[vulkan] Merge in tag sdk-1.2.148.0 from upstream.
Bug: 60761
Change-Id: I8719b30995b8965bbafdf37afc66ee162f9bea8d
diff --git a/.appveyor.yml b/.appveyor.yml
index 1d7d5ee..7feb677 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -14,9 +14,6 @@
os:
- Visual Studio 2015
-init:
- - git config --global core.autocrlf true
-
environment:
PYTHON_PATH: "C:/Python35"
PYTHON_PACKAGE_PATH: "C:/Python35/Scripts"
diff --git a/.gitattributes b/.gitattributes
index ca85b46..10155eb 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -14,3 +14,6 @@
# Text files to always have LF (unix) line endings on checkout.
*.sh text eol=lf
+# Generated source files will always have LF (unix) line endings on checkout.
+layers/generated/*.cpp text eol=lf
+layers/generated/*.h text eol=lf
diff --git a/.gitignore b/.gitignore
index a976f73..0d0f477 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,6 +23,10 @@
build32
dbuild
build-android/external
+build-android/bin
+build-android/libs
+build-android/obj
+build-android/third_party
*.config
*.creator
*.creator.user
diff --git a/.travis.yml b/.travis.yml
index 59b75d1..4234a9a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -13,11 +13,9 @@
include:
# Android build.
- os: linux
- compiler: gcc
env: VULKAN_BUILD_TARGET=ANDROID ANDROID_TARGET=android-26 ANDROID_ABI=armeabi-v7a
# Android 64-bit build.
- os: linux
- compiler: gcc
env: VULKAN_BUILD_TARGET=ANDROID ANDROID_TARGET=android-26 ANDROID_ABI=arm64-v8a
# Linux GCC debug build.
- os: linux
@@ -82,7 +80,10 @@
fi
# Misc setup
- export core_count=$(nproc || echo 4) && echo core_count = $core_count
+ - ccache --version
- ccache --zero-stats
+ - export CCACHE_COMPRESS=true
+ - export CCACHE_COMPRESSLEVEL=9
- set +e
script:
@@ -136,25 +137,6 @@
fi
- |
if [[ "$VULKAN_BUILD_TARGET" == "LINUX" ]]; then
- # Build DevSim in VulkanTools to run Vulkan-ValidationLayer tests
- cd ${TRAVIS_BUILD_DIR}/external
- git clone https://github.com/LunarG/VulkanTools.git
- cd VulkanTools
- ./update_external_sources.sh
- mkdir build
- cd build
- cmake -DCMAKE_BUILD_TYPE=Debug \
- -DBUILD_VIA=NO -DBUILD_VKTRACE=NO -DBUILD_VLF=NO -DBUILD_TESTS=NO -DBUILD_LAYERMGR=NO \
- -DBUILD_MONITOR=NO -DBUILD_SCREENSHOT=NO -DBUILD_APIDUMP=NO \
- -DBUILD_VKTRACEVIEWER=NO -DBUILD_VKTRACE_LAYER=NO -DBUILD_VKTRACE_REPLAY=NO \
- -DVULKAN_HEADERS_INSTALL_DIR=${TRAVIS_BUILD_DIR}/external/Vulkan-Headers/build/install \
- -DVULKAN_LOADER_INSTALL_DIR=${TRAVIS_BUILD_DIR}/external/Vulkan-Loader/build/install \
- -DVULKAN_VALIDATIONLAYERS_INSTALL_DIR=${TRAVIS_BUILD_DIR}/build/install \
- ..
- cmake --build . --target VkLayer_device_simulation -- -j $core_count
- fi
- - |
- if [[ "$VULKAN_BUILD_TARGET" == "LINUX" ]]; then
# Build MockICD in Vulkan-Tools to run Vulkan-ValidationLayer tests
cd ${TRAVIS_BUILD_DIR}/external
git clone https://github.com/KhronosGroup/Vulkan-Tools.git
@@ -183,11 +165,6 @@
export VK_LAYER_PATH=${TRAVIS_BUILD_DIR}/external/VulkanTools/build/layersvt:${TRAVIS_BUILD_DIR}/build/layers
export VK_ICD_FILENAMES=${TRAVIS_BUILD_DIR}/external/Vulkan-Tools/build/icd/VkICD_mock_icd.json
build/tests/vk_layer_validation_tests
- for profile in tests/device_profiles/*.json
- do
- echo Testing with profile $profile
- VK_DEVSIM_FILENAME=$profile build/tests/vk_layer_validation_tests --devsim
- done
fi
- |
if [[ "$VULKAN_BUILD_TARGET" == "ANDROID" ]]; then
@@ -219,7 +196,7 @@
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git depot_tools
export PATH=$PATH:$PWD/depot_tools
./build-gn/update_deps.sh
- gn gen out/Debug
+ gn gen out/Debug --args="cc_wrapper=\"ccache\""
ninja -C out/Debug
fi
- ccache --show-stats
diff --git a/BUILD.gn b/BUILD.gn
index f01e2f0..2b01f7e 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -64,15 +64,11 @@
}
core_validation_sources = [
- # This file is manually included in the layer
- # "layers/generated/vk_safe_struct.cpp",
"layers/buffer_validation.cpp",
"layers/buffer_validation.h",
- "layers/state_tracker.cpp",
- "layers/state_tracker.h",
+ "layers/convert_to_renderpass2.cpp",
"layers/core_validation.cpp",
"layers/core_validation.h",
- "layers/convert_to_renderpass2.cpp",
"layers/descriptor_sets.cpp",
"layers/descriptor_sets.h",
"layers/drawdispatch.cpp",
@@ -80,15 +76,19 @@
"layers/gpu_utils.h",
"layers/gpu_validation.cpp",
"layers/gpu_validation.h",
- "layers/shader_validation.cpp",
- "layers/shader_validation.h",
- "layers/xxhash.c",
- "layers/xxhash.h",
"layers/image_layout_map.cpp",
"layers/image_layout_map.h",
"layers/range_vector.h",
+ "layers/shader_validation.cpp",
+ "layers/shader_validation.h",
+ "layers/state_tracker.cpp",
+ "layers/state_tracker.h",
"layers/subresource_adapter.cpp",
"layers/subresource_adapter.h",
+ "layers/synchronization_validation.cpp",
+ "layers/synchronization_validation.h",
+ "layers/xxhash.c",
+ "layers/xxhash.h",
]
object_lifetimes_sources = [
@@ -111,31 +111,37 @@
unique_objects_sources = []
best_practices_sources = [
+ "layers/best_practices_error_enums.h",
"layers/best_practices_utils.cpp",
"layers/best_practices_validation.h",
- "layers/best_practices_error_enums.h",
+ "layers/generated/best_practices.cpp",
+ "layers/generated/best_practices.h",
]
debug_printf_sources = [
"layers/debug_printf.cpp",
- "layers/debug_printf.h"
+ "layers/debug_printf.h",
]
command_counter_sources = [
+ "layers/command_counter.h",
"layers/generated/command_counter_helper.cpp",
"layers/generated/command_counter_helper.h",
- "layers/command_counter.h",
]
chassis_sources = [
- "layers/generated/vk_safe_struct.h",
- "layers/generated/thread_safety.h",
- "layers/generated/chassis.cpp",
- "layers/generated/chassis.h",
- "layers/generated/layer_chassis_dispatch.cpp",
- "layers/generated/layer_chassis_dispatch.h",
"$vulkan_headers_dir/include/vulkan/vk_layer.h",
"$vulkan_headers_dir/include/vulkan/vulkan.h",
+ "layers/generated/chassis.cpp",
+ "layers/generated/chassis.h",
+ "layers/layer_options.h",
+ "layers/layer_options.cpp",
+ "layers/vk_layer_settings_ext.h",
+ "layers/generated/layer_chassis_dispatch.cpp",
+ "layers/generated/layer_chassis_dispatch.h",
+ "layers/generated/thread_safety.h",
+ "layers/generated/vk_safe_struct.cpp",
+ "layers/generated/vk_safe_struct.h",
]
layers = [ [
@@ -200,10 +206,11 @@
"$vulkan_headers_dir:vulkan_headers_config",
":vulkan_internal_config",
]
- public_deps = []
+ public_deps = [ "$vulkan_headers_dir:vulkan_headers" ]
+
configs -= vulkan_undefine_configs
if (is_fuchsia) {
- public_deps = [
+ public_deps += [
"//third_party/Vulkan-Loader:dlopen_fuchsia",
]
} else {
diff --git a/BUILD.md b/BUILD.md
index dc41215..545be01 100644
--- a/BUILD.md
+++ b/BUILD.md
@@ -65,6 +65,10 @@
"install directory" override can also be used to force the use of a specific
version of that dependency.
+Alternatively, an automated method for obtaining and installing repo dependencies
+is provided, and described below, in
+[Building Dependent Repositories...](#building-dependent-repositories-with-known-good-revisions)
+
#### Vulkan-Headers
This repository has a required dependency on the
@@ -89,6 +93,19 @@
and pass it on the CMake command line for building this repository, as
described below.
+#### SPIRV-Headers
+
+This repository has a required dependency on the
+[SPIRV-headers repository](https://github.com/KhronosGroup/SPIRV-Headers).
+The SPIRV-headers repository is required because it supports components that are
+required to build the validation layers. You must clone the SPIRV-headers repository
+and build its `install` target. Follow the build instructions in the SPIRV-headers
+[README.md](https://github.com/KhronosGroup/SPIRV-Headers/blob/master/README.md)
+file. You must also take note of the SPIRV-headers install directory
+and pass it on the CMake command line for building this repository, as
+described below.
+
+
#### Google Test
The validation layer tests depend on the
@@ -130,7 +147,8 @@
the repository with a name of `build` and place the install directory as a
child of the build directory with the name `install`. The remainder of these
instructions follow this convention, although you can use any name for these
-directories and place them in any location.
+directories and place them in any location (see option `--dir` in the
+[notes](#notes)).
### Building Dependent Repositories with Known-Good Revisions
@@ -173,6 +191,11 @@
- You may need to adjust some of the CMake options based on your platform. See
the platform-specific sections later in this document.
+- When using update_deps.py to change architectures (x64, Win32...)
+ or build configurations (debug, release...) it is strongly recommended to
+ add the '--clean-repo' parameter. This ensures compatibility among dependent
+ components.
+ dependent components will produce consistent build artifacts.
- The `update_deps.py` script fetches and builds the dependent repositories in
the current directory when it is invoked. In this case, they are built in
the `build` directory.
@@ -272,7 +295,10 @@
mkdir build
cd build
cmake -A x64 -DVULKAN_HEADERS_INSTALL_DIR=absolute_path_to_install_dir \
- -DGLSLANG_INSTALL_DIR=absolute_path_to_install_dir ..
+ -DGLSLANG_INSTALL_DIR=absolute_path_to_install_dir \
+ -DSPIRV_HEADERS_INSTALL_DIR=absolute_path_to_install_dir \
+ -DSPIRV_TOOLS_INSTALL_DIR=absolute_path_to_install_dir \
+ ..
cmake --build .
The above commands instruct CMake to find and use the default Visual Studio
@@ -291,7 +317,10 @@
mkdir build
cd build
cmake -A x64 -DVULKAN_HEADERS_INSTALL_DIR=absolute_path_to_install_dir \
- -DGLSLANG_INSTALL_DIR=absolute_path_to_install_dir ..
+ -DGLSLANG_INSTALL_DIR=absolute_path_to_install_dir \
+ -DSPIRV_HEADERS_INSTALL_DIR=absolute_path_to_install_dir \
+ -DSPIRV_TOOLS_INSTALL_DIR=absolute_path_to_install_dir
+ ..
> Note: The `..` parameter tells `cmake` the location of the top of the
> repository. If you place your build directory someplace else, you'll need to
@@ -372,7 +401,9 @@
cmake -A x64 -DVULKAN_HEADERS_INSTALL_DIR=absolute_path_to_install_dir \
-DVULKAN_LOADER_INSTALL_DIR=absolute_path_to_install_dir \
- -DGLSLANG_INSTALL_DIR=absolute_path_to_install_dir ..
+ -DGLSLANG_INSTALL_DIR=absolute_path_to_install_dir \
+ -DSPIRV_TOOLS_INSTALL_DIR=absolute_path_to_install_dir \
+ ..
### Windows Tests and Demos
@@ -424,7 +455,7 @@
sudo apt-get install git build-essential libx11-xcb-dev \
libxkbcommon-dev libwayland-dev libxrandr-dev \
libegl1-mesa-dev
-
+
##### Required package for Ubuntu 18.04 users
For python2 users
@@ -446,7 +477,10 @@
mkdir build
cd build
cmake -DVULKAN_HEADERS_INSTALL_DIR=absolute_path_to_install_dir \
- -DGLSLANG_INSTALL_DIR=absolute_path_to_install_dir ..
+ -DGLSLANG_INSTALL_DIR=absolute_path_to_install_dir \
+ -DSPIRV_HEADERS_INSTALL_DIR=absolute_path_to_install_dir \
+ -DSPIRV_TOOLS_INSTALL_DIR=absolute_path_to_install_dir \
+ ..
make
See below for the details.
@@ -462,6 +496,8 @@
cmake -DCMAKE_BUILD_TYPE=Debug \
-DVULKAN_HEADERS_INSTALL_DIR=absolute_path_to_install_dir \
-DGLSLANG_INSTALL_DIR=absolute_path_to_install_dir \
+ -DSPIRV_HEADERS_INSTALL_DIR=absolute_path_to_install_dir \
+ -DSPIRV_TOOLS_INSTALL_DIR=absolute_path_to_install_dir \
-DCMAKE_INSTALL_PREFIX=install ..
> Note: The `..` parameter tells `cmake` the location of the top of the
@@ -683,6 +719,8 @@
cd build-android
./build_all.sh
+> **NOTE:** By default, the `build_all.sh` script will build for all Android ABI variations. To **speed up the build time** if you know your target(s), set `APP_ABI` in both [build-android/jni/Application.mk](build-android/jni/Application.mk) and [build-android/jni/shaderc/Application.mk](build-android/jni/shaderc/Application.mk) to the desired [Android ABI](https://developer.android.com/ndk/guides/application_mk#app_abi)
+
Resulting validation layer binaries will be in build-android/libs. Test and
demo APKs can be installed on production devices with:
@@ -730,6 +768,10 @@
test_APK.sh -s <serial number> -p <plaform name> -f <gtest_filter>
+To view to logging while running in a separate terminal run
+
+ adb logcat -c && adb logcat *:S VulkanLayerValidationTests
+
## Building on MacOS
### MacOS Build Requirements
@@ -778,6 +820,8 @@
cd build
cmake -DVULKAN_HEADERS_INSTALL_DIR=absolute_path_to_install_dir \
-DGLSLANG_INSTALL_DIR=absolute_path_to_install_dir \
+ -DSPIRV_HEADERS_INSTALL_DIR=absolute_path_to_install_dir \
+ -DSPIRV_TOOLS_INSTALL_DIR=absolute_path_to_install_dir \
-DCMAKE_BUILD_TYPE=Debug ..
make
@@ -794,6 +838,8 @@
cd build-xcode
cmake -DVULKAN_HEADERS_INSTALL_DIR=absolute_path_to_install_dir \
-DGLSLANG_INSTALL_DIR=absolute_path_to_install_dir \
+ -DSPIRV_HEADERS_INSTALL_DIR=absolute_path_to_install_dir \
+ -DSPIRV_TOOLS_INSTALL_DIR=absolute_path_to_install_dir \
-GXcode ..
open VULKAN.xcodeproj
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7a9ef85..04a3270 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -117,9 +117,11 @@
-fno-builtin-memcmp
-fvisibility=hidden)
- # Treat warnings as errors for versions of GCC and Clang that are shipped on Ubuntu 18.04 or older.
+ # Treat warnings as errors for versions of GCC and c++11-compliant Clang versions that are shipped on Ubuntu 18.04 or older.
if((CMAKE_COMPILER_IS_GNUCXX AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 7.3.0)) OR
- (("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 7.0.0)))
+ (("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") AND
+ (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 6.0.0) AND
+ (CMAKE_CXX_COMPILER_VERSION VERSION_LESS_EQUAL 7.0.0)))
add_compile_options(-Werror)
endif()
@@ -165,82 +167,54 @@
message(FATAL_ERROR "Must define location of glslang binaries -- see BUILD.md")
endif()
- # GLSLANG_INSTALL_DIR is used as the path to all dependent projects' install dirs
# CMake command line option overrides environment variable
if(NOT GLSLANG_INSTALL_DIR)
set(GLSLANG_INSTALL_DIR $ENV{GLSLANG_INSTALL_DIR})
endif()
+ # CMake command line option overrides environment variable
+ if(NOT SPIRV_HEADERS_INSTALL_DIR)
+ set(SPIRV_HEADERS_INSTALL_DIR $ENV{SPIRV_HEADERS_INSTALL_DIR})
+ endif()
+
+ if(NOT SPIRV_TOOLS_INSTALL_DIR)
+ set(SPIRV_TOOLS_INSTALL_DIR $ENV{SPIRV_TOOLS_INSTALL_DIR})
+ endif()
+
if (NOT TARGET glslang)
+ if(NOT SPIRV_HEADERS_INSTALL_DIR)
+ message(FATAL_ERROR "Must define location of SPIRV-Headers -- see BUILD.md")
+ endif()
+
message(STATUS "Using glslang install located at ${GLSLANG_INSTALL_DIR}")
set(GLSLANG_SEARCH_PATH "${GLSLANG_INSTALL_DIR}/lib")
set(GLSLANG_DEBUG_SEARCH_PATH "${GLSLANG_INSTALL_DIR}/lib")
set(GLSLANG_SPIRV_INCLUDE_DIR "${GLSLANG_INSTALL_DIR}/include/glslang" CACHE PATH "Path to glslang spirv headers")
+ set(SPIRV_HEADERS_INCLUDE_DIR "${SPIRV_HEADERS_INSTALL_DIR}/include" CACHE PATH "Path to spirv-headers")
- find_library(GLSLANG_LIB NAMES glslang HINTS ${GLSLANG_SEARCH_PATH})
- find_library(OGLCompiler_LIB NAMES OGLCompiler HINTS ${GLSLANG_SEARCH_PATH})
- find_library(OSDependent_LIB NAMES OSDependent HINTS ${GLSLANG_SEARCH_PATH})
- find_library(HLSL_LIB NAMES HLSL HINTS ${GLSLANG_SEARCH_PATH})
- find_library(SPIRV_LIB NAMES SPIRV HINTS ${GLSLANG_SEARCH_PATH})
- find_library(SPIRV_REMAPPER_LIB NAMES SPVRemapper HINTS ${GLSLANG_SEARCH_PATH})
+ set(GLSLANG_LIBRARIES glslang OGLCompiler OSDependent MachineIndependent GenericCodeGen HLSL SPIRV SPVRemapper)
- if(WIN32)
- add_library(glslang STATIC IMPORTED)
- add_library(OGLCompiler STATIC IMPORTED)
- add_library(OSDependent STATIC IMPORTED)
- add_library(HLSL STATIC IMPORTED)
- add_library(SPIRV STATIC IMPORTED)
- add_library(SPVRemapper STATIC IMPORTED)
+ # Add glslang static libraries as imported targets
+ foreach(GLSLANG_LIBRARY ${GLSLANG_LIBRARIES})
+ add_library(${GLSLANG_LIBRARY} STATIC IMPORTED)
+ find_library("${GLSLANG_LIBRARY}_PATH" NAMES "${GLSLANG_LIBRARY}" HINTS ${GLSLANG_SEARCH_PATH})
+ set_target_properties(${GLSLANG_LIBRARY}
+ PROPERTIES IMPORTED_LOCATION
+ "${${GLSLANG_LIBRARY}_PATH}")
+ if (WIN32)
+ find_library("${GLSLANG_LIBRARY}_DEBUG_PATH" NAMES "${GLSLANG_LIBRARY}d" HINTS ${GLSLANG_DEBUG_SEARCH_PATH})
+ set_target_properties(${GLSLANG_LIBRARY}
+ PROPERTIES IMPORTED_LOCATION_DEBUG
+ "${${GLSLANG_LIBRARY}_DEBUG_PATH}")
+ endif()
+ endforeach()
- find_library(GLSLANG_DLIB NAMES glslangd HINTS ${GLSLANG_DEBUG_SEARCH_PATH})
- find_library(OGLCompiler_DLIB NAMES OGLCompilerd HINTS ${GLSLANG_DEBUG_SEARCH_PATH})
- find_library(OSDependent_DLIB NAMES OSDependentd HINTS ${GLSLANG_DEBUG_SEARCH_PATH})
- find_library(HLSL_DLIB NAMES HLSLd HINTS ${GLSLANG_DEBUG_SEARCH_PATH})
- find_library(SPIRV_DLIB NAMES SPIRVd HINTS ${GLSLANG_DEBUG_SEARCH_PATH})
- find_library(SPIRV_REMAPPER_DLIB NAMES SPVRemapperd HINTS ${GLSLANG_DEBUG_SEARCH_PATH})
-
- set_target_properties(glslang
- PROPERTIES IMPORTED_LOCATION
- "${GLSLANG_LIB}"
- IMPORTED_LOCATION_DEBUG
- "${GLSLANG_DLIB}")
- set_target_properties(OGLCompiler
- PROPERTIES IMPORTED_LOCATION
- "${OGLCompiler_LIB}"
- IMPORTED_LOCATION_DEBUG
- "${OGLCompiler_DLIB}")
- set_target_properties(OSDependent
- PROPERTIES IMPORTED_LOCATION
- "${OSDependent_LIB}"
- IMPORTED_LOCATION_DEBUG
- "${OSDependent_DLIB}")
- set_target_properties(HLSL
- PROPERTIES IMPORTED_LOCATION
- "${HLSL_LIB}"
- IMPORTED_LOCATION_DEBUG
- "${HLSL_DLIB}")
- set_target_properties(SPIRV
- PROPERTIES IMPORTED_LOCATION
- "${SPIRV_LIB}"
- IMPORTED_LOCATION_DEBUG
- "${SPIRV_DLIB}")
- set_target_properties(SPVRemapper
- PROPERTIES IMPORTED_LOCATION
- "${SPIRV_REMAPPER_LIB}"
- IMPORTED_LOCATION_DEBUG
- "${SPIRV_REMAPPER_DLIB}")
-
- set(GLSLANG_LIBRARIES glslang OGLCompiler OSDependent HLSL SPIRV SPVRemapper ${SPIRV_TOOLS_LIBRARIES})
- else()
- set(GLSLANG_LIBRARIES
- ${GLSLANG_LIB}
- ${OGLCompiler_LIB}
- ${OSDependent_LIB}
- ${HLSL_LIB}
- ${SPIRV_LIB}
- ${SPIRV_REMAPPER_LIB}
- ${SPIRV_TOOLS_LIBRARIES})
- endif()
+ # Circular dependencies exist between glslang static libs, add them all as link dependencies for each other
+ foreach(GLSLANG_LIBRARY ${GLSLANG_LIBRARIES})
+ set_target_properties(${GLSLANG_LIBRARY}
+ PROPERTIES INTERFACE_LINK_LIBRARIES
+ "${GLSLANG_LIBRARIES}")
+ endforeach()
else()
set(GLSLANG_SPIRV_INCLUDE_DIR "${glslang_SOURCE_DIR}" CACHE PATH "Path to glslang spirv headers")
set(GLSLANG_LIBRARIES glslang SPIRV SPVRemapper)
@@ -248,15 +222,19 @@
# spirv-tools
if (NOT TARGET SPIRV-Tools)
- set(SPIRV_TOOLS_BINARY_ROOT "${GLSLANG_INSTALL_DIR}/lib"
+ if(NOT SPIRV_TOOLS_INSTALL_DIR)
+ set(SPIRV_TOOLS_INSTALL_DIR "${GLSLANG_INSTALL_DIR}")
+ endif()
+
+ set(SPIRV_TOOLS_BINARY_ROOT "${SPIRV_TOOLS_INSTALL_DIR}/lib"
CACHE PATH "User defined path to the SPIRV-Tools binaries for this project")
- set(SPIRV_TOOLS_OPT_BINARY_ROOT "${GLSLANG_INSTALL_DIR}/lib"
+ set(SPIRV_TOOLS_OPT_BINARY_ROOT "${SPIRV_TOOLS_INSTALL_DIR}/lib"
CACHE PATH "User defined path to the SPIRV-Tools-opt binaries for this project")
- set(SPIRV_TOOLS_INCLUDE_DIR "${GLSLANG_INSTALL_DIR}/include" CACHE PATH "Path to spirv tools headers")
- set(SPIRV_TOOLS_SEARCH_PATH "${GLSLANG_INSTALL_DIR}/lib")
- set(SPIRV_TOOLS_DEBUG_SEARCH_PATH "${GLSLANG_INSTALL_DIR}/lib")
- set(SPIRV_TOOLS_OPT_SEARCH_PATH "${GLSLANG_INSTALL_DIR}/lib")
- set(SPIRV_TOOLS_OPT_DEBUG_SEARCH_PATH "${GLSLANG_INSTALL_DIR}/lib")
+ set(SPIRV_TOOLS_INCLUDE_DIR "${SPIRV_TOOLS_INSTALL_DIR}/include" CACHE PATH "Path to spirv tools headers")
+ set(SPIRV_TOOLS_SEARCH_PATH "${SPIRV_TOOLS_INSTALL_DIR}/lib")
+ set(SPIRV_TOOLS_DEBUG_SEARCH_PATH "${SPIRV_TOOLS_INSTALL_DIR}/lib")
+ set(SPIRV_TOOLS_OPT_SEARCH_PATH "${SPIRV_TOOLS_INSTALL_DIR}/lib")
+ set(SPIRV_TOOLS_OPT_DEBUG_SEARCH_PATH "${SPIRV_TOOLS_INSTALL_DIR}/lib")
find_library(SPIRV_TOOLS_LIB NAMES SPIRV-Tools HINTS ${SPIRV_TOOLS_SEARCH_PATH})
find_library(SPIRV_TOOLS_OPT_LIB NAMES SPIRV-Tools-opt HINTS ${SPIRV_TOOLS_OPT_SEARCH_PATH})
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index d03d34e..20d8b2c 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -8,17 +8,20 @@
### **The Vulkan Ecosystem Needs Your Help**
-The Vulkan validation layers are one of the larger and more important components in this repository.
+The Vulkan validation layers make up a significant part of the Vulkan ecosystem.
While there are often active and organized development efforts underway to improve their coverage,
-there are always opportunities for anyone to help by contributing additional validation layer checks
-and tests for these validation checks.
+opportunities always exist for anyone to help by contributing additional validation layer checks
+and tests.
There are a couple of methods to identify areas of need:
* Examine the [issues list](https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues)
in this repository and look for issues that are of interest
-* Alternatively, run the `vk_validation_stats.py` script (in the scripts directory) with the `-todo`
+* Examine the Validation Layer 'Coverage - html' page at [the Vulkan SDK
+documentation page](https://vulkan.lunarg.com/doc/sdk/) -- it lists all published Vulkan VUIDs and their status.
+* Run the `vk_validation_stats.py` script (in the scripts directory) with the `-todo`
command line argument to see a list of as-yet unimplemented validation checks.
-* Having selected a validation check to work on, it is often efficient to implement a block of related checks
+
+Having selected a validation check to work on, it is often efficient to implement a block of related checks
at once. Refer to the validation database output from `vk_validation_stats.py` (available in text, html,
or csv format) to identify related checks that may be implemented simultaneously.
@@ -46,13 +49,16 @@
* Use the existing GitHub forking and pull request process.
This will involve [forking the repository](https://help.github.com/articles/fork-a-repo/),
creating a branch with your commits, and then [submitting a pull request](https://help.github.com/articles/using-pull-requests/).
-* Please read and adhere to the style and process [guidelines ](#coding-conventions-and-formatting) enumerated below.
-* Please base your fixes on the master branch. SDK branches are generally not updated except for critical fixes needed to repair an SDK release.
+* Please read and adhere to the style and process [guidelines ](#coding-conventions-and-formatting) enumerated below. Some highlights:
+ - Source code must follow the repo coding style guidelines, including a pass through a clang-format utility
+ - Implemented VUID checks must be accompanied by relevant tests
+ - Validation source code should be in a separate commit from the tests, unless there are interdependencies. The repo should compile and
+ pass all tests after each commit.
+* Please base your fixes on the master branch. SDK branches are generally not updated except for critical fixes needed to repair an SDK release.
* The resulting Pull Request will be assigned to a repository maintainer. It is the maintainer's responsibility to ensure the Pull Request
passes the Google/LunarG internal CI processes. Once the Pull Request has been approved and is passing internal CI, a repository maintainer
will merge the PR.
-
#### **Coding Conventions and Formatting**
* Use the **[Google style guide](https://google.github.io/styleguide/cppguide.html)** for source code with the following exceptions:
* The column limit is 132 (as opposed to the default value 80). The clang-format tool will handle this. See below.
@@ -100,6 +106,8 @@
* Feel free to subject your code changes to other tests as well!
+* Take a look at the [overview for creating tests](docs/creating_tests.md).
+
#### **GitHub Cloud CI Testing**
Pull Requests to GitHub are tested in the cloud on Linux and Windows VMs. The Linux VMs use [Travis CI](https://travis-ci.org/KhronosGroup/Vulkan-ValidationLayers) with the sequence of commands driven by the [.travis.yml](https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/master/.travis.yml) file. The Windows VMs use [AppVeyor](https://ci.appveyor.com/project/Khronoswebmaster/vulkan-validationlayers/branch/master) with the sequence of commands driven by the [.appveyor.yml](https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/master/.appveyor.yml) file.
@@ -120,7 +128,9 @@
validation objects (thread_safety, object lifetimes) are more special-purpose and are mostly code-generated from the specification.
* **Validation Error/Warning Messages:** Strive to give specific information describing the particulars of the failure, including
output all of the applicable Vulkan Objects and related values. Also, ensure that when messages can give suggestions about _how_ to
-fix the problem, they should do so to better assist the user.
+fix the problem, they should do so to better assist the user. Note that Vulkan object handles must be output via the `FormatHandle()`
+function, and that all object handles visible in a message should also be included in the callback data. If more than a single object is
+output, the LogObjectList structure should be used.
* **Validation Statistics:** The `vk_validation_stats.py` script (in the scripts directory) inspects the layer and test source files
and reports a variety of statistics on validation completeness and correctness. Before submitting a change you should run this
script with the consistency check (`-c`) argument to ensure that your changes have not introduced any inconsistencies in the code.
diff --git a/LAYER_CONFIGURATION.md b/LAYER_CONFIGURATION.md
index ebe9dd6..66a4924 100644
--- a/LAYER_CONFIGURATION.md
+++ b/LAYER_CONFIGURATION.md
@@ -17,11 +17,11 @@
Vulkan validation and utility layers give Vulkan application developers the ability to add additional functionality to applications without modifying the application itself, e.g., dumping API entry points or generating screenshots of specified frames.
-### Vulkan Configurator Tool
+## Configuring Vulkan Layers using *Vulkan Configurator*
-Developers can use the Vulkan Configurator, `vkconfig`, to enable explicit layers and disable implicit layers as well as change layer settings through a graphical user interface. Please see [the Vulkan Configurator documentation in the Vulkan SDK](https://vulkan.lunarg.com/doc/sdk/latest/windows/vkconfig.html) for more information on using the Vulkan Configurator. Continue reading for instructions on how to configure layers without using vkconfig.
+Developers can configure layers through a graphical user interface. *[Vulkan Configurator](https://vulkan.lunarg.com/doc/sdk/latest/windows/vkconfig.html)* allows full user control of Vulkan layers, including enabling or disabling specific layers, controlling layer order, changing layer settings, etc.
-## Validation Layer Overview
+## Configuring Vulkan Layers using Environment Variables
Application validation in Vulkan is implemented solely by the [Khronos validation layer](https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/master/docs/khronos_validation_layer.md),
**`VK_LAYER_KHRONOS_validation`**.
@@ -50,9 +50,9 @@
| VK_LAYER_LUNARG_shader_checker | April 2015 | Deprecated |
| VK_LAYER_LUNARG_image | June 2015 | Deprecated |
-## Activating Layers on Windows
+### Activating Layers on Windows
Before or during execution of a Vulkan application, the loader must be informed of the layers to activate.
-This can be done in two ways: programmatically, or by using environment variables.
+This can be done in two ways: programmatically, or by using environment variables.
Applications may programmatically activate layers via the `vkCreateInstance()` entry point.
@@ -78,7 +78,7 @@
C:\> vkcube
```
-## Activating Layers on Linux and macOS
+### Activating Layers on Linux and macOS
Before or during execution of a Vulkan application, the loader must be informed of the layers to activate.
This can be done in two ways: programmatically, or by using environment variables.
@@ -161,7 +161,7 @@
Note: If layers are activated via `VK_INSTANCE_LAYERS` environment variable and if neither an application-defined callback is defined nor a layer settings file is present, the loader/layers will provide default callbacks enabling output of error-level messages to standard out (and via `OutputDebugString` on Windows).
-## Advanced Layer Configuration, Installation, and Discovery Details
+### Advanced Layer Configuration, Installation, and Discovery Details
The Vulkan loader searches specific platform-specific locations to find installed layers.
For additional details, see the `LoaderAndLayerInterface.md` available [here](https://vulkan.lunarg.com/doc/sdk/latest/windows/loader_and_layer_interface.html),
or in the Vulkan-Loader repository, [here](https://github.com/KhronosGroup/Vulkan-Loader/blob/master/loader/LoaderAndLayerInterface.md).
diff --git a/build-android/cmake/layerlib/CMakeLists.txt b/build-android/cmake/layerlib/CMakeLists.txt
index 1b46dde..6ea7abb 100644
--- a/build-android/cmake/layerlib/CMakeLists.txt
+++ b/build-android/cmake/layerlib/CMakeLists.txt
@@ -73,6 +73,7 @@
${SRC_DIR}/layers/gpu_utils.cpp
${SRC_DIR}/layers/debug_printf.cpp
${SRC_DIR}/layers/best_practices_utils.cpp
+ ${SRC_DIR}/layers/synchronization_validation.cpp
${COMMON_DIR}/include/layer_chassis_dispatch.cpp
${COMMON_DIR}/include/chassis.cpp
${COMMON_DIR}/include/parameter_validation.cpp
diff --git a/build-android/jni/Android.mk b/build-android/jni/Android.mk
index fe7358d..475e77d 100644
--- a/build-android/jni/Android.mk
+++ b/build-android/jni/Android.mk
@@ -45,9 +45,12 @@
LOCAL_SRC_FILES += $(SRC_DIR)/layers/gpu_utils.cpp
LOCAL_SRC_FILES += $(SRC_DIR)/layers/debug_printf.cpp
LOCAL_SRC_FILES += $(SRC_DIR)/layers/best_practices_utils.cpp
+LOCAL_SRC_FILES += $(SRC_DIR)/layers/generated/best_practices.cpp
+LOCAL_SRC_FILES += $(SRC_DIR)/layers/synchronization_validation.cpp
LOCAL_SRC_FILES += $(SRC_DIR)/layers/convert_to_renderpass2.cpp
LOCAL_SRC_FILES += $(SRC_DIR)/layers/generated/layer_chassis_dispatch.cpp
LOCAL_SRC_FILES += $(SRC_DIR)/layers/generated/chassis.cpp
+LOCAL_SRC_FILES += $(SRC_DIR)/layers/layer_options.cpp
LOCAL_SRC_FILES += $(SRC_DIR)/layers/xxhash.c
LOCAL_SRC_FILES += $(SRC_DIR)/layers/generated/parameter_validation.cpp
LOCAL_SRC_FILES += $(SRC_DIR)/layers/parameter_validation_utils.cpp
@@ -55,11 +58,13 @@
LOCAL_SRC_FILES += $(SRC_DIR)/layers/object_tracker_utils.cpp
LOCAL_SRC_FILES += $(SRC_DIR)/layers/generated/thread_safety.cpp
LOCAL_SRC_FILES += $(SRC_DIR)/layers/generated/command_counter_helper.cpp
+LOCAL_SRC_FILES += $(SRC_DIR)/layers/generated/vk_safe_struct.cpp
LOCAL_SRC_FILES += $(SRC_DIR)/layers/image_layout_map.cpp
LOCAL_SRC_FILES += $(SRC_DIR)/layers/subresource_adapter.cpp
LOCAL_C_INCLUDES += $(VULKAN_INCLUDE) \
$(LOCAL_PATH)/$(SRC_DIR)/layers \
- $(LOCAL_PATH)/$(SRC_DIR)/layers/generated
+ $(LOCAL_PATH)/$(SRC_DIR)/layers/generated \
+ $(LOCAL_PATH)/$(THIRD_PARTY)/shaderc/third_party/spirv-tools/external/spirv-headers/include
LOCAL_STATIC_LIBRARIES += layer_utils glslang SPIRV-Tools SPIRV-Tools-opt
LOCAL_CPPFLAGS += -std=c++11 -Wall -Werror -Wno-unused-function -Wno-unused-const-variable
LOCAL_CPPFLAGS += -DVK_ENABLE_BETA_EXTENSIONS -DVK_USE_PLATFORM_ANDROID_KHR -DVK_PROTOTYPES -fvisibility=hidden
@@ -71,12 +76,15 @@
include $(CLEAR_VARS)
LOCAL_MODULE := VkLayerValidationTests
LOCAL_SRC_FILES += $(SRC_DIR)/tests/layer_validation_tests.cpp \
- $(SRC_DIR)/tests/vklayertests_pipeline_shader.cpp \
- $(SRC_DIR)/tests/vklayertests_buffer_image_memory_sampler.cpp \
- $(SRC_DIR)/tests/vklayertests_others.cpp \
- $(SRC_DIR)/tests/vklayertests_descriptor_renderpass_framebuffer.cpp \
- $(SRC_DIR)/tests/vklayertests_command.cpp \
- $(SRC_DIR)/tests/vkpositivelayertests.cpp \
+ $(SRC_DIR)/tests/vklayertests_instanceless.cpp \
+ $(SRC_DIR)/tests/vklayertests_pipeline_shader.cpp \
+ $(SRC_DIR)/tests/vklayertests_buffer_image_memory_sampler.cpp \
+ $(SRC_DIR)/tests/vklayertests_others.cpp \
+ $(SRC_DIR)/tests/vklayertests_descriptor_renderpass_framebuffer.cpp \
+ $(SRC_DIR)/tests/vklayertests_command.cpp \
+ $(SRC_DIR)/tests/vklayertests_gpu.cpp \
+ $(SRC_DIR)/tests/vklayertests_best_practices.cpp \
+ $(SRC_DIR)/tests/vkpositivelayertests.cpp \
$(SRC_DIR)/tests/vktestbinding.cpp \
$(SRC_DIR)/tests/vktestframeworkandroid.cpp \
$(SRC_DIR)/tests/vkrenderframework.cpp \
@@ -101,12 +109,15 @@
include $(CLEAR_VARS)
LOCAL_MODULE := VulkanLayerValidationTests
LOCAL_SRC_FILES += $(SRC_DIR)/tests/layer_validation_tests.cpp \
- $(SRC_DIR)/tests/vklayertests_pipeline_shader.cpp \
- $(SRC_DIR)/tests/vklayertests_buffer_image_memory_sampler.cpp \
- $(SRC_DIR)/tests/vklayertests_others.cpp \
- $(SRC_DIR)/tests/vklayertests_descriptor_renderpass_framebuffer.cpp \
- $(SRC_DIR)/tests/vklayertests_command.cpp \
- $(SRC_DIR)/tests/vkpositivelayertests.cpp \
+ $(SRC_DIR)/tests/vklayertests_instanceless.cpp \
+ $(SRC_DIR)/tests/vklayertests_pipeline_shader.cpp \
+ $(SRC_DIR)/tests/vklayertests_buffer_image_memory_sampler.cpp \
+ $(SRC_DIR)/tests/vklayertests_others.cpp \
+ $(SRC_DIR)/tests/vklayertests_descriptor_renderpass_framebuffer.cpp \
+ $(SRC_DIR)/tests/vklayertests_command.cpp \
+ $(SRC_DIR)/tests/vklayertests_gpu.cpp \
+ $(SRC_DIR)/tests/vklayertests_best_practices.cpp \
+ $(SRC_DIR)/tests/vkpositivelayertests.cpp \
$(SRC_DIR)/tests/vktestbinding.cpp \
$(SRC_DIR)/tests/vktestframeworkandroid.cpp \
$(SRC_DIR)/tests/vkrenderframework.cpp \
diff --git a/build-android/known_good.json b/build-android/known_good.json
index 0f2ac7e..4a56846 100755
--- a/build-android/known_good.json
+++ b/build-android/known_good.json
@@ -4,37 +4,37 @@
"name" : "shaderc",
"url" : "https://github.com/google/shaderc.git",
"sub_dir" : "shaderc",
- "commit" : "3d915b2802667f44a359463f1f420ac33576001b"
+ "commit" : "4162bb13b426dab68ebe411ea7ef05f6343bea95"
},
{
"name" : "glslang",
"url" : "https://github.com/KhronosGroup/glslang.git",
"sub_dir" : "shaderc/third_party/glslang",
- "commit" : "1f0fcbe5a30fdc9632a8bff36277103fabf0797c"
+ "commit" : "3ee5f2f1d3316e228916788b300d786bb574d337"
},
{
"name" : "Vulkan-Headers",
"url" : "https://github.com/KhronosGroup/Vulkan-Headers.git",
"sub_dir" : "Vulkan-Headers",
- "commit" : "v1.2.135"
+ "commit" : "v1.2.148"
},
{
"name" : "Vulkan-Tools",
"url" : "https://github.com/KhronosGroup/Vulkan-Tools.git",
"sub_dir" : "Vulkan-Tools",
- "commit" : "v1.2.135"
+ "commit" : "50e737c8234769be390c20b9adcb6408d32f6015"
},
{
"name" : "SPIRV-Tools",
"url" : "https://github.com/KhronosGroup/SPIRV-Tools.git",
"sub_dir" : "shaderc/third_party/spirv-tools",
- "commit" : "1346dd5de119d603686e260daf08f36958909a23"
+ "commit" : "895927bd3f2d653f40cebab55aa6c7eabde30a86"
},
{
"name" : "SPIRV-Headers",
"url" : "https://github.com/KhronosGroup/SPIRV-Headers.git",
"sub_dir" : "shaderc/third_party/spirv-tools/external/spirv-headers",
- "commit" : "f8bf11a0253a32375c32cad92c841237b96696c0"
+ "commit" : "979924c8bc839e4cb1b69d03d48398551f369ce7"
}
]
}
diff --git a/build-gn/generate_vulkan_layers_json.py b/build-gn/generate_vulkan_layers_json.py
index 5eb1548..323e680 100755
--- a/build-gn/generate_vulkan_layers_json.py
+++ b/build-gn/generate_vulkan_layers_json.py
@@ -80,7 +80,7 @@
data[data_key]['library_path'] = prev_name
target_fname = os.path.join(target_dir, os.path.basename(json_fname))
- with open(target_fname, 'wb') as outfile:
+ with open(target_fname, 'w') as outfile:
json.dump(data, outfile)
# Get the Vulkan version from the vulkan_core.h file
@@ -106,6 +106,8 @@
file_type_suffix = '.so'
if platform.system() == 'Windows':
file_type_suffix = '.dll'
+ elif platform.system() == 'Darwin':
+ file_type_suffix = '.dylib'
# For each *.json.in template files in source dir generate actual json file
# in target dir
diff --git a/docs/best_practices.md b/docs/best_practices.md
index 506eed9..2da0fa8 100644
--- a/docs/best_practices.md
+++ b/docs/best_practices.md
@@ -20,6 +20,8 @@
Best Practices will ideally be run periodically along with normal validation checks so that issues may be addressed in early stages of development.
+Best Practices can easily be enabled and configured using the [Vulkan Configurator](https://vulkan.lunarg.com/doc/sdk/latest/windows/vkconfig.html) included with the Vulkan SDK. Or you can manually enable and configure the Best Practices by following the directions below.
+
The specific areas covered by this layer are currently tracked in
[Github Issue #24: Best Practices/Assistant/Performance Layer.](https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/24)
Requests for additional checks can be posted through the same issue, or by creating a new Github issue.
diff --git a/docs/creating_tests.md b/docs/creating_tests.md
new file mode 100644
index 0000000..641406b
--- /dev/null
+++ b/docs/creating_tests.md
@@ -0,0 +1,220 @@
+# Creating Tests
+
+This is an "up-to-speed" document for writing tests to validate the Validation Layers
+
+## Rule #1
+
+The first rule is to make sure you are actually running the tests on the built version of the Validation Layers you want. If you have the Vulkan SDK installed, then you will have a pre-built version of the Validation Layers set in your path and those are probably not the version you want to test.
+
+Make sure you have the correct `VK_LAYER_PATH` set on Windows or Linux (on Android the layers are baked into the APK so there is nothing to worry about)
+
+```
+export VK_LAYER_PATH=/path/to/Vulkan-ValidationLayers/build/layers/
+```
+
+There is nothing worse than debugging why your layers are not reporting the VUID you added due to not actually testing that code!
+
+## Google Test Overview
+
+The tests take advantage of the Google Test (gtest) Framework which breaks each test into a `TEST_F(VkLayerTest, TestName)` "Test Fixture". This just means that for every test there will be a class that holds many useful member variables.
+
+To run a test labeled `TEST_F(VkLayerTest, Foo)` is as simple as going `--gtest_filter=VkLayerTest.Foo`
+
+## VkRenderFramework
+
+The `VkRenderFramework` class is "base class" that abstract most things in order to allow a test writer to focus on the small part of coded needed for the test.
+
+For most tests, it is as simple as going
+
+```
+ASSERT_NO_FATAL_FAILURE(Init());
+
+// or
+
+ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ASSERT_NO_FATAL_FAILURE(InitState());
+```
+
+to set it up. This will create the `VkInstance` and `VkDevice` for you.
+
+There are other useful helper functions such as `InitSurface()`, `InitSwapchain()`, `InitRenderTarget()`, and more. Please view the class source for more of an overview of what it currently supports
+
+## Extensions
+
+Adding extension support is quite easy.
+
+Here is an example of adding VK_KHR_sampler_ycbcr_conversion with all the extensions it requires as well
+```
+bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
+if (mp_extensions) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+}
+ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+if (mp_extensions) {
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+} else {
+ printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
+ return;
+}
+ASSERT_NO_FATAL_FAILURE(InitState());
+```
+
+The pattern breaks down to
+- Check and add Instance extensions to list
+- Init Framework which creates `VkInstance`
+- Check and add Device extensions to list
+- Init State which creates the `VkDevice`
+- **Optional** skip if test is not worth moving out without extension support
+
+### Vulkan Version
+
+As [raised in a previous issue](https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/1553), when a Vulkan version is enabled, all extensions that are required are exposed. (For example, if the test is created as a Vulkan 1.1 application, then the `VK_KHR_16bit_storage` extension would be supported regardless as it was promoted to Vulkan 1.1 core)
+
+If a certain version of Vulkan is needed a test writer can call
+
+```
+SetTargetApiVersion(VK_API_VERSION_1_1);
+ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+```
+
+Later in the test it can also be checked
+```
+if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
+ // ...
+}
+```
+
+### Getting Function Pointers
+
+A common case for checking the version is in order to find how to correctly get extension function pointers.
+
+```
+// Create aliased function pointers for 1.0 and 1.1+ contexts
+PFN_vkBindImageMemory2KHR vkBindImageMemory2Function = nullptr;
+if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
+ vkBindImageMemory2Function = vk::BindImageMemory2;
+} else {
+ vkBindImageMemory2Function = (PFN_vkBindImageMemory2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkBindImageMemory2KHR");
+}
+
+// later in code
+vkBindImageMemory2Function(device(), 1, &bind_image_info);
+```
+
+## Error Monitor
+
+The `ErrorMonitor *m_errorMonitor` in the `VkRenderFramework` becomes your best friend when you write tests
+
+This small class handles checking all things to VUID and are ultimately what will "pass or fail" a test
+
+The few common patterns that will cover 99% of cases are:
+
+- For checking a call invokes an VUID error
+```
+m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerCreateInfo-addressModeU-01646");
+vk::CreateSampler(m_device->device(), &sci, NULL, &BadSampler);
+m_errorMonitor->VerifyFound();
+```
+
+- For making sure there is no error (positive test)
+```
+m_errorMonitor->ExpectSuccess();
+vk::BindBufferMemory(m_device->device(), buffer, buffer_mem, 0);
+m_errorMonitor->VerifyNotFound();
+```
+
+- When it is possible another VUID will be triggered that you are not testing. This usually happens due to making something invalid can cause a chain effect causing other things to be invalid as well.
+ - Note: If the `SetUnexpectedError` is never called it will not fail the test
+```
+m_errorMonitor->SetUnexpectedError("VUID-VkImageMemoryRequirementsInfo2-image-01590");
+m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageMemoryRequirementsInfo2-image-02280");
+vkGetImageMemoryRequirements2Function(device(), &mem_req_info2, &mem_req2);
+m_errorMonitor->VerifyFound();
+```
+
+- When you expect multpile VUID to be triggered. This is also be a case if you expect the same VUID to be called twice.
+ - Note: If both VUID are not found the test will fail
+```
+m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00905");
+m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00907");
+vk::CmdBeginRenderPass(m_commandBuffer->handle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
+m_errorMonitor->VerifyFound();
+```
+
+- When a VUID is dependent on an extension being present
+ - Note: The start of the test might already have a boolean that checks for extension support
+```
+const char* vuid = DeviceExtensionEnabled(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME) ? "VUID-VkImageCopy-dstImage-01733" : "VUID-VkImageCopy-extent-00164";
+m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
+m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, ©_region);
+m_errorMonitor->VerifyFound();
+```
+
+> Note: It is general good practice to only have one Vulkan function between the m_errorMontior calls to ensure the test is only applied to the single function call being tested
+
+## Device Profiles API
+
+There are times a test writer will want to test a case where an implementation returns a certain support for a format feature or limit. Instead of just hoping to find a device that supports a certain case, there is the Device Profiles API layer. This layer will allow a test writer to inject certain values for format features and/or limits.
+
+Here is an example of how To enable it to allow overriding format features (limits are the same idea, just different function names):
+```
+if (!EnableDeviceProfileLayer()) {
+ printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
+ return;
+}
+
+ASSERT_NO_FATAL_FAILURE(Init());
+
+PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
+PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
+
+// Load required functions
+if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
+ printf("%s Failed to device profile layer.\n", kSkipPrefix);
+ return;
+}
+```
+
+This is an example of injecting the `VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT` feature for the `VK_FORMAT_R32G32B32A32_UINT` format. This will force the Validations Layers to act as if the implementation had support for this feature later in the test's code.
+```
+fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32G32B32A32_UINT, &formatProps);
+formatProps.optimalTilingFeatures |= VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT;
+fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32G32B32A32_UINT, formatProps);
+```
+
+## Running Tests on DevSim and MockICD
+
+To allow a much higher coverage of testing the Validation Layers a test writer can use the Device Simulation layer. [More details here](https://www.lunarg.com/new-vulkan-dev-sim-layer/), but the main idea is the layer intercepts the Physical Device queries allowing testing of much more device properties. The Mock ICD is a "null driver" that is used to handle the Vulkan calls as the Validation Layers mostly only care about input "input" of the driver. If your tests relies on the "output" of the driver (such that a driver/implementation is correctly doing what it should do with valid input), then it might be worth looking into the [Vulkan CTS instead](https://github.com/KhronosGroup/Vulkan-Guide/blob/master/chapters/vulkan_cts.md).
+
+Both the Device Simulation Layer and MockICD can be found in the Vulkan SDK, otherwise, they will need to be cloned from [VulkanTools](https://github.com/LunarG/VulkanTools/blob/master/layersvt/VkLayer_device_simulation.json.in) and [Vulkan-Tools](https://github.com/KhronosGroup/Vulkan-Tools/tree/master/icd) respectfully. Currently, you will need to build the MockICD from source (found in Vulkan SDK or in a local copy somewhere)
+
+Here is an example of setting up and running the Device Simulation layer with MockICD on a Linux environment
+```
+export VULKAN_SDK=/path/to/vulkansdk
+export VVL=/path/to/Vulkan-ValidationLayers
+
+# Add built Vulkan Validation Layers... remember it was Rule #1
+export VK_LAYER_PATH=$VVL/build/layers/
+
+# This step can be skipped if the Vulkan SDK is properly installed
+# Add path for device simulation layer
+export VK_LAYER_PATH=$VK_LAYER_PATH:$VULKAN_SDK/etc/vulkan/explicit_layer.d/
+export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$VULKAN_SDK/lib/
+
+# Set MockICD to be driver
+export VK_ICD_FILENAMES=/path/to/Vulkan-Tools/build/icd/VkICD_mock_icd.json
+
+# Set device simulation profile to a valid json file
+# There are a set of profiles used in CI in the device_profiles folder
+export VK_DEVSIM_FILENAME=$VVL/tests/device_profiles/mobile_chip.json
+
+# Running tests just need the extra --devsim added
+$VVL/build/tests/vk_layer_validation_tests --devsim --gtest_filter=TestName
+```
\ No newline at end of file
diff --git a/docs/debug_printf.md b/docs/debug_printf.md
index d1fb6e5..a408844 100644
--- a/docs/debug_printf.md
+++ b/docs/debug_printf.md
@@ -14,31 +14,65 @@
Debug Printf is implemented in the SPIR-V Tools optimizer and the `VK_LAYER_KHRONOS_validation` layer.
It allows developers to debug their shader code by "printing" any values of interest to the debug callback or stdout.
-This document covers the operation of the layer portion of the implementation.
+
+Debug Printf can easily be enabled and configured using the [Vulkan Configurator](https://vulkan.lunarg.com/doc/sdk/latest/windows/vkconfig.html) included with the Vulkan SDK. Or you can manually enable and configure the layer by following the directions below.
+
+## Limitations
+
+Debug Printf is based on the GPU-assisted validation (GPU-AV) framework, and therefore shares a limitation with it: it requires an additional bound descriptor set. This limitation can make it difficult for mobile apps and other apps that fully subscribe their descriptor sets to use this feature. Some improvements to the GPU-AV interface are being planned in the near future that will make this feature (and GPU-AV in general) more usable for such apps.
## Basic Operation
The basic operation of Debug Printf is comprised of instrumenting shader code to return any values used in a debugPrintfEXT operation when the shader is executed.
The instrumentation is similiar to the process described in the GPU Assisted Validation documentation.
-The debugPrintfEXT operations in the shader are replaced with code to copy the values to be printed to a buffer provided by the validation layer.
-If the shader is executed without instrumentation, the driver will ignore all debugPrintfEXT operations.
+The Debug Printf instructions in the shader are replaced with code to copy the values to be printed to a buffer provided by the validation layer.
+If the shader is executed without instrumentation, the driver will ignore all Debug Printf instructions.
After the shader is executed, the layer uses the values returned to construct a string and send the string in a message to the debug callback.
Note that the printf will generate a string each time the shader containing it is run.
A vertex shader running to draw a triangle will result in 3 messages from a single printf in the shader, unless care is taken in the shader to do otherwise.
+## Enabling Debug Printf in GLSL Shaders
-## Enabling Debug Printf
+A new extension and function have been added to GLSL to enable this capability for Vulkan. Documentation for the GL_EXT_debug_printf extension and the debugPrintfEXT() function can be found
+[here](https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_debug_printf.txt)
+Essentially, the debugPrintfExt(format-string, value0, value1, ... ) function allows programmers to do a formatted print of any scalar or vector values in a shader, similar to the *printf() functions in C/C++.
+
+There is a positive layer validation test that demonstrates simple use of Debug Printf.
+It is called "GpuDebugPrintf" and is in
+[vklayertests_gpu.cpp](https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/master/tests/vklayertests_gpu.cpp)
+in the Vulkan-ValidationLayers repository.
+
+## Enabling Debug Printf in SPIR-V Shaders
+
+A new extended instruction set has been added to SPIR-V to allow developers to directly code debug printfs in their shader. To execute debug printfs in a SPIR-V shader, a developer will need the following two instructions specified:
+
+OpExtension "SPV_KHR_non_semantic_info"
+%N0 = OpExtInstImport NonSemantic.DebugPrintf
+
+Debug printf operations can then be specified in any function with the following instruction:
+
+%NN = OpExtInst %void %N0 1 %N1 %N2 %N3 ...
+
+where:
+
+* N0 is the result id of the OpExtInstImport NonSemantic.DebugPrintf
+* 1 is the opcode of the DebugPrintf instruction in NonSemantic.DebugPrintf
+* N1 is the result of an OpString containing the format for the debug printf
+* N2, N3, ... are result ids of scalar and vector values to be printed
+* NN is the result id of the debug printf operation. This value is undefined.
+
+## Enabling Debug Printf in Vulkan-ValidationLayers
Debug Printf is an object in the KHRONOS_validation layer, so the VK_LAYER_KHRONOS_validation layer must be loaded.
See the LAYER_CONFIGURATION document for information on enabling the VK_LAYER_KHRONOS_validation layer.
Validation itself is not necessary for Debug Printf and can be disabled without affecting Debug Printf functionality.
-Debug Printf can be enabled either through a vk_layer_settings.txt file that must be in the program's working directory, or by setting an environment variable Within a settings file, specify:
+Debug Printf can be enabled either through a vk_layer_settings.txt file that must be in the program's working directory, or by setting an environment variable Within a settings file, specify:
khronos_validation.enables = VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT or set VK_LAYER_ENABLES=VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT as an environment variable.
Debug Printf has been implemented as a state tracker validation object, as a peer to GPU Assisted Validation.
-Because of this, and coupled with the philosophy that validation objects will not communicate with each other, one should never enable both gpu assisted validation and shader printf at the same time.
+Because of this, and coupled with the philosophy that validation objects will not communicate with each other, one should never enable both GPU Assisted Validation and Debug Printf at the same time.
Debug Printf will be disabled if GPU Assisted Validation is enabled.
The strings resulting from a Debug Printf will be sent to the debug callback which is either specified by the app, or by default sent to stdout.
@@ -57,10 +91,10 @@
* khronos_validation.printf_buffer_size = size in bytes
-This setting allows you to specify the size of the per draw buffer, in bytes of device memory, for returning ebug Printf values.
+This setting allows you to specify the size of the per draw buffer, in bytes of device memory, for returning Debug Printf values.
The default is 1024 bytes.
Each printf will require 32 bytes for header information and an additonal 4 bytes for each 32 bit value being printed, and an additional 8 bytes for each 64 bit value.
-If printfs are truncated due to lack of memory, a warning will be sent to the vulkan debug callback.
+If printfs are truncated due to lack of memory, a warning will be sent to the Vulkan debug callback.
* khronos_validation.printf_verbose = 'false' or 'true'
@@ -68,7 +102,7 @@
* khronos_validation.printf_to_stdout = 'false' or 'true'
-By default, debug printf messages are sent to the debug callback, but this setting will instead send Debug Printf strings to stdout.
+By default, Debug Printf messages are sent to the debug callback, but this setting will instead send Debug Printf strings to stdout.
This can also be enabled by setting the environment variable DEBUG_PRINTF_TO_STDOUT.
### Debug Printf Format String
@@ -77,11 +111,11 @@
Format for specifier is "%"*precision* <d, i, o, u, x, X, a, A, e, E, f, F, g, G, or ul>
-Format for vector specifier is "%"*precision*"v" [2, 3, or 4] [specifiers list above]
+Format for vector specifier is "%"*precision*"v" [2, 3, or 4] [specifiers list above]
- The vector value separator is ", "
- "%%" will print as "%"
-- No length modifiers. Everything except ul is 32 bits, and ul values are printed only in hex
+- No length modifiers. Everything except ul is 32 bits, and ul values are printed only in hex
- No strings or characters allowed
- No flags or width specifications allowed
- No error checking for invalid format strings is done.
@@ -91,6 +125,3 @@
Analogous to GPU Assisted Validation, Debug Printf uses device memory and a descriptor set to allow the shader instrumentation code to return values to the layer.
See the gpu_validation document for more information
-### Debug Printf Test / Example
-
-There is a positive layer validation test that demonstrates simple use of Debug Printf. It is called "GpuDebugPrintf" and is in vkpositivelayertests.cpp
diff --git a/docs/gpu_validation.md b/docs/gpu_validation.md
index 864025f..7887818 100644
--- a/docs/gpu_validation.md
+++ b/docs/gpu_validation.md
@@ -1,5 +1,5 @@
<!-- markdownlint-disable MD041 -->
-<!-- Copyright 2015-2019 LunarG, Inc. -->
+<!-- Copyright 2015-2020 LunarG, Inc. -->
[![Khronos Vulkan][1]][2]
[1]: https://vulkan.lunarg.com/img/Vulkan_100px_Dec16.png "https://www.khronos.org/vulkan/"
@@ -15,6 +15,8 @@
GPU-Assisted Validation is implemented in the SPIR-V Tools optimizer and the `VK_LAYER_KHRONOS_validation` layer.
This document covers the design of the layer portion of the implementation.
+GPU-Assisted Validation can easily be enabled and configured using the [Vulkan Configurator](https://vulkan.lunarg.com/doc/sdk/latest/windows/vkconfig.html) included with the Vulkan SDK. Or you can manually enable and configure by following the directions below.
+
## Basic Operation
The basic operation of GPU-Assisted Validation is comprised of instrumenting shader code to perform run-time checking of shaders and
@@ -675,6 +677,8 @@
|Geometry |3 |
|Fragment |4 |
|Compute |5 |
+|Task |5267 |
+|Mesh |5268 |
|RayGenerationNV|5313 |
|IntersectionNV |5314 |
|AnyHitNV |5315 |
@@ -695,6 +699,8 @@
|Geometry |PrimitiveID |InvocationID | unused |
|Fragment |FragCoord.x |FragCoord.y | unused |
|Compute |GlobalInvocID.x |GlobalInvocID.y|GlobalInvocID.z|
+|Task |GlobalInvocID.x |GlobalInvocID.y|GlobalInvocID.z|
+|Mesh |GlobalInvocID.x |GlobalInvocID.y|GlobalInvocID.z|
|RayGenerationNV|LaunchIdNV.x |LaunchIdNV.y |LaunchIdNV.z |
|IntersectionNV |LaunchIdNV.x |LaunchIdNV.y |LaunchIdNV.z |
|AnyHitNV |LaunchIdNV.x |LaunchIdNV.y |LaunchIdNV.z |
diff --git a/docs/images/sync_diagram_source.txt b/docs/images/sync_diagram_source.txt
new file mode 100644
index 0000000..66e5edb
--- /dev/null
+++ b/docs/images/sync_diagram_source.txt
@@ -0,0 +1,29 @@
+Copyright 2015-2020 LunarG, Inc.
+
+Creative Commons License:
+Attribution-NoDerivatives 4.0 International (CC BY-ND 4.0)
+https://creativecommons.org/licenses/by-nd/4.0/
+
+Diagrams sync_wrr.png and sync_wrw.png were created using
+
+https://bramp.github.io/js-sequence-diagrams/
+
+Script for wrr diagram:
+
+Title: WRR Sequence
+W->R0: M
+R0 -- > W: Most recent
+R1 -- > W: Most recent
+R1->R2: E
+R2-->R1: Most Recent
+R3-->W: Most Recent
+Note right of R3: R3 not in\nscope of E
+
+Script for wrw diagram:
+
+Title: WRW Sequence
+W0->R: M
+R --> W0: Most recent
+R -> W1: E
+W1 -- > R: Most recent
+
diff --git a/docs/images/sync_wrr.png b/docs/images/sync_wrr.png
new file mode 100644
index 0000000..ad8d1c1
--- /dev/null
+++ b/docs/images/sync_wrr.png
Binary files differ
diff --git a/docs/images/sync_wrw.png b/docs/images/sync_wrw.png
new file mode 100644
index 0000000..116e079
--- /dev/null
+++ b/docs/images/sync_wrw.png
Binary files differ
diff --git a/docs/khronos_validation_layer.md b/docs/khronos_validation_layer.md
index 7dcc90d..33acd4c 100644
--- a/docs/khronos_validation_layer.md
+++ b/docs/khronos_validation_layer.md
@@ -12,16 +12,84 @@
[3]: https://i.creativecommons.org/l/by-nd/4.0/88x31.png "Creative Commons License"
[4]: https://creativecommons.org/licenses/by-nd/4.0/
-The `VK_LAYER_KHRONOS_validation` layer supports the following validation areas:
+The `VK_LAYER_KHRONOS_validation` layer supports the following validation coverage areas:
-- Thread safety validation
-- Stateless parameter validation
-- Object lifetime validation
-- Core validation checks
-- GPU-Assisted validation
-- Best practices validation
-- Debug Printf functionality
-- Handle wrapping functionality
+- [Core validation](https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/master/docs/core_checks.md)
+- [Stateless parameter validation](https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/master/docs/stateless_validation.md)
+- [Object lifetime validation](https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/master/docs/object_lifetimes.md)
+- [GPU-Assisted validation](https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/master/docs/gpu_validation.md)
+- [Thread safety validation](https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/master/docs/thread_safety.md)
+- [Synchronization validation](https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/master/docs/synchronization_usage.md)
+- [Best practices validation](https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/master/docs/best_practices.md)
+- [Debug Printf functionality](https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/master/docs/debug_printf.md)
+- [Handle wrapping functionality](https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/master/docs/handle_wrapping.md)
-Details for the functionality contained in each of these areas can be viewed in their respective validation detail documents, located in this directory.
+**Note:**
+
+* Most *Khronos Validation layer* features can be used simultaneously. However, this could result in noticeable performance degradation. The best practice is to run *Core validation*, *GPU-Assisted validation*, *Synchronization Validation* and *Best practices validation* features individually.
+
+* *Debug Printf functionality* and *GPU-Assisted validation* cannot be run at the same time.
+
+## Layer Controls
+Layer behavior is controlled through either a layer settings file or an extension.
+The layer settings file allows a user to control various layer features and behaviors by providing easily modifiable settings.
+The Vulkan Validation Features extension provides layer controls, while the Vulkan Debug Utils extension profides methods of
+accessing and controlling feedback from the layers:
+
+| Extension | Description |
+| ------------------------ | ---------------------------- |
+| [VK_EXT_validation_features](#validationfeatures) | allows application control of various layer features |
+| [VK_EXT_debug_utils](#debugutils) | allows application control and capture of debug reporting information |
+
+
+See the [Layers Overview and Configuration](../LAYER_CONFIGURATION.md) document for more detailed information on configuring Vulkan layers.
+
+### <a name="validationfeatures"></a>VK\_EXT\_validation\_features
+The preferred method for an application to programmatically control validation layer features is through the `VK_EXT_validation_features` extension.
+Using this extension allows an application to enable or disable specific Khronos validation features.
+Note that this extension provides low-level control to an application, and that some combinations of enable/disable settings may produce undefined behavior.
+
+The `VK_EXT_validation_features` flags can be used to disable validation corresponding to the following deprecated layers:
+
+| Setting this `VK_EXT_validation_features` disable flag | Corresponds to not loading this deprecated layer |
+| -------------------------------------------------------|--------------------------------------------------|
+| `VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT` | `VK_LAYER_GOOGLE_threading` |
+| `VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT` | `VK_LAYER_LUNARG_parameter_validation` |
+| `VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT` | `VK_LAYER_LUNARG_object_tracker` |
+| `VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT` | `VK_LAYER_LUNARG_core_validation` |
+| `VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT` | `VK_LAYER_GOOGLE_unqiue_objects` |
+
+Refer to [VK_EXT_validation_features](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_validation_features)
+in the Vulkan specification for details on this extension.
+
+### <a name="debugutils"></a>VK\_EXT\_debug\_utils
+The preferred method for an app to control layer logging is via the `VK_EXT_debug_utils` extension.
+Using the `VK_EXT_debug_utils` extension allows an application to register multiple messengers with the layers.
+Each messenger can trigger a message callback when a log message occurs.
+Some messenger callbacks may log the information to a file, others may cause a debug break point or other-application defined behavior.
+An application can create a messenger even when no layers are enabled, but they will only be called for loader and, if implemented, driver events.
+Each message is identified by both a severity level and a message type.
+Severity levels indicate the severity of the message that should be logged including: error, warning, etc.
+Message types indicate the specific type of message including: validation, performance, etc.
+Some layers return a unique message ID string per message as well.
+Using the severity, type, and message ID, an application can easily filter the messages received by their messenger callback.
+
+When reporting an error, the KHRONOS validation layer returns relevant specification information and a link to that information
+in the official Vulkan specification. Layers included in a Vulkan SDK will link to a version of the Vulkan specification
+annotated with valid usage identifiers.
+
+#### Message Types As Reported By VK\_EXT\_debug\_utils flags:
+
+| Type | Debug Utils Severity | Debug Utils Type |
+| ---------|----------------------------------|------------------------------|
+| Error | `VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT` | `VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT` |
+| Warn | `VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT` | `VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT` |
+| Perf Warn | `VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT` | `VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT` |
+| Info | `VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT` | `VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT` or `VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT` |
+
+Refer to [VK_EXT_debug_utils](https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VK_EXT_debug_utils)
+in the Vulkan Specification for details on this feature.
+
+
+
diff --git a/docs/synchronization.md b/docs/synchronization.md
new file mode 100644
index 0000000..dfad645
--- /dev/null
+++ b/docs/synchronization.md
@@ -0,0 +1,1341 @@
+<!-- markdownlint-disable MD041 -->
+<!-- Copyright 2015-2020 LunarG, Inc. -->
+[![Khronos Vulkan][1]][2]
+
+[1]: https://vulkan.lunarg.com/img/Vulkan_100px_Dec16.png "https://www.khronos.org/vulkan/"
+[2]: https://www.khronos.org/vulkan/
+
+# Synchronization Validation Design Documentation (alpha/phase1 release)
+
+[![Creative Commons][3]][4]
+
+[3]: https://i.creativecommons.org/l/by-nd/4.0/88x31.png "Creative Commons License"
+[4]: https://creativecommons.org/licenses/by-nd/4.0/
+
+Authors: Tobin Ehlis, John Zulauf
+
+
+[TOC]
+
+
+
+## Overview
+
+The Vulkan API features a number of unique synchronization primitives to express execution and memory dependencies and currently validation only has limited support for tracking fence and semaphore primitives.
+
+
+
+Execution and memory dependencies are used to solve data hazards, i.e. to ensure that read and write operations occur in a well-defined order. Write-after-read hazards can be solved with just an execution dependency, but read-after-write and write-after-write hazards need appropriate memory dependencies to be included between them. If an application does not include dependencies to solve these hazards, the results and execution orders of memory accesses are undefined.
+
+This document is intended to outline a design that will unify the tracking of all Vulkan memory accesses and synchronization primitives within Vulkan Validation. Such a model will enable flagging error cases where synchronization primitives are missing, but also allow for visualization of such primitives and provide for recommendations on optimal use of synchronization for any given combination of Vulkan commands and resources.
+
+The pipelined and multi-threaded nature of Vulkan makes it particularly important for applications to correctly insert needed synchronization primitives, and for validation to diagnose unprotected hazards. These hazards are:
+
+
+<table>
+ <tr>
+ <td>RAW
+ </td>
+ <td>Read-after-write
+ </td>
+ <td>Occurs when a subsequent operation uses the result of a previous operation without waiting for the result to be completed.
+ </td>
+ </tr>
+ <tr>
+ <td>WAR
+ </td>
+ <td>Write-after-read
+ </td>
+ <td>Occurs when a subsequent operation overwrites a memory location read by a previous operation before that operation is complete. (requires only execution dependency)
+ </td>
+ </tr>
+ <tr>
+ <td>WAW
+ </td>
+ <td>Write-after-write
+ </td>
+ <td>Occurs when a subsequent operation writes to the same set of memory locations (in whole or in part) being written by a previous operation.
+ </td>
+ </tr>
+ <tr>
+ <td>WRW
+ </td>
+ <td>Write-racing-write
+ </td>
+ <td>Occurs when unsynchronized subpasses/queues perform writes to the same set of memory locations.
+ </td>
+ </tr>
+ <tr>
+ <td>RRW
+ </td>
+ <td>Read-racing-write
+ </td>
+ <td>Occurs when unsynchronized subpasses/queues perform read and write operations on the same set of memory locations
+ </td>
+ </tr>
+</table>
+
+
+## Algorithmic Overview
+
+### Approach
+
+In order to validate synchronization the effect of action and synchronization commands must be tracked. The full validation can *only* be done at queue submission time, when the full context of the command batches is known. However, partial validation of hazards knowable within the context of a single recorded command buffer can be done at record time at. This partial validation includes record time detection of internally present hazards during sub-pass and can be extended to include secondary command buffer execution. To support this usage, the validation and update components must be designed to operate at record, secondary command buffer execute record, and queue submit time.
+
+ Synchronization validation centers around examining the previous access and synchronization operations for a range of memory addresses against a current access or operation against that same range. The _state_ (Resource Access State) tracks the most recent read, write, and synchronization operations for a given range of memory addresses. These are captured in contexts (Access Context) which reflect the Queue, Command Buffer, or Subpass instance in which the memory accesses were made. This first approach is sufficient for single command buffer validation. Note that only the most recent state (relative to *write* operations) is retained. Additionally, the “dependency chain” logic can be represented by a cumulative state reflecting the impact of all synchronization operations on the most recent read/write state. Between the _state_ and _context_, enough information is present to do record time validation of single command buffers.
+
+### Most Recent Access
+
+When detecting memory access hazards, synchronization validation considers only the most recent access for comparison. All prior hazards are assumed to have been reported.
+
+For read operations the most recent access rules apply to prior reads with execution barriers (or ordering) relative to the current read. The prior write access is only considered the most recent access if no intervening prior read has occurred that *happens-before* the current read. Consider the following sequence of access and barriers (listed in submission order) acting on the same memory address:
+
+
+
+| Operation | Description |
+| --------- | ------------------------------------------------------------ |
+| W | write operation |
+| M | memory barrier guarding access at R0 |
+| R0 | first read operation |
+| R1 | second read operation |
+| E | execution barrier s.t. R2 *happens-after R1* |
+| R2 | third read operation |
+| R3 | fourth read operation with stage not in second execution scope of E |
+
+![sync_wrr](images/sync_wrr.png)
+
+For write hazard checks in a given range of memory addresses, if there are intervening read operations between the current write and the most recent previous write, these intervening read operations are considered the most recent access. In that case, write-after-write checks are not done.
+
+Consider the following sequence of operations one the same memory address:
+
+| Operation | Description |
+| --------- | --------------------------------------- |
+| W0 | first write operation |
+| M | memory barrier guarding access at R |
+| R | read access |
+| E | execution barrier guarding access at W1 |
+| W1 | second write operation |
+
+![sync_wrw](images/sync_wrw.png)
+
+In this case, a read-after-write check is done for R based on W0 and M, and a write-after-read check is performed on W1 based on R and E. W1 is not checked against W0 for write-after-write. If W0, M, R **is** not a hazard, this guarantees W0 is available and visible to R, and thus to any operations that *happen-after*. As such, the correctness of R, E, W1 depends solely on those operations. The correctness of the entire sequence can be assured by pairwise hazard checks.
+
+### Tracking Across Command Buffers
+
+For multiple command buffers/secondary buffers, a partial recording of memory accesses and synchronization operations is required. Current design targets the use of storing the “first” access information (first reads, first write), along with the either a recording of all synchronization operations *or* some "barrier state" that can be stored with each “first access”. This approach should be familiar to those that have seen the “image layout” queue-submit, and execute-command validation, which validates against a similar “first” record.
+
+Overall the operations to perform include
+
+* Access/operation validation against current state. This involves lookup of the affected state, potentially traversing a context tree or barrier record, and then comparing the access relative to the state -- i.e. the previous read and/or write operations in light of the synchronization operations recorded in the state
+* Reporting detected hazard
+* Updating the current state to reflect the access or operation.
+
+Additionally
+
+* Traversal of context trees/barrier replay (or reconstruction)
+* Initialization (import) or Resolution (export) of access contexts to parent or subsequent contexts
+
+
+## Memory Access Storage
+
+Memory access is characterized by the _memory extent_ and _memory usage_. Memory extent described the memory affected including the `VkMemory` handle, offset, size, and (for images) subresource range. The memory usage describe the pipeline stage (`VkPipelineStageFlagBits`) and memory access (`VkAccessFlagBits`) -- for example “vertex shader stage / shader read”. A memory access only describes a single usage for a given extent.
+
+
+### Memory Address Space
+
+To simplify tracking and updating the state of memory extents as listed below, state is stored in a consistent way for all resource types. Also, to eliminate needing to define separate address spaces for each device memory allocations, VkMemory are placed at “fictitious” base addresses (FBA) within a global address space using a simple “next available” allocation scheme. (Which is robust for all rational Vulkan usage models for months of runtime.) However, because the actual memory organization of certain resources is opaque, the tracking is divided into Linear and Ideal extents which exist in independent spaces.
+
+
+### Memory Extent Definitions and Comparisons
+
+Memory extent can be specified in a variety of ways:
+
+
+<table>
+ <tr>
+ <td>Memory range
+ </td>
+ <td>A <code>VkMemory </code>handle referencing a specific memory allocation, and a contiguous range within the Vulkan memory allocation (offset, size) further offset in the Linear address space by the FBA
+ </td>
+ </tr>
+ <tr>
+ <td>Linear (transparent) image subresource range
+ </td>
+ <td>A <code>VkImage</code> handle for transparent (linear tiling) image with a <code>VkSubresourceRange </code>are mapped to the (potentially non contiguous) memory ranges of the <code>VkMemory </code>bound to the VkImage for each subresource within the range.
+ </td>
+ </tr>
+ <tr>
+ <td>Tiled (opaque) image subresource range
+ </td>
+ <td>A VkImage handle to an opaque (optimal tiling) image with a VkSubresourceRange which cannot be mapped to a specific subset of the the <code>VkMemory </code>bound to the <code>VkImage</code>. The subresources are encoded to the “Idealized” memory range, specific to the image creation parameters which can only be compared relative to “compatible” aliases. Otherwise all subresources within the range are assumed to alias to *every* device memory address bound to the image.
+ </td>
+ </tr>
+ <tr>
+ <td>Sparsely bound Extents
+ </td>
+ <td>TBD
+ </td>
+ </tr>
+</table>
+
+
+These distinctions affect the ability of memory references to be compared w.r.t. “overlap” --
+
+
+<table>
+ <tr>
+ <td>For same memory handle
+ </td>
+ <td>Memory range
+ </td>
+ <td>Linear Image
+ </td>
+ <td>Tiled Image
+ </td>
+ </tr>
+ <tr>
+ <td>Memory range
+ </td>
+ <td>Compare range
+ </td>
+ <td>Encode subresource range to memory range and compare..
+ </td>
+ <td>Compare memory range to all accesses within image binding memory range.
+ </td>
+ </tr>
+ <tr>
+ <td>Linear Image
+ </td>
+ <td>
+ </td>
+ <td>Encode subresource range to memory range and compare.
+ </td>
+ <td>Compare memory range to all accesses within image binding memory range.
+ </td>
+ </tr>
+ <tr>
+ <td>Tiled image
+ </td>
+ <td>
+ </td>
+ <td>
+ </td>
+ <td>For “compatible*” tiled images, compare encoded “idealized” memory ranges. For incompatible images, every subresource is assumed to alias to any subresource in the other image.
+ </td>
+ </tr>
+</table>
+
+
+* Compatible tiled images are those with same image resource handle, or with the same image create info with `VK_IMAGE_CREATE_ALIAS_BIT `set and the same memory handle binding offset.
+
+For incompatible memory extent types any overlap of the bound range must be assumed to be an overlap of the entire bound range (and thus all subresource ranges). Note: looking for binding range overlap is a likely important first step before doing more detailed overlap analysis. Also, as a lower precision option, any comparison of non-similar resources (offset or create info) could revert to the opaque “tiled” case for linear images.
+
+
+### Algorithmic Aside: Interval Trees
+
+Several of the lookups below require tracking and comparing non-unique collections of intervals (memory binding range, mip levels or slices in a subresource). To compress storage improve traversal of the access state these intervals are stored in non-overlapping interval trees -- effectively a run-length compression for ranges of memory addresses over which the state is constant.
+
+The implementation used is a wrapper to std::map (which is typically implemented as a red-black tree), that implements a non-overlapping 1 dimensional range map. Conversion to and from subresource address space is performed by a “encoder”/”generator” classes the create a set of single-dimensional ranges from subresource range definitions. For buffer and linear images, the index for the interval tree represents device memory in an idealized/simplified memory allocation scheme for VkDeviceMemory allocations. For tiled/opaque images, the index represents an idealized memory range, not corresponding to device memory in any way.
+
+
+### Memory Usage Specification
+
+Vulkan classifies memory access by pipeline stage and access. However for purposes of tracking specific access, availability, and visibility state changes the two masks would allow for aliasing that could hide hazards. In order to avoid that aliasing, the valid combinations of Stage and Access flags can be combined into memory usages-- with each represented by a unique index (currently 55 valid combinations) )and tracked with single bit within a mask(list in roughly pipeline order).
+
+<table>
+ <tr>
+ <td>Stage
+ </td>
+ <td>Stage/Access
+ </td>
+ </tr>
+ <tr>
+ <td>Draw Indirect
+ </td>
+ <td>DRAW_INDIRECT_INDIRECT_COMMAND_READ
+<p>
+DRAW_INDIRECT_TRANSFORM_FEEDBACK_COUNTER_READ_EXT
+ </td>
+ </tr>
+ <tr>
+ <td>Vertex Input
+ </td>
+ <td>VERTEX_INPUT_INDEX_READ
+<p>
+VERTEX_INPUT_VERTEX_ATTRIBUTE_READ
+ </td>
+ </tr>
+ <tr>
+ <td>Vertex Shader
+ </td>
+ <td>VERTEX_SHADER_SHADER_READ
+<p>
+VERTEX_SHADER_SHADER_WRITE
+<p>
+VERTEX_SHADER_UNIFORM_READ
+ </td>
+ </tr>
+ <tr>
+ <td>Tessellation Control
+ </td>
+ <td>TESSELLATION_CONTROL_SHADER_SHADER_READ
+<p>
+TESSELLATION_CONTROL_SHADER_SHADER_WRITE
+<p>
+TESSELLATION_CONTROL_SHADER_UNIFORM_READ
+ </td>
+ </tr>
+ <tr>
+ <td>Tessellation Evaluation
+ </td>
+ <td>TESSELLATION_EVALUATION_SHADER_SHADER_READ
+<p>
+TESSELLATION_EVALUATION_SHADER_SHADER_WRITE
+<p>
+TESSELLATION_EVALUATION_SHADER_UNIFORM_READ
+ </td>
+ </tr>
+ <tr>
+ <td>Geometry Shader
+ </td>
+ <td>GEOMETRY_SHADER_SHADER_READ
+<p>
+GEOMETRY_SHADER_SHADER_WRITE
+<p>
+GEOMETRY_SHADER_UNIFORM_READ
+ </td>
+ </tr>
+ <tr>
+ <td>Transform Feedback
+ </td>
+ <td>TRANSFORM_FEEDBACK_EXT_TRANSFORM_FEEDBACK_COUNTER_WRITE_EXT
+<p>
+TRANSFORM_FEEDBACK_EXT_TRANSFORM_FEEDBACK_WRITE_EXT
+ </td>
+ </tr>
+ <tr>
+ <td>Fragment Density
+ </td>
+ <td>FRAGMENT_DENSITY_PROCESS_EXT_FRAGMENT_DENSITY_MAP_READ_EXT
+ </td>
+ </tr>
+ <tr>
+ <td>Task Shader
+ </td>
+ <td>TASK_SHADER_NV_SHADER_READ
+<p>
+TASK_SHADER_NV_SHADER_WRITE
+<p>
+TASK_SHADER_NV_UNIFORM_READ
+ </td>
+ </tr>
+ <tr>
+ <td>Mesh Shader
+ </td>
+ <td>MESH_SHADER_NV_SHADER_READ
+<p>
+MESH_SHADER_NV_SHADER_WRITE
+<p>
+MESH_SHADER_NV_UNIFORM_READ
+ </td>
+ </tr>
+ <tr>
+ <td>Shading Rate
+ </td>
+ <td>SHADING_RATE_IMAGE_NV_SHADING_RATE_IMAGE_READ_NV
+ </td>
+ </tr>
+ <tr>
+ <td>Early Fragement Tests
+ </td>
+ <td>EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ
+<p>
+EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE
+ </td>
+ </tr>
+ <tr>
+ <td>Fragment Shader
+ </td>
+ <td>FRAGMENT_SHADER_INPUT_ATTACHMENT_READ
+<p>
+FRAGMENT_SHADER_SHADER_READ
+<p>
+FRAGMENT_SHADER_SHADER_WRITE
+<p>
+FRAGMENT_SHADER_UNIFORM_READ
+ </td>
+ </tr>
+ <tr>
+ <td>Late Fragment Tests
+ </td>
+ <td>LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ
+<p>
+LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE
+ </td>
+ </tr>
+ <tr>
+ <td>Color Attachment Output
+ </td>
+ <td>COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ
+<p>
+COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ_NONCOHERENT_EXT
+<p>
+COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE
+ </td>
+ </tr>
+ <tr>
+ <td>Compute Shader
+ </td>
+ <td>COMPUTE_SHADER_SHADER_READ
+<p>
+COMPUTE_SHADER_SHADER_WRITE
+<p>
+COMPUTE_SHADER_UNIFORM_READ
+ </td>
+ </tr>
+ <tr>
+ <td>Transfer
+ </td>
+ <td>TRANSFER_TRANSFER_READ
+<p>
+TRANSFER_TRANSFER_WRITE
+ </td>
+ </tr>
+ <tr>
+ <td>Command Preprocess
+ </td>
+ <td>COMMAND_PREPROCESS_NV_COMMAND_PREPROCESS_READ_NV
+<p>
+COMMAND_PREPROCESS_NV_COMMAND_PREPROCESS_WRITE_NV
+ </td>
+ </tr>
+ <tr>
+ <td>Host Memory Access
+ </td>
+ <td>HOST_HOST_READ
+<p>
+HOST_HOST_WRITE
+ </td>
+ </tr>
+ <tr>
+ <td>Barrier operations
+ </td>
+ <td>IMAGE_LAYOUT_TRANSITION
+<p>
+QUEUE_FAMILY_OWNERSHIP_TRANSFER
+ </td>
+ </tr>
+</table>
+Note that of interest is also the “pipeline type” (compute, graphics, or transfer) of the action causing this memory access. It is needed when determining logically “earlier” and “later” stages of the pipeline for apply synchronization scope updates. This information is code-generated from parsing of the Vulkan specification, with appropriate snippets *manually* update within the code generation scripts.
+
+
+### Access Scopes
+
+Within the specification the scope of effect for synchronization operations is characterized differently for execution and memory access. Execution scopes are _expanded _to include logically earlier stage for “source” (or “first”) execution scopes, and logically later for “second” (or “destination”) execution scopes. Validation and update operations perform meta-stage substitution of `VK_PIPELINE_STAGE_ALL_COMMANDS_BIT `and `VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT `prior to stage expansion.
+
+The scope of memory access is instead _restricted_ to the set of accesses both legal for the execution scope as _provided_ to the synchronization operation and within the mask of access types to be included. Prior to any validation or update operations as described in subsequent sections, this _expansion_ or _restriction _is performed yielding _source execution scope, source access scope, destination execution scope, and destination access scope _which are encoded as bitmasks (encoding stage and stage/access appropriately)._._
+
+
+## State Tracking
+
+
+### Data Structures
+
+#### ResourceUsageTag
+
+A marker representing a specific access for error reporting or sequence specific operations.
+
+#### ResourceAccessState
+
+The specific access/barrier state for a given extent of memory (or idealized memory) addresses. The ResourceAccessState reflects the common state of a single contiguous range of memory addresses.
+
+Stores:
+
+* Write usage -- information about most recent write usage for the memory range
+ * State/Access of usage. Updated on write
+ * Write barriers -- the destination stage/access pairs which are _non-hazardous_ to the last write. Cleared on write.
+ * Memory access synchronization chain mask. Tracks the stages for which barriers applying to the write usage. Cleared on write.
+ * Usage tag. Updated on write
+ * None cleared by read operations
+* read usage -- Per stage, All cleared on write operations.
+ * Stage/Access of usage. Updated on stage read
+ * Execution (read) barriers -- the union of destination execution scopes for synchronization operations affecting this read at this stage
+ * Usage Tag. Updated on on stage read.
+
+Implements:
+
+* Hazard detection functions
+* State update/resolution operations
+
+#### ResourceAccessRangeMap
+
+Interval tree of ResourceAccessState for a given address space
+
+#### AccessContext
+
+ResourceAccessState and dependency information for a given “context” (for example within a given command buffer, but outside a renderpass, or within a given subpass of a renderpass instance)
+
+Stores:
+
+* Idealized address space ResourceAccessRangeMap
+* Linear address space ResourceAccessRangeMap
+* Subpass dependency and barrier information (for traversal within renderpass instances) if needed.
+
+Implements:
+
+* Hazard detection traversal over (potentially discontiguous) ranges for images and buffers
+* Resource addressing (linear/idealized) type resolution
+* VkMemory FBA offset
+* State update traversal over (potentially discontiguous) ranges for images and buffers
+* Subpass dependency graph traversal for state lookup and resolution operations (including support for RenderPass specific and Hazard detection operations)
+* Range map operations to split (and potentially combine) ResourceAccessState records, to ensure state changes only impact the correct portion of the address space.
+
+#### CommandBufferAccessContext
+
+container for all access contexts for a specific command buffer, and state reflecting the current context.
+
+Stores:
+
+* Command buffer state pointer (saves StateTracker lookup)
+* AccessContext for all outside-renderpass-instance operations
+* RenderPassAccessContext
+
+Implements:
+
+* RenderPass instance operations top level begin/next/end operations (calling RenderPassAccessContext operations)
+
+#### RenderPassAccessContext
+
+Manages the current access context and context transitions for render pass instance begin/next/end operations.
+
+Stores:
+
+* Render pass state pointer (saves StateTracker lookup)
+* Per subpass AccessContext’s
+* Attachment view state pointers
+* Parent (command buffer) access context pointer
+
+Implements:
+
+* Begin/next/end operations
+* RenderPass specific hazard check and state update operations
+
+
+### Range Based Operations
+
+In the discussion below, validation or update of the state of resource is discussed as if it is a uniform, singular operation. However, over the input range of a memory access or synchronization operation the resource access state can vary. For images, the input range may even be discontinuous, covering a series of locally contiguous ranges (in linear or ideal address space).
+
+All resource access state operations described below happen over ranges over which the input and current access state values are constant. As such, top-level operations (such as hazard detection for the use a of memory range in a copy operation), are implemented using range traversal functions to hide the complexity of the underlying variability in current state. Return values from certain query operations (like those needed for “resolve” operations below) are not single valued but are ResourceAccessRangeMap objects reflecting the set of range/value pairs in the query range. State update operations also must deal with the potential of a non-constant current state over the range, range boundary misalignment, or gaps in current state, requiring record splitting or infilling of initial data.
+
+The interposition of the traversal functions between the Access Context level operations and the Resource Access State Operations adds an unavoidable complexity to the implementation of each operation. To the extent possible, common traversal frameworks should be used to prevent the proliferation of range (and or graph) walkers. (To the extent these are truly general, they should be add to the algorithms implemented with the underlying range_map.) Maintainers should become familiar and comfortable with the traversal tools for the range maps and their use in Synchronization Validation.
+
+Fragmentation of the access range maps is a distinct possibility, with the map implementation supporting record coalescence, should this prove a performance or memory usage issue. Optimizations such as using alternative update traversal algorithms are possible, for example, in situations where it is known that the update will fully overwrite the existing records.
+
+
+### ResourceAccessState Operations
+
+The ResourceAccessState is the leaf level structure at which the synchronization validation and state tracking is performed. The operations on the access state implement the logic described in the Vulkan specification regarding the effects of access and synchronization operations from a resource (memory address range) point of view. The caller _must _assure that both the input and the current state are constant and correctly bounded over the range of the operation.
+
+
+#### State Update
+
+* Update: Record the state change based an “ordinary” memory access
+ * Read usages: add or update the current usage to the read usage list, clearing the stage barriers and updating the stage read tag
+ * Write usages: erase read usages, update write usage and clear write barriers and update the write tag
+* Resolve: Combine access states from different contexts
+ * If one write tag is strictly after another, the later state is preserved
+ * If the write tags match, the pre-stage read information is resolved as a union of stages accessed, with most recent usage retained if stage present in both contexts.
+* Execution Barrier
+ * Effect on read usage (per stage with usage)
+ * If the _source execution scope_ includes the stage, or intersects with the mask of barriers, the _destination execution scope_ is OR’d with the barrier mask.
+ * Effect on write usage
+ * If the_ source execution scope_ is present in the dependency chain mask for writes, the _destination execution scope _is OR’d with the dependency chain mask. Note that if no prior _memory_ barrier has occurred since the last write, no dependency chaining will occur, and in no case is the write barrier information updated.
+* Memory Barrier (assumes execution barrier operation will also be applied barriers)
+ * Effect on read usage (per stage with usage)
+ * No effect, except from corresponding execution barrier
+ * Effect on write usage
+ * If the write usage is within the _source access scope_, or if _source execution scope _intersects the write dependency chain, the write barrier is updated to include the _destination access scope, _and the write dependency chain is updated to include the _destination execution scope_..
+
+
+#### Validation / Hazard Checking
+
+* Memory stage/access hazard check
+
+ This test compares a stage/access against a resource access state.
+
+ * For read access
+ * If there is a write recorded, test stage/access flag vs. write barriers. If there is no write barrier for stage/access, report RAW
+ * For write access
+ * If there is a write recorded, test stage/access flag vs. write barriers. If there is no write barrier for stage/access, report WAW
+ * If there is no WAW found, test each per-stage read record, if any read does not have a barrier for the write access stage, report WAR.
+ * For accesses with Ordering Guarantees
+ * Certain operations (rasterization, load, store, clear, resolve) have guaranteed ordering at the sample level.
+ * Hazard check performed for these operations supply ordering execution and access scope masks, indicating the stages and accesses that have ordering guarantees. If the last write (for read access) or the last write and all last reads (for write accesses) are all with the access and execution scopes, there is no hazard.
+ * For Rasterization (draw) operations the scopes are (by attachment type)
+
+<table>
+ <tr>
+ <td>
+Attachment Type
+ </td>
+ <td>Ordering Stage Mask
+ </td>
+ <td>Ordering Access Mask
+ </td>
+ </tr>
+ <tr>
+ <td>Color
+ </td>
+ <td>STAGE_COLOR_ATTACHMENT_OUTPUT
+ </td>
+ <td>ACCESS_COLOR_ATTACHMENT_READ | ACCESS_COLOR_ATTACHMENT_WRITE | ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT
+ </td>
+ </tr>
+ <tr>
+ <td>Depth/Stencil
+ </td>
+ <td>STAGE_EARLY_FRAGMENT_TESTS | STAGE_LATE_FRAGMENT_TESTS
+ </td>
+ <td>ACCESS_DEPTH_STENCIL_ATTACHMENT_READ | ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE
+ </td>
+ </tr>
+</table>
+
+
+> Note: this special case is handled in validation to avoid the potential of polluting the “barrier chain” information by storing the effect of an implicit barrier in the access state. (Unclear to the designer what all the side-effects might be.)
+
+* Layout transition hazard check
+
+ The layout transition is treated as a subresource range read/write operation. Given the implied source barrier this check is distinct from a normal Memory stage/access hazard check described above.
+
+ * For resource accesses with write operations
+ * If the previous write is in the src access scope **or **the source execution scope is in the dependency chain **and** there are _any _memory barriers set then layout transition is safe, otherwise a WAW hazard is reported.
+ * For resources with read operations
+ * If the source execution scope intersect with either the read stage flat or the per stage read barriers, the access is safe, otherwise a WAR hazard is reported.
+* Asynchronous access hazard check
+
+ Compares a stage/access against the current state of a resource access, assuming asynchronous operation (such as unsynchronized sub-passes or queues)
+
+* For resource access with write operations
+ * If input access is read report RRW (read racing write)
+ * If input access is write report WRW (write racing write)
+* For resource access with only read accesses
+ * If input access is write, report RRW
+ * If input access is read, report ‘no hazard’
+
+
+## Vulkan Commands and Synchronization
+Vulkan commands of interest to synchronization are:
+
+
+
+* Command buffer render pass/subpass operations affecting the synchronization and access context within a command buffer
+* Command buffer synchronization commands -- set/wait events, pipeline barrier.
+* Command buffer action commands -- draw, dispatch, clear, copy, query/timestamp operations, begin/end subpass operations that record device side actions that are to be taken when a command buffer is submitted.
+* Queue submission commands -- vkQueueSubmit, vkQueueBindSparse which specify work to be done on the device as well as synchronization operations before and after the submitted work
+* Host synchronization commands -- commands that set, query, or wait for device-side synchronization operations
+
+ Several of the validation and update operations combine one of more of the above Resource Access actions above to implement the complex behaviors of the Vulkan synchronization system.
+
+Command buffer state commands also affect the execution of the action commands, but validation and recording of the effects of these commands is generally deferred until an action command affected is either recorded or enqueued.
+
+
+### Image Layout Transitions
+
+As noted above Image Layout Transition are typically implemented in the context of a barrier operation, as such these have special support at the Resource Access level. In the implementation of synchronization validation for these barriers, validation checks are only required for barriers with a layout transition. State update for barriers with layout transitions first update the state to reflect the write-access, then update the destination barriers using the layout transition as the source access scope. Otherwise no state up operation is performed, and the source and destination scopes are passed to the ResourceAccess state to update the barrier state.
+
+
+### Renderpass Operations
+
+As within a renderpass instance subpasses may execute dependently or independently, and include implicit image layout transitions, barriers, load, store and resolve operations. These operations use the Access Context objects connected in the render pass dependency graph. All validation operations are performed on a backward-looking basis, with operations in higher index subpasses begin validated against previous access, without deferral or replay of earlier accesses.
+
+
+#### Resource Access State Resolution
+
+When a resource is accessed and must be tested for hazard, has a barrier applied, or has some state update, these operations must be performed against the current state of the resource. Within a render pass instance Access Contexts for subpasses are lazily populated, and thus the state not be known within the subpass Access Context. If so, the Access Context supports graph traversal of earlier Access Contexts. Resource access resolution traverses the graph through previous subpasses (including the Access Context for the command buffer prior to BeginRenderPass), until it finds non-empty state (or the end-of-graph), and returns a copy of that state, applying inter-subpass barrier to that copy as it is returned. If at any point in the graph traversal no state is found and more than one previous subpass exists, results from all previous subpass Access Contexts are resolved as described in Resource Access State Update “Resolve” operation above. For purposes of access state resolution, subpasses outside of the “previous” subpasses within the DAG are ignored.
+
+Note: there is a bit of a complication arising from the following:
+
+> For non-attachment resources, the memory dependency expressed by subpass dependency is nearly identical to that of a <code>VkMemoryBarrier </code>(with matching <code>srcAccessMask/dstAccessMask</code> parameters) submitted as a part of a vkCmdPipelineBarrier (with matching srcStageMask/dstStageMask parameters). The only difference being that its scopes are limited to the identified subpasses rather than potentially affecting everything before and after.
+
+**TODO/KNOWN LIMITATION**: Ensure that Access State Resolution checks against tag sequencing vs. the previous NextSubpass to ensure barrier application is correctly restricted
+
+
+#### Resource Stage/Access Validation and Update
+
+For simple stage/access references, hazard detection operates on the state found in the Access Context, or failing that on the state returned by state resolution above. The detail is encapsulated within the Access Context, and for any given stage/access and address range, may be divided between state stored currently within Access Context and state resolved.
+
+State update likewise operates on state either from the Access Context of the subpass, or resolved from the DAG, with the updated state stored into the subpass Access Context. This detail is also encapsulated in the Access Context, and Access Context objects _outside_ of a renderpass instance simply have an empty “previous” context graph.
+
+
+#### RenderPass Begin/Next Operations
+
+For renderpass begin/next entry points, two types of accesses occur -- image layout transitions and load operations. As these operations and tests occur on the boundary between subpasses (or between “external” and a subpass) they are handled within the Begin/Next validate and record functions. If no implicit accesses (layout transition or load operation), no state update occurs, leaving the subpass barrier application to the lazy resolve operations described above.
+
+**TODO/KNOWN LIMITATION: **First phase does not include implementation of multi-view renderpass support.
+
+#### Subpass Image Layout Transitions
+
+Image layout transitions are validated _independently_ as the equivalent barrier for each source subpass without resolution across multiple previous subpasess. State update for image layout transition, updates the state to reflect the layout transition, and applies the destination scopes for a source subpass entries in the same image layout transition.
+
+As layout transitions affect entire image subresource ranges, the validation and update are _not _restricted to the `VkRenderPassBeginInfo::renderArea`, but are applied to the entire attachment view.
+
+
+#### Load Operations
+
+Load operations are also validated and applied at Begin/Next time, and must be validated/updated relative to current state with any image layout transition effects applied. The validation and update operations are restricted to the `VkRenderPassBeginInfo::renderArea`, as is the load operation. As load operations occur _only_ in the first use of an attachment, the only previous context that needs to be considered is the external (command buffer) access context. Validation is then performed on the external Resource Access state (copied and modified by the image layout transition as needed). Additionally the load operation must be validated against any image layout transition if present. This can be done by comparing the destination access scope of the barrier from external with the usage(s) implied in the loadOp and/or stencilLoadOp. If those usages lie within the destination access scope, then no hazard with the layout transition occurs. If there is a layout transition no check versus the external context is needed as the transition is the “most recent access” (though at validation time not yet recorded).
+
+The stage/access pair used for validation is based on the format of the attachment (color or depth/stencil) and the load operation specified.
+
+
+<table>
+ <tr>
+ <td>Format
+ </td>
+ <td>Load Stage / Load Access Prefix
+ </td>
+ <td>Op Load
+ </td>
+ <td> \
+Op Clear / Don’t care
+ </td>
+ </tr>
+ <tr>
+ <td>Color
+ </td>
+ <td>STAGE_COLOR_ATTACHMENT_OUTPUT / ACCESS_COLOR_ATTACHMENT
+ </td>
+ <td>_READ
+ </td>
+ <td>_WRITE
+ </td>
+ </tr>
+ <tr>
+ <td>Depth Stencil
+ </td>
+ <td>STAGE_EARLY_FRAGMENT_TESTS / \
+ACCESS_DEPTH_STENCIL_ATTACHMENT
+ </td>
+ <td>_READ
+ </td>
+ <td>_WRITE
+ </td>
+ </tr>
+</table>
+
+
+Load operations have guarantees memory access order guarantees:
+
+> The load operation for each sample in an attachment happens-before any recorded command which accesses the sample
+
+To support these guarantees, load operations update resource access state to reflect the effective stage/access of the load operation, and then apply an effective barrier with the source execution and access scopes reflecting the load operation stage/access and the destination execution and access scopes based on the the valid stages and accesses listed. _(Note: some consideration was given to simply zeroing out the access state s.t. no hazard relative to the access could occur, however, given the presence of asynchronous access hazards, conserving the record of the operation, while providing a correct effective barrier was preferred, here and elsewhere in the design.)_
+
+**_PHASE1 TODO: review both in document and code (in light of the DetectHazard time Ordering Guarantee support) whether this effective barrier is still required, as there are good reasons (such as synchronization operation chaining) not to pollute the barrier state._**
+
+The valid stages and accesses for attachments are:
+
+
+```
+VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
+VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
+VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
+VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
+
+VK_ACCESS_INPUT_ATTACHMENT_READ_BIT
+VK_ACCESS_COLOR_ATTACHMENT_READ_BIT
+VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT
+VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT
+VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT
+VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT
+```
+
+
+
+#### Renderpass Next/End Operations
+
+As next/end calls end the current subpass can, the subpass attachment can be tested for violations of the “preserve attachment” no access rule. This validation inspects the subpass access context to ensure that no access state change is found for the address range covered by the preserve attachment view. Given the current _lazy_ evaluation of access context contents, is done by testing that no resource state access records are found within the attachment range. The range tested _is _restricted to the `VkRenderPassBeginInfo::renderArea`.
+
+Automated of resolve attachment occurs at the end of each subpass with valid resolve attachments. They are automatically synchronized with the matching _input_ color/depth/stencil attachments. The reads of the matching color or depth/stencil attachment are validated as attachment read operations, the raster order guarantees embedded in state update correctly accounting for that synchronization. The resolve attachments are validated as attachment write operations relative to the resolve target attachment, with the state update consistent with the attachment write stage/access `COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE`.
+
+
+#### Renderpass End Operations
+
+As renderpass end completes a renderpass instance several pieces of cleanup work are required. Primarily these are attachment store and resolve operations.
+
+Store operations also have implicit ordering guarantees that it “happens-after any recorded command which accesses the sample in the last subpass where the attachment is used”. Similar to the load operation there is an implicit barrier, but as validation precedes state update, the implicit barrier is applied to a copy of the resource access state during validation. The state update reflects the store op:
+
+<table>
+ <tr>
+ <td>Format
+ </td>
+ <td>Store Stage
+ </td>
+ <td>All Store Ops
+ </td>
+ </tr>
+ <tr>
+ <td>Color
+ </td>
+ <td>STAGE_COLOR_ATTACHMENT_OUTPUT
+ </td>
+ <td>ACCESS_COLOR_ATTACHMENT_WRITE
+ </td>
+ </tr>
+ <tr>
+ <td>Depth Stencil
+ </td>
+ <td>STAGE_LATE_FRAGMENT_TESTS
+ </td>
+ <td>ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE
+ </td>
+ </tr>
+</table>
+Resolve operations export the state of the subpass access contexts to the access context for the command buffer. For each subpass, the linear and idealized ResourceAccessRangeMap’s are traversed. For each access state, the dstSubpass=VK_SUBPASS_EXTERNAL barrier is applied, and the result is merged with the command buffer access context. The resulting state is the resolve of all subpass access with their final barrier applied. The resolve is performed after the store operation state update has completed.
+
+
+### Synchronization operations
+
+
+#### CmdPipelineBarrier
+
+For each memory, buffer, and image barrier defined use the range traversal functions to update all accesses in source scope. For images, prior to update (i.e. in PreValidate…) test for image layout transition hazards as described above.
+
+Apply global execution barriers from the src/dstStageMask.
+
+
+#### CmdSet/WaitEvent
+
+**TODO/KNOWN LIMITATION:** host set event not supported through at least phase 2.
+
+vkCmdSetEvent defines the source execution scope for the matching vkCmdWaitEvent but does not cause any update to the resource access state. While a simplistic model would allow simple recording of the resource usage tag to define the set of resource accesses affected at wait time, the access state’s storage of dependency chain information is not time-stamped. Thus to record the accesses within the scope of the the set event, a range map (containing potentially simply a boolean) is constructed to record the address ranges containing “in scope” accesses. This map should likely have a “merge operation” run, combining adjacent ranges with the same value to minimize the memory footprint of the map. Additionally, vkCmdSetEvent must record the usage tag (or equivalent sequence/timestamp).
+
+CmdWaitEvent uses both the source execution scope map and the usage tag to determine the _effective _source scopes. Resource access state barrier information are _only _updated if they lie within a range of the source scope map, have not (by means of testing usage tags) been updated since the CmdSetEvent call, and (as appropriate) lie within the access scopes defined by the wait event command.
+
+
+##### Semaphore Operations
+
+**TODO/KNOWN LIMITATION:** host set event not supported in phase 1
+
+
+### Command Buffer Action Commands
+
+Recorded action command describe compute, graphics, or transfer actions to be executed on a device when the containing command buffer is submitted to a queue of the appropriate capabilities. Validation of these consists (in the first phase of implementation) of hazard detection for all known <range, stage/access> pairs against the current access context. The access context is then updated for the same set of <range, stage/access> pair. Each update is tagged with the Usage Tag as described above
+
+#### Commands
+
+<table>
+ <tr>
+ <td>Pipeline type
+ </td>
+ <td>Command
+ </td>
+ <td>Notes
+ </td>
+ </tr>
+ <tr>
+ <td>compute
+ </td>
+ <td><code>vkCmdDispatch</code>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>compute
+ </td>
+ <td><code>vkCmdDispatchIndirect</code>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>graphics
+ </td>
+ <td><code>vkCmdClearAttachments</code>
+ </td>
+ <td>TobinE: No memory barriers are needed between vkCmdClearAttachments and preceding or subsequent draw or attachment clear commands in the same subpass. I believe color/depth bits are used depending on aspectMask for attachment to be cleared (TODO: Verify this)
+ </td>
+ </tr>
+ <tr>
+ <td>graphics
+ </td>
+ <td><code>vkCmdDraw</code>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>graphics
+ </td>
+ <td><code>vkCmdDrawIndexed</code>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>graphics
+ </td>
+ <td><code>vkCmdDrawIndexedIndirect</code>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>graphics
+ </td>
+ <td><code>vkCmdDrawIndexedIndirectCountAMD</code>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>graphics
+ </td>
+ <td><code>vkCmdDrawIndexedIndirectCountKHR</code>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>graphics
+ </td>
+ <td><code>vkCmdDrawIndirect</code>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>graphics
+ </td>
+ <td><code>vkCmdDrawIndirectCountAMD</code>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>graphics
+ </td>
+ <td><code>vkCmdDrawIndirectCountKHR</code>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>transfer
+ </td>
+ <td><code>vkCmdBlitImage</code>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>transfer
+ </td>
+ <td><code>vkCmdClearColorImage</code>
+ </td>
+ <td> “
+ </td>
+ </tr>
+ <tr>
+ <td>transfer
+ </td>
+ <td><code>vkCmdClearDepthStencilImage</code>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>transfer
+ </td>
+ <td><code>vkCmdCopyBuffer</code>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>transfer
+ </td>
+ <td><code>vkCmdCopyBufferToImage</code>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>transfer
+ </td>
+ <td><code>vkCmdCopyImage</code>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>transfer
+ </td>
+ <td><code>vkCmdCopyImageToBuffer</code>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>transfer
+ </td>
+ <td><code>vkCmdCopyQueryPoolResults</code>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>transfer
+ </td>
+ <td><code>vkCmdFillBuffer</code>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>transfer
+ </td>
+ <td><code>vkCmdResolveImage</code>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>transfer
+ </td>
+ <td><code>vkCmdUpdateBuffer</code>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>transfer
+ </td>
+ <td><code>vkCmdWriteBufferMarkerAMD</code>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>transfer
+ </td>
+ <td><code>vkCmdWriteTimestamp</code>
+ </td>
+ <td>
+ </td>
+ </tr>
+ <tr>
+ <td>N/A
+ </td>
+ <td><code>vkCmdExecuteCommands</code>
+ </td>
+ <td>Not supported in initial release.
+ </td>
+ </tr>
+</table>
+
+
+
+**TODO/KNOWN LIMITATION:** ExecuteCommands and QueueSubmit not supported in phase 1
+
+Recording and validating `vkCmdExecuteCommands `which is more similar in scope to the various `vkQueue… `commands. The “first” access state of the executed command buffers must be added to the access context of the calling parent buffer. Record time validation of `vkCmdExecuteCommands `may require a replay of the secondary command buffer synchronization operations up to the point of the first access within the secondary command buffer. TODO: Finish in phase 2 design, with as much code reuse w.r.t. queue submit as possible.
+
+
+#### Command Buffer State Bindings
+
+##### Vertex Input Fixed-function bindings
+
+These are read only, but as the actual indices and vertices referenced are only known at shader execution time, the entire bound resource is treated as being read by draw commands that reference these bound resources
+
+ Vertex
+
+ Index
+
+##### Bound Descriptor Set Access
+
+The stage/access for each bound descriptor referenced by a draw or dispatch call is determined by the shader stage, access control decoration and descriptor type. For those descriptors that _can_ be stored to, access of read vs. write is determined by the “GLSL readonly” or Spir-V NonWritable decoration. An binding not marked as readonly, and legal for store or atomic operations will be treated as a write access.
+
+
+<table>
+ <tr>
+ <td>Descriptor Type
+ </td>
+ <td><code>VK_DESCRIPTOR_TYPE_</code>
+ </td>
+ <td>Resource
+ </td>
+ <td>Operations
+ </td>
+ <td><code>VK_ACCESS_..._BIT</code>
+ </td>
+ </tr>
+ <tr>
+ <td>storage image
+ </td>
+ <td><code>STORAGE_IMAGE</code>
+ </td>
+ <td>Image view
+ </td>
+ <td>load, store, and atomic
+ </td>
+ <td><code>SHADER_READ(WRITE) </code>
+ </td>
+ </tr>
+ <tr>
+ <td>sampled image
+ </td>
+ <td><code>SAMPLED_IMAGE</code>
+ </td>
+ <td>Image view
+ </td>
+ <td>sampling
+ </td>
+ <td><code>SHADER_READ</code>
+ </td>
+ </tr>
+ <tr>
+ <td>combined image sampler
+ </td>
+ <td><code>COMBINED_IMAGE_SAMPLER</code>
+ </td>
+ <td>Sampler and Image view
+ </td>
+ <td>sampling
+ </td>
+ <td><code>SHADER_READ</code>
+ </td>
+ </tr>
+ <tr>
+ <td>uniform texel buffer
+ </td>
+ <td><code>UNIFORM_TEXEL_BUFFER</code>
+ </td>
+ <td>Buffer view
+ </td>
+ <td>load
+ </td>
+ <td><code>SHADER_READ</code>
+ </td>
+ </tr>
+ <tr>
+ <td>storage texel buffer
+ </td>
+ <td><code>STORAGE_TEXEL_BUFFER</code>
+ </td>
+ <td>Buffer view
+ </td>
+ <td>load, store, and atomic
+ </td>
+ <td><code>SHADER_READ(WRITE) </code>
+ </td>
+ </tr>
+ <tr>
+ <td>storage buffer
+ </td>
+ <td><code>STORAGE_BUFFER</code>
+ </td>
+ <td>Buffer
+ </td>
+ <td>load, store, and atomic
+ </td>
+ <td><code>SHADER_READ(WRITE) </code>
+ </td>
+ </tr>
+ <tr>
+ <td>uniform buffer
+ </td>
+ <td><code>UNIFORM_BUFFER</code>
+ </td>
+ <td>Buffer
+ </td>
+ <td>load
+ </td>
+ <td><code>SHADER_READ</code>
+ </td>
+ </tr>
+ <tr>
+ <td>dynamic uniform buffer
+ </td>
+ <td><code>UNIFORM_BUFFER_DYNAMIC</code>
+ </td>
+ <td>Buffer
+ </td>
+ <td>load
+ </td>
+ <td><code>SHADER_READ</code>
+ </td>
+ </tr>
+ <tr>
+ <td>dynamic storage buffer
+ </td>
+ <td><code>STORAGE_BUFFER_DYNAMIC</code>
+ </td>
+ <td>Buffer
+ </td>
+ <td>load, store, and atomic
+ </td>
+ <td><code>SHADER_READ(WRITE)</code>
+ </td>
+ </tr>
+ <tr>
+ <td>inline uniform block
+ </td>
+ <td><code>INLINE_UNIFORM_BLOCK_EXT</code>
+ </td>
+ <td>Storage in the encompassing descriptor set
+ </td>
+ <td>
+ </td>
+ <td><code>SHADER_READ</code>
+ </td>
+ </tr>
+ <tr>
+ <td>input attachment
+ </td>
+ <td><code>INPUT_ATTACHMENT</code>
+ </td>
+ <td> Image view
+ </td>
+ <td>Framebuffer local load
+ </td>
+ <td><code>INPUT_ATTACHMENT_READ</code>
+ </td>
+ </tr>
+ <tr>
+ <td>acceleration structure
+ </td>
+ <td><code>ACCELERATION_STRUCTURE_KHR</code>
+ </td>
+ <td>Acceleration structure
+ </td>
+ <td>Shaders read-only access
+ </td>
+ <td><code>SHADER_READ</code>
+ </td>
+ </tr>
+</table>
+
+
+** Attachment read, based on image format VK_ACCESS_COLOR_ATTACHMENT_READ_BIT for Color format attachment and VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT for depth/stencil formats.
+
+#### Attachments -- Framebuffer local images
+
+##### Color Attachments
+
+Color attachment use is controlled by the fragment shader output declarations and `VkPipelineRasterizationStateCreateInfo::rasterizerDiscardEnable`. Fragment shader output variables with Location decorations correspond to the pColorAttachments index for the current subpass. The renderArea portion of these attachments is treated as stage/access SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE, unless `rasterizerDiscardEnable `is true -- in which case a operations on color attachments result in no memory accesses.
+
+**TODO/KNOWN LIMITATION:** Memory access checks not suppressed for VK_CULL_MODE_FRONT_AND_BACK -- would need to ensure we have sufficient information to know TOPOLOGY being emitted to rasterization fixed function state. \
+
+**TODO/KNOWN LIMITATION: **First phase does not include component granularity access tracking.
+
+> Designer’s note. Given the “inmost loop” nature of component read/write enable, it is likely the performance and memory use will be unacceptable unless the “Idealized” encoding changes the apparent memory organization of components to be at least just above the x, y, and z dimensions, s.t. the effective “run-length-compression” of the range maps is not lost. Storing access state byte-by-byte is likely not going to be acceptable. Whether this encoding should be adaptive (only present for images with component level information) or globally present in the idealized encoding) is a design detail TBD. For broadest application this may mean that non-aliased linear tiling images should also be given an idealized encoding w.r.t. component granularity information.
+
+
+##### Depth/Stencil Attachments
+
+Depth/Stencil Attachment usage is controlled by `VkPipelineRasterizationStateCreateInfo::rasterizerDiscardEnable `and various parameter of `VkPipelineDepthStencilStateCreateInfo`. If `rasterizerDiscardEnable` is set, Depth/Stencil attachments are ignored for hazard detection and state update. Depth aspect detection and update are controlled by depthTestEnable and depthWriteEnable and the ExecutionMode EarlyFragmentTests. If depthTestEnable is false, depth attachments aspects are ignored. Otherwise the following stage/access are used for the renderArea portion of the depth aspect. \
+
+
+
+<table>
+ <tr>
+ <td><code>depthWriteEnable</code>
+ </td>
+ <td><code>EarlyFragmentTests</code>
+ </td>
+ <td>Stage/Access
+ </td>
+ </tr>
+ <tr>
+ <td>FALSE
+ </td>
+ <td>Specified
+ </td>
+ <td><code>SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ</code>
+ </td>
+ </tr>
+ <tr>
+ <td>TRUE
+ </td>
+ <td>Specified
+ </td>
+ <td><code>SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE</code>
+ </td>
+ </tr>
+ <tr>
+ <td>FALSE
+ </td>
+ <td>Not set
+ </td>
+ <td><code>SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ</code>
+ </td>
+ </tr>
+ <tr>
+ <td>TRUE
+ </td>
+ <td>Not set
+ </td>
+ <td><code>SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE</code>
+ </td>
+ </tr>
+</table>
+
+
+Stencil attachments are controlled by `stencilTestEnable`, with additional state to determine the type of access. The type of access is controlled by the the `VkStencilOpState`. Stencil aspect access is read-only If `writeMask `is zero, or the one of the following combination of stencil parameters is set for all non-culled (see `VkPipelineRasterizationStateCreateInfo::cullMode)` faces front or back.
+
+
+<table>
+ <tr>
+ <td>compareOp
+ </td>
+ <td>failOp
+ </td>
+ <td>passOp
+ </td>
+ <td>depthFailOp
+ </td>
+ </tr>
+ <tr>
+ <td>VK_COMPARE_OP_
+ </td>
+ <td colspan="3" >VK_STENCIL_OP_
+ </td>
+ </tr>
+ <tr>
+ <td>NEVER
+ </td>
+ <td>KEEP
+ </td>
+ <td>any
+ </td>
+ <td>any
+ </td>
+ </tr>
+ <tr>
+ <td>ALWAYS
+ </td>
+ <td>any
+ </td>
+ <td>KEEP
+ </td>
+ <td>KEEP*
+ </td>
+ </tr>
+ <tr>
+ <td>other
+ </td>
+ <td>KEEP
+ </td>
+ <td>KEEP
+ </td>
+ <td>KEEP*
+ </td>
+ </tr>
+</table>
+
+
+If depthTestEnable is TRUE, otherwise, any, since with depth testing disabled the depth test cannot fail.
+
+### Host Synchronization commands
+
+**TODO/KNOWN LIMITATION:** Host synchronization not supported in phases 1 and 2.
diff --git a/docs/synchronization_usage.md b/docs/synchronization_usage.md
new file mode 100644
index 0000000..dbb39c0
--- /dev/null
+++ b/docs/synchronization_usage.md
@@ -0,0 +1,133 @@
+<!-- markdownlint-disable MD041 -->
+<!-- Copyright 2015-2020 LunarG, Inc. -->
+[![Khronos Vulkan][1]][2]
+
+[1]: https://vulkan.lunarg.com/img/Vulkan_100px_Dec16.png "https://www.khronos.org/vulkan/"
+[2]: https://www.khronos.org/vulkan/
+
+# Synchronization Validation (Alpha)
+
+[![Creative Commons][3]][4]
+
+[3]: https://i.creativecommons.org/l/by-nd/4.0/88x31.png "Creative Commons License"
+[4]: https://creativecommons.org/licenses/by-nd/4.0/
+
+Synchronization Validation (alpha release)
+
+Synchronization Validation is implemented in the `VK_LAYER_KHRONOS_validation layer`. When enabled, the Synchronization Object is intended to identify resource access conflicts due to missing or incorrect synchronization operations between actions (Draw, Copy, Dispatch, Blit) reading or writing the same regions of memory.
+
+Synchronization will ideally be run periodically after resolving any outstanding validation checks from all other validation objects, so that issues may be addressed in early stages of development.
+
+Synchronization can easily be enabled and configured using the [Vulkan Configurator](https://vulkan.lunarg.com/doc/sdk/latest/windows/vkconfig.html) included with the Vulkan SDK. You can also manually enable Synchronization following instructions below.
+
+
+
+The specific areas covered by this layer are currently tracked in
+[Github Issue #72: Validate synchronization correctness: Sync Tracking](https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/72)
+Requests for additional checks can be posted through the same issue, or by creating a new Github issue.
+
+## Synchronization Validation Functionality
+
+### Overview
+
+The pipelined and multi-threaded nature of Vulkan makes it particularly important for applications to correctly insert needed synchronization primitives, and for validation to diagnose unprotected memory access hazards. Synchronization reports the presence of access hazards including information to identify the Vulkan operations which are in conflict. The reported hazards are:
+
+
+<table>
+ <tr>
+ <td>RAW
+ </td>
+ <td>Read-after-write
+ </td>
+ <td>Occurs when a subsequent operation uses the result of a previous operation without waiting for the result to be completed.
+ </td>
+ </tr>
+ <tr>
+ <td>WAR
+ </td>
+ <td>Write-after-read
+ </td>
+ <td>Occurs when a subsequent operation overwrites a memory location read by a previous operation before that operation is complete. (requires only execution dependency)
+ </td>
+ </tr>
+ <tr>
+ <td>WAW
+ </td>
+ <td>Write-after-write
+ </td>
+ <td>Occurs when a subsequent operation writes to the same set of memory locations (in whole or in part) being written by a previous operation.
+ </td>
+ </tr>
+ <tr>
+ <td>WRW
+ </td>
+ <td>Write-racing-write
+ </td>
+ <td>Occurs when unsynchronized subpasses/queues perform writes to the same set of memory locations.
+ </td>
+ </tr>
+ <tr>
+ <td>RRW
+ </td>
+ <td>Read-racing-write
+ </td>
+ <td>Occurs when unsynchronized subpasses/queues perform read and write operations on the same set of memory locations
+ </td>
+ </tr>
+</table>
+
+
+
+### Current Feature set
+
+- Hazard detection for memory usage for commands within the *same* command buffer
+- Synchronization operations vkCmdPipelineBarrier and renderpass/subpass barriers
+- Image layout transition hazard and access tracking
+- Load/Store/Resolve operations within Subpasses.
+
+### Known Limitations
+
+- Does not include implementation of multi-view renderpass support.
+- Does not include vkCmd(Set|Wait)Event support.
+- Host set event not supported
+- ExecuteCommands and QueueSubmit hazards from are not tracked or reported
+- Memory access checks not suppressed for VK_CULL_MODE_FRONT_AND_BACK
+- Does not include component granularity access tracking.
+- Host synchronization not supported
+
+## Enabling Synchronization Validation
+
+Synchronization Validation is disabled by default. To turn on Synchronization Validation, add the following to your layer settings file,
+`vk_layer_settings.txt`:
+
+```code
+khronos_validation.enables = VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION
+```
+
+To enable using environment variables, set the following variable:
+
+```code
+VK_LAYER_ENABLES=VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION
+```
+
+Some platforms do not support configuration of the validation layers with this configuration file.
+Programs running on these platforms must then use the programmatic interface.
+
+As Synchronization Validation is resource intensive, it is recommended to disable all other validation layer objects.
+
+### Enabling and Specifying Options with the Programmatic Interface
+
+The `VK_EXT_validation_features` extension can be used to enable Synchronization Validation at CreateInstance time.
+
+Here is sample code illustrating how to enable it:
+
+```code
+VkValidationFeatureEnableEXT enables[] = {VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION};
+VkValidationFeaturesEXT features = {};
+features.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
+features.enabledValidationFeatureCount = 1;
+features.pEnabledValidationFeatures = enables;
+
+VkInstanceCreateInfo info = {};
+info.pNext = &features;
+```
diff --git a/layers/CMakeLists.txt b/layers/CMakeLists.txt
index 4a8ac90..323512d 100644
--- a/layers/CMakeLists.txt
+++ b/layers/CMakeLists.txt
@@ -154,6 +154,12 @@
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpointer-arith -Wno-unused-function -Wno-sign-compare")
endif()
+
+if(ANNOTATED_SPEC_LINK)
+ message("-- ANNOTATED_SPEC_LINK is ${ANNOTATED_SPEC_LINK}")
+ add_definitions(-DANNOTATED_SPEC_LINK=${ANNOTATED_SPEC_LINK})
+endif()
+
# Clang warns about unused const variables. Generated files may purposely contain unused consts, so silence this warning in Clang
if(CMAKE_C_COMPILER_ID MATCHES "Clang")
set_source_files_properties(parameter_validation.cpp PROPERTIES COMPILE_FLAGS "-Wno-unused-const-variable")
@@ -163,27 +169,39 @@
generated/chassis.cpp
generated/layer_chassis_dispatch.cpp
generated/command_counter_helper.cpp
+ generated/vk_safe_struct.cpp
+ generated/vk_safe_struct.h
+ layer_options.cpp
state_tracker.cpp
+ state_tracker.h
image_layout_map.cpp
image_layout_map.h
range_vector.h
+ vk_layer_settings_ext.h
subresource_adapter.cpp
subresource_adapter.h)
set(CORE_VALIDATION_LIBRARY_FILES
core_validation.cpp
+ core_validation.h
+ core_validation_error_enums.h
+ core_validation_types.h
drawdispatch.cpp
convert_to_renderpass2.cpp
descriptor_sets.cpp
+ descriptor_sets.h
buffer_validation.cpp
+ buffer_validation.h
shader_validation.cpp
+ shader_validation.h
gpu_validation.cpp
xxhash.c)
set(OBJECT_LIFETIMES_LIBRARY_FILES
generated/object_tracker.cpp
generated/object_tracker.h
- object_tracker_utils.cpp)
+ object_tracker_utils.cpp
+ object_lifetime_validation.h)
set(THREAD_SAFETY_LIBRARY_FILES
generated/thread_safety.cpp
@@ -192,13 +210,15 @@
set(STATELESS_VALIDATION_LIBRARY_FILES
generated/parameter_validation.cpp
generated/parameter_validation.h
- parameter_validation_utils.cpp)
+ parameter_validation_utils.cpp
+ stateless_validation.h)
set(BEST_PRACTICES_LIBRARY_FILES
best_practices_utils.cpp
generated/best_practices.cpp
generated/best_practices.h
- best_practices_validation.h)
+ best_practices_validation.h
+ best_practices_error_enums.h)
set(GPU_ASSISTED_LIBRARY_FILES
gpu_validation.cpp
@@ -212,6 +232,10 @@
gpu_utils.cpp
gpu_utils.h)
+set(SYNC_VALIDATION_LIBRARY_FILES
+ synchronization_validation.cpp
+ synchronization_validation.h)
+
if(BUILD_LAYERS)
AddVkLayer(khronos_validation ""
${CHASSIS_LIBRARY_FILES}
@@ -222,11 +246,13 @@
${BEST_PRACTICES_LIBRARY_FILES}
${GPU_UTILITY_LIBRARY_FILES}
${GPU_ASSISTED_LIBRARY_FILES}
- ${DEBUG_PRINTF_LIBRARY_FILES})
+ ${DEBUG_PRINTF_LIBRARY_FILES}
+ ${SYNC_VALIDATION_LIBRARY_FILES})
# Khronos validation additional dependencies
target_include_directories(VkLayer_khronos_validation PRIVATE ${GLSLANG_SPIRV_INCLUDE_DIR})
target_include_directories(VkLayer_khronos_validation PRIVATE ${SPIRV_TOOLS_INCLUDE_DIR})
+ target_include_directories(VkLayer_khronos_validation PRIVATE ${SPIRV_HEADERS_INCLUDE_DIR})
target_link_libraries(VkLayer_khronos_validation PRIVATE ${SPIRV_TOOLS_LIBRARIES})
# The output file needs Unix "/" separators or Windows "\" separators On top of that, Windows separators actually need to be doubled
diff --git a/layers/android_ndk_types.h b/layers/android_ndk_types.h
index 515f128..4134f8f 100644
--- a/layers/android_ndk_types.h
+++ b/layers/android_ndk_types.h
@@ -1,7 +1,7 @@
-/* Copyright (c) 2018-2019 The Khronos Group Inc.
- * Copyright (c) 2018-2019 Valve Corporation
- * Copyright (c) 2018-2019 LunarG, Inc.
- * Copyright (C) 2018-2019 Google Inc.
+/* Copyright (c) 2018-2020 The Khronos Group Inc.
+ * Copyright (c) 2018-2020 Valve Corporation
+ * Copyright (c) 2018-2020 LunarG, Inc.
+ * Copyright (C) 2018-2020 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,10 +24,11 @@
#ifdef VK_USE_PLATFORM_ANDROID_KHR
// All eums referenced by VK_ANDROID_external_memory_android_hardware_buffer are present in
-// the platform-28 (Android P) versions of the header files. A partial set exists in the
+// the platform-29 (Android Q) versions of the header files. A partial set exists in the
// platform-26 (O) headers, where hardware_buffer.h first appears in the NDK.
//
-// Building Vulkan validation with NDK header files prior to platform-26 is not supported.
+// Building Vulkan validation with NDK header files prior to platform-26 is not supported due to
+// Android 24 and 25 devices do not support Android Hardware Buffers.
//
// Decoder ring for Android compile symbols found here: https://github.com/android-ndk/ndk/issues/407
@@ -50,6 +51,13 @@
#define AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE 0x4000000
#endif // __ANDROID_API_O__ && !_P__
+// GPU_FRAMEBUFFER was added as the desired alias for GPU_COLOR_OUTPUT starting in NDK r20
+// GPU_COLOR_OUTPUT was removed from the spec, so to prevent confusion, all aspect of the layers
+// should use GPU_FRAMEBUFFER, but need to define here for older NDK versions
+#ifndef AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER
+#define AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT
+#endif
+
#else // Not __ANDROID__, but VK_USE_PLATFORM_ANDROID_KHR
// This combination should not be seen in the wild, but can be used to allow testing
// of the AHB extension validation on other platforms using MockICD
@@ -77,7 +85,7 @@
typedef enum AHardwareBufferUsage {
AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE = 0x100,
- AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT = 0x200,
+ AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER = 0x200,
AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP = 0x2000000,
AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE = 0x4000000,
AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT = 0x4000,
diff --git a/layers/best_practices_error_enums.h b/layers/best_practices_error_enums.h
index 3599adc..8ddcd5f 100644
--- a/layers/best_practices_error_enums.h
+++ b/layers/best_practices_error_enums.h
@@ -91,8 +91,12 @@
static const char DECORATE_UNUSED *kVUID_BestPractices_Error_Result = "UNASSIGNED-BestPractices-Error-Result";
static const char DECORATE_UNUSED *kVUID_BestPractices_NonSuccess_Result = "UNASSIGNED-BestPractices-NonSuccess-Result";
static const char DECORATE_UNUSED *kVUID_BestPractices_SuboptimalSwapchain = "UNASSIGNED-BestPractices-SuboptimalSwapchain";
+static const char DECORATE_UNUSED *kVUID_BestPractices_SuboptimalSwapchainImageCount =
+ "UNASSIGNED-BestPractices-vkCreateSwapchainKHR-suboptimal-swapchain-image-count";
// Arm-specific best practice
+static const char DECORATE_UNUSED *kVUID_BestPractices_AllocateDescriptorSets_SuboptimalReuse =
+ "UNASSIGNED-BestPractices-vkAllocateDescriptorSets-suboptimal-reuse";
static const char DECORATE_UNUSED *kVUID_BestPractices_CreatePipelines_MultisampledBlending =
"UNASSIGNED-BestPractices-vkCreatePipelines-multisampled-blending";
static const char DECORATE_UNUSED *kVUID_BestPractices_CreateImage_TooLargeSampleCount =
@@ -114,9 +118,21 @@
"UNASSIGNED-BestPractices-vkCmdResolveImage-resolving-image";
static const char DECORATE_UNUSED *kVUID_BestPractices_CmdDrawIndexed_ManySmallIndexedDrawcalls =
"UNASSIGNED-BestPractices-vkCmdDrawIndexed-many-small-indexed-drawcalls";
+static const char DECORATE_UNUSED *kVUID_BestPractices_CmdDrawIndexed_SparseIndexBuffer =
+ "UNASSIGNED-BestPractices-vkCmdDrawIndexed-sparse-index-buffer";
+static const char DECORATE_UNUSED *kVUID_BestPractices_CmdDrawIndexed_PostTransformCacheThrashing =
+ "UNASSIGNED-BestPractices-vkCmdDrawIndexed-post-transform-cache-thrashing";
static const char DECORATE_UNUSED *kVUID_BestPractices_BeginCommandBuffer_OneTimeSubmit =
"UNASSIGNED-BestPractices-vkBeginCommandBuffer-one-time-submit";
static const char DECORATE_UNUSED *kVUID_BestPractices_BeginRenderPass_AttachmentNeedsReadback =
"UNASSIGNED-BestPractices-vkCmdBeginRenderPass-attachment-needs-readback";
+static const char DECORATE_UNUSED *kVUID_BestPractices_CreateSwapchain_PresentMode =
+ "UNASSIGNED-BestPractices-vkCreateSwapchainKHR-swapchain-presentmode-not-fifo";
+static const char DECORATE_UNUSED *kVUID_BestPractices_CreatePipelines_DepthBias_Zero =
+ "UNASSIGNED-BestPractices-vkCreatePipelines-depthbias-zero";
+static const char DECORATE_UNUSED *kVUID_BestPractices_CreateDevice_RobustBufferAccess =
+ "UNASSIGNED-BestPractices-vkCreateDevice-RobustBufferAccess";
+static const char DECORATE_UNUSED *kVUID_BestPractices_EndRenderPass_DepthPrePassUsage =
+ "UNASSIGNED-BestPractices-vkCmdEndRenderPass-depth-pre-pass-usage";
#endif
diff --git a/layers/best_practices_utils.cpp b/layers/best_practices_utils.cpp
index aa1c395..e8241d8 100644
--- a/layers/best_practices_utils.cpp
+++ b/layers/best_practices_utils.cpp
@@ -23,6 +23,7 @@
#include <string>
#include <iomanip>
+#include <bitset>
// get the API name is proper format
std::string BestPractices::GetAPIVersionName(uint32_t version) const {
@@ -38,17 +39,17 @@
}
struct VendorSpecificInfo {
- bool CHECK_ENABLED::*check;
+ EnableFlags vendor_id;
std::string name;
};
const std::map<BPVendorFlagBits, VendorSpecificInfo> vendor_info = {
- {kBPVendorArm, {&CHECK_ENABLED::vendor_specific_arm, "Arm"}},
+ {kBPVendorArm, {vendor_specific_arm, "Arm"}},
};
bool BestPractices::VendorCheckEnabled(BPVendorFlags vendors) const {
for (const auto& vendor : vendor_info) {
- if (vendors & vendor.first && enabled.*(vendor.second.check)) {
+ if (vendors & vendor.first && enabled[vendor.second.vendor_id]) {
return true;
}
}
@@ -107,12 +108,12 @@
auto dep_info_it = deprecated_extensions.find(extension_name);
if (dep_info_it != deprecated_extensions.end()) {
auto dep_info = dep_info_it->second;
- if ((dep_info.target.compare("VK_VERSION_1_1") && (version >= VK_VERSION_1_1)) ||
- (dep_info.target.compare("VK_VERSION_1_2") && (version >= VK_VERSION_1_2))) {
+ if (((dep_info.target.compare("VK_VERSION_1_1") == 0) && (version >= VK_API_VERSION_1_1)) ||
+ ((dep_info.target.compare("VK_VERSION_1_2") == 0) && (version >= VK_API_VERSION_1_2))) {
skip |=
LogWarning(instance, vuid, "%s(): Attempting to enable deprecated extension %s, but this extension has been %s %s.",
api_name, extension_name, DepReasonToString(dep_info.reason), (dep_info.target).c_str());
- } else if (!dep_info.target.find("VK_VERSION")) {
+ } else if (dep_info.target.find("VK_VERSION") == std::string::npos) {
if (dep_info.target.length() == 0) {
skip |= LogWarning(instance, vuid,
"%s(): Attempting to enable deprecated extension %s, but this extension has been deprecated "
@@ -138,8 +139,9 @@
"vkCreateInstance(): Attempting to enable Device Extension %s at CreateInstance time.",
pCreateInfo->ppEnabledExtensionNames[i]);
}
- skip |= ValidateDeprecatedExtensions("CreateInstance", pCreateInfo->ppEnabledExtensionNames[i],
- pCreateInfo->pApplicationInfo->apiVersion,
+ uint32_t specified_version =
+ (pCreateInfo->pApplicationInfo ? pCreateInfo->pApplicationInfo->apiVersion : VK_API_VERSION_1_0);
+ skip |= ValidateDeprecatedExtensions("CreateInstance", pCreateInfo->ppEnabledExtensionNames[i], specified_version,
kVUID_BestPractices_CreateInstance_DeprecatedExtension);
}
@@ -149,7 +151,11 @@
void BestPractices::PreCallRecordCreateInstance(const VkInstanceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator,
VkInstance* pInstance) {
ValidationStateTracker::PreCallRecordCreateInstance(pCreateInfo, pAllocator, pInstance);
- instance_api_version = pCreateInfo->pApplicationInfo->apiVersion;
+
+ if (pCreateInfo != nullptr && pCreateInfo->pApplicationInfo != nullptr)
+ instance_api_version = pCreateInfo->pApplicationInfo->apiVersion;
+ else
+ instance_api_version = 0;
}
bool BestPractices::PreCallValidateCreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo,
@@ -187,6 +193,17 @@
"vkCreateDevice() called before getting physical device features from vkGetPhysicalDeviceFeatures().");
}
+ if ((VendorCheckEnabled(kBPVendorArm)) && (pCreateInfo->pEnabledFeatures != nullptr) &&
+ (pCreateInfo->pEnabledFeatures->robustBufferAccess == VK_TRUE)) {
+ skip |= LogPerformanceWarning(
+ device, kVUID_BestPractices_CreateDevice_RobustBufferAccess,
+ "%s vkCreateDevice() called with enabled robustBufferAccess. Use robustBufferAccess as a debugging tool during "
+ "development. Enabling it causes loss in performance for accesses to uniform buffers and shader storage "
+ "buffers. Disable robustBufferAccess in release builds. Only leave it enabled if the application use-case "
+ "requires the additional level of reliability due to the use of unverified user-supplied draw parameters.",
+ VendorSpecificTag(kBPVendorArm));
+ }
+
return skip;
}
@@ -273,11 +290,31 @@
if ((pCreateInfo->queueFamilyIndexCount > 1) && (pCreateInfo->imageSharingMode == VK_SHARING_MODE_EXCLUSIVE)) {
skip |=
LogWarning(device, kVUID_BestPractices_SharingModeExclusive,
- "Warning: A Swapchain is being created which specifies a sharing mode of VK_SHARING_MODE_EXCULSIVE while "
+ "Warning: A Swapchain is being created which specifies a sharing mode of VK_SHARING_MODE_EXCLUSIVE while "
"specifying multiple queues (queueFamilyIndexCount of %" PRIu32 ").",
pCreateInfo->queueFamilyIndexCount);
}
+ if (pCreateInfo->minImageCount == 2) {
+ skip |= LogPerformanceWarning(
+ device, kVUID_BestPractices_SuboptimalSwapchainImageCount,
+ "Warning: A Swapchain is being created with minImageCount set to %" PRIu32
+ ", which means double buffering is going "
+ "to be used. Using double buffering and vsync locks rendering to an integer fraction of the vsync rate. In turn, "
+ "reducing the performance of the application if rendering is slower than vsync. Consider setting minImageCount to "
+ "3 to use triple buffering to maximize performance in such cases.",
+ pCreateInfo->minImageCount);
+ }
+
+ if (VendorCheckEnabled(kBPVendorArm) && (pCreateInfo->presentMode != VK_PRESENT_MODE_FIFO_KHR)) {
+ skip |= LogWarning(device, kVUID_BestPractices_CreateSwapchain_PresentMode,
+ "%s Warning: Swapchain is not being created with presentation mode \"VK_PRESENT_MODE_FIFO_KHR\". "
+ "Prefer using \"VK_PRESENT_MODE_FIFO_KHR\" to avoid unnecessary CPU and GPU load and save power. "
+ "Presentation modes which are not FIFO will present the latest available frame and discard other "
+ "frame(s) if any.",
+ VendorSpecificTag(kBPVendorArm));
+ }
+
return skip;
}
@@ -354,67 +391,125 @@
return skip;
}
+bool BestPractices::ValidateAttachments(const VkRenderPassCreateInfo2* rpci, uint32_t attachmentCount,
+ const VkImageView* image_views) const {
+ bool skip = false;
+
+ // Check for non-transient attachments that should be transient and vice versa
+ for (uint32_t i = 0; i < attachmentCount; ++i) {
+ auto& attachment = rpci->pAttachments[i];
+ bool attachment_should_be_transient =
+ (attachment.loadOp != VK_ATTACHMENT_LOAD_OP_LOAD && attachment.storeOp != VK_ATTACHMENT_STORE_OP_STORE);
+
+ if (FormatHasStencil(attachment.format)) {
+ attachment_should_be_transient &= (attachment.stencilLoadOp != VK_ATTACHMENT_LOAD_OP_LOAD &&
+ attachment.stencilStoreOp != VK_ATTACHMENT_STORE_OP_STORE);
+ }
+
+ auto view_state = GetImageViewState(image_views[i]);
+ if (view_state) {
+ auto& ivci = view_state->create_info;
+ auto& ici = GetImageState(ivci.image)->createInfo;
+
+ bool image_is_transient = (ici.usage & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) != 0;
+
+ // The check for an image that should not be transient applies to all GPUs
+ if (!attachment_should_be_transient && image_is_transient) {
+ skip |= LogPerformanceWarning(
+ device, kVUID_BestPractices_CreateFramebuffer_AttachmentShouldNotBeTransient,
+ "Attachment %u in VkFramebuffer uses loadOp/storeOps which need to access physical memory, "
+ "but the image backing the image view has VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT set. "
+ "Physical memory will need to be backed lazily to this image, potentially causing stalls.",
+ i);
+ }
+
+ bool supports_lazy = false;
+ for (uint32_t j = 0; j < phys_dev_mem_props.memoryTypeCount; j++) {
+ if (phys_dev_mem_props.memoryTypes[j].propertyFlags & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
+ supports_lazy = true;
+ }
+ }
+
+ // The check for an image that should be transient only applies to GPUs supporting
+ // lazily allocated memory
+ if (supports_lazy && attachment_should_be_transient && !image_is_transient) {
+ skip |= LogPerformanceWarning(
+ device, kVUID_BestPractices_CreateFramebuffer_AttachmentShouldBeTransient,
+ "Attachment %u in VkFramebuffer uses loadOp/storeOps which never have to be backed by physical memory, "
+ "but the image backing the image view does not have VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT set. "
+ "You can save physical memory by using transient attachment backed by lazily allocated memory here.",
+ i);
+ }
+ }
+ }
+ return skip;
+}
+
bool BestPractices::PreCallValidateCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator, VkFramebuffer* pFramebuffer) const {
bool skip = false;
- // Check for non-transient attachments that should be transient and vice versa
auto rp_state = GetRenderPassState(pCreateInfo->renderPass);
- if (rp_state) {
- const VkRenderPassCreateInfo2* rpci = rp_state->createInfo.ptr();
- const VkImageView* image_views = pCreateInfo->pAttachments;
+ if (rp_state && !(pCreateInfo->flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR)) {
+ skip = ValidateAttachments(rp_state->createInfo.ptr(), pCreateInfo->attachmentCount, pCreateInfo->pAttachments);
+ }
- for (uint32_t i = 0; i < pCreateInfo->attachmentCount; ++i) {
- auto& attachment = rpci->pAttachments[i];
- bool attachment_should_be_transient =
- (attachment.loadOp != VK_ATTACHMENT_LOAD_OP_LOAD && attachment.storeOp != VK_ATTACHMENT_STORE_OP_STORE);
+ return skip;
+}
- if (FormatHasStencil(attachment.format)) {
- attachment_should_be_transient &= (attachment.stencilLoadOp != VK_ATTACHMENT_LOAD_OP_LOAD &&
- attachment.stencilStoreOp != VK_ATTACHMENT_STORE_OP_STORE);
- }
+bool BestPractices::PreCallValidateAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo* pAllocateInfo,
+ VkDescriptorSet* pDescriptorSets, void* ads_state_data) const {
+ bool skip = false;
+ skip |= ValidationStateTracker::PreCallValidateAllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets, ads_state_data);
- auto view_state = GetImageViewState(image_views[i]);
- if (view_state) {
- auto& ivci = view_state->create_info;
- auto& ici = GetImageState(ivci.image)->createInfo;
-
- bool image_is_transient = (ici.usage & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) != 0;
-
- // The check for an image that should not be transient applies to all GPUs
- if (!attachment_should_be_transient && image_is_transient) {
- skip |= LogPerformanceWarning(
- device, kVUID_BestPractices_CreateFramebuffer_AttachmentShouldNotBeTransient,
- "Attachment %u in VkFramebuffer uses loadOp/storeOps which need to access physical memory, "
- "but the image backing the image view has VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT set. "
- "Physical memory will need to be backed lazily to this image, potentially causing stalls.",
- i);
- }
-
- bool supports_lazy = false;
- for (uint32_t j = 0; j < phys_dev_mem_props.memoryTypeCount; j++) {
- if (phys_dev_mem_props.memoryTypes[j].propertyFlags & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) {
- supports_lazy = true;
- }
- }
-
- // The check for an image that should be transient only applies to GPUs supporting
- // lazily allocated memory
- if (supports_lazy && attachment_should_be_transient && !image_is_transient) {
- skip |= LogPerformanceWarning(
- device, kVUID_BestPractices_CreateFramebuffer_AttachmentShouldBeTransient,
- "Attachment %u in VkFramebuffer uses loadOp/storeOps which never have to be backed by physical memory, "
- "but the image backing the image view does not have VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT set. "
- "You can save physical memory by using transient attachment backed by lazily allocated memory here.",
- i);
- }
- }
+ if (!skip) {
+ const auto& pool_handle = pAllocateInfo->descriptorPool;
+ auto iter = descriptor_pool_freed_count.find(pool_handle);
+ // if the number of freed sets > 0, it implies they could be recycled instead if desirable
+ // this warning is specific to Arm
+ if (VendorCheckEnabled(kBPVendorArm) && iter != descriptor_pool_freed_count.end() && iter->second > 0) {
+ skip |= LogPerformanceWarning(
+ device, kVUID_BestPractices_AllocateDescriptorSets_SuboptimalReuse,
+ "%s Descriptor set memory was allocated via vkAllocateDescriptorSets() for sets which were previously freed in the "
+ "same logical device. On some drivers or architectures it may be most optimal to re-use existing descriptor sets.",
+ VendorSpecificTag(kBPVendorArm));
}
}
return skip;
}
+void BestPractices::ManualPostCallRecordAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo* pAllocateInfo,
+ VkDescriptorSet* pDescriptorSets, VkResult result, void* ads_state) {
+ if (result == VK_SUCCESS) {
+ // find the free count for the pool we allocated into
+ auto iter = descriptor_pool_freed_count.find(pAllocateInfo->descriptorPool);
+ if (iter != descriptor_pool_freed_count.end()) {
+ // we record successful allocations by subtracting the allocation count from the last recorded free count
+ const auto alloc_count = pAllocateInfo->descriptorSetCount;
+ // clamp the unsigned subtraction to the range [0, last_free_count]
+ if (iter->second > alloc_count)
+ iter->second -= alloc_count;
+ else
+ iter->second = 0;
+ }
+ }
+}
+
+void BestPractices::PostCallRecordFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
+ const VkDescriptorSet* pDescriptorSets, VkResult result) {
+ ValidationStateTracker::PostCallRecordFreeDescriptorSets(device, descriptorPool, descriptorSetCount, pDescriptorSets, result);
+ if (result == VK_SUCCESS) {
+ // we want to track frees because we're interested in suggesting re-use
+ auto iter = descriptor_pool_freed_count.find(descriptorPool);
+ if (iter == descriptor_pool_freed_count.end()) {
+ descriptor_pool_freed_count.insert(std::make_pair(descriptorPool, descriptorSetCount));
+ } else {
+ iter->second += descriptorSetCount;
+ }
+ }
+}
+
bool BestPractices::PreCallValidateAllocateMemory(VkDevice device, const VkMemoryAllocateInfo* pAllocateInfo,
const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory) const {
bool skip = false;
@@ -438,10 +533,9 @@
return skip;
}
-void BestPractices::PostCallRecordAllocateMemory(VkDevice device, const VkMemoryAllocateInfo* pAllocateInfo,
- const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory,
- VkResult result) {
- ValidationStateTracker::PostCallRecordAllocateMemory(device, pAllocateInfo, pAllocator, pMemory, result);
+void BestPractices::ManualPostCallRecordAllocateMemory(VkDevice device, const VkMemoryAllocateInfo* pAllocateInfo,
+ const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory,
+ VkResult result) {
if (result != VK_SUCCESS) {
static std::vector<VkResult> error_codes = {VK_ERROR_OUT_OF_HOST_MEMORY, VK_ERROR_OUT_OF_DEVICE_MEMORY,
VK_ERROR_TOO_MANY_OBJECTS, VK_ERROR_INVALID_EXTERNAL_HANDLE,
@@ -453,17 +547,17 @@
num_mem_objects++;
}
-void BestPractices::ValidateReturnCodes(const char* api_name, VkResult result, const std::vector<VkResult>& success_codes,
- const std::vector<VkResult>& error_codes) const {
+void BestPractices::ValidateReturnCodes(const char* api_name, VkResult result, const std::vector<VkResult>& error_codes,
+ const std::vector<VkResult>& success_codes) const {
auto error = std::find(error_codes.begin(), error_codes.end(), result);
if (error != error_codes.end()) {
- LogWarning(instance, kVUID_BestPractices_NonSuccess_Result, "%s(): Returned error %s.", api_name, string_VkResult(result));
+ LogWarning(instance, kVUID_BestPractices_Error_Result, "%s(): Returned error %s.", api_name, string_VkResult(result));
return;
}
auto success = std::find(success_codes.begin(), success_codes.end(), result);
if (success != success_codes.end()) {
- LogWarning(instance, kVUID_BestPractices_Error_Result, "%s(): Returned non-success return code %s.", api_name,
- string_VkResult(result));
+ LogInfo(instance, kVUID_BestPractices_NonSuccess_Result, "%s(): Returned non-success return code %s.", api_name,
+ string_VkResult(result));
}
}
@@ -557,10 +651,15 @@
bool skip = false;
const IMAGE_STATE* image_state = GetImageState(image);
- if (!image_state->memory_requirements_checked && !image_state->external_memory_handle) {
- skip |= LogWarning(device, kVUID_BestPractices_ImageMemReqNotCalled,
- "%s: Binding memory to %s but vkGetImageMemoryRequirements() has not been called on that image.",
- api_name, report_data->FormatHandle(image).c_str());
+ if (image_state->disjoint == false) {
+ if (!image_state->memory_requirements_checked && !image_state->external_memory_handle) {
+ skip |= LogWarning(device, kVUID_BestPractices_ImageMemReqNotCalled,
+ "%s: Binding memory to %s but vkGetImageMemoryRequirements() has not been called on that image.",
+ api_name, report_data->FormatHandle(image).c_str());
+ }
+ } else {
+ // TODO If binding disjoint image then this needs to check that VkImagePlaneMemoryRequirementsInfo was called for each
+ // plane.
}
const DEVICE_MEMORY_STATE* mem_state = GetDevMemState(memory);
@@ -625,7 +724,9 @@
for (uint32_t i = 0; i < bindInfoCount; i++) {
sprintf(api_name, "vkBindImageMemory2() pBindInfos[%u]", i);
- skip |= ValidateBindImageMemory(pBindInfos[i].image, pBindInfos[i].memory, api_name);
+ if (!lvl_find_in_chain<VkBindImageMemorySwapchainInfoKHR>(pBindInfos[i].pNext)) {
+ skip |= ValidateBindImageMemory(pBindInfos[i].image, pBindInfos[i].memory, api_name);
+ }
}
return skip;
@@ -703,6 +804,7 @@
void* cgpl_state_data) const {
bool skip = StateTracker::PreCallValidateCreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos,
pAllocator, pPipelines, cgpl_state_data);
+ create_graphics_pipeline_api_state* cgpl_state = reinterpret_cast<create_graphics_pipeline_api_state*>(cgpl_state_data);
if ((createInfoCount > 1) && (!pipelineCache)) {
skip |= LogPerformanceWarning(
@@ -714,20 +816,34 @@
for (uint32_t i = 0; i < createInfoCount; i++) {
auto& createInfo = pCreateInfos[i];
- auto& vertexInput = *createInfo.pVertexInputState;
- uint32_t count = 0;
- for (uint32_t j = 0; j < vertexInput.vertexBindingDescriptionCount; j++) {
- if (vertexInput.pVertexBindingDescriptions[j].inputRate == VK_VERTEX_INPUT_RATE_INSTANCE) {
- count++;
+ if (!(cgpl_state->pipe_state[i]->active_shaders & VK_SHADER_STAGE_MESH_BIT_NV)) {
+ auto& vertexInput = *createInfo.pVertexInputState;
+ uint32_t count = 0;
+ for (uint32_t j = 0; j < vertexInput.vertexBindingDescriptionCount; j++) {
+ if (vertexInput.pVertexBindingDescriptions[j].inputRate == VK_VERTEX_INPUT_RATE_INSTANCE) {
+ count++;
+ }
+ }
+ if (count > kMaxInstancedVertexBuffers) {
+ skip |= LogPerformanceWarning(
+ device, kVUID_BestPractices_CreatePipelines_TooManyInstancedVertexBuffers,
+ "The pipeline is using %u instanced vertex buffers (current limit: %u), but this can be inefficient on the "
+ "GPU. If using instanced vertex attributes prefer interleaving them in a single buffer.",
+ count, kMaxInstancedVertexBuffers);
}
}
- if (count > kMaxInstancedVertexBuffers) {
- skip |= LogPerformanceWarning(
- device, kVUID_BestPractices_CreatePipelines_TooManyInstancedVertexBuffers,
- "The pipeline is using %u instanced vertex buffers (current limit: %u), but this can be inefficient on the "
- "GPU. If using instanced vertex attributes prefer interleaving them in a single buffer.",
- count, kMaxInstancedVertexBuffers);
+ if ((pCreateInfos[i].pRasterizationState->depthBiasEnable) &&
+ (pCreateInfos[i].pRasterizationState->depthBiasConstantFactor == 0.0f) &&
+ (pCreateInfos[i].pRasterizationState->depthBiasSlopeFactor == 0.0f)) {
+ skip |= VendorCheckEnabled(kBPVendorArm) &&
+ LogPerformanceWarning(
+ device, kVUID_BestPractices_CreatePipelines_DepthBias_Zero,
+ "%s Performance Warning: This vkCreateGraphicsPipelines call is created with depthBiasEnable set to true "
+ "and both depthBiasConstantFactor and depthBiasSlopeFactor are set to 0. This can cause reduced "
+ "efficiency during rasterization. Consider disabling depthBias or increasing either "
+ "depthBiasConstantFactor or depthBiasSlopeFactor.",
+ VendorSpecificTag(kBPVendorArm));
}
skip |= VendorCheckEnabled(kBPVendorArm) && ValidateMultisampledBlendingArm(createInfoCount, pCreateInfos);
@@ -736,6 +852,37 @@
return skip;
}
+void BestPractices::ManualPostCallRecordCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
+ const VkGraphicsPipelineCreateInfo* pCreateInfos,
+ const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines,
+ VkResult result, void* cgpl_state_data) {
+ for (size_t i = 0; i < count; i++) {
+ const auto* cgpl_state = reinterpret_cast<create_graphics_pipeline_api_state*>(cgpl_state_data);
+ const VkPipeline pipeline_handle = pPipelines[i];
+
+ // record depth stencil state and color blend states for depth pre-pass tracking purposes
+ auto gp_cis = graphicsPipelineCIs.find(pipeline_handle);
+
+ // add the tracking state if it doesn't exist
+ if (gp_cis == graphicsPipelineCIs.end()) {
+ auto result = graphicsPipelineCIs.emplace(std::make_pair(pipeline_handle, GraphicsPipelineCIs{}));
+
+ if (!result.second) continue;
+
+ gp_cis = result.first;
+ }
+
+ gp_cis->second.colorBlendStateCI =
+ cgpl_state->pCreateInfos[i].pColorBlendState
+ ? new safe_VkPipelineColorBlendStateCreateInfo(cgpl_state->pCreateInfos[i].pColorBlendState)
+ : nullptr;
+ gp_cis->second.depthStencilStateCI =
+ cgpl_state->pCreateInfos[i].pDepthStencilState
+ ? new safe_VkPipelineDepthStencilStateCreateInfo(cgpl_state->pCreateInfos[i].pDepthStencilState)
+ : nullptr;
+ }
+}
+
bool BestPractices::PreCallValidateCreateComputePipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t createInfoCount,
const VkComputePipelineCreateInfo* pCreateInfos,
const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines,
@@ -767,8 +914,7 @@
return skip;
}
-void BestPractices::PostCallRecordQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR* pPresentInfo, VkResult result) {
- ValidationStateTracker::PostCallRecordQueuePresentKHR(queue, pPresentInfo, result);
+void BestPractices::ManualPostCallRecordQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR* pPresentInfo, VkResult result) {
for (uint32_t i = 0; i < pPresentInfo->swapchainCount; ++i) {
auto swapchains_result = pPresentInfo->pResults ? pPresentInfo->pResults[i] : result;
if (swapchains_result == VK_SUBOPTIMAL_KHR) {
@@ -886,6 +1032,57 @@
return skip;
}
+void BestPractices::PostCallRecordCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
+ VkPipeline pipeline) {
+ StateTracker::PostCallRecordCmdBindPipeline(commandBuffer, pipelineBindPoint, pipeline);
+
+ if (pipelineBindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS) {
+ // check for depth/blend state tracking
+ auto gp_cis = graphicsPipelineCIs.find(pipeline);
+ if (gp_cis != graphicsPipelineCIs.end()) {
+ auto prepass_state = cbDepthPrePassStates.find(commandBuffer);
+ if (prepass_state == cbDepthPrePassStates.end()) {
+ auto result = cbDepthPrePassStates.emplace(std::make_pair(commandBuffer, DepthPrePassState{}));
+
+ if (!result.second) return;
+
+ prepass_state = result.first;
+ }
+
+ const auto* blend_state = gp_cis->second.colorBlendStateCI;
+ const auto* stencil_state = gp_cis->second.depthStencilStateCI;
+
+ if (blend_state) {
+ // assume the pipeline is depth-only unless any of the attachments have color writes enabled
+ prepass_state->second.depthOnly = true;
+ for (size_t i = 0; i < blend_state->attachmentCount; i++) {
+ if (blend_state->pAttachments[i].colorWriteMask != 0) {
+ prepass_state->second.depthOnly = false;
+ }
+ }
+ }
+
+ // check for depth value usage
+ prepass_state->second.depthEqualComparison = false;
+
+ if (stencil_state && stencil_state->depthTestEnable) {
+ switch (stencil_state->depthCompareOp) {
+ case VK_COMPARE_OP_EQUAL:
+ case VK_COMPARE_OP_GREATER_OR_EQUAL:
+ case VK_COMPARE_OP_LESS_OR_EQUAL:
+ prepass_state->second.depthEqualComparison = true;
+ break;
+ default:
+ break;
+ }
+ }
+ } else {
+ // reset depth pre-pass tracking
+ cbDepthPrePassStates.emplace(std::make_pair(commandBuffer, DepthPrePassState{}));
+ }
+ }
+}
+
static inline bool RenderPassUsesAttachmentOnTile(const safe_VkRenderPassCreateInfo2& createInfo, uint32_t attachment) {
for (uint32_t subpass = 0; subpass < createInfo.subpassCount; subpass++) {
auto& subpassInfo = createInfo.pSubpasses[subpass];
@@ -918,6 +1115,13 @@
auto rp_state = GetRenderPassState(pRenderPassBegin->renderPass);
if (rp_state) {
+ if (rp_state->createInfo.flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR) {
+ const VkRenderPassAttachmentBeginInfo* rpabi =
+ lvl_find_in_chain<VkRenderPassAttachmentBeginInfo>(pRenderPassBegin->pNext);
+ if (rpabi) {
+ skip = ValidateAttachments(rp_state->createInfo.ptr(), rpabi->attachmentCount, rpabi->pAttachments);
+ }
+ }
// Check if any attachments have LOAD operation on them
for (uint32_t att = 0; att < rp_state->createInfo.attachmentCount; att++) {
auto& attachment = rp_state->createInfo.pAttachments[att];
@@ -959,23 +1163,73 @@
bool BestPractices::PreCallValidateCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin,
VkSubpassContents contents) const {
- bool skip = ValidateCmdBeginRenderPass(commandBuffer, RENDER_PASS_VERSION_1, pRenderPassBegin);
+ bool skip = StateTracker::PreCallValidateCmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
+ skip |= ValidateCmdBeginRenderPass(commandBuffer, RENDER_PASS_VERSION_1, pRenderPassBegin);
return skip;
}
bool BestPractices::PreCallValidateCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer,
const VkRenderPassBeginInfo* pRenderPassBegin,
const VkSubpassBeginInfoKHR* pSubpassBeginInfo) const {
- bool skip = ValidateCmdBeginRenderPass(commandBuffer, RENDER_PASS_VERSION_2, pRenderPassBegin);
+ bool skip = StateTracker::PreCallValidateCmdBeginRenderPass2KHR(commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
+ skip |= ValidateCmdBeginRenderPass(commandBuffer, RENDER_PASS_VERSION_2, pRenderPassBegin);
return skip;
}
bool BestPractices::PreCallValidateCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin,
const VkSubpassBeginInfoKHR* pSubpassBeginInfo) const {
- bool skip = ValidateCmdBeginRenderPass(commandBuffer, RENDER_PASS_VERSION_2, pRenderPassBegin);
+ bool skip = StateTracker::PreCallValidateCmdBeginRenderPass2(commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
+ skip |= ValidateCmdBeginRenderPass(commandBuffer, RENDER_PASS_VERSION_2, pRenderPassBegin);
return skip;
}
+void BestPractices::RecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, RenderPassCreateVersion rp_version,
+ const VkRenderPassBeginInfo* pRenderPassBegin) {
+ auto prepass_state = cbDepthPrePassStates.find(commandBuffer);
+
+ // add the tracking state if it doesn't exist
+ if (prepass_state == cbDepthPrePassStates.end()) {
+ auto result = cbDepthPrePassStates.emplace(std::make_pair(commandBuffer, DepthPrePassState{}));
+
+ if (!result.second) return;
+
+ prepass_state = result.first;
+ }
+
+ // reset the renderpass state
+ prepass_state->second = {};
+
+ const auto* cb_state = GetCBState(commandBuffer);
+ const auto* rp_state = cb_state->activeRenderPass.get();
+
+ // track depth / color attachment usage within the renderpass
+ for (size_t i = 0; i < rp_state->createInfo.subpassCount; i++) {
+ // record if depth/color attachments are in use for this renderpass
+ if (rp_state->createInfo.pSubpasses[i].pDepthStencilAttachment != nullptr) prepass_state->second.depthAttachment = true;
+
+ if (rp_state->createInfo.pSubpasses[i].colorAttachmentCount > 0) prepass_state->second.colorAttachment = true;
+ }
+}
+
+void BestPractices::PostCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin,
+ VkSubpassContents contents) {
+ StateTracker::PostCallRecordCmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
+ RecordCmdBeginRenderPass(commandBuffer, RENDER_PASS_VERSION_1, pRenderPassBegin);
+}
+
+void BestPractices::PostCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin,
+ const VkSubpassBeginInfo* pSubpassBeginInfo) {
+ StateTracker::PostCallRecordCmdBeginRenderPass2(commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
+ RecordCmdBeginRenderPass(commandBuffer, RENDER_PASS_VERSION_2, pRenderPassBegin);
+}
+
+void BestPractices::PostCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer,
+ const VkRenderPassBeginInfo* pRenderPassBegin,
+ const VkSubpassBeginInfo* pSubpassBeginInfo) {
+ StateTracker::PostCallRecordCmdBeginRenderPass2KHR(commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
+ RecordCmdBeginRenderPass(commandBuffer, RENDER_PASS_VERSION_2, pRenderPassBegin);
+}
+
// Generic function to handle validation for all CmdDraw* type functions
bool BestPractices::ValidateCmdDrawType(VkCommandBuffer cmd_buffer, const char* caller) const {
bool skip = false;
@@ -1000,6 +1254,21 @@
return skip;
}
+void BestPractices::RecordCmdDrawType(VkCommandBuffer cmd_buffer, uint32_t draw_count, const char* caller) {
+ if (VendorCheckEnabled(kBPVendorArm)) {
+ RecordCmdDrawTypeArm(cmd_buffer, draw_count, caller);
+ }
+}
+
+void BestPractices::RecordCmdDrawTypeArm(VkCommandBuffer cmd_buffer, uint32_t draw_count, const char* caller) {
+ auto prepass_state = cbDepthPrePassStates.find(cmd_buffer);
+ if (prepass_state != cbDepthPrePassStates.end() && draw_count >= kDepthPrePassMinDrawCountArm) {
+ if (prepass_state->second.depthOnly) prepass_state->second.numDrawCallsDepthOnly++;
+
+ if (prepass_state->second.depthEqualComparison) prepass_state->second.numDrawCallsDepthEqualCompare++;
+ }
+}
+
bool BestPractices::PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
uint32_t firstVertex, uint32_t firstInstance) const {
bool skip = false;
@@ -1013,6 +1282,12 @@
return skip;
}
+void BestPractices::PostCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
+ uint32_t firstVertex, uint32_t firstInstance) {
+ StateTracker::PostCallRecordCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
+ RecordCmdDrawType(commandBuffer, vertexCount * instanceCount, "vkCmdDraw()");
+}
+
bool BestPractices::PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const {
bool skip = false;
@@ -1036,6 +1311,164 @@
VendorSpecificTag(kBPVendorArm), kMaxSmallIndexedDrawcalls, kSmallIndexedDrawcallIndices);
}
+ if (VendorCheckEnabled(kBPVendorArm)) {
+ ValidateIndexBufferArm(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
+ }
+
+ return skip;
+}
+
+bool BestPractices::ValidateIndexBufferArm(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
+ uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const {
+ bool skip = false;
+
+ // check for sparse/underutilised index buffer, and post-transform cache thrashing
+ const auto* cmd_state = GetCBState(commandBuffer);
+ if (cmd_state == nullptr) return skip;
+
+ const auto* ib_state = GetBufferState(cmd_state->index_buffer_binding.buffer);
+ if (ib_state == nullptr) return skip;
+
+ const VkIndexType ib_type = cmd_state->index_buffer_binding.index_type;
+ const auto& ib_mem_state = *ib_state->binding.mem_state;
+ const VkDeviceSize ib_mem_offset = ib_mem_state.mapped_range.offset;
+ const void* ib_mem = ib_mem_state.p_driver_data;
+ bool primitive_restart_enable = false;
+
+ const auto& pipeline_binding_iter = cmd_state->lastBound.find(VK_PIPELINE_BIND_POINT_GRAPHICS);
+
+ if (pipeline_binding_iter != cmd_state->lastBound.end()) {
+ const auto* pipeline_state = pipeline_binding_iter->second.pipeline_state;
+ if (pipeline_state != nullptr && pipeline_state->graphicsPipelineCI.pInputAssemblyState != nullptr)
+ primitive_restart_enable = pipeline_state->graphicsPipelineCI.pInputAssemblyState->primitiveRestartEnable == VK_TRUE;
+ }
+
+ // no point checking index buffer if the memory is nonexistant/unmapped, or if there is no graphics pipeline bound to this CB
+ if (ib_mem && pipeline_binding_iter != cmd_state->lastBound.end()) {
+ uint32_t scan_stride;
+ if (ib_type == VK_INDEX_TYPE_UINT8_EXT) {
+ scan_stride = sizeof(uint8_t);
+ } else if (ib_type == VK_INDEX_TYPE_UINT16) {
+ scan_stride = sizeof(uint16_t);
+ } else {
+ scan_stride = sizeof(uint32_t);
+ }
+
+ const uint8_t* scan_begin = static_cast<const uint8_t*>(ib_mem) + ib_mem_offset + firstIndex * scan_stride;
+ const uint8_t* scan_end = scan_begin + indexCount * scan_stride;
+
+ // Min and max are important to track for some Mali architectures. In older Mali devices without IDVS, all
+ // vertices corresponding to indices between the minimum and maximum may be loaded, and possibly shaded,
+ // irrespective of whether or not they're part of the draw call.
+
+ // start with minimum as 0xFFFFFFFF and adjust to indices in the buffer
+ uint32_t min_index = ~0u;
+ // start with maximum as 0 and adjust to indices in the buffer
+ uint32_t max_index = 0u;
+
+ // first scan-through, we're looking to simulate a model LRU post-transform cache, estimating the number of vertices shaded
+ // for the given index buffer
+ uint32_t vertex_shade_count = 0;
+
+ PostTransformLRUCacheModel post_transform_cache;
+
+ // The size of the cache being modelled positively correlates with how much behaviour it can capture about
+ // arbitrary ground-truth hardware/architecture cache behaviour. I.e. it's a good solution when we don't know the
+ // target architecture.
+ // However, modelling a post-transform cache with more than 32 elements gives diminishing returns in practice.
+ // http://eelpi.gotdns.org/papers/fast_vert_cache_opt.html
+ post_transform_cache.resize(32);
+
+ for (const uint8_t* scan_ptr = scan_begin; scan_ptr < scan_end; scan_ptr += scan_stride) {
+ uint32_t scan_index;
+ uint32_t primitive_restart_value;
+ if (ib_type == VK_INDEX_TYPE_UINT8_EXT) {
+ scan_index = *reinterpret_cast<const uint8_t*>(scan_ptr);
+ primitive_restart_value = 0xFF;
+ } else if (ib_type == VK_INDEX_TYPE_UINT16) {
+ scan_index = *reinterpret_cast<const uint16_t*>(scan_ptr);
+ primitive_restart_value = 0xFFFF;
+ } else {
+ scan_index = *reinterpret_cast<const uint32_t*>(scan_ptr);
+ primitive_restart_value = 0xFFFFFFFF;
+ }
+
+ max_index = std::max(max_index, scan_index);
+ min_index = std::min(min_index, scan_index);
+
+ if (!primitive_restart_enable || scan_index != primitive_restart_value) {
+ bool in_cache = post_transform_cache.query_cache(scan_index);
+ // if the shaded vertex corresponding to the index is not in the PT-cache, we need to shade again
+ if (!in_cache) vertex_shade_count++;
+ }
+ }
+
+ // if the max and min values were not set, then we either have no indices, or all primitive restarts, exit...
+ if (max_index < min_index) return skip;
+
+ if (max_index - min_index >= indexCount) {
+ skip |= LogPerformanceWarning(
+ device, kVUID_BestPractices_CmdDrawIndexed_SparseIndexBuffer,
+ "%s The indices which were specified for the draw call only utilise approximately %.02f%% of "
+ "index buffer value range. Arm Mali architectures before G71 do not have IDVS (Index-Driven "
+ "Vertex Shading), meaning all vertices corresponding to indices between the minimum and "
+ "maximum would be loaded, and possibly shaded, whether or not they are used.",
+ VendorSpecificTag(kBPVendorArm), (static_cast<float>(indexCount) / (max_index - min_index)) * 100.0f);
+ return skip;
+ }
+
+ // use a dynamic vector of bitsets as a memory-compact representation of which indices are included in the draw call
+ // each bit of the n-th bucket contains the inclusion information for indices (n*n_buckets) to ((n+1)*n_buckets)
+ const size_t n_buckets = 64;
+ std::vector<std::bitset<n_buckets>> vertex_reference_buckets;
+ vertex_reference_buckets.resize((max_index - min_index + 1) / n_buckets);
+
+ // To avoid using too much memory, we run over the indices again.
+ // Knowing the size from the last scan allows us to record index usage with bitsets
+ for (const uint8_t* scan_ptr = scan_begin; scan_ptr < scan_end; scan_ptr += scan_stride) {
+ uint32_t scan_index;
+ if (ib_type == VK_INDEX_TYPE_UINT8_EXT) {
+ scan_index = *reinterpret_cast<const uint8_t*>(scan_ptr);
+ } else if (ib_type == VK_INDEX_TYPE_UINT16) {
+ scan_index = *reinterpret_cast<const uint16_t*>(scan_ptr);
+ } else {
+ scan_index = *reinterpret_cast<const uint32_t*>(scan_ptr);
+ }
+ // keep track of the set of all indices used to reference vertices in the draw call
+ size_t index_offset = scan_index - min_index;
+ size_t bitset_bucket_index = index_offset / n_buckets;
+ uint64_t used_indices = 1ull << ((index_offset % n_buckets) & 0xFFFFFFFFu);
+ vertex_reference_buckets[bitset_bucket_index] |= used_indices;
+ }
+
+ uint32_t vertex_reference_count = 0;
+ for (const auto& bitset : vertex_reference_buckets) {
+ vertex_reference_count += static_cast<uint32_t>(bitset.count());
+ }
+
+ // low index buffer utilization implies that: of the vertices available to the draw call, not all are utilized
+ float utilization = static_cast<float>(vertex_reference_count) / (max_index - min_index + 1);
+ // low hit rate (high miss rate) implies the order of indices in the draw call may be possible to improve
+ float cache_hit_rate = static_cast<float>(vertex_reference_count) / vertex_shade_count;
+
+ if (utilization < 0.5f) {
+ skip |= LogPerformanceWarning(device, kVUID_BestPractices_CmdDrawIndexed_SparseIndexBuffer,
+ "%s The indices which were specified for the draw call only utilise approximately "
+ "%.02f%% of the bound vertex buffer.",
+ VendorSpecificTag(kBPVendorArm), utilization);
+ }
+
+ if (cache_hit_rate <= 0.5f) {
+ skip |=
+ LogPerformanceWarning(device, kVUID_BestPractices_CmdDrawIndexed_PostTransformCacheThrashing,
+ "%s The indices which were specified for the draw call are estimated to cause thrashing of "
+ "the post-transform vertex cache, with a hit-rate of %.02f%%. "
+ "I.e. the ordering of the index buffer may not make optimal use of indices associated with "
+ "recently shaded vertices.",
+ VendorSpecificTag(kBPVendorArm), cache_hit_rate * 100.0f);
+ }
+ }
+
return skip;
}
@@ -1050,6 +1483,12 @@
}
}
+void BestPractices::PostCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
+ uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
+ StateTracker::PostCallRecordCmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
+ RecordCmdDrawType(commandBuffer, indexCount * instanceCount, "vkCmdDrawIndexed()");
+}
+
bool BestPractices::PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
VkDeviceSize offset, VkBuffer countBuffer,
VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
@@ -1072,6 +1511,12 @@
return skip;
}
+void BestPractices::PostCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ uint32_t count, uint32_t stride) {
+ StateTracker::PostCallRecordCmdDrawIndirect(commandBuffer, buffer, offset, count, stride);
+ RecordCmdDrawType(commandBuffer, count, "vkCmdDrawIndirect()");
+}
+
bool BestPractices::PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
uint32_t drawCount, uint32_t stride) const {
bool skip = false;
@@ -1085,6 +1530,12 @@
return skip;
}
+void BestPractices::PostCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ uint32_t count, uint32_t stride) {
+ StateTracker::PostCallRecordCmdDrawIndexedIndirect(commandBuffer, buffer, offset, count, stride);
+ RecordCmdDrawType(commandBuffer, count, "vkCmdDrawIndexedIndirect()");
+}
+
bool BestPractices::PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY,
uint32_t groupCountZ) const {
bool skip = false;
@@ -1099,6 +1550,30 @@
return skip;
}
+bool BestPractices::PreCallValidateCmdEndRenderPass(VkCommandBuffer commandBuffer) const {
+ bool skip = false;
+
+ skip |= StateTracker::PreCallValidateCmdEndRenderPass(commandBuffer);
+
+ auto prepass_state = cbDepthPrePassStates.find(commandBuffer);
+
+ if (prepass_state == cbDepthPrePassStates.end()) return skip;
+
+ bool uses_depth = (prepass_state->second.depthAttachment || prepass_state->second.colorAttachment) &&
+ prepass_state->second.numDrawCallsDepthEqualCompare >= kDepthPrePassNumDrawCallsArm &&
+ prepass_state->second.numDrawCallsDepthOnly >= kDepthPrePassNumDrawCallsArm;
+ if (uses_depth) {
+ skip |= LogPerformanceWarning(
+ device, kVUID_BestPractices_EndRenderPass_DepthPrePassUsage,
+ "%s Depth pre-passes may be in use. In general, this is not recommended, as in Arm Mali GPUs since "
+ "Mali-T620, Forward Pixel Killing (FPK) can already perform automatic hidden surface removal; in which "
+ "case, using depth pre-passes for hidden surface removal may worsen performance.",
+ VendorSpecificTag(kBPVendorArm));
+ }
+
+ return skip;
+}
+
bool BestPractices::ValidateGetPhysicalDeviceDisplayPlanePropertiesKHRQuery(VkPhysicalDevice physicalDevice,
const char* api_name) const {
bool skip = false;
@@ -1345,15 +1820,9 @@
return skip;
}
-void BestPractices::PostCallRecordQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo* pBindInfo,
- VkFence fence, VkResult result) {
- ValidationStateTracker::PostCallRecordQueueBindSparse(queue, bindInfoCount, pBindInfo, fence, result);
-
+void BestPractices::ManualPostCallRecordQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo* pBindInfo,
+ VkFence fence, VkResult result) {
if (result != VK_SUCCESS) {
- static std::vector<VkResult> error_codes = {VK_ERROR_OUT_OF_HOST_MEMORY, VK_ERROR_OUT_OF_DEVICE_MEMORY,
- VK_ERROR_DEVICE_LOST};
- static std::vector<VkResult> success_codes = {};
- ValidateReturnCodes("vkReleaseFullScreenExclusiveModeEXT", result, error_codes, success_codes);
return;
}
@@ -1394,7 +1863,7 @@
// Check for uses of ClearAttachments along with LOAD_OP_LOAD,
// as it can be more efficient to just use LOAD_OP_CLEAR
- const RENDER_PASS_STATE* rp = cb_node->activeRenderPass;
+ const RENDER_PASS_STATE* rp = cb_node->activeRenderPass.get();
if (rp) {
const auto& subpass = rp->createInfo.pSubpasses[cb_node->activeSubpass];
@@ -1528,3 +1997,28 @@
return skip;
}
+
+void BestPractices::PostTransformLRUCacheModel::resize(size_t size) { _entries.resize(size); }
+
+bool BestPractices::PostTransformLRUCacheModel::query_cache(uint32_t value) {
+ // look for a cache hit
+ auto hit = std::find_if(_entries.begin(), _entries.end(), [value](const CacheEntry& entry) { return entry.value == value; });
+ if (hit != _entries.end()) {
+ // mark the cache hit as being most recently used
+ hit->age = iteration++;
+ return true;
+ }
+
+ // if there's no cache hit, we need to model the entry being inserted into the cache
+ CacheEntry new_entry = {value, iteration};
+ if (iteration < static_cast<uint32_t>(std::distance(_entries.begin(), _entries.end()))) {
+ // if there is still space left in the cache, use the next available slot
+ *(_entries.begin() + iteration) = new_entry;
+ } else {
+ // otherwise replace the least recently used cache entry
+ auto lru = std::min_element(_entries.begin(), hit, [](const CacheEntry& a, const CacheEntry& b) { return a.age < b.age; });
+ *lru = new_entry;
+ }
+ iteration++;
+ return false;
+}
diff --git a/layers/best_practices_validation.h b/layers/best_practices_validation.h
index 35abf5f..71d69ee 100644
--- a/layers/best_practices_validation.h
+++ b/layers/best_practices_validation.h
@@ -59,6 +59,12 @@
// How many indices make a small indexed drawcall
static const int kSmallIndexedDrawcallIndices = 10;
+// Minimum number of vertices/indices to take into account when doing depth pre-pass checks for Arm Mali GPUs
+static const int kDepthPrePassMinDrawCountArm = 500;
+
+// Minimum, number of draw calls in order to trigger depth pre-pass warnings for Arm Mali GPUs
+static const int kDepthPrePassNumDrawCallsArm = 20;
+
// Maximum sample count for full throughput on Mali GPUs
static const VkSampleCountFlagBits kMaxEfficientSamplesArm = VK_SAMPLE_COUNT_4_BIT;
@@ -66,10 +72,16 @@
public:
using StateTracker = ValidationStateTracker;
+ BestPractices() { container_type = LayerObjectTypeBestPractices; }
+
std::string GetAPIVersionName(uint32_t version) const;
bool ValidateCmdDrawType(VkCommandBuffer cmd_buffer, const char* caller) const;
+ void RecordCmdDrawType(VkCommandBuffer cmd_buffer, uint32_t draw_count, const char* caller);
+
+ void RecordCmdDrawTypeArm(VkCommandBuffer cmd_buffer, uint32_t draw_count, const char* caller);
+
bool ValidateDeprecatedExtensions(const char* api_name, const char* extension_name, uint32_t version, const char* vuid) const;
bool PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
@@ -93,12 +105,19 @@
const VkAllocationCallbacks* pAllocator, VkSwapchainKHR* pSwapchains) const;
bool PreCallValidateCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass) const;
+ bool ValidateAttachments(const VkRenderPassCreateInfo2* rpci, uint32_t attachmentCount, const VkImageView* image_views) const;
bool PreCallValidateCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator, VkFramebuffer* pFramebuffer) const;
+ bool PreCallValidateAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo* pAllocateInfo,
+ VkDescriptorSet* pDescriptorSets, void* ads_state_data) const;
+ void ManualPostCallRecordAllocateDescriptorSets(VkDevice device, const VkDescriptorSetAllocateInfo* pAllocateInfo,
+ VkDescriptorSet* pDescriptorSets, VkResult result, void* ads_state);
+ void PostCallRecordFreeDescriptorSets(VkDevice device, VkDescriptorPool descriptorPool, uint32_t descriptorSetCount,
+ const VkDescriptorSet* pDescriptorSets, VkResult result);
bool PreCallValidateAllocateMemory(VkDevice device, const VkMemoryAllocateInfo* pAllocateInfo,
const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory) const;
- void PostCallRecordAllocateMemory(VkDevice device, const VkMemoryAllocateInfo* pAllocateInfo,
- const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory, VkResult result);
+ void ManualPostCallRecordAllocateMemory(VkDevice device, const VkMemoryAllocateInfo* pAllocateInfo,
+ const VkAllocationCallbacks* pAllocator, VkDeviceMemory* pMemory, VkResult result);
void PreCallRecordFreeMemory(VkDevice device, VkDeviceMemory memory, const VkAllocationCallbacks* pAllocator);
bool ValidateBindBufferMemory(VkBuffer buffer, VkDeviceMemory memory, const char* api_name) const;
bool PreCallValidateBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory memory, VkDeviceSize memoryOffset) const;
@@ -140,6 +159,7 @@
const VkImageMemoryBarrier* pImageMemoryBarriers) const;
bool PreCallValidateCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
VkQueryPool queryPool, uint32_t query) const;
+ void PostCallRecordCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline);
bool ValidateCmdBeginRenderPass(VkCommandBuffer commandBuffer, RenderPassCreateVersion rp_version,
const VkRenderPassBeginInfo* pRenderPassBegin) const;
bool PreCallValidateCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin,
@@ -148,18 +168,37 @@
const VkSubpassBeginInfoKHR* pSubpassBeginInfo) const;
bool PreCallValidateCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin,
const VkSubpassBeginInfoKHR* pSubpassBeginInfo) const;
+ void RecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, RenderPassCreateVersion rp_version,
+ const VkRenderPassBeginInfo* pRenderPassBegin);
+ void PostCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin,
+ VkSubpassContents contents);
+ void PostCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin,
+ const VkSubpassBeginInfo* pSubpassBeginInfo);
+ void PostCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin,
+ const VkSubpassBeginInfo* pSubpassBeginInfo);
bool PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
uint32_t firstInstance) const;
+ void PostCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
+ uint32_t firstInstance);
bool PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const;
+ bool ValidateIndexBufferArm(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex,
+ int32_t vertexOffset, uint32_t firstInstance) const;
void PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance);
+ void PostCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
+ uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance);
bool PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
uint32_t stride) const;
+ void PostCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
+ uint32_t stride);
bool PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
uint32_t drawCount, uint32_t stride) const;
+ void PostCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
+ uint32_t stride);
bool PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY,
uint32_t groupCountZ) const;
+ bool PreCallValidateCmdEndRenderPass(VkCommandBuffer commandBuffer) const;
bool ValidateGetPhysicalDeviceDisplayPlanePropertiesKHRQuery(VkPhysicalDevice physicalDevice, const char* api_name) const;
bool PreCallValidateGetDisplayPlaneSupportedDisplaysKHR(VkPhysicalDevice physicalDevice, uint32_t planeIndex,
uint32_t* pDisplayCount, VkDisplayKHR* pDisplays) const;
@@ -188,27 +227,74 @@
const VkBindAccelerationStructureMemoryInfoNV* pBindInfos) const;
bool PreCallValidateQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo* pBindInfo,
VkFence fence) const;
- void PostCallRecordQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo* pBindInfo, VkFence fence,
- VkResult result);
+ void ManualPostCallRecordQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo* pBindInfo,
+ VkFence fence, VkResult result);
bool PreCallValidateCmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
const VkClearAttachment* pAttachments, uint32_t rectCount,
const VkClearRect* pRects) const;
- void ValidateReturnCodes(const char* api_name, VkResult result, const std::vector<VkResult>& success_codes,
- const std::vector<VkResult>& error_codes) const;
+ void ValidateReturnCodes(const char* api_name, VkResult result, const std::vector<VkResult>& error_codes,
+ const std::vector<VkResult>& success_codes) const;
bool PreCallValidateCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
const VkImageResolve* pRegions) const;
bool PreCallValidateCreateSampler(VkDevice device, const VkSamplerCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator, VkSampler* pSampler) const;
- void PostCallRecordQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR* pPresentInfo, VkResult result);
+ void ManualPostCallRecordQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR* pPresentInfo, VkResult result);
+ void ManualPostCallRecordCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
+ const VkGraphicsPipelineCreateInfo* pCreateInfos,
+ const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines,
+ VkResult result, void* cgpl_state_data);
// Include code-generated functions
#include "best_practices.h"
private:
- uint32_t instance_api_version;
+ uint32_t instance_api_version = 0;
uint32_t num_mem_objects = 0;
// Check that vendor-specific checks are enabled for at least one of the vendors
bool VendorCheckEnabled(BPVendorFlags vendors) const;
+
+ // State for use in best practices:
+ std::unordered_map<VkDescriptorPool, uint32_t> descriptor_pool_freed_count = {};
+
+ struct CacheEntry {
+ uint32_t value;
+ uint32_t age;
+ };
+
+ class PostTransformLRUCacheModel {
+ public:
+ typedef std::vector<CacheEntry>::iterator cache_iterator;
+
+ void resize(size_t size);
+
+ // Returns true if there was a cache hit - also models LRU behavior which will effect subsequent calls.
+ bool query_cache(uint32_t value);
+
+ private:
+ std::vector<CacheEntry> _entries = {};
+ uint32_t iteration = 0;
+ };
+
+ struct GraphicsPipelineCIs {
+ const safe_VkPipelineDepthStencilStateCreateInfo* depthStencilStateCI;
+ const safe_VkPipelineColorBlendStateCreateInfo* colorBlendStateCI;
+ };
+
+ // used to track CreateInfos for graphics pipelines
+ std::unordered_map<VkPipeline, GraphicsPipelineCIs> graphicsPipelineCIs = {};
+
+ // used to track state regarding depth pre-pass heuristic checks
+ struct DepthPrePassState {
+ bool depthAttachment = false;
+ bool colorAttachment = false;
+ bool depthOnly = false;
+ bool depthEqualComparison = false;
+ uint32_t numDrawCallsDepthOnly = 0;
+ uint32_t numDrawCallsDepthEqualCompare = 0;
+ };
+
+ // used to track depth pre-pass heuristic data per command buffer
+ std::unordered_map<VkCommandBuffer, DepthPrePassState> cbDepthPrePassStates = {};
};
diff --git a/layers/buffer_validation.cpp b/layers/buffer_validation.cpp
index 91fa2c9..86d18d3 100644
--- a/layers/buffer_validation.cpp
+++ b/layers/buffer_validation.cpp
@@ -49,8 +49,6 @@
return subresource_range;
}
-static VkImageSubresourceRange NormalizeSubresourceRange(const VkImageCreateInfo &image_create_info,
- const VkImageSubresourceRange &range);
static VkImageSubresourceRange MakeImageFullRange(const VkImageCreateInfo &create_info) {
const auto format = create_info.format;
VkImageSubresourceRange init_range{0, 0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS};
@@ -63,7 +61,7 @@
return NormalizeSubresourceRange(create_info, init_range);
}
-IMAGE_STATE::IMAGE_STATE(VkImage img, const VkImageCreateInfo *pCreateInfo)
+IMAGE_STATE::IMAGE_STATE(VkDevice dev, VkImage img, const VkImageCreateInfo *pCreateInfo)
: image(img),
safe_create_info(pCreateInfo),
createInfo(*safe_create_info.ptr()),
@@ -74,7 +72,6 @@
get_sparse_reqs_called(false),
sparse_metadata_required(false),
sparse_metadata_bound(false),
- imported_ahb(false),
has_ahb_format(false),
is_swapchain_image(false),
ahb_format(0),
@@ -83,6 +80,13 @@
bind_swapchain(VK_NULL_HANDLE),
bind_swapchain_imageIndex(0),
range_encoder(full_range),
+ disjoint(false),
+ plane0_memory_requirements_checked(false),
+ plane1_memory_requirements_checked(false),
+ plane2_memory_requirements_checked(false),
+ subresource_encoder(full_range),
+ fragment_encoder(nullptr),
+ store_device_as_workaround(dev), // TODO REMOVE WHEN encoder can be const
sparse_requirements{} {
if ((createInfo.sharingMode == VK_SHARING_MODE_CONCURRENT) && (createInfo.queueFamilyIndexCount > 0)) {
uint32_t *pQueueFamilyIndices = new uint32_t[createInfo.queueFamilyIndexCount];
@@ -100,16 +104,6 @@
if (externalMemoryInfo) {
external_memory_handle = externalMemoryInfo->handleTypes;
}
-
-#ifdef VK_USE_PLATFORM_ANDROID_KHR
- auto external_format = lvl_find_in_chain<VkExternalFormatANDROID>(createInfo.pNext);
- if (external_format) {
- external_format_android = external_format->externalFormat;
- } else {
- // If externalFormat is zero, the effect is as if the VkExternalFormatANDROID structure was not present.
- external_format_android = 0;
- }
-#endif // VK_USE_PLATFORM_ANDROID_KHR
}
bool IMAGE_STATE::IsCreateInfoEqual(const VkImageCreateInfo &other_createInfo) const {
@@ -119,7 +113,8 @@
is_equal = is_equal && IsUsageEqual(other_createInfo) && IsInitialLayoutEqual(other_createInfo);
is_equal = is_equal && IsExtentEqual(other_createInfo) && IsTilingEqual(other_createInfo);
is_equal = is_equal && IsSamplesEqual(other_createInfo) && IsSharingModeEqual(other_createInfo);
- return is_equal && IsQueueFamilyIndicesEqual(other_createInfo);
+ return is_equal &&
+ ((createInfo.sharingMode == VK_SHARING_MODE_CONCURRENT) ? IsQueueFamilyIndicesEqual(other_createInfo) : true);
}
// Check image compatibility rules for VK_NV_dedicated_allocation_image_aliasing
@@ -129,7 +124,9 @@
is_compatible = is_compatible && IsMipLevelsEqual(other_createInfo);
is_compatible = is_compatible && IsUsageEqual(other_createInfo) && IsInitialLayoutEqual(other_createInfo);
is_compatible = is_compatible && IsSamplesEqual(other_createInfo) && IsSharingModeEqual(other_createInfo);
- is_compatible = is_compatible && IsQueueFamilyIndicesEqual(other_createInfo) && IsTilingEqual(other_createInfo);
+ is_compatible = is_compatible &&
+ ((createInfo.sharingMode == VK_SHARING_MODE_CONCURRENT) ? IsQueueFamilyIndicesEqual(other_createInfo) : true);
+ is_compatible = is_compatible && IsTilingEqual(other_createInfo);
is_compatible = is_compatible && createInfo.extent.width <= other_createInfo.extent.width &&
createInfo.extent.height <= other_createInfo.extent.height &&
@@ -157,7 +154,7 @@
: image_view(iv),
create_info(*ci),
normalized_subresource_range(NormalizeSubresourceRange(*im, ci->subresourceRange)),
- range_generator(im->range_encoder, normalized_subresource_range),
+ range_generator(im->subresource_encoder, normalized_subresource_range),
samplerConversion(VK_NULL_HANDLE),
image_state(im) {
auto *conversionInfo = lvl_find_in_chain<VkSamplerYcbcrConversionInfo>(create_info.pNext);
@@ -184,37 +181,6 @@
uint32_t FullMipChainLevels(VkExtent2D extent) { return FullMipChainLevels(extent.height, extent.width); }
-static VkImageSubresourceRange NormalizeSubresourceRange(const VkImageCreateInfo &image_create_info,
- const VkImageSubresourceRange &range) {
- VkImageSubresourceRange norm = range;
- norm.levelCount = ResolveRemainingLevels(&range, image_create_info.mipLevels);
-
- // Special case for 3D images with VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR flag bit, where <extent.depth> and
- // <arrayLayers> can potentially alias.
- uint32_t layer_limit = (0 != (image_create_info.flags & VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR))
- ? image_create_info.extent.depth
- : image_create_info.arrayLayers;
- norm.layerCount = ResolveRemainingLayers(&range, layer_limit);
-
- // For multiplanar formats, IMAGE_ASPECT_COLOR is equivalent to adding the aspect of the individual planes
- VkImageAspectFlags &aspect_mask = norm.aspectMask;
- if (FormatIsMultiplane(image_create_info.format)) {
- if (aspect_mask & VK_IMAGE_ASPECT_COLOR_BIT) {
- aspect_mask &= ~VK_IMAGE_ASPECT_COLOR_BIT;
- aspect_mask |= (VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT);
- if (FormatPlaneCount(image_create_info.format) > 2) {
- aspect_mask |= VK_IMAGE_ASPECT_PLANE_2_BIT;
- }
- }
- }
- return norm;
-}
-
-VkImageSubresourceRange NormalizeSubresourceRange(const IMAGE_STATE &image_state, const VkImageSubresourceRange &range) {
- const VkImageCreateInfo &image_create_info = image_state.createInfo;
- return NormalizeSubresourceRange(image_create_info, range);
-}
-
bool CoreChecks::FindLayouts(VkImage image, std::vector<VkImageLayout> &layouts) const {
auto image_state = GetImageState(image);
if (!image_state) return false;
@@ -257,7 +223,7 @@
// Set the initial image layout for all slices of an image view
void CoreChecks::SetImageViewInitialLayout(CMD_BUFFER_STATE *cb_node, const IMAGE_VIEW_STATE &view_state, VkImageLayout layout) {
- if (disabled.image_layout_validation) {
+ if (disabled[image_layout_validation]) {
return;
}
IMAGE_STATE *image_state = view_state.image_state.get();
@@ -327,20 +293,26 @@
auto image_state = GetImageState(image);
const char *vuid;
const bool use_rp2 = (rp_version == RENDER_PASS_VERSION_2);
+ const char *function_name = use_rp2 ? "vkCmdBeginRenderPass2()" : "vkCmdBeginRenderPass()";
if (!image_state) {
LogObjectList objlist(image);
objlist.add(renderpass);
objlist.add(framebuffer);
objlist.add(image_view);
- skip |= LogError(image, "VUID-VkRenderPassBeginInfo-framebuffer-parameter",
- "Render Pass begin with %s uses %s where pAttachments[%" PRIu32 "] = %s, which refers to an invalid image",
- report_data->FormatHandle(renderpass).c_str(), report_data->FormatHandle(framebuffer).c_str(),
- attachment_index, report_data->FormatHandle(image_view).c_str());
+ skip |=
+ LogError(image, "VUID-VkRenderPassBeginInfo-framebuffer-parameter",
+ "%s: RenderPass %s uses %s where pAttachments[%" PRIu32 "] = %s, which refers to an invalid image",
+ function_name, report_data->FormatHandle(renderpass).c_str(), report_data->FormatHandle(framebuffer).c_str(),
+ attachment_index, report_data->FormatHandle(image_view).c_str());
return skip;
}
auto image_usage = image_state->createInfo.usage;
+ const auto stencil_usage_info = lvl_find_in_chain<VkImageStencilUsageCreateInfo>(image_state->createInfo.pNext);
+ if (stencil_usage_info) {
+ image_usage |= stencil_usage_info->stencilUsage;
+ }
// Check for layouts that mismatch image usages in the framebuffer
if (layout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL && !(image_usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)) {
@@ -349,13 +321,13 @@
objlist.add(renderpass);
objlist.add(framebuffer);
objlist.add(image_view);
- skip |=
- LogError(objlist, vuid,
- "Layout/usage mismatch for attachment %u in %s"
- " - the %s is %s but the image attached to %s via %s"
- " was not created with VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT",
- attachment_index, report_data->FormatHandle(renderpass).c_str(), variable_name, string_VkImageLayout(layout),
- report_data->FormatHandle(framebuffer).c_str(), report_data->FormatHandle(image_view).c_str());
+ skip |= LogError(objlist, vuid,
+ "%s: Layout/usage mismatch for attachment %u in %s"
+ " - the %s is %s but the image attached to %s via %s"
+ " was not created with VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT",
+ function_name, attachment_index, report_data->FormatHandle(renderpass).c_str(), variable_name,
+ string_VkImageLayout(layout), report_data->FormatHandle(framebuffer).c_str(),
+ report_data->FormatHandle(image_view).c_str());
}
if (layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL &&
@@ -365,13 +337,13 @@
objlist.add(renderpass);
objlist.add(framebuffer);
objlist.add(image_view);
- skip |=
- LogError(objlist, vuid,
- "Layout/usage mismatch for attachment %u in %s"
- " - the %s is %s but the image attached to %s via %s"
- " was not created with VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT or VK_IMAGE_USAGE_SAMPLED_BIT",
- attachment_index, report_data->FormatHandle(renderpass).c_str(), variable_name, string_VkImageLayout(layout),
- report_data->FormatHandle(framebuffer).c_str(), report_data->FormatHandle(image_view).c_str());
+ skip |= LogError(objlist, vuid,
+ "%s: Layout/usage mismatch for attachment %u in %s"
+ " - the %s is %s but the image attached to %s via %s"
+ " was not created with VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT or VK_IMAGE_USAGE_SAMPLED_BIT",
+ function_name, attachment_index, report_data->FormatHandle(renderpass).c_str(), variable_name,
+ string_VkImageLayout(layout), report_data->FormatHandle(framebuffer).c_str(),
+ report_data->FormatHandle(image_view).c_str());
}
if (layout == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL && !(image_usage & VK_IMAGE_USAGE_TRANSFER_SRC_BIT)) {
@@ -380,13 +352,13 @@
objlist.add(renderpass);
objlist.add(framebuffer);
objlist.add(image_view);
- skip |=
- LogError(objlist, vuid,
- "Layout/usage mismatch for attachment %u in %s"
- " - the %s is %s but the image attached to %s via %s"
- " was not created with VK_IMAGE_USAGE_TRANSFER_SRC_BIT",
- attachment_index, report_data->FormatHandle(renderpass).c_str(), variable_name, string_VkImageLayout(layout),
- report_data->FormatHandle(framebuffer).c_str(), report_data->FormatHandle(image_view).c_str());
+ skip |= LogError(objlist, vuid,
+ "%s: Layout/usage mismatch for attachment %u in %s"
+ " - the %s is %s but the image attached to %s via %s"
+ " was not created with VK_IMAGE_USAGE_TRANSFER_SRC_BIT",
+ function_name, attachment_index, report_data->FormatHandle(renderpass).c_str(), variable_name,
+ string_VkImageLayout(layout), report_data->FormatHandle(framebuffer).c_str(),
+ report_data->FormatHandle(image_view).c_str());
}
if (layout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL && !(image_usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT)) {
@@ -395,13 +367,13 @@
objlist.add(renderpass);
objlist.add(framebuffer);
objlist.add(image_view);
- skip |=
- LogError(objlist, vuid,
- "Layout/usage mismatch for attachment %u in %s"
- " - the %s is %s but the image attached to %s via %s"
- " was not created with VK_IMAGE_USAGE_TRANSFER_DST_BIT",
- attachment_index, report_data->FormatHandle(renderpass).c_str(), variable_name, string_VkImageLayout(layout),
- report_data->FormatHandle(framebuffer).c_str(), report_data->FormatHandle(image_view).c_str());
+ skip |= LogError(objlist, vuid,
+ "%s: Layout/usage mismatch for attachment %u in %s"
+ " - the %s is %s but the image attached to %s via %s"
+ " was not created with VK_IMAGE_USAGE_TRANSFER_DST_BIT",
+ function_name, attachment_index, report_data->FormatHandle(renderpass).c_str(), variable_name,
+ string_VkImageLayout(layout), report_data->FormatHandle(framebuffer).c_str(),
+ report_data->FormatHandle(image_view).c_str());
}
if (device_extensions.vk_khr_maintenance2) {
@@ -416,10 +388,10 @@
objlist.add(framebuffer);
objlist.add(image_view);
skip |= LogError(objlist, vuid,
- "Layout/usage mismatch for attachment %u in %s"
+ "%s: Layout/usage mismatch for attachment %u in %s"
" - the %s is %s but the image attached to %s via %s"
" was not created with VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT",
- attachment_index, report_data->FormatHandle(renderpass).c_str(), variable_name,
+ function_name, attachment_index, report_data->FormatHandle(renderpass).c_str(), variable_name,
string_VkImageLayout(layout), report_data->FormatHandle(framebuffer).c_str(),
report_data->FormatHandle(image_view).c_str());
}
@@ -433,10 +405,10 @@
objlist.add(framebuffer);
objlist.add(image_view);
skip |= LogError(objlist, "VUID-vkCmdBeginRenderPass-initialLayout-00896",
- "Layout/usage mismatch for attachment %u in %s"
+ "%s: Layout/usage mismatch for attachment %u in %s"
" - the %s is %s but the image attached to %s via %s"
" was not created with VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT",
- attachment_index, report_data->FormatHandle(renderpass).c_str(), variable_name,
+ function_name, attachment_index, report_data->FormatHandle(renderpass).c_str(), variable_name,
string_VkImageLayout(layout), report_data->FormatHandle(framebuffer).c_str(),
report_data->FormatHandle(image_view).c_str());
}
@@ -610,7 +582,7 @@
lvl_find_in_chain<VkRenderPassAttachmentBeginInfoKHR>(pCB->activeRenderPassBeginInfo.pNext);
if (attachment_info) image_view = GetImageViewState(attachment_info->pAttachments[ref.attachment]);
} else {
- image_view = GetAttachmentImageViewState(pFramebuffer, ref.attachment);
+ image_view = GetAttachmentImageViewState(pCB, pFramebuffer, ref.attachment);
}
if (image_view) {
VkImageLayout stencil_layout = kInvalidLayout;
@@ -656,7 +628,7 @@
lvl_find_in_chain<VkRenderPassAttachmentBeginInfoKHR>(cb_state->activeRenderPassBeginInfo.pNext);
if (attachment_info) view_state = GetImageViewState(attachment_info->pAttachments[i]);
} else {
- view_state = GetAttachmentImageViewState(framebuffer_state, i);
+ view_state = GetAttachmentImageViewState(cb_state, framebuffer_state, i);
}
if (view_state) {
VkImageLayout stencil_layout = kInvalidLayout;
@@ -734,6 +706,16 @@
msg_code = "VUID-VkImageMemoryBarrier-oldLayout-02088";
}
break;
+ case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL:
+ if ((usage_flags & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) == 0) {
+ msg_code = "VUID-VkImageMemoryBarrier-oldLayout-01658";
+ }
+ break;
+ case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL:
+ if ((usage_flags & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) == 0) {
+ msg_code = "VUID-VkImageMemoryBarrier-oldLayout-01659";
+ }
+ break;
default:
// Other VkImageLayout values do not have VUs defined in this context.
break;
@@ -814,16 +796,17 @@
// TODO: Add unique id for error when available
skip |= LogError(
img_barrier.image, 0,
- "Attempting to transition shared presentable %s"
+ "%s: Attempting to transition shared presentable %s"
" from layout %s to layout %s, but image has already been presented and cannot have its layout transitioned.",
- report_data->FormatHandle(img_barrier.image).c_str(), string_VkImageLayout(img_barrier.oldLayout),
+ func_name, report_data->FormatHandle(img_barrier.image).c_str(), string_VkImageLayout(img_barrier.oldLayout),
string_VkImageLayout(img_barrier.newLayout));
}
const VkImageCreateInfo &image_create_info = image_state->createInfo;
+ const VkFormat image_format = image_create_info.format;
+ const VkImageAspectFlags aspect_mask = img_barrier.subresourceRange.aspectMask;
// For a Depth/Stencil image both aspects MUST be set
- if (FormatIsDepthAndStencil(image_create_info.format)) {
- auto const aspect_mask = img_barrier.subresourceRange.aspectMask;
+ if (FormatIsDepthAndStencil(image_format)) {
if (enabled_features.core12.separateDepthStencilLayouts) {
if (!(aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT))) {
skip |=
@@ -831,16 +814,19 @@
"%s: Image barrier %s references %s of format %s that must have either the depth or stencil "
"aspects set, but its aspectMask is 0x%" PRIx32 ".",
func_name, barrier_pname.c_str(), report_data->FormatHandle(img_barrier.image).c_str(),
- string_VkFormat(image_create_info.format), aspect_mask);
+ string_VkFormat(image_format), aspect_mask);
}
} else {
auto const ds_mask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
if ((aspect_mask & ds_mask) != (ds_mask)) {
- skip |= LogError(img_barrier.image, "VUID-VkImageMemoryBarrier-image-03320",
+ const char *vuid = device_extensions.vk_khr_separate_depth_stencil_layouts
+ ? "VUID-VkImageMemoryBarrier-image-03320"
+ : "VUID-VkImageMemoryBarrier-image-01207";
+ skip |= LogError(img_barrier.image, vuid,
"%s: Image barrier %s references %s of format %s that must have the depth and stencil "
"aspects set, but its aspectMask is 0x%" PRIx32 ".",
func_name, barrier_pname.c_str(), report_data->FormatHandle(img_barrier.image).c_str(),
- string_VkFormat(image_create_info.format), aspect_mask);
+ string_VkFormat(image_format), aspect_mask);
}
}
}
@@ -850,7 +836,7 @@
// TODO: Set memory invalid which is in mem_tracker currently
// Not sure if this needs to be in the ForRange traversal, pulling it out as it is currently invariant with
// subresource.
- } else if (subresource_map) {
+ } else if (subresource_map && !QueueFamilyIsExternal(img_barrier.srcQueueFamilyIndex)) {
bool subres_skip = false;
LayoutUseCheckAndMessage layout_check(subresource_map);
VkImageSubresourceRange normalized_isr = NormalizeSubresourceRange(*image_state, img_barrier.subresourceRange);
@@ -859,15 +845,50 @@
if (!layout_check.Check(value.subresource, img_barrier.oldLayout, value.current_layout, value.initial_layout)) {
subres_skip = LogError(
cb_state->commandBuffer, "VUID-VkImageMemoryBarrier-oldLayout-01197",
- "For %s you cannot transition the layout of aspect=%d level=%d layer=%d from %s when the "
+ "%s: For %s you cannot transition the layout of aspect=%d level=%d layer=%d from %s when the "
"%s layout is %s.",
- report_data->FormatHandle(img_barrier.image).c_str(), value.subresource.aspectMask,
+ func_name, report_data->FormatHandle(img_barrier.image).c_str(), value.subresource.aspectMask,
value.subresource.mipLevel, value.subresource.arrayLayer, string_VkImageLayout(img_barrier.oldLayout),
layout_check.message, string_VkImageLayout(layout_check.layout));
}
}
skip |= subres_skip;
}
+
+ // checks color format and (single-plane or non-disjoint)
+ // if ycbcr extension is not supported then single-plane and non-disjoint are always both true
+ if ((FormatIsColor(image_format) == true) &&
+ ((FormatIsMultiplane(image_format) == false) || (image_state->disjoint == false))) {
+ if (aspect_mask != VK_IMAGE_ASPECT_COLOR_BIT) {
+ const char *vuid = (device_extensions.vk_khr_sampler_ycbcr_conversion)
+ ? "VUID-VkImageMemoryBarrier-image-01671"
+ : "VUID-VkImageMemoryBarrier-image-02902";
+ skip |= LogError(img_barrier.image, vuid,
+ "%s: Image barrier %s references %s of format %s that must be only VK_IMAGE_ASPECT_COLOR_BIT, "
+ "but its aspectMask is 0x%" PRIx32 ".",
+ func_name, barrier_pname.c_str(), report_data->FormatHandle(img_barrier.image).c_str(),
+ string_VkFormat(image_format), aspect_mask);
+ }
+ }
+
+ VkImageAspectFlags valid_disjoint_mask =
+ VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT | VK_IMAGE_ASPECT_PLANE_2_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
+ if ((FormatIsMultiplane(image_format) == true) && (image_state->disjoint == true) &&
+ ((aspect_mask & valid_disjoint_mask) == 0)) {
+ skip |= LogError(img_barrier.image, "VUID-VkImageMemoryBarrier-image-01672",
+ "%s: Image barrier %s references %s of format %s has aspectMask (0x%" PRIx32
+ ") but needs to include either an VK_IMAGE_ASPECT_PLANE_*_BIT or VK_IMAGE_ASPECT_COLOR_BIT.",
+ func_name, barrier_pname.c_str(), report_data->FormatHandle(img_barrier.image).c_str(),
+ string_VkFormat(image_format), aspect_mask);
+ }
+
+ if ((FormatPlaneCount(image_format) == 2) && ((aspect_mask & VK_IMAGE_ASPECT_PLANE_2_BIT) != 0)) {
+ skip |= LogError(img_barrier.image, "VUID-VkImageMemoryBarrier-image-01673",
+ "%s: Image barrier %s references %s of format %s has only two planes but included "
+ "VK_IMAGE_ASPECT_PLANE_2_BIT in its aspectMask (0x%" PRIx32 ").",
+ func_name, barrier_pname.c_str(), report_data->FormatHandle(img_barrier.image).c_str(),
+ string_VkFormat(image_format), aspect_mask);
+ }
}
}
return skip;
@@ -894,14 +915,14 @@
if (!IsTransferOp(&barriers[b])) continue;
const BarrierRecord *barrier_record = nullptr;
if (TempIsReleaseOp<Barrier, true /* Assume IsTransfer */>(pool, &barriers[b]) &&
- !QueueFamilyIsSpecial(barriers[b].dstQueueFamilyIndex)) {
+ !QueueFamilyIsExternal(barriers[b].dstQueueFamilyIndex)) {
const auto found = barrier_sets.release.find(barriers[b]);
if (found != barrier_sets.release.cend()) {
barrier_record = &(*found);
transfer_type = "releasing";
}
} else if (IsAcquireOp<Barrier, true /*Assume IsTransfer */>(pool, &barriers[b]) &&
- !QueueFamilyIsSpecial(barriers[b].srcQueueFamilyIndex)) {
+ !QueueFamilyIsExternal(barriers[b].srcQueueFamilyIndex)) {
const auto found = barrier_sets.acquire.find(barriers[b]);
if (found != barrier_sets.acquire.cend()) {
barrier_record = &(*found);
@@ -947,10 +968,10 @@
auto &barrier = barriers[b];
if (IsTransferOp(&barrier)) {
if (TempIsReleaseOp<Barrier, true /* Assume IsTransfer*/>(pool, &barrier) &&
- !QueueFamilyIsSpecial(barrier.dstQueueFamilyIndex)) {
+ !QueueFamilyIsExternal(barrier.dstQueueFamilyIndex)) {
barrier_sets.release.emplace(barrier);
} else if (IsAcquireOp<Barrier, true /*Assume IsTransfer */>(pool, &barrier) &&
- !QueueFamilyIsSpecial(barrier.srcQueueFamilyIndex)) {
+ !QueueFamilyIsExternal(barrier.srcQueueFamilyIndex)) {
barrier_sets.acquire.emplace(barrier);
}
}
@@ -1141,10 +1162,17 @@
normalized_isr.layerCount = image_create_info.extent.depth; // Treat each depth slice as a layer subresource
}
+ VkImageLayout initial_layout = mem_barrier.oldLayout;
+
+ // Layout transitions in external instance are not tracked, so don't validate initial layout.
+ if (QueueFamilyIsExternal(mem_barrier.srcQueueFamilyIndex)) {
+ initial_layout = VK_IMAGE_LAYOUT_UNDEFINED;
+ }
+
if (is_release_op) {
SetImageInitialLayout(cb_state, *image_state, normalized_isr, mem_barrier.oldLayout);
} else {
- SetImageLayout(cb_state, *image_state, normalized_isr, mem_barrier.newLayout, mem_barrier.oldLayout);
+ SetImageLayout(cb_state, *image_state, normalized_isr, mem_barrier.newLayout, initial_layout);
}
}
@@ -1152,7 +1180,7 @@
const VkImageSubresourceRange &range, VkImageAspectFlags aspect_mask,
VkImageLayout explicit_layout, VkImageLayout optimal_layout, const char *caller,
const char *layout_invalid_msg_code, const char *layout_mismatch_msg_code, bool *error) const {
- if (disabled.image_layout_validation) return false;
+ if (disabled[image_layout_validation]) return false;
assert(cb_node);
assert(image_state);
const auto image = image_state->image;
@@ -1188,9 +1216,10 @@
} else if (device_extensions.vk_khr_shared_presentable_image) {
if (image_state->shared_presentable) {
if (VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR != explicit_layout) {
- skip |= LogError(device, layout_invalid_msg_code,
- "Layout for shared presentable image is %s but must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR.",
- string_VkImageLayout(optimal_layout));
+ skip |=
+ LogError(device, layout_invalid_msg_code,
+ "%s: Layout for shared presentable image is %s but must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR.",
+ caller, string_VkImageLayout(optimal_layout));
}
}
} else {
@@ -1224,7 +1253,7 @@
const auto attachment_info = lvl_find_in_chain<VkRenderPassAttachmentBeginInfoKHR>(pRenderPassBegin->pNext);
if (attachment_info) view_state = GetImageViewState(attachment_info->pAttachments[i]);
} else {
- view_state = GetAttachmentImageViewState(framebuffer_state, i);
+ view_state = GetAttachmentImageViewState(pCB, framebuffer_state, i);
}
if (view_state) {
VkImageLayout stencil_layout = kInvalidLayout;
@@ -1268,7 +1297,9 @@
if (0 != (~VK_IMAGE_USAGE_SAMPLED_BIT & create_info->usage)) {
skip |= LogError(device, "VUID-VkImageCreateInfo-pNext-02397",
"vkCreateImage(): VkImageCreateInfo struct has a chained VkExternalFormatANDROID struct with "
- "non-zero externalFormat, but usage includes bits other than VK_IMAGE_USAGE_SAMPLED_BIT.");
+ "non-zero externalFormat, but usage includes bits (0x%" PRIx64
+ ") other than VK_IMAGE_USAGE_SAMPLED_BIT.",
+ create_info->usage);
}
if (VK_IMAGE_TILING_OPTIMAL != create_info->tiling) {
@@ -1278,10 +1309,13 @@
}
}
- if ((0 != ext_fmt_android->externalFormat) && (0 == ahb_ext_formats_set.count(ext_fmt_android->externalFormat))) {
+ if ((0 != ext_fmt_android->externalFormat) &&
+ (ahb_ext_formats_map.find(ext_fmt_android->externalFormat) == ahb_ext_formats_map.end())) {
skip |= LogError(device, "VUID-VkExternalFormatANDROID-externalFormat-01894",
- "vkCreateImage(): Chained VkExternalFormatANDROID struct contains a non-zero externalFormat which has "
- "not been previously retrieved by vkGetAndroidHardwareBufferPropertiesANDROID().");
+ "vkCreateImage(): Chained VkExternalFormatANDROID struct contains a non-zero externalFormat (%" PRIu64
+ ") which has "
+ "not been previously retrieved by vkGetAndroidHardwareBufferPropertiesANDROID().",
+ ext_fmt_android->externalFormat);
}
}
@@ -1324,7 +1358,7 @@
if (VK_FORMAT_UNDEFINED != create_info->format) {
skip |= LogError(create_info->image, "VUID-VkImageViewCreateInfo-image-02399",
"vkCreateImageView(): VkImageViewCreateInfo struct has a chained VkExternalFormatANDROID struct, but "
- "format member is %s.",
+ "format member is %s and must be VK_FORMAT_UNDEFINED.",
string_VkFormat(create_info->format));
}
@@ -1341,18 +1375,22 @@
}
if ((!conv_found) || (external_format != image_state->ahb_format)) {
skip |= LogError(create_info->image, "VUID-VkImageViewCreateInfo-image-02400",
- "vkCreateImageView(): VkImageViewCreateInfo struct has a chained VkExternalFormatANDROID struct, but "
- "without a chained VkSamplerYcbcrConversionInfo struct with the same external format.");
+ "vkCreateImageView(): VkImageViewCreateInfo struct has a chained VkExternalFormatANDROID struct with "
+ "an externalFormat (%" PRIu64
+ ") but needs a chained VkSamplerYcbcrConversionInfo struct with a VkSamplerYcbcrConversion created "
+ "with the same external format.",
+ image_state->ahb_format);
}
// Errors in create_info swizzles
- if ((create_info->components.r != VK_COMPONENT_SWIZZLE_IDENTITY) ||
- (create_info->components.g != VK_COMPONENT_SWIZZLE_IDENTITY) ||
- (create_info->components.b != VK_COMPONENT_SWIZZLE_IDENTITY) ||
- (create_info->components.a != VK_COMPONENT_SWIZZLE_IDENTITY)) {
- skip |= LogError(create_info->image, "VUID-VkImageViewCreateInfo-image-02401",
- "vkCreateImageView(): VkImageViewCreateInfo struct has a chained VkExternalFormatANDROID struct, but "
- "includes one or more non-identity component swizzles.");
+ if (IsIdentitySwizzle(create_info->components) == false) {
+ skip |= LogError(
+ create_info->image, "VUID-VkImageViewCreateInfo-image-02401",
+ "vkCreateImageView(): VkImageViewCreateInfo struct has a chained VkExternalFormatANDROID struct, but "
+ "includes one or more non-identity component swizzles, r swizzle = %s, g swizzle = %s, b swizzle = %s, a swizzle "
+ "= %s.",
+ string_VkComponentSwizzle(create_info->components.r), string_VkComponentSwizzle(create_info->components.g),
+ string_VkComponentSwizzle(create_info->components.b), string_VkComponentSwizzle(create_info->components.a));
}
}
@@ -1363,11 +1401,13 @@
bool skip = false;
const IMAGE_STATE *image_state = GetImageState(image);
- if (image_state->imported_ahb && (0 == image_state->GetBoundMemory().size())) {
- skip |= LogError(image, "VUID-vkGetImageSubresourceLayout-image-01895",
- "vkGetImageSubresourceLayout(): Attempt to query layout from an image created with "
- "VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID handleType which has not yet been "
- "bound to memory.");
+ if (image_state != nullptr) {
+ if (image_state->external_ahb && (0 == image_state->GetBoundMemory().size())) {
+ skip |= LogError(image, "VUID-vkGetImageSubresourceLayout-image-01895",
+ "vkGetImageSubresourceLayout(): Attempt to query layout from an image created with "
+ "VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID handleType which has not yet been "
+ "bound to memory.");
+ }
}
return skip;
}
@@ -1384,6 +1424,75 @@
#endif // VK_USE_PLATFORM_ANDROID_KHR
+bool CoreChecks::ValidateImageFormatFeatures(const VkImageCreateInfo *pCreateInfo) const {
+ bool skip = false;
+
+ // validates based on imageCreateFormatFeatures from vkspec.html#resources-image-creation-limits
+ VkFormatFeatureFlags tiling_features = VK_FORMAT_FEATURE_FLAG_BITS_MAX_ENUM;
+ const VkImageTiling image_tiling = pCreateInfo->tiling;
+ const VkFormat image_format = pCreateInfo->format;
+
+ if (image_format == VK_FORMAT_UNDEFINED) {
+ // VU 01975 states format can't be undefined unless an android externalFormat
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
+ const VkExternalFormatANDROID *ext_fmt_android = lvl_find_in_chain<VkExternalFormatANDROID>(pCreateInfo->pNext);
+ if ((image_tiling == VK_IMAGE_TILING_OPTIMAL) && (ext_fmt_android != nullptr) && (0 != ext_fmt_android->externalFormat)) {
+ auto it = ahb_ext_formats_map.find(ext_fmt_android->externalFormat);
+ if (it != ahb_ext_formats_map.end()) {
+ tiling_features = it->second;
+ }
+ }
+#endif
+ } else if (image_tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
+ uint64_t drm_format_modifier = 0;
+ const VkImageDrmFormatModifierExplicitCreateInfoEXT *drm_explicit =
+ lvl_find_in_chain<VkImageDrmFormatModifierExplicitCreateInfoEXT>(pCreateInfo->pNext);
+ const VkImageDrmFormatModifierListCreateInfoEXT *drm_implicit =
+ lvl_find_in_chain<VkImageDrmFormatModifierListCreateInfoEXT>(pCreateInfo->pNext);
+
+ if (drm_explicit != nullptr) {
+ drm_format_modifier = drm_explicit->drmFormatModifier;
+ } else {
+ // VUID 02261 makes sure its only explict or implict in parameter checking
+ assert(drm_implicit != nullptr);
+ for (uint32_t i = 0; i < drm_implicit->drmFormatModifierCount; i++) {
+ drm_format_modifier |= drm_implicit->pDrmFormatModifiers[i];
+ }
+ }
+
+ VkFormatProperties2 format_properties_2 = {VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2, nullptr};
+ VkDrmFormatModifierPropertiesListEXT drm_properties_list = {VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT,
+ nullptr};
+ format_properties_2.pNext = (void *)&drm_properties_list;
+ DispatchGetPhysicalDeviceFormatProperties2(physical_device, image_format, &format_properties_2);
+ std::vector<VkDrmFormatModifierPropertiesEXT> drm_properties;
+ drm_properties.resize(drm_properties_list.drmFormatModifierCount);
+ drm_properties_list.pDrmFormatModifierProperties = &drm_properties[0];
+ DispatchGetPhysicalDeviceFormatProperties2(physical_device, image_format, &format_properties_2);
+
+ for (uint32_t i = 0; i < drm_properties_list.drmFormatModifierCount; i++) {
+ if ((drm_properties_list.pDrmFormatModifierProperties[i].drmFormatModifier & drm_format_modifier) != 0) {
+ tiling_features |= drm_properties_list.pDrmFormatModifierProperties[i].drmFormatModifierTilingFeatures;
+ }
+ }
+ } else {
+ VkFormatProperties format_properties = GetPDFormatProperties(image_format);
+ tiling_features = (image_tiling == VK_IMAGE_TILING_LINEAR) ? format_properties.linearTilingFeatures
+ : format_properties.optimalTilingFeatures;
+ }
+
+ // Lack of disjoint format feature support while using the flag
+ if (FormatIsMultiplane(image_format) && ((pCreateInfo->flags & VK_IMAGE_CREATE_DISJOINT_BIT) != 0) &&
+ ((tiling_features & VK_FORMAT_FEATURE_DISJOINT_BIT) == 0)) {
+ skip |= LogError(device, "VUID-VkImageCreateInfo-imageCreateFormatFeatures-02260",
+ "vkCreateImage(): can't use VK_IMAGE_CREATE_DISJOINT_BIT because %s doesn't support "
+ "VK_FORMAT_FEATURE_DISJOINT_BIT based on imageCreateFormatFeatures.",
+ string_VkFormat(pCreateInfo->format));
+ }
+
+ return skip;
+}
+
bool CoreChecks::PreCallValidateCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
const VkAllocationCallbacks *pAllocator, VkImage *pImage) const {
bool skip = false;
@@ -1427,7 +1536,7 @@
"maxFramebufferHeight");
}
- if (device_extensions.vk_ext_fragment_density_map) {
+ if (device_extensions.vk_ext_fragment_density_map || device_extensions.vk_ext_fragment_density_map_2) {
uint32_t ceiling_width =
(uint32_t)ceil((float)device_limits->maxFramebufferWidth /
std::max((float)phys_dev_ext_props.fragment_density_map_props.minFragmentDensityTexelSize.width, 1.0f));
@@ -1462,23 +1571,57 @@
pCreateInfo->tiling, pCreateInfo->usage, pCreateInfo->flags,
&format_limits);
} else {
- auto image_format_info = lvl_init_struct<VkPhysicalDeviceImageFormatInfo2>();
- auto image_format_properties = lvl_init_struct<VkImageFormatProperties2>();
- image_format_info.type = pCreateInfo->imageType;
- image_format_info.tiling = pCreateInfo->tiling;
- image_format_info.usage = pCreateInfo->usage;
- image_format_info.flags = pCreateInfo->flags;
- result = DispatchGetPhysicalDeviceImageFormatProperties2(physical_device, &image_format_info, &image_format_properties);
- format_limits = image_format_properties.imageFormatProperties;
+ auto modifier_list = lvl_find_in_chain<VkImageDrmFormatModifierListCreateInfoEXT>(pCreateInfo->pNext);
+ auto explicit_modifier = lvl_find_in_chain<VkImageDrmFormatModifierExplicitCreateInfoEXT>(pCreateInfo->pNext);
+ if (modifier_list) {
+ for (uint32_t i = 0; i < modifier_list->drmFormatModifierCount; i++) {
+ auto drm_format_modifier = lvl_init_struct<VkPhysicalDeviceImageDrmFormatModifierInfoEXT>();
+ drm_format_modifier.drmFormatModifier = modifier_list->pDrmFormatModifiers[i];
+ auto image_format_info = lvl_init_struct<VkPhysicalDeviceImageFormatInfo2>(&drm_format_modifier);
+ image_format_info.type = pCreateInfo->imageType;
+ image_format_info.format = pCreateInfo->format;
+ image_format_info.tiling = pCreateInfo->tiling;
+ image_format_info.usage = pCreateInfo->usage;
+ image_format_info.flags = pCreateInfo->flags;
+ auto image_format_properties = lvl_init_struct<VkImageFormatProperties2>();
+
+ result =
+ DispatchGetPhysicalDeviceImageFormatProperties2(physical_device, &image_format_info, &image_format_properties);
+ format_limits = image_format_properties.imageFormatProperties;
+
+ /* The application gives a list of modifier and the driver
+ * selects one. If one is wrong, stop there.
+ */
+ if (result != VK_SUCCESS) break;
+ }
+ } else if (explicit_modifier) {
+ auto drm_format_modifier = lvl_init_struct<VkPhysicalDeviceImageDrmFormatModifierInfoEXT>();
+ drm_format_modifier.drmFormatModifier = explicit_modifier->drmFormatModifier;
+ auto image_format_info = lvl_init_struct<VkPhysicalDeviceImageFormatInfo2>(&drm_format_modifier);
+ image_format_info.type = pCreateInfo->imageType;
+ image_format_info.format = pCreateInfo->format;
+ image_format_info.tiling = pCreateInfo->tiling;
+ image_format_info.usage = pCreateInfo->usage;
+ image_format_info.flags = pCreateInfo->flags;
+ auto image_format_properties = lvl_init_struct<VkImageFormatProperties2>();
+
+ result = DispatchGetPhysicalDeviceImageFormatProperties2(physical_device, &image_format_info, &image_format_properties);
+ format_limits = image_format_properties.imageFormatProperties;
+ }
}
- if (result == VK_ERROR_FORMAT_NOT_SUPPORTED) {
+ // 1. vkGetPhysicalDeviceImageFormatProperties[2] only success code is VK_SUCCESS
+ // 2. If call returns an error, then "imageCreateImageFormatPropertiesList" is defined to be the empty list
+ // 3. All values in 02251 are undefined if "imageCreateImageFormatPropertiesList" is empty.
+ if (result != VK_SUCCESS) {
+ // External memory will always have a "imageCreateImageFormatPropertiesList" so skip
#ifdef VK_USE_PLATFORM_ANDROID_KHR
if (!lvl_find_in_chain<VkExternalFormatANDROID>(pCreateInfo->pNext))
#endif // VK_USE_PLATFORM_ANDROID_KHR
- skip |=
- LogError(device, kVUIDUndefined, "vkCreateImage(): Format %s is not supported for this combination of parameters.",
- string_VkFormat(pCreateInfo->format));
+ skip |= LogError(device, "VUID-VkImageCreateInfo-imageCreateMaxMipLevels-02251",
+ "vkCreateImage(): Format %s is not supported for this combination of parameters and "
+ "VkGetPhysicalDeviceImageFormatProperties returned back %s.",
+ string_VkFormat(pCreateInfo->format), string_VkResult(result));
} else {
if (pCreateInfo->mipLevels > format_limits.maxMipLevels) {
const char *format_string = string_VkFormat(pCreateInfo->format);
@@ -1515,6 +1658,24 @@
"vkCreateImage(): samples %s is not supported by format 0x%.8X.",
string_VkSampleCountFlagBits(pCreateInfo->samples), format_limits.sampleCounts);
}
+
+ if (pCreateInfo->extent.width > format_limits.maxExtent.width) {
+ skip |= LogError(device, "VUID-VkImageCreateInfo-extent-02252",
+ "vkCreateImage(): extent.width %u exceeds allowable maximum image extent width %u.",
+ pCreateInfo->extent.width, format_limits.maxExtent.width);
+ }
+
+ if (pCreateInfo->extent.height > format_limits.maxExtent.height) {
+ skip |= LogError(device, "VUID-VkImageCreateInfo-extent-02253",
+ "vkCreateImage(): extent.height %u exceeds allowable maximum image extent height %u.",
+ pCreateInfo->extent.height, format_limits.maxExtent.height);
+ }
+
+ if (pCreateInfo->extent.depth > format_limits.maxExtent.depth) {
+ skip |= LogError(device, "VUID-VkImageCreateInfo-extent-02254",
+ "vkCreateImage(): extent.depth %u exceeds allowable maximum image extent depth %u.",
+ pCreateInfo->extent.depth, format_limits.maxExtent.depth);
+ }
}
// Tests for "Formats requiring sampler YCBCR conversion for VK_IMAGE_ASPECT_COLOR_BIT image views"
@@ -1549,16 +1710,9 @@
}
}
- if ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) && (!enabled_features.core.sparseResidencyAliased)) {
- skip |=
- LogError(device, "VUID-VkImageCreateInfo-flags-01924",
- "vkCreateImage(): the sparseResidencyAliased device feature is disabled: Images cannot be created with the "
- "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT set.");
- }
-
if (device_extensions.vk_khr_maintenance2) {
if (pCreateInfo->flags & VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT) {
- if (!(FormatIsCompressed_BC(pCreateInfo->format) || FormatIsCompressed_ASTC_LDR(pCreateInfo->format) ||
+ if (!(FormatIsCompressed_BC(pCreateInfo->format) || FormatIsCompressed_ASTC(pCreateInfo->format) ||
FormatIsCompressed_ETC2_EAC(pCreateInfo->format))) {
skip |= LogError(device, "VUID-VkImageCreateInfo-flags-01572",
"vkCreateImage(): If pCreateInfo->flags contains VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT, "
@@ -1574,9 +1728,9 @@
}
if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT && pCreateInfo->pQueueFamilyIndices) {
- skip |= ValidateQueueFamilies(pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices, "vkCreateImage",
- "pCreateInfo->pQueueFamilyIndices", "VUID-VkImageCreateInfo-sharingMode-01420",
- "VUID-VkImageCreateInfo-sharingMode-01420", false);
+ skip |= ValidatePhysicalDeviceQueueFamilies(pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices,
+ "vkCreateImage", "pCreateInfo->pQueueFamilyIndices",
+ "VUID-VkImageCreateInfo-sharingMode-01420");
}
if (!FormatIsMultiplane(pCreateInfo->format) && !(pCreateInfo->flags & VK_IMAGE_CREATE_ALIAS_BIT) &&
@@ -1586,6 +1740,57 @@
"vkCreateImage(): format is %s and flags are %s. The flags should not include VK_IMAGE_CREATE_DISJOINT_BIT.",
string_VkFormat(pCreateInfo->format), string_VkImageCreateFlags(pCreateInfo->flags).c_str());
}
+
+ const auto swapchain_create_info = lvl_find_in_chain<VkImageSwapchainCreateInfoKHR>(pCreateInfo->pNext);
+ if (swapchain_create_info != nullptr) {
+ if (swapchain_create_info->swapchain != VK_NULL_HANDLE) {
+ const SWAPCHAIN_NODE *swapchain_state = GetSwapchainState(swapchain_create_info->swapchain);
+ const VkSwapchainCreateFlagsKHR swapchain_flags = swapchain_state->createInfo.flags;
+
+ // Validate rest of Swapchain Image create check that require swapchain state
+ const char *vuid = "VUID-VkImageSwapchainCreateInfoKHR-swapchain-00995";
+ if (((swapchain_flags & VK_SWAPCHAIN_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR) != 0) &&
+ ((pCreateInfo->flags & VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT) == 0)) {
+ skip |= LogError(
+ device, vuid,
+ "vkCreateImage(): Swapchain was created with VK_SWAPCHAIN_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR flag so "
+ "all swapchain images must have the VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT flag set.");
+ }
+ if (((swapchain_flags & VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR) != 0) &&
+ ((pCreateInfo->flags & VK_IMAGE_CREATE_PROTECTED_BIT) == 0)) {
+ skip |= LogError(device, vuid,
+ "vkCreateImage(): Swapchain was created with VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR flag so all "
+ "swapchain images must have the VK_IMAGE_CREATE_PROTECTED_BIT flag set.");
+ }
+ const VkImageCreateFlags mutable_flags = (VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR);
+ if (((swapchain_flags & VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR) != 0) &&
+ ((pCreateInfo->flags & mutable_flags) != mutable_flags)) {
+ skip |= LogError(device, vuid,
+ "vkCreateImage(): Swapchain was created with VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR flag so "
+ "all swapchain images must have the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT and "
+ "VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR flags both set.");
+ }
+ }
+ }
+
+ if ((pCreateInfo->flags & VK_IMAGE_CREATE_PROTECTED_BIT) != 0) {
+ if (enabled_features.core11.protectedMemory == VK_FALSE) {
+ skip |= LogError(device, "VUID-VkImageCreateInfo-flags-01890",
+ "vkCreateImage(): the protectedMemory device feature is disabled: Images cannot be created with the "
+ "VK_IMAGE_CREATE_PROTECTED_BIT set.");
+ }
+ const VkImageCreateFlags invalid_flags =
+ VK_IMAGE_CREATE_SPARSE_BINDING_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT;
+ if ((pCreateInfo->flags & invalid_flags) != 0) {
+ skip |= LogError(device, "VUID-VkImageCreateInfo-None-01891",
+ "vkCreateImage(): VK_IMAGE_CREATE_PROTECTED_BIT is set so no sparse create flags can be used at same "
+ "time (VK_IMAGE_CREATE_SPARSE_BINDING_BIT | VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | "
+ "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT).");
+ }
+ }
+
+ skip |= ValidateImageFormatFeatures(pCreateInfo);
+
return skip;
}
@@ -1618,47 +1823,36 @@
StateTracker::PreCallRecordDestroyImage(device, image, pAllocator);
}
-bool CoreChecks::ValidateImageAttributes(const IMAGE_STATE *image_state, const VkImageSubresourceRange &range) const {
+bool CoreChecks::ValidateImageAttributes(const IMAGE_STATE *image_state, const VkImageSubresourceRange &range,
+ const char *param_name) const {
bool skip = false;
+ const VkImage image = image_state->image;
+ const VkFormat format = image_state->createInfo.format;
if (range.aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) {
- char const str[] = "vkCmdClearColorImage aspectMasks for all subresource ranges must be set to VK_IMAGE_ASPECT_COLOR_BIT";
- skip |= LogError(image_state->image, kVUID_Core_DrawState_InvalidImageAspect, str);
+ skip |= LogError(image, "VUID-vkCmdClearColorImage-aspectMask-02498",
+ "vkCmdClearColorImage(): %s.aspectMasks must only be set to VK_IMAGE_ASPECT_COLOR_BIT.", param_name);
}
- if (FormatIsDepthOrStencil(image_state->createInfo.format)) {
- char const str[] = "vkCmdClearColorImage called with depth/stencil image.";
- skip |= LogError(image_state->image, "VUID-vkCmdClearColorImage-image-00007", "%s.", str);
- } else if (FormatIsCompressed(image_state->createInfo.format)) {
- char const str[] = "vkCmdClearColorImage called with compressed image.";
- skip |= LogError(image_state->image, "VUID-vkCmdClearColorImage-image-00007", "%s.", str);
+ if (FormatIsDepthOrStencil(format)) {
+ skip |= LogError(image, "VUID-vkCmdClearColorImage-image-00007",
+ "vkCmdClearColorImage(): %s called with image %s which has a depth/stencil format (%s).", param_name,
+ report_data->FormatHandle(image).c_str(), string_VkFormat(format));
+ } else if (FormatIsCompressed(format)) {
+ skip |= LogError(image, "VUID-vkCmdClearColorImage-image-00007",
+ "vkCmdClearColorImage(): %s called with image %s which has a compressed format (%s).", param_name,
+ report_data->FormatHandle(image).c_str(), string_VkFormat(format));
}
if (!(image_state->createInfo.usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT)) {
- char const str[] = "vkCmdClearColorImage called with image created without VK_IMAGE_USAGE_TRANSFER_DST_BIT.";
- skip |= LogError(image_state->image, "VUID-vkCmdClearColorImage-image-00002", "%s.", str);
+ skip |=
+ LogError(image, "VUID-vkCmdClearColorImage-image-00002",
+ "vkCmdClearColorImage() %s called with image %s which was created without VK_IMAGE_USAGE_TRANSFER_DST_BIT.",
+ param_name, report_data->FormatHandle(image).c_str());
}
return skip;
}
-uint32_t ResolveRemainingLevels(const VkImageSubresourceRange *range, uint32_t mip_levels) {
- // Return correct number of mip levels taking into account VK_REMAINING_MIP_LEVELS
- uint32_t mip_level_count = range->levelCount;
- if (range->levelCount == VK_REMAINING_MIP_LEVELS) {
- mip_level_count = mip_levels - range->baseMipLevel;
- }
- return mip_level_count;
-}
-
-uint32_t ResolveRemainingLayers(const VkImageSubresourceRange *range, uint32_t layers) {
- // Return correct number of layers taking into account VK_REMAINING_ARRAY_LAYERS
- uint32_t array_layer_count = range->layerCount;
- if (range->layerCount == VK_REMAINING_ARRAY_LAYERS) {
- array_layer_count = layers - range->baseArrayLayer;
- }
- return array_layer_count;
-}
-
bool CoreChecks::VerifyClearImageLayout(const CMD_BUFFER_STATE *cb_node, const IMAGE_STATE *image_state,
const VkImageSubresourceRange &range, VkImageLayout dest_image_layout,
const char *func_name) const {
@@ -1728,15 +1922,14 @@
"VUID-vkCmdClearColorImage-commandBuffer-cmdpool");
skip |= ValidateCmd(cb_node, CMD_CLEARCOLORIMAGE, "vkCmdClearColorImage()");
if (device_extensions.vk_khr_maintenance1) {
- skip |=
- ValidateImageFormatFeatureFlags(image_state, VK_FORMAT_FEATURE_TRANSFER_DST_BIT, "vkCmdClearColorImage",
- "VUID-vkCmdClearColorImage-image-01993", "VUID-vkCmdClearColorImage-image-01993");
+ skip |= ValidateImageFormatFeatureFlags(image_state, VK_FORMAT_FEATURE_TRANSFER_DST_BIT, "vkCmdClearColorImage",
+ "VUID-vkCmdClearColorImage-image-01993");
}
skip |= InsideRenderPass(cb_node, "vkCmdClearColorImage()", "VUID-vkCmdClearColorImage-renderpass");
for (uint32_t i = 0; i < rangeCount; ++i) {
std::string param_name = "pRanges[" + std::to_string(i) + "]";
skip |= ValidateCmdClearColorSubresourceRange(image_state, pRanges[i], param_name.c_str());
- skip |= ValidateImageAttributes(image_state, pRanges[i]);
+ skip |= ValidateImageAttributes(image_state, pRanges[i], param_name.c_str());
skip |= VerifyClearImageLayout(cb_node, image_state, pRanges[i], imageLayout, "vkCmdClearColorImage()");
}
// Tests for "Formats requiring sampler Y’CBCR conversion for VK_IMAGE_ASPECT_COLOR_BIT image views"
@@ -1780,7 +1973,6 @@
skip |= ValidateCmd(cb_node, CMD_CLEARDEPTHSTENCILIMAGE, "vkCmdClearDepthStencilImage()");
if (device_extensions.vk_khr_maintenance1) {
skip |= ValidateImageFormatFeatureFlags(image_state, VK_FORMAT_FEATURE_TRANSFER_DST_BIT, "vkCmdClearDepthStencilImage",
- "VUID-vkCmdClearDepthStencilImage-image-01994",
"VUID-vkCmdClearDepthStencilImage-image-01994");
}
skip |= InsideRenderPass(cb_node, "vkCmdClearDepthStencilImage()", "VUID-vkCmdClearDepthStencilImage-renderpass");
@@ -1795,10 +1987,10 @@
// Image aspect must be depth or stencil or both
VkImageAspectFlags valid_aspects = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
if (((pRanges[i].aspectMask & valid_aspects) == 0) || ((pRanges[i].aspectMask & ~valid_aspects) != 0)) {
- char const str[] =
- "vkCmdClearDepthStencilImage aspectMasks for all subresource ranges must be set to VK_IMAGE_ASPECT_DEPTH_BIT "
- "and/or VK_IMAGE_ASPECT_STENCIL_BIT";
- skip |= LogError(commandBuffer, kVUID_Core_DrawState_InvalidImageAspect, str);
+ skip |= LogError(commandBuffer, "VUID-vkCmdClearDepthStencilImage-aspectMask-02824",
+ "vkCmdClearDepthStencilImage(): pRanges[%u].aspectMask can only be VK_IMAGE_ASPECT_DEPTH_BIT "
+ "and/or VK_IMAGE_ASPECT_STENCIL_BIT.",
+ i);
}
if ((pRanges[i].aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) != 0) {
any_include_aspect_depth_bit = true;
@@ -1833,14 +2025,15 @@
"VK_IMAGE_USAGE_TRANSFER_DST_BIT must be included in VkImageCreateInfo::usage used to create image");
}
if (image_state && !FormatIsDepthOrStencil(image_state->createInfo.format)) {
- char const str[] = "vkCmdClearDepthStencilImage called without a depth/stencil image.";
- skip |= LogError(image, "VUID-vkCmdClearDepthStencilImage-image-00014", "%s.", str);
+ skip |= LogError(image, "VUID-vkCmdClearDepthStencilImage-image-00014",
+ "vkCmdClearDepthStencilImage(): called with image %s which doesn't have a depth/stencil format (%s).",
+ report_data->FormatHandle(image).c_str(), string_VkFormat(image_state->createInfo.format));
}
if (VK_IMAGE_USAGE_TRANSFER_DST_BIT != (VK_IMAGE_USAGE_TRANSFER_DST_BIT & image_state->createInfo.usage)) {
- char const str[] =
- "vkCmdClearDepthStencilImage() called with an image that was not created with the VK_IMAGE_USAGE_TRANSFER_DST_BIT "
- "set.";
- skip |= LogError(image, "VUID-vkCmdClearDepthStencilImage-image-00009", "%s.", str);
+ skip |= LogError(image, "VUID-vkCmdClearDepthStencilImage-image-00009",
+ "vkCmdClearDepthStencilImage(): called with image %s which was not created with the "
+ "VK_IMAGE_USAGE_TRANSFER_DST_BIT set.",
+ report_data->FormatHandle(image).c_str());
}
}
return skip;
@@ -1935,73 +2128,11 @@
return result;
}
-// For image copies between compressed/uncompressed formats, the extent is provided in source image texels
-// Destination image texel extents must be adjusted by block size for the dest validation checks
-VkExtent3D GetAdjustedDestImageExtent(VkFormat src_format, VkFormat dst_format, VkExtent3D extent) {
- VkExtent3D adjusted_extent = extent;
- if ((FormatIsCompressed(src_format) || FormatIsSinglePlane_422(src_format)) &&
- !(FormatIsCompressed(dst_format) || FormatIsSinglePlane_422(dst_format))) {
- VkExtent3D block_size = FormatTexelBlockExtent(src_format);
- adjusted_extent.width /= block_size.width;
- adjusted_extent.height /= block_size.height;
- adjusted_extent.depth /= block_size.depth;
- } else if (!(FormatIsCompressed(src_format) || FormatIsSinglePlane_422(src_format)) &&
- (FormatIsCompressed(dst_format) || FormatIsSinglePlane_422(dst_format))) {
- VkExtent3D block_size = FormatTexelBlockExtent(dst_format);
- adjusted_extent.width *= block_size.width;
- adjusted_extent.height *= block_size.height;
- adjusted_extent.depth *= block_size.depth;
- }
- return adjusted_extent;
-}
-
-// Returns the effective extent of an image subresource, adjusted for mip level and array depth.
-static inline VkExtent3D GetImageSubresourceExtent(const IMAGE_STATE *img, const VkImageSubresourceLayers *subresource) {
- const uint32_t mip = subresource->mipLevel;
-
- // Return zero extent if mip level doesn't exist
- if (mip >= img->createInfo.mipLevels) {
- return VkExtent3D{0, 0, 0};
- }
-
- // Don't allow mip adjustment to create 0 dim, but pass along a 0 if that's what subresource specified
- VkExtent3D extent = img->createInfo.extent;
-
- // If multi-plane, adjust per-plane extent
- if (FormatIsMultiplane(img->createInfo.format)) {
- VkExtent2D divisors = FindMultiplaneExtentDivisors(img->createInfo.format, subresource->aspectMask);
- extent.width /= divisors.width;
- extent.height /= divisors.height;
- }
-
- if (img->createInfo.flags & VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV) {
- extent.width = (0 == extent.width ? 0 : std::max(2U, 1 + ((extent.width - 1) >> mip)));
- extent.height = (0 == extent.height ? 0 : std::max(2U, 1 + ((extent.height - 1) >> mip)));
- extent.depth = (0 == extent.depth ? 0 : std::max(2U, 1 + ((extent.depth - 1) >> mip)));
- } else {
- extent.width = (0 == extent.width ? 0 : std::max(1U, extent.width >> mip));
- extent.height = (0 == extent.height ? 0 : std::max(1U, extent.height >> mip));
- extent.depth = (0 == extent.depth ? 0 : std::max(1U, extent.depth >> mip));
- }
-
- // Image arrays have an effective z extent that isn't diminished by mip level
- if (VK_IMAGE_TYPE_3D != img->createInfo.imageType) {
- extent.depth = img->createInfo.arrayLayers;
- }
-
- return extent;
-}
-
// Test if the extent argument has all dimensions set to 0.
static inline bool IsExtentAllZeroes(const VkExtent3D *extent) {
return ((extent->width == 0) && (extent->height == 0) && (extent->depth == 0));
}
-// Test if the extent argument has any dimensions set to 0.
-static inline bool IsExtentSizeZero(const VkExtent3D *extent) {
- return ((extent->width == 0) || (extent->height == 0) || (extent->depth == 0));
-}
-
// Returns the image transfer granularity for a specific image scaled by compressed block size if necessary.
VkExtent3D CoreChecks::GetScaledItg(const CMD_BUFFER_STATE *cb_node, const IMAGE_STATE *img) const {
// Default to (0, 0, 0) granularity in case we can't find the real granularity for the physical device.
@@ -2207,7 +2338,6 @@
}
// Do all checks on source image
- //
if (src_state->createInfo.imageType == VK_IMAGE_TYPE_1D) {
if ((0 != region.srcOffset.y) || (1 != src_copy_extent.height)) {
skip |=
@@ -2218,7 +2348,6 @@
}
}
- // VUID-VkImageCopy-srcImage-01785
if ((src_state->createInfo.imageType == VK_IMAGE_TYPE_1D) && ((0 != region.srcOffset.z) || (1 != src_copy_extent.depth))) {
skip |= LogError(src_state->image, "VUID-VkImageCopy-srcImage-01785",
"vkCmdCopyImage(): pRegion[%d] srcOffset.z is %d and extent.depth is %d. For 1D images "
@@ -2226,35 +2355,12 @@
i, region.srcOffset.z, src_copy_extent.depth);
}
- // VUID-VkImageCopy-srcImage-01787
if ((src_state->createInfo.imageType == VK_IMAGE_TYPE_2D) && (0 != region.srcOffset.z)) {
skip |= LogError(src_state->image, "VUID-VkImageCopy-srcImage-01787",
"vkCmdCopyImage(): pRegion[%d] srcOffset.z is %d. For 2D images the z-offset must be 0.", i,
region.srcOffset.z);
}
- if (device_extensions.vk_khr_maintenance1) {
- if (src_state->createInfo.imageType == VK_IMAGE_TYPE_3D) {
- if ((0 != region.srcSubresource.baseArrayLayer) || (1 != region.srcSubresource.layerCount)) {
- skip |=
- LogError(src_state->image, "VUID-VkImageCopy-srcImage-00141",
- "vkCmdCopyImage(): pRegion[%d] srcSubresource.baseArrayLayer is %d and srcSubresource.layerCount "
- "is %d. For VK_IMAGE_TYPE_3D images these must be 0 and 1, respectively.",
- i, region.srcSubresource.baseArrayLayer, region.srcSubresource.layerCount);
- }
- }
- } else { // Pre maint 1
- if (src_state->createInfo.imageType == VK_IMAGE_TYPE_3D || dst_state->createInfo.imageType == VK_IMAGE_TYPE_3D) {
- if ((0 != region.srcSubresource.baseArrayLayer) || (1 != region.srcSubresource.layerCount)) {
- skip |= LogError(src_state->image, "VUID-VkImageCopy-srcImage-00141",
- "vkCmdCopyImage(): pRegion[%d] srcSubresource.baseArrayLayer is %d and "
- "srcSubresource.layerCount is %d. For copies with either source or dest of type "
- "VK_IMAGE_TYPE_3D, these must be 0 and 1, respectively.",
- i, region.srcSubresource.baseArrayLayer, region.srcSubresource.layerCount);
- }
- }
- }
-
// Source checks that apply only to compressed images (or to _422 images if ycbcr enabled)
bool ext_ycbcr = IsExtEnabled(device_extensions.vk_khr_sampler_ycbcr_conversion);
if (FormatIsCompressed(src_state->createInfo.format) ||
@@ -2306,7 +2412,6 @@
} // Compressed
// Do all checks on dest image
- //
if (dst_state->createInfo.imageType == VK_IMAGE_TYPE_1D) {
if ((0 != region.dstOffset.y) || (1 != dst_copy_extent.height)) {
skip |= LogError(dst_state->image, "VUID-VkImageCopy-dstImage-00152",
@@ -2316,7 +2421,6 @@
}
}
- // VUID-VkImageCopy-dstImage-01786
if ((dst_state->createInfo.imageType == VK_IMAGE_TYPE_1D) && ((0 != region.dstOffset.z) || (1 != dst_copy_extent.depth))) {
skip |=
LogError(dst_state->image, "VUID-VkImageCopy-dstImage-01786",
@@ -2325,23 +2429,23 @@
i, region.dstOffset.z, dst_copy_extent.depth);
}
- // VUID-VkImageCopy-dstImage-01788
if ((dst_state->createInfo.imageType == VK_IMAGE_TYPE_2D) && (0 != region.dstOffset.z)) {
skip |= LogError(dst_state->image, "VUID-VkImageCopy-dstImage-01788",
"vkCmdCopyImage(): pRegion[%d] dstOffset.z is %d. For 2D images the z-offset must be 0.", i,
region.dstOffset.z);
}
- if (dst_state->createInfo.imageType == VK_IMAGE_TYPE_3D) {
- if ((0 != region.dstSubresource.baseArrayLayer) || (1 != region.dstSubresource.layerCount)) {
- skip |= LogError(dst_state->image, "VUID-VkImageCopy-srcImage-00141",
- "vkCmdCopyImage(): pRegion[%d] dstSubresource.baseArrayLayer is %d and dstSubresource.layerCount "
- "is %d. For VK_IMAGE_TYPE_3D images these must be 0 and 1, respectively.",
- i, region.dstSubresource.baseArrayLayer, region.dstSubresource.layerCount);
- }
- }
- // VU01199 changed with mnt1
+ // Handle difference between Maintenance 1
if (device_extensions.vk_khr_maintenance1) {
+ if (src_state->createInfo.imageType == VK_IMAGE_TYPE_3D) {
+ if ((0 != region.srcSubresource.baseArrayLayer) || (1 != region.srcSubresource.layerCount)) {
+ skip |=
+ LogError(src_state->image, "VUID-VkImageCopy-srcImage-00141",
+ "vkCmdCopyImage(): pRegion[%d] srcSubresource.baseArrayLayer is %d and srcSubresource.layerCount "
+ "is %d. For VK_IMAGE_TYPE_3D images these must be 0 and 1, respectively.",
+ i, region.srcSubresource.baseArrayLayer, region.srcSubresource.layerCount);
+ }
+ }
if (dst_state->createInfo.imageType == VK_IMAGE_TYPE_3D) {
if ((0 != region.dstSubresource.baseArrayLayer) || (1 != region.dstSubresource.layerCount)) {
skip |=
@@ -2353,8 +2457,15 @@
}
} else { // Pre maint 1
if (src_state->createInfo.imageType == VK_IMAGE_TYPE_3D || dst_state->createInfo.imageType == VK_IMAGE_TYPE_3D) {
+ if ((0 != region.srcSubresource.baseArrayLayer) || (1 != region.srcSubresource.layerCount)) {
+ skip |= LogError(src_state->image, "VUID-VkImageCopy-srcImage-00139",
+ "vkCmdCopyImage(): pRegion[%d] srcSubresource.baseArrayLayer is %d and "
+ "srcSubresource.layerCount is %d. For copies with either source or dest of type "
+ "VK_IMAGE_TYPE_3D, these must be 0 and 1, respectively.",
+ i, region.srcSubresource.baseArrayLayer, region.srcSubresource.layerCount);
+ }
if ((0 != region.dstSubresource.baseArrayLayer) || (1 != region.dstSubresource.layerCount)) {
- skip |= LogError(dst_state->image, "VUID-VkImageCopy-srcImage-00141",
+ skip |= LogError(dst_state->image, "VUID-VkImageCopy-srcImage-00139",
"vkCmdCopyImage(): pRegion[%d] dstSubresource.baseArrayLayer is %d and "
"dstSubresource.layerCount is %d. For copies with either source or dest of type "
"VK_IMAGE_TYPE_3D, these must be 0 and 1, respectively.",
@@ -2540,19 +2651,18 @@
(VK_IMAGE_TYPE_3D == dst_image_state->createInfo.imageType ? dst_copy_extent.depth
: region.dstSubresource.layerCount);
if (src_slices != dst_slices) {
- std::stringstream ss;
- ss << "vkCmdCopyImage(): number of depth slices in source and destination subresources for pRegions[" << i
- << "] do not match";
- skip |= LogError(command_buffer, "VUID-VkImageCopy-extent-00140", "%s.", ss.str().c_str());
+ skip |= LogError(command_buffer, "VUID-VkImageCopy-extent-00140",
+ "vkCmdCopyImage(): number of depth slices in source and destination subresources for "
+ "pRegions[%u] do not match.",
+ i);
}
}
} else {
// For each region the layerCount member of srcSubresource and dstSubresource must match
if (region.srcSubresource.layerCount != region.dstSubresource.layerCount) {
- std::stringstream ss;
- ss << "vkCmdCopyImage(): number of layers in source and destination subresources for pRegions[" << i
- << "] do not match";
- skip |= LogError(command_buffer, "VUID-VkImageCopy-extent-00140", "%s.", ss.str().c_str());
+ skip |= LogError(
+ command_buffer, "VUID-VkImageCopy-layerCount-00138",
+ "vkCmdCopyImage(): number of layers in source and destination subresources for pRegions[%u] do not match", i);
}
}
@@ -2686,23 +2796,56 @@
"dstSubresource.layerCount (%u)",
i, src_copy_extent.depth, region.dstSubresource.layerCount);
}
+
+ // Check for multi-plane format compatiblity
+ if (FormatIsMultiplane(src_format) || FormatIsMultiplane(dst_format)) {
+ size_t src_format_size = 0;
+ size_t dst_format_size = 0;
+ if (FormatIsMultiplane(src_format)) {
+ const VkFormat planeFormat = FindMultiplaneCompatibleFormat(src_format, region.srcSubresource.aspectMask);
+ src_format_size = FormatElementSize(planeFormat);
+ } else {
+ src_format_size = FormatElementSize(src_format);
+ }
+ if (FormatIsMultiplane(dst_format)) {
+ const VkFormat planeFormat = FindMultiplaneCompatibleFormat(dst_format, region.dstSubresource.aspectMask);
+ dst_format_size = FormatElementSize(planeFormat);
+ } else {
+ dst_format_size = FormatElementSize(dst_format);
+ }
+ // If size is still zero, then format is invalid and will be caught in another VU
+ if ((src_format_size != dst_format_size) && (src_format_size != 0) && (dst_format_size != 0)) {
+ skip |=
+ LogError(command_buffer, "VUID-vkCmdCopyImage-None-01549",
+ "vkCmdCopyImage(): pRegions[%u] called with non-compatible image formats. "
+ "The src format %s with aspectMask %s is not compatible with dst format %s aspectMask %s.",
+ i, string_VkFormat(src_format), string_VkImageAspectFlags(region.srcSubresource.aspectMask).c_str(),
+ string_VkFormat(dst_format), string_VkImageAspectFlags(region.dstSubresource.aspectMask).c_str());
+ }
+ }
}
- // The formats of src_image and dst_image must be compatible. Formats are considered compatible if their texel size in bytes
- // is the same between both formats. For example, VK_FORMAT_R8G8B8A8_UNORM is compatible with VK_FORMAT_R32_UINT because
- // because both texels are 4 bytes in size. Depth/stencil formats must match exactly.
- if (FormatIsDepthOrStencil(src_format) || FormatIsDepthOrStencil(dst_format)) {
- if (src_format != dst_format) {
- char const str[] = "vkCmdCopyImage called with unmatched source and dest image depth/stencil formats.";
- skip |= LogError(command_buffer, kVUID_Core_DrawState_MismatchedImageFormat, str);
- }
- } else {
- if ((!FormatSizesAreEqual(src_format, dst_format, regionCount, pRegions)) && (!FormatIsMultiplane(src_format)) &&
- (!FormatIsMultiplane(dst_format))) {
- const char *vuid = (device_extensions.vk_khr_sampler_ycbcr_conversion) ? "VUID-vkCmdCopyImage-srcImage-01548"
- : "VUID-vkCmdCopyImage-srcImage-00135";
- char const str[] = "vkCmdCopyImage called with unmatched source and dest image format sizes.";
- skip |= LogError(command_buffer, vuid, "%s.", str);
+ // The formats of non-multiplane src_image and dst_image must be compatible. Formats are considered compatible if their texel
+ // size in bytes is the same between both formats. For example, VK_FORMAT_R8G8B8A8_UNORM is compatible with VK_FORMAT_R32_UINT
+ // because because both texels are 4 bytes in size.
+ if (!FormatIsMultiplane(src_format) && !FormatIsMultiplane(dst_format)) {
+ const char *compatible_vuid = (device_extensions.vk_khr_sampler_ycbcr_conversion) ? "VUID-vkCmdCopyImage-srcImage-01548"
+ : "VUID-vkCmdCopyImage-srcImage-00135";
+ // Depth/stencil formats must match exactly.
+ if (FormatIsDepthOrStencil(src_format) || FormatIsDepthOrStencil(dst_format)) {
+ if (src_format != dst_format) {
+ skip |= LogError(command_buffer, compatible_vuid,
+ "vkCmdCopyImage(): Depth/stencil formats must match exactly for src (%s) and dst (%s).",
+ string_VkFormat(src_format), string_VkFormat(dst_format));
+ }
+ } else {
+ if (!FormatSizesAreEqual(src_format, dst_format, regionCount, pRegions)) {
+ skip |= LogError(command_buffer, compatible_vuid,
+ "vkCmdCopyImage(): Unmatched image format sizes. "
+ "The src format %s has size of %zu and dst format %s has size of %zu.",
+ string_VkFormat(src_format), FormatElementSize(src_format), string_VkFormat(dst_format),
+ FormatElementSize(dst_format));
+ }
}
}
@@ -2719,11 +2862,24 @@
"vkCmdCopyImage()", "VK_IMAGE_USAGE_TRANSFER_SRC_BIT");
skip |= ValidateImageUsageFlags(dst_image_state, VK_IMAGE_USAGE_TRANSFER_DST_BIT, true, "VUID-vkCmdCopyImage-dstImage-00131",
"vkCmdCopyImage()", "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
+
+ // Validation for VK_EXT_fragment_density_map
+ if (src_image_state->createInfo.flags & VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT) {
+ skip |= LogError(
+ command_buffer, "VUID-vkCmdCopyImage-dstImage-02542",
+ "vkCmdCopyImage(): srcImage must not have been created with flags containing VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT");
+ }
+ if (dst_image_state->createInfo.flags & VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT) {
+ skip |= LogError(
+ command_buffer, "VUID-vkCmdCopyImage-dstImage-02542",
+ "vkCmdCopyImage(): dstImage must not have been created with flags containing VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT");
+ }
+
if (device_extensions.vk_khr_maintenance1) {
skip |= ValidateImageFormatFeatureFlags(src_image_state, VK_FORMAT_FEATURE_TRANSFER_SRC_BIT, "vkCmdCopyImage()",
- "VUID-vkCmdCopyImage-srcImage-01995", "VUID-vkCmdCopyImage-srcImage-01995");
+ "VUID-vkCmdCopyImage-srcImage-01995");
skip |= ValidateImageFormatFeatureFlags(dst_image_state, VK_FORMAT_FEATURE_TRANSFER_DST_BIT, "vkCmdCopyImage()",
- "VUID-vkCmdCopyImage-dstImage-01996", "VUID-vkCmdCopyImage-dstImage-01996");
+ "VUID-vkCmdCopyImage-dstImage-01996");
}
skip |= ValidateCmdQueueFlags(cb_node, "vkCmdCopyImage()", VK_QUEUE_TRANSFER_BIT | VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT,
"VUID-vkCmdCopyImage-commandBuffer-cmdpool");
@@ -2781,7 +2937,7 @@
bool skip = false;
const IMAGE_VIEW_STATE *image_view_state = nullptr;
if (framebuffer && (fb_attachment != VK_ATTACHMENT_UNUSED) && (fb_attachment < framebuffer->createInfo.attachmentCount)) {
- image_view_state = GetImageViewState(framebuffer->createInfo.pAttachments[fb_attachment]);
+ image_view_state = GetAttachmentImageViewState(GetCBState(command_buffer), framebuffer, fb_attachment);
}
for (uint32_t j = 0; j < rect_count; j++) {
@@ -2825,7 +2981,7 @@
const VkRenderPassCreateInfo2KHR *renderpass_create_info = cb_node->activeRenderPass->createInfo.ptr();
const uint32_t renderpass_attachment_count = renderpass_create_info->attachmentCount;
const VkSubpassDescription2KHR *subpass_desc = &renderpass_create_info->pSubpasses[cb_node->activeSubpass];
- const auto *framebuffer = GetFramebufferState(cb_node->activeFramebuffer);
+ const auto *framebuffer = cb_node->activeFramebuffer.get();
const auto &render_area = cb_node->activeRenderPassBeginInfo.renderArea;
for (uint32_t attachment_index = 0; attachment_index < attachmentCount; attachment_index++) {
@@ -2918,13 +3074,12 @@
// if a secondary level command buffer inherits the framebuffer from the primary command buffer
// (see VkCommandBufferInheritanceInfo), this validation must be deferred until queue submit time
auto val_fn = [this, commandBuffer, attachment_index, fb_attachment, rectCount, clear_rect_copy](
- const CMD_BUFFER_STATE *prim_cb, VkFramebuffer fb) {
+ const CMD_BUFFER_STATE *prim_cb, const FRAMEBUFFER_STATE *fb) {
assert(rectCount == clear_rect_copy->size());
- const FRAMEBUFFER_STATE *framebuffer = GetFramebufferState(fb);
const auto &render_area = prim_cb->activeRenderPassBeginInfo.renderArea;
bool skip = false;
- skip = ValidateClearAttachmentExtent(commandBuffer, attachment_index, framebuffer, fb_attachment, render_area,
- rectCount, clear_rect_copy->data());
+ skip = ValidateClearAttachmentExtent(commandBuffer, attachment_index, fb, fb_attachment, render_area, rectCount,
+ clear_rect_copy->data());
return skip;
};
cb_node->cmd_execute_commands_functions.emplace_back(val_fn);
@@ -2949,7 +3104,19 @@
skip |= ValidateCmd(cb_node, CMD_RESOLVEIMAGE, "vkCmdResolveImage()");
skip |= InsideRenderPass(cb_node, "vkCmdResolveImage()", "VUID-vkCmdResolveImage-renderpass");
skip |= ValidateImageFormatFeatureFlags(dst_image_state, VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT, "vkCmdResolveImage()",
- "VUID-vkCmdResolveImage-dstImage-02003", "VUID-vkCmdResolveImage-dstImage-02003");
+ "VUID-vkCmdResolveImage-dstImage-02003");
+
+ // Validation for VK_EXT_fragment_density_map
+ if (src_image_state->createInfo.flags & VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT) {
+ skip |= LogError(cb_node->commandBuffer, "vkCmdResolveImage-dstImage-02546",
+ "vkCmdResolveImage(): srcImage must not have been created with flags containing "
+ "VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT");
+ }
+ if (dst_image_state->createInfo.flags & VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT) {
+ skip |= LogError(cb_node->commandBuffer, "vkCmdResolveImage-dstImage-02546",
+ "vkCmdResolveImage(): dstImage must not have been created with flags containing "
+ "VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT");
+ }
bool hit_error = false;
const char *invalid_src_layout_vuid =
@@ -2963,57 +3130,125 @@
// For each region, the number of layers in the image subresource should not be zero
// For each region, src and dest image aspect must be color only
for (uint32_t i = 0; i < regionCount; i++) {
- skip |=
- ValidateImageSubresourceLayers(cb_node, &pRegions[i].srcSubresource, "vkCmdResolveImage()", "srcSubresource", i);
- skip |=
- ValidateImageSubresourceLayers(cb_node, &pRegions[i].dstSubresource, "vkCmdResolveImage()", "dstSubresource", i);
- skip |= VerifyImageLayout(cb_node, src_image_state, pRegions[i].srcSubresource, srcImageLayout,
+ const VkImageSubresourceLayers src_subresource = pRegions[i].srcSubresource;
+ const VkImageSubresourceLayers dst_subresource = pRegions[i].dstSubresource;
+ skip |= ValidateImageSubresourceLayers(cb_node, &src_subresource, "vkCmdResolveImage()", "srcSubresource", i);
+ skip |= ValidateImageSubresourceLayers(cb_node, &dst_subresource, "vkCmdResolveImage()", "dstSubresource", i);
+ skip |= VerifyImageLayout(cb_node, src_image_state, src_subresource, srcImageLayout,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, "vkCmdResolveImage()", invalid_src_layout_vuid,
"VUID-vkCmdResolveImage-srcImageLayout-00260", &hit_error);
- skip |= VerifyImageLayout(cb_node, dst_image_state, pRegions[i].dstSubresource, dstImageLayout,
+ skip |= VerifyImageLayout(cb_node, dst_image_state, dst_subresource, dstImageLayout,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "vkCmdResolveImage()", invalid_dst_layout_vuid,
"VUID-vkCmdResolveImage-dstImageLayout-00262", &hit_error);
- skip |= ValidateImageMipLevel(cb_node, src_image_state, pRegions[i].srcSubresource.mipLevel, i, "vkCmdResolveImage()",
+ skip |= ValidateImageMipLevel(cb_node, src_image_state, src_subresource.mipLevel, i, "vkCmdResolveImage()",
"srcSubresource", "VUID-vkCmdResolveImage-srcSubresource-01709");
- skip |= ValidateImageMipLevel(cb_node, dst_image_state, pRegions[i].dstSubresource.mipLevel, i, "vkCmdResolveImage()",
+ skip |= ValidateImageMipLevel(cb_node, dst_image_state, dst_subresource.mipLevel, i, "vkCmdResolveImage()",
"dstSubresource", "VUID-vkCmdResolveImage-dstSubresource-01710");
- skip |= ValidateImageArrayLayerRange(cb_node, src_image_state, pRegions[i].srcSubresource.baseArrayLayer,
- pRegions[i].srcSubresource.layerCount, i, "vkCmdResolveImage()", "srcSubresource",
+ skip |= ValidateImageArrayLayerRange(cb_node, src_image_state, src_subresource.baseArrayLayer,
+ src_subresource.layerCount, i, "vkCmdResolveImage()", "srcSubresource",
"VUID-vkCmdResolveImage-srcSubresource-01711");
- skip |= ValidateImageArrayLayerRange(cb_node, dst_image_state, pRegions[i].dstSubresource.baseArrayLayer,
- pRegions[i].dstSubresource.layerCount, i, "vkCmdResolveImage()", "srcSubresource",
+ skip |= ValidateImageArrayLayerRange(cb_node, dst_image_state, dst_subresource.baseArrayLayer,
+ dst_subresource.layerCount, i, "vkCmdResolveImage()", "srcSubresource",
"VUID-vkCmdResolveImage-dstSubresource-01712");
// layer counts must match
- if (pRegions[i].srcSubresource.layerCount != pRegions[i].dstSubresource.layerCount) {
+ if (src_subresource.layerCount != dst_subresource.layerCount) {
skip |= LogError(
cb_node->commandBuffer, "VUID-VkImageResolve-layerCount-00267",
- "vkCmdResolveImage(): layerCount in source and destination subresource of pRegions[%d] does not match.", i);
+ "vkCmdResolveImage(): layerCount in source and destination subresource of pRegions[%u] does not match.", i);
}
// For each region, src and dest image aspect must be color only
- if ((pRegions[i].srcSubresource.aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) ||
- (pRegions[i].dstSubresource.aspectMask != VK_IMAGE_ASPECT_COLOR_BIT)) {
- char const str[] =
- "vkCmdResolveImage(): src and dest aspectMasks for each region must specify only VK_IMAGE_ASPECT_COLOR_BIT";
- skip |= LogError(cb_node->commandBuffer, "VUID-VkImageResolve-aspectMask-00266", "%s.", str);
+ if ((src_subresource.aspectMask != VK_IMAGE_ASPECT_COLOR_BIT) ||
+ (dst_subresource.aspectMask != VK_IMAGE_ASPECT_COLOR_BIT)) {
+ skip |= LogError(
+ cb_node->commandBuffer, "VUID-VkImageResolve-aspectMask-00266",
+ "vkCmdResolveImage(): src and dest aspectMasks for pRegions[%u] must specify only VK_IMAGE_ASPECT_COLOR_BIT.",
+ i);
+ }
+
+ const VkImageType src_image_type = src_image_state->createInfo.imageType;
+ const VkImageType dst_image_type = dst_image_state->createInfo.imageType;
+
+ if ((VK_IMAGE_TYPE_3D == src_image_type) || (VK_IMAGE_TYPE_3D == dst_image_type)) {
+ if ((0 != src_subresource.baseArrayLayer) || (1 != src_subresource.layerCount) ||
+ (0 != dst_subresource.baseArrayLayer) || (1 != dst_subresource.layerCount)) {
+ LogObjectList objlist(cb_node->commandBuffer);
+ objlist.add(src_image_state->image);
+ objlist.add(dst_image_state->image);
+ skip |= LogError(objlist, "VUID-VkImageResolve-srcImage-00268",
+ "vkCmdResolveImage(): pRegions[%u] baseArrayLayer must be 0 and layerCount must be 1 for all "
+ "subresources if the src or dst image is 3D.",
+ i);
+ }
+ }
+
+ if (VK_IMAGE_TYPE_1D == src_image_type) {
+ if ((pRegions[i].srcOffset.y != 0) || (pRegions[i].extent.height != 1)) {
+ LogObjectList objlist(cb_node->commandBuffer);
+ objlist.add(src_image_state->image);
+ skip |= LogError(objlist, "VUID-VkImageResolve-srcImage-00271",
+ "vkCmdResolveImage(): srcImage (%s) is 1D but pRegions[%u] srcOffset.y (%d) is not 0 or "
+ "extent.height (%u) is not 1.",
+ report_data->FormatHandle(src_image_state->image).c_str(), i, pRegions[i].srcOffset.y,
+ pRegions[i].extent.height);
+ }
+ }
+ if ((VK_IMAGE_TYPE_1D == src_image_type) || (VK_IMAGE_TYPE_2D == src_image_type)) {
+ if ((pRegions[i].srcOffset.z != 0) || (pRegions[i].extent.depth != 1)) {
+ LogObjectList objlist(cb_node->commandBuffer);
+ objlist.add(src_image_state->image);
+ skip |= LogError(objlist, "VUID-VkImageResolve-srcImage-00273",
+ "vkCmdResolveImage(): srcImage (%s) is 2D but pRegions[%u] srcOffset.z (%d) is not 0 or "
+ "extent.depth (%u) is not 1.",
+ report_data->FormatHandle(src_image_state->image).c_str(), i, pRegions[i].srcOffset.z,
+ pRegions[i].extent.depth);
+ }
+ }
+
+ if (VK_IMAGE_TYPE_1D == dst_image_type) {
+ if ((pRegions[i].dstOffset.y != 0) || (pRegions[i].extent.height != 1)) {
+ LogObjectList objlist(cb_node->commandBuffer);
+ objlist.add(dst_image_state->image);
+ skip |= LogError(objlist, "VUID-VkImageResolve-dstImage-00276",
+ "vkCmdResolveImage(): dstImage (%s) is 1D but pRegions[%u] dstOffset.y (%d) is not 0 or "
+ "extent.height (%u) is not 1.",
+ report_data->FormatHandle(dst_image_state->image).c_str(), i, pRegions[i].dstOffset.y,
+ pRegions[i].extent.height);
+ }
+ }
+ if ((VK_IMAGE_TYPE_1D == dst_image_type) || (VK_IMAGE_TYPE_2D == dst_image_type)) {
+ if ((pRegions[i].dstOffset.z != 0) || (pRegions[i].extent.depth != 1)) {
+ LogObjectList objlist(cb_node->commandBuffer);
+ objlist.add(dst_image_state->image);
+ skip |= LogError(objlist, "VUID-VkImageResolve-dstImage-00278",
+ "vkCmdResolveImage(): dstImage (%s) is 2D but pRegions[%u] dstOffset.z (%d) is not 0 or "
+ "extent.depth (%u) is not 1.",
+ report_data->FormatHandle(dst_image_state->image).c_str(), i, pRegions[i].dstOffset.z,
+ pRegions[i].extent.depth);
+ }
}
}
if (src_image_state->createInfo.format != dst_image_state->createInfo.format) {
- char const str[] = "vkCmdResolveImage called with unmatched source and dest formats.";
- skip |= LogWarning(cb_node->commandBuffer, kVUID_Core_DrawState_MismatchedImageFormat, str);
+ skip |=
+ LogError(cb_node->commandBuffer, "VUID-vkCmdResolveImage-srcImage-01386",
+ "vkCmdResolveImage(): srcImage format (%s) and dstImage format (%s) are not the same.",
+ string_VkFormat(src_image_state->createInfo.format), string_VkFormat(dst_image_state->createInfo.format));
}
if (src_image_state->createInfo.imageType != dst_image_state->createInfo.imageType) {
- char const str[] = "vkCmdResolveImage called with unmatched source and dest image types.";
- skip |= LogWarning(cb_node->commandBuffer, kVUID_Core_DrawState_MismatchedImageType, str);
+ skip |= LogWarning(cb_node->commandBuffer, kVUID_Core_DrawState_MismatchedImageType,
+ "vkCmdResolveImage(): srcImage type (%s) and dstImage type (%s) are not the same.",
+ string_VkImageType(src_image_state->createInfo.imageType),
+ string_VkImageType(dst_image_state->createInfo.imageType));
}
if (src_image_state->createInfo.samples == VK_SAMPLE_COUNT_1_BIT) {
- char const str[] = "vkCmdResolveImage called with source sample count less than 2.";
- skip |= LogError(cb_node->commandBuffer, "VUID-vkCmdResolveImage-srcImage-00257", "%s.", str);
+ skip |= LogError(cb_node->commandBuffer, "VUID-vkCmdResolveImage-srcImage-00257",
+ "vkCmdResolveImage(): srcImage sample count is VK_SAMPLE_COUNT_1_BIT.");
}
if (dst_image_state->createInfo.samples != VK_SAMPLE_COUNT_1_BIT) {
- char const str[] = "vkCmdResolveImage called with dest sample count greater than 1.";
- skip |= LogError(cb_node->commandBuffer, "VUID-vkCmdResolveImage-dstImage-00259", "%s.", str);
+ skip |= LogError(cb_node->commandBuffer, "VUID-vkCmdResolveImage-dstImage-00259",
+ "vkCmdResolveImage(): dstImage sample count (%s) is not VK_SAMPLE_COUNT_1_BIT.",
+ string_VkSampleCountFlagBits(dst_image_state->createInfo.samples));
}
} else {
assert(0);
@@ -3050,9 +3285,21 @@
skip |= ValidateCmd(cb_node, CMD_BLITIMAGE, "vkCmdBlitImage()");
skip |= InsideRenderPass(cb_node, "vkCmdBlitImage()", "VUID-vkCmdBlitImage-renderpass");
skip |= ValidateImageFormatFeatureFlags(src_image_state, VK_FORMAT_FEATURE_BLIT_SRC_BIT, "vkCmdBlitImage()",
- "VUID-vkCmdBlitImage-srcImage-01999", "VUID-vkCmdBlitImage-srcImage-01999");
+ "VUID-vkCmdBlitImage-srcImage-01999");
skip |= ValidateImageFormatFeatureFlags(dst_image_state, VK_FORMAT_FEATURE_BLIT_DST_BIT, "vkCmdBlitImage()",
- "VUID-vkCmdBlitImage-dstImage-02000", "VUID-vkCmdBlitImage-dstImage-02000");
+ "VUID-vkCmdBlitImage-dstImage-02000");
+
+ // Validation for VK_EXT_fragment_density_map
+ if (src_image_state->createInfo.flags & VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT) {
+ skip |= LogError(
+ cb_node->commandBuffer, "VUID-vkCmdBlitImage-dstImage-02545",
+ "vkCmdBlitImage(): srcImage must not have been created with flags containing VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT");
+ }
+ if (dst_image_state->createInfo.flags & VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT) {
+ skip |= LogError(
+ cb_node->commandBuffer, "VUID-vkCmdBlitImage-dstImage-02545",
+ "vkCmdBlitImage(): dstImage must not have been created with flags containing VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT");
+ }
// TODO: Need to validate image layouts, which will include layout validation for shared presentable images
@@ -3063,12 +3310,10 @@
if (VK_FILTER_LINEAR == filter) {
skip |= ValidateImageFormatFeatureFlags(src_image_state, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT,
- "vkCmdBlitImage()", "VUID-vkCmdBlitImage-filter-02001",
- "VUID-vkCmdBlitImage-filter-02001");
+ "vkCmdBlitImage()", "VUID-vkCmdBlitImage-filter-02001");
} else if (VK_FILTER_CUBIC_IMG == filter) {
skip |= ValidateImageFormatFeatureFlags(src_image_state, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG,
- "vkCmdBlitImage()", "VUID-vkCmdBlitImage-filter-02002",
- "VUID-vkCmdBlitImage-filter-02002");
+ "vkCmdBlitImage()", "VUID-vkCmdBlitImage-filter-02002");
}
if (FormatRequiresYcbcrConversion(src_format)) {
@@ -3090,12 +3335,6 @@
"vkCmdBlitImage(): source image type must be VK_IMAGE_TYPE_3D when cubic filtering is specified.");
}
- if ((VK_SAMPLE_COUNT_1_BIT != src_image_state->createInfo.samples) ||
- (VK_SAMPLE_COUNT_1_BIT != dst_image_state->createInfo.samples)) {
- skip |= LogError(cb_node->commandBuffer, "VUID-vkCmdBlitImage-srcImage-00228",
- "vkCmdBlitImage(): source or dest image has sample count other than VK_SAMPLE_COUNT_1_BIT.");
- }
-
// Validate consistency for unsigned formats
if (FormatIsUInt(src_format) != FormatIsUInt(dst_format)) {
std::stringstream ss;
@@ -3346,7 +3585,7 @@
auto inserted = map->emplace(std::make_pair(image_state.image, nullptr));
if (inserted.second) {
assert(nullptr == inserted.first->second.get());
- GlobalImageLayoutRangeMap *layout_map = new GlobalImageLayoutRangeMap(image_state.range_encoder.SubresourceCount());
+ GlobalImageLayoutRangeMap *layout_map = new GlobalImageLayoutRangeMap(image_state.subresource_encoder.SubresourceCount());
inserted.first->second.reset(layout_map);
return layout_map;
} else {
@@ -3367,7 +3606,7 @@
// This validates that the initial layout specified in the command buffer for the IMAGE is the same as the global IMAGE layout
bool CoreChecks::ValidateCmdBufImageLayouts(const CMD_BUFFER_STATE *pCB, const GlobalImageLayoutMap &globalImageLayoutMap,
GlobalImageLayoutMap *overlayLayoutMap_arg) const {
- if (disabled.image_layout_validation) return false;
+ if (disabled[image_layout_validation]) return false;
bool skip = false;
GlobalImageLayoutMap &overlayLayoutMap = *overlayLayoutMap_arg;
// Iterate over the layout maps for each referenced image
@@ -3412,17 +3651,15 @@
assert(initial_layout_state); // There's no way we should have an initial layout without matching state...
bool matches = ImageLayoutMatches(initial_layout_state->aspect_mask, image_layout, initial_layout);
if (!matches) {
- std::string formatted_label = FormatDebugLabel(" ", pCB->debug_label);
// We can report all the errors for the intersected range directly
for (auto index : sparse_container::range_view<decltype(intersected_range)>(intersected_range)) {
- const auto subresource = image_state->range_encoder.Decode(index);
+ const auto subresource = image_state->subresource_encoder.Decode(index);
skip |= LogError(
pCB->commandBuffer, kVUID_Core_DrawState_InvalidImageLayout,
"Submitted command buffer expects %s (subresource: aspectMask 0x%X array layer %u, mip level %u) "
- "to be in layout %s--instead, current layout is %s.%s",
+ "to be in layout %s--instead, current layout is %s.",
report_data->FormatHandle(image).c_str(), subresource.aspectMask, subresource.arrayLayer,
- subresource.mipLevel, string_VkImageLayout(initial_layout), string_VkImageLayout(image_layout),
- formatted_label.c_str());
+ subresource.mipLevel, string_VkImageLayout(initial_layout), string_VkImageLayout(image_layout));
}
}
}
@@ -3471,17 +3708,17 @@
(first_layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) ||
(first_layout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL))) {
skip |= LogError(device, "VUID-VkRenderPassCreateInfo2-pAttachments-02522",
- "Cannot clear attachment %d with invalid first layout %s.", attachment,
+ "vkCreateRenderPass2(): Cannot clear attachment %d with invalid first layout %s.", attachment,
string_VkImageLayout(first_layout));
} else if ((use_rp2 == false) && (device_extensions.vk_khr_maintenance2) &&
(first_layout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL)) {
skip |= LogError(device, "VUID-VkRenderPassCreateInfo-pAttachments-01566",
- "Cannot clear attachment %d with invalid first layout %s.", attachment,
+ "vkCreateRenderPass(): Cannot clear attachment %d with invalid first layout %s.", attachment,
string_VkImageLayout(first_layout));
} else if ((use_rp2 == false) && ((first_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL) ||
(first_layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL))) {
skip |= LogError(device, "VUID-VkRenderPassCreateInfo-pAttachments-00836",
- "Cannot clear attachment %d with invalid first layout %s.", attachment,
+ "vkCreateRenderPass(): Cannot clear attachment %d with invalid first layout %s.", attachment,
string_VkImageLayout(first_layout));
}
}
@@ -3492,17 +3729,17 @@
(first_layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) ||
(first_layout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL))) {
skip |= LogError(device, "VUID-VkRenderPassCreateInfo2-pAttachments-02523",
- "Cannot clear attachment %d with invalid first layout %s.", attachment,
+ "vkCreateRenderPass2(): Cannot clear attachment %d with invalid first layout %s.", attachment,
string_VkImageLayout(first_layout));
} else if ((use_rp2 == false) && (device_extensions.vk_khr_maintenance2) &&
(first_layout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL)) {
skip |= LogError(device, "VUID-VkRenderPassCreateInfo-pAttachments-01567",
- "Cannot clear attachment %d with invalid first layout %s.", attachment,
+ "vkCreateRenderPass(): Cannot clear attachment %d with invalid first layout %s.", attachment,
string_VkImageLayout(first_layout));
} else if ((use_rp2 == false) && ((first_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL) ||
(first_layout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL))) {
skip |= LogError(device, "VUID-VkRenderPassCreateInfo-pAttachments-02511",
- "Cannot clear attachment %d with invalid first layout %s.", attachment,
+ "vkCreateRenderPass(): Cannot clear attachment %d with invalid first layout %s.", attachment,
string_VkImageLayout(first_layout));
}
}
@@ -3522,18 +3759,20 @@
if ((FormatIsColor(format) || FormatHasDepth(format)) &&
pCreateInfo->pAttachments[i].loadOp == VK_ATTACHMENT_LOAD_OP_LOAD) {
skip |= LogWarning(device, kVUID_Core_DrawState_InvalidRenderpass,
- "Render pass has an attachment with loadOp == VK_ATTACHMENT_LOAD_OP_LOAD and initialLayout == "
+ "%s: Render pass pAttachment[%u] has loadOp == VK_ATTACHMENT_LOAD_OP_LOAD and initialLayout == "
"VK_IMAGE_LAYOUT_UNDEFINED. This is probably not what you intended. Consider using "
"VK_ATTACHMENT_LOAD_OP_DONT_CARE instead if the image truely is undefined at the start of the "
- "render pass.");
+ "render pass.",
+ function_name, i);
}
if (FormatHasStencil(format) && pCreateInfo->pAttachments[i].stencilLoadOp == VK_ATTACHMENT_LOAD_OP_LOAD) {
skip |=
LogWarning(device, kVUID_Core_DrawState_InvalidRenderpass,
- "Render pass has an attachment with stencilLoadOp == VK_ATTACHMENT_LOAD_OP_LOAD and initialLayout "
+ "%s: Render pass pAttachment[%u] has stencilLoadOp == VK_ATTACHMENT_LOAD_OP_LOAD and initialLayout "
"== VK_IMAGE_LAYOUT_UNDEFINED. This is probably not what you intended. Consider using "
"VK_ATTACHMENT_LOAD_OP_DONT_CARE instead if the image truely is undefined at the start of the "
- "render pass.");
+ "render pass.",
+ function_name, i);
}
}
}
@@ -3555,17 +3794,19 @@
case VK_IMAGE_LAYOUT_GENERAL:
// May not be optimal. TODO: reconsider this warning based on other constraints.
- skip |= LogPerformanceWarning(device, kVUID_Core_DrawState_InvalidImageLayout,
- "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
+ skip |= LogPerformanceWarning(
+ device, kVUID_Core_DrawState_InvalidImageLayout,
+ "%s: Layout for input attachment reference %u in subpass %u is GENERAL but should be READ_ONLY_OPTIMAL.",
+ function_name, j, i);
break;
case VK_IMAGE_LAYOUT_UNDEFINED:
case VK_IMAGE_LAYOUT_PREINITIALIZED:
vuid = use_rp2 ? "VUID-VkAttachmentReference2-layout-03077" : "VUID-VkAttachmentReference-layout-00857";
skip |= LogError(device, vuid,
- "Layout for input attachment reference %u in subpass %u is %s but must be "
+ "%s: Layout for input attachment reference %u in subpass %u is %s but must be "
"DEPTH_STENCIL_READ_ONLY, SHADER_READ_ONLY_OPTIMAL, or GENERAL.",
- j, i, string_VkImageLayout(subpass.pInputAttachments[j].layout));
+ function_name, j, i, string_VkImageLayout(subpass.pInputAttachments[j].layout));
break;
case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR:
@@ -3575,17 +3816,17 @@
if (!enabled_features.core12.separateDepthStencilLayouts) {
skip |= LogError(
device, "VUID-VkAttachmentReference2-separateDepthStencilLayouts-03313",
- "Layout for input attachment reference %u in subpass %u is %s but must not be "
+ "%s: Layout for input attachment reference %u in subpass %u is %s but must not be "
"VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR, "
"VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR.",
- j, i, string_VkImageLayout(subpass.pInputAttachments[j].layout));
+ function_name, j, i, string_VkImageLayout(subpass.pInputAttachments[j].layout));
} else if (subpass.pInputAttachments[j].aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) {
skip |= LogError(
device, "VUID-VkAttachmentReference2-attachment-03314",
- "Layout for input attachment reference %u in subpass %u is %s but must not be "
+ "%s: Layout for input attachment reference %u in subpass %u is %s but must not be "
"VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR, "
"VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR.",
- j, i, string_VkImageLayout(subpass.pInputAttachments[j].layout));
+ function_name, j, i, string_VkImageLayout(subpass.pInputAttachments[j].layout));
} else if ((subpass.pInputAttachments[j].aspectMask &
(VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) ==
(VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
@@ -3612,7 +3853,7 @@
VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL ||
attachment_reference_stencil_layout->stencilLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR) {
skip |= LogError(device, "VUID-VkAttachmentReferenceStencilLayout-stencilLayout-03318",
- "In the attachment reference %u in subpass %u with pNext chain instance "
+ "%s: In the attachment reference %u in subpass %u with pNext chain instance "
"VkAttachmentReferenceStencilLayoutKHR"
"the stencilLayout member but must not be "
"VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_PREINITIALIZED, "
@@ -3624,37 +3865,37 @@
"VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, "
"VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, or "
"VK_IMAGE_LAYOUT_PRESENT_SRC_KHR.",
- j, i);
+ function_name, j, i);
}
} else {
skip |= LogError(
device, "VUID-VkAttachmentReference2-attachment-03315",
- "When the layout for input attachment reference %u in subpass %u is "
+ "%s: When the layout for input attachment reference %u in subpass %u is "
"VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR or "
"VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR then the pNext chain must include a valid "
"VkAttachmentReferenceStencilLayout instance.",
- j, i);
+ function_name, j, i);
}
}
} else if (subpass.pInputAttachments[j].aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) {
if (subpass.pInputAttachments[j].layout == VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR ||
subpass.pInputAttachments[j].layout == VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR) {
- skip |= LogError(
- device, "VUID-VkAttachmentReference2-attachment-03315",
- "When the aspectMask for input attachment reference %u in subpass %u is VK_IMAGE_ASPECT_DEPTH_BIT "
- "then the layout must not be VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR, or "
- "VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR.",
- j, i);
+ skip |= LogError(device, "VUID-VkAttachmentReference2-attachment-03315",
+ "%s: When the aspectMask for input attachment reference %u in subpass %u is "
+ "VK_IMAGE_ASPECT_DEPTH_BIT "
+ "then the layout must not be VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR, or "
+ "VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR.",
+ function_name, j, i);
}
} else if (subpass.pInputAttachments[j].aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) {
if (subpass.pInputAttachments[j].layout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR ||
subpass.pInputAttachments[j].layout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR) {
skip |= LogError(device, "VUID-VkAttachmentReference2-attachment-03317",
- "When the aspectMask for input attachment reference %u in subpass %u is "
+ "%s: When the aspectMask for input attachment reference %u in subpass %u is "
"VK_IMAGE_ASPECT_STENCIL_BIT "
"then the layout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, or "
"VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL.",
- j, i);
+ function_name, j, i);
}
}
break;
@@ -3671,8 +3912,8 @@
default:
// No other layouts are acceptable
skip |= LogError(device, kVUID_Core_DrawState_InvalidImageLayout,
- "Layout for input attachment is %s but can only be READ_ONLY_OPTIMAL or GENERAL.",
- string_VkImageLayout(subpass.pInputAttachments[j].layout));
+ "%s: Layout for input attachment is %s but can only be READ_ONLY_OPTIMAL or GENERAL.",
+ function_name, string_VkImageLayout(subpass.pInputAttachments[j].layout));
}
if (attach_first_use[attach_index]) {
@@ -3690,7 +3931,7 @@
vuid = use_rp2 ? "VUID-VkSubpassDescription2-loadOp-03064" : "VUID-VkSubpassDescription-loadOp-00846";
skip |= LogError(device, vuid,
"%s: attachment %u is first used as an input attachment in subpass %u with loadOp=CLEAR.",
- function_name, attach_index, attach_index);
+ function_name, attach_index, i);
}
}
attach_first_use[attach_index] = false;
@@ -3713,16 +3954,18 @@
case VK_IMAGE_LAYOUT_GENERAL:
// May not be optimal; TODO: reconsider this warning based on other constraints?
skip |= LogPerformanceWarning(device, kVUID_Core_DrawState_InvalidImageLayout,
- "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
+ "%s: Layout for color attachment reference %u in subpass %u is GENERAL but "
+ "should be COLOR_ATTACHMENT_OPTIMAL.",
+ function_name, j, i);
break;
case VK_IMAGE_LAYOUT_UNDEFINED:
case VK_IMAGE_LAYOUT_PREINITIALIZED:
vuid = use_rp2 ? "VUID-VkAttachmentReference2-layout-03077" : "VUID-VkAttachmentReference-layout-00857";
skip |= LogError(device, vuid,
- "Layout for color attachment reference %u in subpass %u is %s but should be "
+ "%s: Layout for color attachment reference %u in subpass %u is %s but should be "
"COLOR_ATTACHMENT_OPTIMAL or GENERAL.",
- j, i, string_VkImageLayout(subpass.pColorAttachments[j].layout));
+ function_name, j, i, string_VkImageLayout(subpass.pColorAttachments[j].layout));
break;
case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR:
@@ -3732,17 +3975,17 @@
if (!enabled_features.core12.separateDepthStencilLayouts) {
skip |= LogError(
device, "VUID-VkAttachmentReference2-separateDepthStencilLayouts-03313",
- "Layout for color attachment reference %u in subpass %u is %s but must not be "
+ "%s: Layout for color attachment reference %u in subpass %u is %s but must not be "
"VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR, "
"VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR.",
- j, i, string_VkImageLayout(subpass.pColorAttachments[j].layout));
+ function_name, j, i, string_VkImageLayout(subpass.pColorAttachments[j].layout));
} else if (subpass.pColorAttachments[j].aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) {
skip |= LogError(
device, "VUID-VkAttachmentReference2-attachment-03314",
- "Layout for color attachment reference %u in subpass %u is %s but must not be "
+ "%s: Layout for color attachment reference %u in subpass %u is %s but must not be "
"VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR, "
"VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR.",
- j, i, string_VkImageLayout(subpass.pColorAttachments[j].layout));
+ function_name, j, i, string_VkImageLayout(subpass.pColorAttachments[j].layout));
} else if ((subpass.pColorAttachments[j].aspectMask &
(VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) ==
(VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
@@ -3769,7 +4012,7 @@
VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL ||
attachment_reference_stencil_layout->stencilLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR) {
skip |= LogError(device, "VUID-VkAttachmentReferenceStencilLayout-stencilLayout-03318",
- "In the attachment reference %u in subpass %u with pNext chain instance "
+ "%s: In the attachment reference %u in subpass %u with pNext chain instance "
"VkAttachmentReferenceStencilLayoutKHR"
"the stencilLayout member but must not be "
"VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_PREINITIALIZED, "
@@ -3781,45 +4024,45 @@
"VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, "
"VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, or "
"VK_IMAGE_LAYOUT_PRESENT_SRC_KHR.",
- j, i);
+ function_name, j, i);
}
} else {
skip |= LogError(
device, "VUID-VkAttachmentReference2-attachment-03315",
- "When the layout for color attachment reference %u in subpass %u is "
+ "%s: When the layout for color attachment reference %u in subpass %u is "
"VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR or "
"VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR then the pNext chain must include a valid "
"VkAttachmentReferenceStencilLayout instance.",
- j, i);
+ function_name, j, i);
}
}
} else if (subpass.pColorAttachments[j].aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) {
if (subpass.pColorAttachments[j].layout == VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR ||
subpass.pColorAttachments[j].layout == VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR) {
- skip |= LogError(
- device, "VUID-VkAttachmentReference2-attachment-03315",
- "When the aspectMask for color attachment reference %u in subpass %u is VK_IMAGE_ASPECT_DEPTH_BIT "
- "then the layout must not be VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR, or "
- "VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR.",
- j, i);
+ skip |= LogError(device, "VUID-VkAttachmentReference2-attachment-03315",
+ "%s: When the aspectMask for color attachment reference %u in subpass %u is "
+ "VK_IMAGE_ASPECT_DEPTH_BIT "
+ "then the layout must not be VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR, or "
+ "VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR.",
+ function_name, j, i);
}
} else if (subpass.pColorAttachments[j].aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) {
if (subpass.pColorAttachments[j].layout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR ||
subpass.pColorAttachments[j].layout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR) {
skip |= LogError(device, "VUID-VkAttachmentReference2-attachment-03317",
- "When the aspectMask for color attachment reference %u in subpass %u is "
+ "%s: When the aspectMask for color attachment reference %u in subpass %u is "
"VK_IMAGE_ASPECT_STENCIL_BIT "
"then the layout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, or "
"VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL.",
- j, i);
+ function_name, j, i);
}
}
break;
default:
skip |= LogError(device, kVUID_Core_DrawState_InvalidImageLayout,
- "Layout for color attachment is %s but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.",
- string_VkImageLayout(subpass.pColorAttachments[j].layout));
+ "%s: Layout for color attachment is %s but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.",
+ function_name, string_VkImageLayout(subpass.pColorAttachments[j].layout));
}
if (subpass.pResolveAttachments && (subpass.pResolveAttachments[j].attachment != VK_ATTACHMENT_UNUSED) &&
@@ -3827,9 +4070,9 @@
subpass.pResolveAttachments[j].layout == VK_IMAGE_LAYOUT_PREINITIALIZED)) {
vuid = use_rp2 ? "VUID-VkAttachmentReference2-layout-03077" : "VUID-VkAttachmentReference-layout-00857";
skip |= LogError(device, vuid,
- "Layout for resolve attachment reference %u in subpass %u is %s but should be "
+ "%s: Layout for resolve attachment reference %u in subpass %u is %s but should be "
"COLOR_ATTACHMENT_OPTIMAL or GENERAL.",
- j, i, string_VkImageLayout(subpass.pResolveAttachments[j].layout));
+ function_name, j, i, string_VkImageLayout(subpass.pResolveAttachments[j].layout));
}
if (attach_first_use[attach_index]) {
@@ -3849,17 +4092,20 @@
case VK_IMAGE_LAYOUT_GENERAL:
// May not be optimal; TODO: reconsider this warning based on other constraints? GENERAL can be better than
// doing a bunch of transitions.
- skip |= LogPerformanceWarning(device, kVUID_Core_DrawState_InvalidImageLayout,
- "GENERAL layout for depth attachment may not give optimal performance.");
+ skip |= LogPerformanceWarning(
+ device, kVUID_Core_DrawState_InvalidImageLayout,
+ "%s: GENERAL layout for depth attachment reference in subpass %u may not give optimal performance.",
+ function_name, i);
break;
case VK_IMAGE_LAYOUT_UNDEFINED:
case VK_IMAGE_LAYOUT_PREINITIALIZED:
vuid = use_rp2 ? "VUID-VkAttachmentReference2-layout-03077" : "VUID-VkAttachmentReference-layout-00857";
- skip |= LogError(device, vuid,
- "Layout for depth attachment reference in subpass %u is %s but must be a valid depth/stencil "
- "layout or GENERAL.",
- i, string_VkImageLayout(subpass.pDepthStencilAttachment->layout));
+ skip |=
+ LogError(device, vuid,
+ "%s: Layout for depth attachment reference in subpass %u is %s but must be a valid depth/stencil "
+ "layout or GENERAL.",
+ function_name, i, string_VkImageLayout(subpass.pDepthStencilAttachment->layout));
break;
case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR:
@@ -3869,17 +4115,17 @@
if (!enabled_features.core12.separateDepthStencilLayouts) {
skip |= LogError(
device, "VUID-VkAttachmentReference2-separateDepthStencilLayouts-03313",
- "Layout for depth attachment reference in subpass %u is %s but must not be "
+ "%s: Layout for depth attachment reference in subpass %u is %s but must not be "
"VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR, "
"VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR.",
- i, string_VkImageLayout(subpass.pDepthStencilAttachment->layout));
+ function_name, i, string_VkImageLayout(subpass.pDepthStencilAttachment->layout));
} else if (subpass.pDepthStencilAttachment->aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) {
skip |= LogError(
device, "VUID-VkAttachmentReference2-attachment-03314",
- "Layout for depth attachment reference in subpass %u is %s but must not be "
+ "%s: Layout for depth attachment reference in subpass %u is %s but must not be "
"VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR, "
"VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR.",
- i, string_VkImageLayout(subpass.pDepthStencilAttachment->layout));
+ function_name, i, string_VkImageLayout(subpass.pDepthStencilAttachment->layout));
} else if ((subpass.pDepthStencilAttachment->aspectMask &
(VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) ==
(VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
@@ -3906,7 +4152,7 @@
VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL ||
attachment_reference_stencil_layout->stencilLayout == VK_IMAGE_LAYOUT_PRESENT_SRC_KHR) {
skip |= LogError(device, "VUID-VkAttachmentReferenceStencilLayout-stencilLayout-03318",
- "In the attachment reference in subpass %u with pNext chain instance "
+ "%s: In the attachment reference in subpass %u with pNext chain instance "
"VkAttachmentReferenceStencilLayoutKHR"
"the stencilLayout member but must not be "
"VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_PREINITIALIZED, "
@@ -3918,16 +4164,16 @@
"VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, "
"VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, or "
"VK_IMAGE_LAYOUT_PRESENT_SRC_KHR.",
- i);
+ function_name, i);
}
} else {
skip |= LogError(
device, "VUID-VkAttachmentReference2-attachment-03315",
- "When the layout for depth attachment reference in subpass %u is "
+ "%s: When the layout for depth attachment reference in subpass %u is "
"VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR or "
"VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR then the pNext chain must include a valid "
"VkAttachmentReferenceStencilLayout instance.",
- i);
+ function_name, i);
}
}
} else if (subpass.pDepthStencilAttachment->aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) {
@@ -3935,20 +4181,20 @@
subpass.pDepthStencilAttachment->layout == VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR) {
skip |= LogError(
device, "VUID-VkAttachmentReference2-attachment-03315",
- "When the aspectMask for depth attachment reference in subpass %u is VK_IMAGE_ASPECT_DEPTH_BIT "
+ "%s: When the aspectMask for depth attachment reference in subpass %u is VK_IMAGE_ASPECT_DEPTH_BIT "
"then the layout must not be VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR, or "
"VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR.",
- i);
+ function_name, i);
}
} else if (subpass.pDepthStencilAttachment->aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) {
if (subpass.pDepthStencilAttachment->layout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR ||
subpass.pDepthStencilAttachment->layout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR) {
skip |= LogError(device, "VUID-VkAttachmentReference2-attachment-03317",
- "When the aspectMask for depth attachment reference in subpass %u is "
+ "%s: When the aspectMask for depth attachment reference in subpass %u is "
"VK_IMAGE_ASPECT_STENCIL_BIT "
"then the layout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, or "
"VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL.",
- i);
+ function_name, i);
}
}
break;
@@ -3965,9 +4211,9 @@
default:
// No other layouts are acceptable
skip |= LogError(device, kVUID_Core_DrawState_InvalidImageLayout,
- "Layout for depth attachment is %s but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL, "
+ "%s: Layout for depth attachment is %s but can only be DEPTH_STENCIL_ATTACHMENT_OPTIMAL, "
"DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.",
- string_VkImageLayout(subpass.pDepthStencilAttachment->layout));
+ function_name, string_VkImageLayout(subpass.pDepthStencilAttachment->layout));
}
auto attach_index = subpass.pDepthStencilAttachment->attachment;
@@ -4020,22 +4266,24 @@
}
bool CoreChecks::ValidateImageFormatFeatureFlags(IMAGE_STATE const *image_state, VkFormatFeatureFlags desired,
- char const *func_name, const char *linear_vuid, const char *optimal_vuid) const {
- VkFormatProperties format_properties = GetPDFormatProperties(image_state->createInfo.format);
+ char const *func_name, const char *vuid) const {
bool skip = false;
- if (image_state->createInfo.tiling == VK_IMAGE_TILING_LINEAR) {
- if ((format_properties.linearTilingFeatures & desired) != desired) {
- skip |=
- LogError(image_state->image, linear_vuid, "In %s, invalid linearTilingFeatures (0x%08X) for format %u used by %s.",
- func_name, format_properties.linearTilingFeatures, image_state->createInfo.format,
- report_data->FormatHandle(image_state->image).c_str());
- }
- } else if (image_state->createInfo.tiling == VK_IMAGE_TILING_OPTIMAL) {
- if ((format_properties.optimalTilingFeatures & desired) != desired) {
- skip |= LogError(image_state->image, optimal_vuid,
- "In %s, invalid optimalTilingFeatures (0x%08X) for format %u used by %s.", func_name,
- format_properties.optimalTilingFeatures, image_state->createInfo.format,
+ const VkFormatFeatureFlags image_format_features = image_state->format_features;
+ if ((image_format_features & desired) != desired) {
+ // Same error, but more details if it was an AHB external format
+ if (image_state->has_ahb_format == true) {
+ skip |= LogError(image_state->image, vuid,
+ "In %s, VkFormatFeatureFlags (0x%08X) does not support required feature %s for the external format "
+ "found in VkAndroidHardwareBufferFormatPropertiesANDROID::formatFeatures used by %s.",
+ func_name, image_format_features, string_VkFormatFeatureFlags(desired).c_str(),
report_data->FormatHandle(image_state->image).c_str());
+ } else {
+ skip |= LogError(image_state->image, vuid,
+ "In %s, VkFormatFeatureFlags (0x%08X) does not support required feature %s for format %u used by %s "
+ "with tiling %s.",
+ func_name, image_format_features, string_VkFormatFeatureFlags(desired).c_str(),
+ image_state->createInfo.format, report_data->FormatHandle(image_state->image).c_str(),
+ string_VkImageTiling(image_state->createInfo.tiling));
}
}
return skip;
@@ -4082,7 +4330,7 @@
// Range must be greater than 0
if (range <= 0) {
skip |= LogError(buffer_state->buffer, "VUID-VkBufferViewCreateInfo-range-00928",
- "If VkBufferViewCreateInfo range (%" PRIuLEAST64
+ "vkCreateBufferView(): If VkBufferViewCreateInfo range (%" PRIuLEAST64
") does not equal VK_WHOLE_SIZE, range must be greater than 0.",
range);
}
@@ -4090,7 +4338,7 @@
const uint32_t format_size = FormatElementSize(pCreateInfo->format);
if (SafeModulo(range, format_size) != 0) {
skip |= LogError(buffer_state->buffer, "VUID-VkBufferViewCreateInfo-range-00929",
- "If VkBufferViewCreateInfo range (%" PRIuLEAST64
+ "vkCreateBufferView(): If VkBufferViewCreateInfo range (%" PRIuLEAST64
") does not equal VK_WHOLE_SIZE, range must be a multiple of the element size of the format "
"(%" PRIu32 ").",
range, format_size);
@@ -4098,7 +4346,7 @@
// Range divided by the element size of format must be less than or equal to VkPhysicalDeviceLimits::maxTexelBufferElements
if (SafeDivision(range, format_size) > device_limits->maxTexelBufferElements) {
skip |= LogError(buffer_state->buffer, "VUID-VkBufferViewCreateInfo-range-00930",
- "If VkBufferViewCreateInfo range (%" PRIuLEAST64
+ "vkCreateBufferView(): If VkBufferViewCreateInfo range (%" PRIuLEAST64
") does not equal VK_WHOLE_SIZE, range divided by the element size of the format (%" PRIu32
") must be less than or equal to VkPhysicalDeviceLimits::maxTexelBufferElements (%" PRIuLEAST32 ").",
range, format_size, device_limits->maxTexelBufferElements);
@@ -4106,11 +4354,26 @@
// The sum of range and offset must be less than or equal to the size of buffer
if (range + pCreateInfo->offset > buffer_state->createInfo.size) {
skip |= LogError(buffer_state->buffer, "VUID-VkBufferViewCreateInfo-offset-00931",
- "If VkBufferViewCreateInfo range (%" PRIuLEAST64
+ "vkCreateBufferView(): If VkBufferViewCreateInfo range (%" PRIuLEAST64
") does not equal VK_WHOLE_SIZE, the sum of offset (%" PRIuLEAST64
") and range must be less than or equal to the size of the buffer (%" PRIuLEAST64 ").",
range, pCreateInfo->offset, buffer_state->createInfo.size);
}
+ } else {
+ const uint32_t format_size = FormatElementSize(pCreateInfo->format);
+
+ // Size of buffer - offset, divided by the element size of format must be less than or equal to
+ // VkPhysicalDeviceLimits::maxTexelBufferElements
+ if (SafeDivision(buffer_state->createInfo.size - pCreateInfo->offset, format_size) >
+ device_limits->maxTexelBufferElements) {
+ skip |= LogError(buffer_state->buffer, "VUID-VkBufferViewCreateInfo-range-04059",
+ "vkCreateBufferView(): If VkBufferViewCreateInfo range (%" PRIuLEAST64
+ ") equals VK_WHOLE_SIZE, the buffer's size (%" PRIuLEAST64 ") minus the offset (%" PRIuLEAST64
+ "), divided by the element size of the format (%" PRIu32
+ ") must be less than or equal to VkPhysicalDeviceLimits::maxTexelBufferElements (%" PRIuLEAST32 ").",
+ range, buffer_state->createInfo.size, pCreateInfo->offset, format_size,
+ device_limits->maxTexelBufferElements);
+ }
}
return skip;
}
@@ -4121,13 +4384,15 @@
if ((buffer_state->createInfo.usage & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) &&
!(format_properties.bufferFeatures & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT)) {
skip |= LogError(buffer_state->buffer, "VUID-VkBufferViewCreateInfo-buffer-00933",
- "If buffer was created with `usage` containing VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, format must "
+ "vkCreateBufferView(): If buffer was created with `usage` containing "
+ "VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, format must "
"be supported for uniform texel buffers");
}
if ((buffer_state->createInfo.usage & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) &&
!(format_properties.bufferFeatures & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT)) {
skip |= LogError(buffer_state->buffer, "VUID-VkBufferViewCreateInfo-buffer-00934",
- "If buffer was created with `usage` containing VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, format must "
+ "vkCreateBufferView(): If buffer was created with `usage` containing "
+ "VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, format must "
"be supported for storage texel buffers");
}
return skip;
@@ -4139,24 +4404,6 @@
// TODO: Add check for "VUID-vkCreateBuffer-flags-00911" (sparse address space accounting)
- if ((pCreateInfo->flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) && (!enabled_features.core.sparseBinding)) {
- skip |= LogError(device, "VUID-VkBufferCreateInfo-flags-00915",
- "vkCreateBuffer(): the sparseBinding device feature is disabled: Buffers cannot be created with the "
- "VK_BUFFER_CREATE_SPARSE_BINDING_BIT set.");
- }
-
- if ((pCreateInfo->flags & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) && (!enabled_features.core.sparseResidencyBuffer)) {
- skip |= LogError(device, "VUID-VkBufferCreateInfo-flags-00916",
- "vkCreateBuffer(): the sparseResidencyBuffer device feature is disabled: Buffers cannot be created with "
- "the VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT set.");
- }
-
- if ((pCreateInfo->flags & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) && (!enabled_features.core.sparseResidencyAliased)) {
- skip |= LogError(device, "VUID-VkBufferCreateInfo-flags-00917",
- "vkCreateBuffer(): the sparseResidencyAliased device feature is disabled: Buffers cannot be created with "
- "the VK_BUFFER_CREATE_SPARSE_ALIASED_BIT set.");
- }
-
auto chained_devaddr_struct = lvl_find_in_chain<VkBufferDeviceAddressCreateInfoEXT>(pCreateInfo->pNext);
if (chained_devaddr_struct) {
if (!(pCreateInfo->flags & VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_EXT) &&
@@ -4178,7 +4425,8 @@
}
if ((pCreateInfo->flags & VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR) &&
- !enabled_features.core12.bufferDeviceAddressCaptureReplay) {
+ !enabled_features.core12.bufferDeviceAddressCaptureReplay &&
+ !enabled_features.buffer_device_address_ext.bufferDeviceAddressCaptureReplay) {
skip |= LogError(
device, "VUID-VkBufferCreateInfo-flags-03338",
"vkCreateBuffer(): the bufferDeviceAddressCaptureReplay device feature is disabled: Buffers cannot be created with "
@@ -4186,9 +4434,25 @@
}
if (pCreateInfo->sharingMode == VK_SHARING_MODE_CONCURRENT && pCreateInfo->pQueueFamilyIndices) {
- skip |= ValidateQueueFamilies(pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices, "vkCreateBuffer",
- "pCreateInfo->pQueueFamilyIndices", "VUID-VkBufferCreateInfo-sharingMode-01419",
- "VUID-VkBufferCreateInfo-sharingMode-01419", false);
+ skip |= ValidatePhysicalDeviceQueueFamilies(pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices,
+ "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
+ "VUID-VkBufferCreateInfo-sharingMode-01419");
+ }
+
+ if ((pCreateInfo->flags & VK_BUFFER_CREATE_PROTECTED_BIT) != 0) {
+ if (enabled_features.core11.protectedMemory == VK_FALSE) {
+ skip |= LogError(device, "VUID-VkBufferCreateInfo-flags-01887",
+ "vkCreateBuffer(): the protectedMemory device feature is disabled: Buffers cannot be created with the "
+ "VK_BUFFER_CREATE_PROTECTED_BIT set.");
+ }
+ const VkBufferCreateFlags invalid_flags =
+ VK_BUFFER_CREATE_SPARSE_BINDING_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
+ if ((pCreateInfo->flags & invalid_flags) != 0) {
+ skip |= LogError(device, "VUID-VkBufferCreateInfo-None-01888",
+ "vkCreateBuffer(): VK_BUFFER_CREATE_PROTECTED_BIT is set so no sparse create flags can be used at "
+ "same time (VK_BUFFER_CREATE_SPARSE_BINDING_BIT | VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | "
+ "VK_BUFFER_CREATE_SPARSE_ALIASED_BIT).");
+ }
}
return skip;
@@ -4211,7 +4475,7 @@
// Buffer view offset must be less than the size of buffer
if (pCreateInfo->offset >= buffer_state->createInfo.size) {
skip |= LogError(buffer_state->buffer, "VUID-VkBufferViewCreateInfo-offset-00925",
- "VkBufferViewCreateInfo offset (%" PRIuLEAST64
+ "vkCreateBufferView(): VkBufferViewCreateInfo offset (%" PRIuLEAST64
") must be less than the size of the buffer (%" PRIuLEAST64 ").",
pCreateInfo->offset, buffer_state->createInfo.size);
}
@@ -4220,8 +4484,10 @@
// Buffer view offset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment
if ((pCreateInfo->offset % device_limits->minTexelBufferOffsetAlignment) != 0 &&
!enabled_features.texel_buffer_alignment_features.texelBufferAlignment) {
- skip |= LogError(buffer_state->buffer, "VUID-VkBufferViewCreateInfo-offset-02749",
- "VkBufferViewCreateInfo offset (%" PRIuLEAST64
+ const char *vuid = device_extensions.vk_ext_texel_buffer_alignment ? "VUID-VkBufferViewCreateInfo-offset-02749"
+ : "VUID-VkBufferViewCreateInfo-offset-00926";
+ skip |= LogError(buffer_state->buffer, vuid,
+ "vkCreateBufferView(): VkBufferViewCreateInfo offset (%" PRIuLEAST64
") must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment (%" PRIuLEAST64 ").",
pCreateInfo->offset, device_limits->minTexelBufferOffsetAlignment);
}
@@ -4240,7 +4506,8 @@
if (SafeModulo(pCreateInfo->offset, alignmentRequirement) != 0) {
skip |= LogError(
buffer_state->buffer, "VUID-VkBufferViewCreateInfo-buffer-02750",
- "If buffer was created with usage containing VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
+ "vkCreateBufferView(): If buffer was created with usage containing "
+ "VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
"VkBufferViewCreateInfo offset (%" PRIuLEAST64
") must be a multiple of the lesser of "
"VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT::storageTexelBufferOffsetAlignmentBytes (%" PRIuLEAST64
@@ -4262,7 +4529,8 @@
if (SafeModulo(pCreateInfo->offset, alignmentRequirement) != 0) {
skip |= LogError(
buffer_state->buffer, "VUID-VkBufferViewCreateInfo-buffer-02751",
- "If buffer was created with usage containing VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, "
+ "vkCreateBufferView(): If buffer was created with usage containing "
+ "VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, "
"VkBufferViewCreateInfo offset (%" PRIuLEAST64
") must be a multiple of the lesser of "
"VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT::uniformTexelBufferOffsetAlignmentBytes (%" PRIuLEAST64
@@ -4288,8 +4556,10 @@
bool CoreChecks::ValidateImageAspectMask(VkImage image, VkFormat format, VkImageAspectFlags aspect_mask, const char *func_name,
const char *vuid) const {
bool skip = false;
-
- if (FormatIsColor(format)) {
+ const IMAGE_STATE *image_state = GetImageState(image);
+ // checks color format and (single-plane or non-disjoint)
+ // if ycbcr extension is not supported then single-plane and non-disjoint are always both true
+ if ((FormatIsColor(format)) && ((FormatIsMultiplane(format) == false) || (image_state->disjoint == false))) {
if ((aspect_mask & VK_IMAGE_ASPECT_COLOR_BIT) != VK_IMAGE_ASPECT_COLOR_BIT) {
skip |= LogError(image, vuid, "%s: Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.", func_name);
} else if ((aspect_mask & VK_IMAGE_ASPECT_COLOR_BIT) != aspect_mask) {
@@ -4354,7 +4624,8 @@
if (subresourceRange.levelCount != VK_REMAINING_MIP_LEVELS) {
if (subresourceRange.levelCount == 0) {
- skip |= LogError(image, errorCodes.mip_count_err, "%s: %s.levelCount is 0.", cmd_name, param_name);
+ skip |=
+ LogError(image, "VUID-VkImageSubresourceRange-levelCount-01720", "%s: %s.levelCount is 0.", cmd_name, param_name);
} else {
const uint64_t necessary_mip_count = uint64_t{subresourceRange.baseMipLevel} + uint64_t{subresourceRange.levelCount};
@@ -4378,7 +4649,8 @@
if (subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS) {
if (subresourceRange.layerCount == 0) {
- skip |= LogError(image, errorCodes.layer_count_err, "%s: %s.layerCount is 0.", cmd_name, param_name);
+ skip |=
+ LogError(image, "VUID-VkImageSubresourceRange-layerCount-01721", "%s: %s.layerCount is 0.", cmd_name, param_name);
} else {
const uint64_t necessary_layer_count =
uint64_t{subresourceRange.baseArrayLayer} + uint64_t{subresourceRange.layerCount};
@@ -4463,6 +4735,79 @@
cmd_name, param_name, "arrayLayers", image_state->image, subresourceRangeErrorCodes);
}
+bool CoreChecks::ValidateImageViewFormatFeatures(const IMAGE_STATE *image_state, const VkFormat view_format,
+ const VkImageUsageFlags image_usage) const {
+ // Pass in image_usage here instead of extracting it from image_state in case there's a chained VkImageViewUsageCreateInfo
+ bool skip = false;
+
+ VkFormatFeatureFlags tiling_features = VK_FORMAT_FEATURE_FLAG_BITS_MAX_ENUM;
+ const VkImageTiling image_tiling = image_state->createInfo.tiling;
+
+ if (image_state->has_ahb_format == true) {
+ // AHB image view and image share same feature sets
+ tiling_features = image_state->format_features;
+ } else if (image_tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
+ // Parameter validation should catch if this is used without VK_EXT_image_drm_format_modifier
+ assert(device_extensions.vk_ext_image_drm_format_modifier);
+ VkImageDrmFormatModifierPropertiesEXT drm_format_properties = {VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT,
+ nullptr};
+ DispatchGetImageDrmFormatModifierPropertiesEXT(device, image_state->image, &drm_format_properties);
+
+ VkFormatProperties2 format_properties_2 = {VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2, nullptr};
+ VkDrmFormatModifierPropertiesListEXT drm_properties_list = {VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT,
+ nullptr};
+ format_properties_2.pNext = (void *)&drm_properties_list;
+ DispatchGetPhysicalDeviceFormatProperties2(physical_device, view_format, &format_properties_2);
+
+ for (uint32_t i = 0; i < drm_properties_list.drmFormatModifierCount; i++) {
+ if ((drm_properties_list.pDrmFormatModifierProperties[i].drmFormatModifier & drm_format_properties.drmFormatModifier) !=
+ 0) {
+ tiling_features |= drm_properties_list.pDrmFormatModifierProperties[i].drmFormatModifierTilingFeatures;
+ }
+ }
+ } else {
+ VkFormatProperties format_properties = GetPDFormatProperties(view_format);
+ tiling_features = (image_tiling == VK_IMAGE_TILING_LINEAR) ? format_properties.linearTilingFeatures
+ : format_properties.optimalTilingFeatures;
+ }
+
+ if (tiling_features == 0) {
+ skip |= LogError(image_state->image, "VUID-VkImageViewCreateInfo-None-02273",
+ "vkCreateImageView(): pCreateInfo->format %s with tiling %s has no supported format features on this "
+ "physical device.",
+ string_VkFormat(view_format), string_VkImageTiling(image_tiling));
+ } else if ((image_usage & VK_IMAGE_USAGE_SAMPLED_BIT) && !(tiling_features & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
+ skip |= LogError(image_state->image, "VUID-VkImageViewCreateInfo-usage-02274",
+ "vkCreateImageView(): pCreateInfo->format %s with tiling %s does not support usage that includes "
+ "VK_IMAGE_USAGE_SAMPLED_BIT.",
+ string_VkFormat(view_format), string_VkImageTiling(image_tiling));
+ } else if ((image_usage & VK_IMAGE_USAGE_STORAGE_BIT) && !(tiling_features & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT)) {
+ skip |= LogError(image_state->image, "VUID-VkImageViewCreateInfo-usage-02275",
+ "vkCreateImageView(): pCreateInfo->format %s with tiling %s does not support usage that includes "
+ "VK_IMAGE_USAGE_STORAGE_BIT.",
+ string_VkFormat(view_format), string_VkImageTiling(image_tiling));
+ } else if ((image_usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) && !(tiling_features & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT)) {
+ skip |= LogError(image_state->image, "VUID-VkImageViewCreateInfo-usage-02276",
+ "vkCreateImageView(): pCreateInfo->format %s with tiling %s does not support usage that includes "
+ "VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT.",
+ string_VkFormat(view_format), string_VkImageTiling(image_tiling));
+ } else if ((image_usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) &&
+ !(tiling_features & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
+ skip |= LogError(image_state->image, "VUID-VkImageViewCreateInfo-usage-02277",
+ "vkCreateImageView(): pCreateInfo->format %s with tiling %s does not support usage that includes "
+ "VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT.",
+ string_VkFormat(view_format), string_VkImageTiling(image_tiling));
+ } else if ((image_usage & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) &&
+ !(tiling_features & (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT))) {
+ skip |= LogError(image_state->image, "VUID-VkImageViewCreateInfo-usage-02652",
+ "vkCreateImageView(): pCreateInfo->format %s with tiling %s does not support usage that includes "
+ "VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT or VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT.",
+ string_VkFormat(view_format), string_VkImageTiling(image_tiling));
+ }
+
+ return skip;
+}
+
bool CoreChecks::PreCallValidateCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
const VkAllocationCallbacks *pAllocator, VkImageView *pView) const {
bool skip = false;
@@ -4486,7 +4831,6 @@
VkImageCreateFlags image_flags = image_state->createInfo.flags;
VkFormat image_format = image_state->createInfo.format;
VkImageUsageFlags image_usage = image_state->createInfo.usage;
- VkImageTiling image_tiling = image_state->createInfo.tiling;
VkFormat view_format = pCreateInfo->format;
VkImageAspectFlags aspect_mask = pCreateInfo->subresourceRange.aspectMask;
VkImageType image_type = image_state->createInfo.imageType;
@@ -4594,13 +4938,6 @@
}
}
- // Validate feature set if using CUBE_ARRAY
- if ((view_type == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) && (enabled_features.core.imageCubeArray == false)) {
- skip |= LogError(pCreateInfo->image, "VUID-VkImageViewCreateInfo-viewType-01004",
- "vkCreateImageView(): pCreateInfo->viewType can't be VK_IMAGE_VIEW_TYPE_CUBE_ARRAY without "
- "enabling the imageCubeArray feature.");
- }
-
// Validate correct image aspect bits for desired formats and format consistency
skip |= ValidateImageAspectMask(image_state->image, image_format, aspect_mask, "vkCreateImageView()");
@@ -4667,44 +5004,7 @@
skip |= ValidateCreateImageViewANDROID(pCreateInfo);
}
- VkFormatProperties format_properties = GetPDFormatProperties(view_format);
- VkFormatFeatureFlags tiling_features = (image_tiling & VK_IMAGE_TILING_LINEAR) ? format_properties.linearTilingFeatures
- : format_properties.optimalTilingFeatures;
-
- if (tiling_features == 0) {
- skip |= LogError(pCreateInfo->image, "VUID-VkImageViewCreateInfo-None-02273",
- "vkCreateImageView(): pCreateInfo->format %s with tiling %s has no supported format features on this "
- "physical device.",
- string_VkFormat(view_format), string_VkImageTiling(image_tiling));
- } else if ((image_usage & VK_IMAGE_USAGE_SAMPLED_BIT) && !(tiling_features & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
- skip |= LogError(pCreateInfo->image, "VUID-VkImageViewCreateInfo-usage-02274",
- "vkCreateImageView(): pCreateInfo->format %s with tiling %s does not support usage that includes "
- "VK_IMAGE_USAGE_SAMPLED_BIT.",
- string_VkFormat(view_format), string_VkImageTiling(image_tiling));
- } else if ((image_usage & VK_IMAGE_USAGE_STORAGE_BIT) && !(tiling_features & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT)) {
- skip |= LogError(pCreateInfo->image, "VUID-VkImageViewCreateInfo-usage-02275",
- "vkCreateImageView(): pCreateInfo->format %s with tiling %s does not support usage that includes "
- "VK_IMAGE_USAGE_STORAGE_BIT.",
- string_VkFormat(view_format), string_VkImageTiling(image_tiling));
- } else if ((image_usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) &&
- !(tiling_features & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT)) {
- skip |= LogError(pCreateInfo->image, "VUID-VkImageViewCreateInfo-usage-02276",
- "vkCreateImageView(): pCreateInfo->format %s with tiling %s does not support usage that includes "
- "VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT.",
- string_VkFormat(view_format), string_VkImageTiling(image_tiling));
- } else if ((image_usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) &&
- !(tiling_features & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
- skip |= LogError(pCreateInfo->image, "VUID-VkImageViewCreateInfo-usage-02277",
- "vkCreateImageView(): pCreateInfo->format %s with tiling %s does not support usage that includes "
- "VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT.",
- string_VkFormat(view_format), string_VkImageTiling(image_tiling));
- } else if ((image_usage & VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) &&
- !(tiling_features & (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT))) {
- skip |= LogError(pCreateInfo->image, "VUID-VkImageViewCreateInfo-usage-02652",
- "vkCreateImageView(): pCreateInfo->format %s with tiling %s does not support usage that includes "
- "VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT or VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT.",
- string_VkFormat(view_format), string_VkImageTiling(image_tiling));
- }
+ skip |= ValidateImageViewFormatFeatures(image_state, view_format, image_usage);
if (image_usage & VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV) {
if (view_type != VK_IMAGE_VIEW_TYPE_2D && view_type != VK_IMAGE_VIEW_TYPE_2D_ARRAY) {
@@ -4719,6 +5019,85 @@
"VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV, format must be VK_FORMAT_R8_UINT.");
}
}
+
+ if (pCreateInfo->subresourceRange.layerCount == VK_REMAINING_ARRAY_LAYERS) {
+ if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE &&
+ image_state->createInfo.arrayLayers - pCreateInfo->subresourceRange.baseArrayLayer != 6) {
+ skip |= LogError(device, "VUID-VkImageViewCreateInfo-viewType-02962",
+ "vkCreateImageView(): subresourceRange.layerCount VK_REMAINING_ARRAY_LAYERS=(%d) must be 6",
+ image_state->createInfo.arrayLayers - pCreateInfo->subresourceRange.baseArrayLayer);
+ }
+ if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY &&
+ ((image_state->createInfo.arrayLayers - pCreateInfo->subresourceRange.baseArrayLayer) % 6) != 0) {
+ skip |= LogError(
+ device, "VUID-VkImageViewCreateInfo-viewType-02963",
+ "vkCreateImageView(): subresourceRange.layerCount VK_REMAINING_ARRAY_LAYERS=(%d) must be a multiple of 6",
+ image_state->createInfo.arrayLayers - pCreateInfo->subresourceRange.baseArrayLayer);
+ }
+ }
+
+ if (image_usage & VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT) {
+ if (pCreateInfo->subresourceRange.levelCount != 1) {
+ skip |= LogError(pCreateInfo->image, "VUID-VkImageViewCreateInfo-image-02571",
+ "vkCreateImageView(): If image was created with usage containing "
+ "VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT, subresourceRange.levelCount (%d) must: be 1",
+ pCreateInfo->subresourceRange.levelCount);
+ }
+ }
+ if (pCreateInfo->flags & VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT) {
+ if (!enabled_features.fragment_density_map_features.fragmentDensityMapDynamic) {
+ skip |= LogError(pCreateInfo->image, "VUID-VkImageViewCreateInfo-flags-02572",
+ "vkCreateImageView(): If the fragmentDensityMapDynamic feature is not enabled, "
+ "flags must not contain VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT");
+ }
+ } else {
+ if (image_usage & VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT) {
+ if (image_flags & (VK_IMAGE_CREATE_PROTECTED_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT |
+ VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) {
+ skip |= LogError(pCreateInfo->image, "VUID-VkImageViewCreateInfo-flags-04116",
+ "vkCreateImageView(): If image was created with usage containing "
+ "VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT flags must not contain any of "
+ "VK_IMAGE_CREATE_PROTECTED_BIT, VK_IMAGE_CREATE_SPARSE_BINDING_BIT, "
+ "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT, or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT");
+ }
+ }
+ }
+
+ if (pCreateInfo->flags & VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT) {
+ if (!enabled_features.fragment_density_map2_features.fragmentDensityMapDeferred) {
+ skip |= LogError(pCreateInfo->image, "VUID-VkImageViewCreateInfo-flags-03567",
+ "vkCreateImageView(): If the fragmentDensityMapDeferred feature is not enabled, "
+ "flags must not contain VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT");
+ }
+ if (pCreateInfo->flags & VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT) {
+ skip |=
+ LogError(pCreateInfo->image, "VUID-VkImageViewCreateInfo-flags-03568",
+ "vkCreateImageView(): If flags contains VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT, "
+ "flags must not contain VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT");
+ }
+ }
+ if (device_extensions.vk_ext_fragment_density_map_2) {
+ if ((image_flags & VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT) && (image_usage & VK_IMAGE_USAGE_SAMPLED_BIT) &&
+ (pCreateInfo->subresourceRange.layerCount >
+ phys_dev_ext_props.fragment_density_map2_props.maxSubsampledArrayLayers)) {
+ skip |= LogError(pCreateInfo->image, "VUID-VkImageViewCreateInfo-image-03569",
+ "vkCreateImageView(): If image was created with flags containing "
+ "VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT and usage containing VK_IMAGE_USAGE_SAMPLED_BIT "
+ "subresourceRange.layerCount (%d) must: be less than or equal to maxSubsampledArrayLayers (%d)",
+ pCreateInfo->subresourceRange.layerCount,
+ phys_dev_ext_props.fragment_density_map2_props.maxSubsampledArrayLayers);
+ }
+ }
+
+ auto astc_decode_mode = lvl_find_in_chain<VkImageViewASTCDecodeModeEXT>(pCreateInfo->pNext);
+ if ((device_extensions.vk_ext_astc_decode_mode) && (astc_decode_mode != nullptr)) {
+ if ((enabled_features.astc_decode_features.decodeModeSharedExponent == VK_FALSE) &&
+ (astc_decode_mode->decodeMode == VK_FORMAT_E5B9G9R9_UFLOAT_PACK32)) {
+ skip |= LogError(device, "VUID-VkImageViewASTCDecodeModeEXT-decodeMode-02231",
+ "vkCreateImageView(): decodeModeSharedExponent is not enabled but "
+ "VkImageViewASTCDecodeModeEXT::decodeMode is VK_FORMAT_E5B9G9R9_UFLOAT_PACK32.");
+ }
+ }
}
return skip;
}
@@ -4896,8 +5275,11 @@
bool CoreChecks::ValidateBufferImageCopyData(uint32_t regionCount, const VkBufferImageCopy *pRegions,
const IMAGE_STATE *image_state, const char *function) const {
bool skip = false;
+ assert(image_state != nullptr);
+ const VkFormat image_format = image_state->createInfo.format;
for (uint32_t i = 0; i < regionCount; i++) {
+ const VkImageAspectFlags region_aspect_mask = pRegions[i].imageSubresource.aspectMask;
if (image_state->createInfo.imageType == VK_IMAGE_TYPE_1D) {
if ((pRegions[i].imageOffset.y != 0) || (pRegions[i].imageExtent.height != 1)) {
skip |=
@@ -4928,22 +5310,19 @@
// If the the calling command's VkImage parameter's format is not a depth/stencil format,
// then bufferOffset must be a multiple of the calling command's VkImage parameter's element size
- uint32_t element_size = FormatElementSize(image_state->createInfo.format, pRegions[i].imageSubresource.aspectMask);
+ uint32_t element_size = FormatElementSize(image_format, region_aspect_mask);
- if (!FormatIsDepthAndStencil(image_state->createInfo.format) && SafeModulo(pRegions[i].bufferOffset, element_size) != 0) {
- skip |= LogError(image_state->image, "VUID-VkBufferImageCopy-bufferOffset-00193",
+ // If not depth/stencil and not multi-plane
+ if ((!FormatIsDepthAndStencil(image_format) && !FormatIsMultiplane(image_format)) &&
+ SafeModulo(pRegions[i].bufferOffset, element_size) != 0) {
+ const char *vuid = (device_extensions.vk_khr_sampler_ycbcr_conversion) ? "VUID-VkBufferImageCopy-bufferOffset-01558"
+ : "VUID-VkBufferImageCopy-bufferOffset-00193";
+ skip |= LogError(image_state->image, vuid,
"%s(): pRegion[%d] bufferOffset 0x%" PRIxLEAST64
" must be a multiple of this format's texel size (%" PRIu32 ").",
function, i, pRegions[i].bufferOffset, element_size);
}
- // BufferOffset must be a multiple of 4
- if (SafeModulo(pRegions[i].bufferOffset, 4) != 0) {
- skip |= LogError(image_state->image, "VUID-VkBufferImageCopy-bufferOffset-00194",
- "%s(): pRegion[%d] bufferOffset 0x%" PRIxLEAST64 " must be a multiple of 4.", function, i,
- pRegions[i].bufferOffset);
- }
-
// BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
if ((pRegions[i].bufferRowLength != 0) && (pRegions[i].bufferRowLength < pRegions[i].imageExtent.width)) {
skip |=
@@ -4997,36 +5376,42 @@
// subresource aspectMask must have exactly 1 bit set
const int num_bits = sizeof(VkFlags) * CHAR_BIT;
- std::bitset<num_bits> aspect_mask_bits(pRegions[i].imageSubresource.aspectMask);
+ std::bitset<num_bits> aspect_mask_bits(region_aspect_mask);
if (aspect_mask_bits.count() != 1) {
skip |= LogError(image_state->image, "VUID-VkBufferImageCopy-aspectMask-00212",
- "%s: aspectMasks for imageSubresource in each region must have only a single bit set.", function);
+ "%s(): aspectMasks for imageSubresource in pRegion[%d] must have only a single bit set.", function, i);
}
// image subresource aspect bit must match format
- if (!VerifyAspectsPresent(pRegions[i].imageSubresource.aspectMask, image_state->createInfo.format)) {
+ if (!VerifyAspectsPresent(region_aspect_mask, image_format)) {
skip |= LogError(
image_state->image, "VUID-VkBufferImageCopy-aspectMask-00211",
"%s(): pRegion[%d] subresource aspectMask 0x%x specifies aspects that are not present in image format 0x%x.",
- function, i, pRegions[i].imageSubresource.aspectMask, image_state->createInfo.format);
+ function, i, region_aspect_mask, image_format);
}
// Checks that apply only to compressed images
- if (FormatIsCompressed(image_state->createInfo.format) || FormatIsSinglePlane_422(image_state->createInfo.format)) {
- auto block_size = FormatTexelBlockExtent(image_state->createInfo.format);
+ if (FormatIsCompressed(image_format) || FormatIsSinglePlane_422(image_format)) {
+ auto block_size = FormatTexelBlockExtent(image_format);
// BufferRowLength must be a multiple of block width
if (SafeModulo(pRegions[i].bufferRowLength, block_size.width) != 0) {
+ const char *vuid = (device_extensions.vk_khr_sampler_ycbcr_conversion)
+ ? "VUID-VkBufferImageCopy-None-01735"
+ : "VUID-VkBufferImageCopy-bufferRowLength-00203";
skip |= LogError(
- image_state->image, "VUID-VkBufferImageCopy-bufferRowLength-00203",
+ image_state->image, vuid,
"%s(): pRegion[%d] bufferRowLength (%d) must be a multiple of the compressed image's texel width (%d)..",
function, i, pRegions[i].bufferRowLength, block_size.width);
}
// BufferRowHeight must be a multiple of block height
if (SafeModulo(pRegions[i].bufferImageHeight, block_size.height) != 0) {
+ const char *vuid = (device_extensions.vk_khr_sampler_ycbcr_conversion)
+ ? "VUID-VkBufferImageCopy-None-01736"
+ : "VUID-VkBufferImageCopy-bufferImageHeight-00204";
skip |= LogError(
- image_state->image, "VUID-VkBufferImageCopy-bufferImageHeight-00204",
+ image_state->image, vuid,
"%s(): pRegion[%d] bufferImageHeight (%d) must be a multiple of the compressed image's texel height (%d)..",
function, i, pRegions[i].bufferImageHeight, block_size.height);
}
@@ -5035,7 +5420,9 @@
if ((SafeModulo(pRegions[i].imageOffset.x, block_size.width) != 0) ||
(SafeModulo(pRegions[i].imageOffset.y, block_size.height) != 0) ||
(SafeModulo(pRegions[i].imageOffset.z, block_size.depth) != 0)) {
- skip |= LogError(image_state->image, "VUID-VkBufferImageCopy-imageOffset-00205",
+ const char *vuid = (device_extensions.vk_khr_sampler_ycbcr_conversion) ? "VUID-VkBufferImageCopy-None-01737"
+ : "VUID-VkBufferImageCopy-imageOffset-00205";
+ skip |= LogError(image_state->image, vuid,
"%s(): pRegion[%d] imageOffset(x,y) (%d, %d) must be multiples of the compressed image's texel "
"width & height (%d, %d)..",
function, i, pRegions[i].imageOffset.x, pRegions[i].imageOffset.y, block_size.width,
@@ -5043,9 +5430,12 @@
}
// bufferOffset must be a multiple of block size (linear bytes)
- uint32_t block_size_in_bytes = FormatElementSize(image_state->createInfo.format);
+ uint32_t block_size_in_bytes = FormatElementSize(image_format);
if (SafeModulo(pRegions[i].bufferOffset, block_size_in_bytes) != 0) {
- skip |= LogError(image_state->image, "VUID-VkBufferImageCopy-bufferOffset-00206",
+ const char *vuid = (device_extensions.vk_khr_sampler_ycbcr_conversion)
+ ? "VUID-VkBufferImageCopy-None-01738"
+ : "VUID-VkBufferImageCopy-bufferOffset-00206";
+ skip |= LogError(image_state->image, vuid,
"%s(): pRegion[%d] bufferOffset (0x%" PRIxLEAST64
") must be a multiple of the compressed image's texel block size (%" PRIu32 ")..",
function, i, pRegions[i].bufferOffset, block_size_in_bytes);
@@ -5055,7 +5445,9 @@
VkExtent3D mip_extent = GetImageSubresourceExtent(image_state, &(pRegions[i].imageSubresource));
if ((SafeModulo(pRegions[i].imageExtent.width, block_size.width) != 0) &&
(pRegions[i].imageExtent.width + pRegions[i].imageOffset.x != mip_extent.width)) {
- skip |= LogError(image_state->image, "VUID-VkBufferImageCopy-imageExtent-00207",
+ const char *vuid = (device_extensions.vk_khr_sampler_ycbcr_conversion) ? "VUID-VkBufferImageCopy-None-01739"
+ : "VUID-VkBufferImageCopy-imageExtent-00207";
+ skip |= LogError(image_state->image, vuid,
"%s(): pRegion[%d] extent width (%d) must be a multiple of the compressed texture block width "
"(%d), or when added to offset.x (%d) must equal the image subresource width (%d)..",
function, i, pRegions[i].imageExtent.width, block_size.width, pRegions[i].imageOffset.x,
@@ -5065,7 +5457,9 @@
// imageExtent height must be a multiple of block height, or extent+offset height must equal subresource height
if ((SafeModulo(pRegions[i].imageExtent.height, block_size.height) != 0) &&
(pRegions[i].imageExtent.height + pRegions[i].imageOffset.y != mip_extent.height)) {
- skip |= LogError(image_state->image, "VUID-VkBufferImageCopy-imageExtent-00208",
+ const char *vuid = (device_extensions.vk_khr_sampler_ycbcr_conversion) ? "VUID-VkBufferImageCopy-None-01740"
+ : "VUID-VkBufferImageCopy-imageExtent-00208";
+ skip |= LogError(image_state->image, vuid,
"%s(): pRegion[%d] extent height (%d) must be a multiple of the compressed texture block height "
"(%d), or when added to offset.y (%d) must equal the image subresource height (%d)..",
function, i, pRegions[i].imageExtent.height, block_size.height, pRegions[i].imageOffset.y,
@@ -5075,7 +5469,9 @@
// imageExtent depth must be a multiple of block depth, or extent+offset depth must equal subresource depth
if ((SafeModulo(pRegions[i].imageExtent.depth, block_size.depth) != 0) &&
(pRegions[i].imageExtent.depth + pRegions[i].imageOffset.z != mip_extent.depth)) {
- skip |= LogError(image_state->image, "VUID-VkBufferImageCopy-imageExtent-00209",
+ const char *vuid = (device_extensions.vk_khr_sampler_ycbcr_conversion) ? "VUID-VkBufferImageCopy-None-01741"
+ : "VUID-VkBufferImageCopy-imageExtent-00209";
+ skip |= LogError(image_state->image, vuid,
"%s(): pRegion[%d] extent width (%d) must be a multiple of the compressed texture block depth "
"(%d), or when added to offset.z (%d) must equal the image subresource depth (%d)..",
function, i, pRegions[i].imageExtent.depth, block_size.depth, pRegions[i].imageOffset.z,
@@ -5084,10 +5480,9 @@
}
// Checks that apply only to multi-planar format images
- if (FormatIsMultiplane(image_state->createInfo.format)) {
+ if (FormatIsMultiplane(image_format)) {
// VK_IMAGE_ASPECT_PLANE_2_BIT valid only for image formats with three planes
- if ((FormatPlaneCount(image_state->createInfo.format) < 3) &&
- (pRegions[i].imageSubresource.aspectMask == VK_IMAGE_ASPECT_PLANE_2_BIT)) {
+ if ((FormatPlaneCount(image_format) < 3) && (region_aspect_mask == VK_IMAGE_ASPECT_PLANE_2_BIT)) {
skip |= LogError(image_state->image, "VUID-VkBufferImageCopy-aspectMask-01560",
"%s(): pRegion[%d] subresource aspectMask cannot be VK_IMAGE_ASPECT_PLANE_2_BIT unless image "
"format has three planes.",
@@ -5095,12 +5490,24 @@
}
// image subresource aspectMask must be VK_IMAGE_ASPECT_PLANE_*_BIT
- if (0 == (pRegions[i].imageSubresource.aspectMask &
- (VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT | VK_IMAGE_ASPECT_PLANE_2_BIT))) {
+ if (0 ==
+ (region_aspect_mask & (VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT | VK_IMAGE_ASPECT_PLANE_2_BIT))) {
skip |= LogError(image_state->image, "VUID-VkBufferImageCopy-aspectMask-01560",
"%s(): pRegion[%d] subresource aspectMask for multi-plane image formats must have a "
"VK_IMAGE_ASPECT_PLANE_*_BIT when copying to or from.",
function, i);
+ } else {
+ // Know aspect mask is valid
+ const VkFormat compatible_format = FindMultiplaneCompatibleFormat(image_format, region_aspect_mask);
+ const uint32_t compatible_size = FormatElementSize(compatible_format);
+ if (SafeModulo(pRegions[i].bufferOffset, compatible_size) != 0) {
+ skip |= LogError(
+ image_state->image, "VUID-VkBufferImageCopy-bufferOffset-01559",
+ "%s(): pRegion[%d]->bufferOffset is 0x%" PRIxLEAST64
+ " but must be a multiple of the multi-plane compatible format's texel size (%u) for plane %u (%s).",
+ function, i, pRegions[i].bufferOffset, element_size, GetPlaneIndex(region_aspect_mask),
+ string_VkFormat(compatible_format));
+ }
}
}
}
@@ -5155,39 +5562,11 @@
VkDeviceSize buffer_size = buff_state->createInfo.size;
for (uint32_t i = 0; i < regionCount; i++) {
- VkExtent3D copy_extent = pRegions[i].imageExtent;
-
- VkDeviceSize buffer_width = (0 == pRegions[i].bufferRowLength ? copy_extent.width : pRegions[i].bufferRowLength);
- VkDeviceSize buffer_height = (0 == pRegions[i].bufferImageHeight ? copy_extent.height : pRegions[i].bufferImageHeight);
- VkDeviceSize unit_size = FormatElementSize(image_state->createInfo.format,
- pRegions[i].imageSubresource.aspectMask); // size (bytes) of texel or block
-
- if (FormatIsCompressed(image_state->createInfo.format) || FormatIsSinglePlane_422(image_state->createInfo.format)) {
- // Switch to texel block units, rounding up for any partially-used blocks
- auto block_dim = FormatTexelBlockExtent(image_state->createInfo.format);
- buffer_width = (buffer_width + block_dim.width - 1) / block_dim.width;
- buffer_height = (buffer_height + block_dim.height - 1) / block_dim.height;
-
- copy_extent.width = (copy_extent.width + block_dim.width - 1) / block_dim.width;
- copy_extent.height = (copy_extent.height + block_dim.height - 1) / block_dim.height;
- copy_extent.depth = (copy_extent.depth + block_dim.depth - 1) / block_dim.depth;
- }
-
- // Either depth or layerCount may be greater than 1 (not both). This is the number of 'slices' to copy
- uint32_t z_copies = std::max(copy_extent.depth, pRegions[i].imageSubresource.layerCount);
- if (IsExtentSizeZero(©_extent) || (0 == z_copies)) {
- // TODO: Issue warning here? Already warned in ValidateImageBounds()...
- } else {
- // Calculate buffer offset of final copied byte, + 1.
- VkDeviceSize max_buffer_offset = (z_copies - 1) * buffer_height * buffer_width; // offset to slice
- max_buffer_offset += ((copy_extent.height - 1) * buffer_width) + copy_extent.width; // add row,col
- max_buffer_offset *= unit_size; // convert to bytes
- max_buffer_offset += pRegions[i].bufferOffset; // add initial offset (bytes)
-
- if (buffer_size < max_buffer_offset) {
- skip |= LogError(device, msg_code, "%s: pRegion[%d] exceeds buffer size of %" PRIu64 " bytes..", func_name, i,
- buffer_size);
- }
+ VkDeviceSize max_buffer_offset =
+ GetBufferSizeFromCopyImage(pRegions[i], image_state->createInfo.format) + pRegions[i].bufferOffset;
+ if (buffer_size < max_buffer_offset) {
+ skip |=
+ LogError(device, msg_code, "%s: pRegion[%d] exceeds buffer size of %" PRIu64 " bytes..", func_name, i, buffer_size);
}
}
@@ -5235,9 +5614,16 @@
skip |= ValidateBufferUsageFlags(dst_buffer_state, VK_BUFFER_USAGE_TRANSFER_DST_BIT, true,
"VUID-vkCmdCopyImageToBuffer-dstBuffer-00191", "vkCmdCopyImageToBuffer()",
"VK_BUFFER_USAGE_TRANSFER_DST_BIT");
+
+ // Validation for VK_EXT_fragment_density_map
+ if (src_image_state->createInfo.flags & VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT) {
+ skip |= LogError(cb_node->commandBuffer, "vkCmdCopyImageToBuffer-srcImage-02544",
+ "vkCmdCopyBufferToImage(): srcImage must not have been created with flags containing "
+ "VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT");
+ }
+
if (device_extensions.vk_khr_maintenance1) {
skip |= ValidateImageFormatFeatureFlags(src_image_state, VK_FORMAT_FEATURE_TRANSFER_SRC_BIT, "vkCmdCopyImageToBuffer()",
- "VUID-vkCmdCopyImageToBuffer-srcImage-01998",
"VUID-vkCmdCopyImageToBuffer-srcImage-01998");
}
skip |= InsideRenderPass(cb_node, "vkCmdCopyImageToBuffer()", "VUID-vkCmdCopyImageToBuffer-renderpass");
@@ -5311,9 +5697,16 @@
skip |= ValidateImageUsageFlags(dst_image_state, VK_IMAGE_USAGE_TRANSFER_DST_BIT, true,
"VUID-vkCmdCopyBufferToImage-dstImage-00177", "vkCmdCopyBufferToImage()",
"VK_IMAGE_USAGE_TRANSFER_DST_BIT");
+
+ // Validation for VK_EXT_fragment_density_map
+ if (dst_image_state->createInfo.flags & VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT) {
+ skip |= LogError(cb_node->commandBuffer, "vkCmdCopyBufferToImage-dstImage-02543",
+ "vkCmdCopyBufferToImage(): dstImage must not have been created with flags containing "
+ "VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT");
+ }
+
if (device_extensions.vk_khr_maintenance1) {
skip |= ValidateImageFormatFeatureFlags(dst_image_state, VK_FORMAT_FEATURE_TRANSFER_DST_BIT, "vkCmdCopyBufferToImage()",
- "VUID-vkCmdCopyBufferToImage-dstImage-01997",
"VUID-vkCmdCopyBufferToImage-dstImage-01997");
}
skip |= InsideRenderPass(cb_node, "vkCmdCopyBufferToImage()", "VUID-vkCmdCopyBufferToImage-renderpass");
diff --git a/layers/command_counter.h b/layers/command_counter.h
index 31eb365..5f63964 100644
--- a/layers/command_counter.h
+++ b/layers/command_counter.h
@@ -20,7 +20,7 @@
class CommandCounter : public ValidationObject {
public:
- CommandCounter(CoreChecks *coreChecks) : coreChecks(coreChecks) {}
+ CommandCounter(CoreChecks *coreChecks) : coreChecks(coreChecks) { container_type = LayerObjectTypeCommandCounter; }
virtual ~CommandCounter() {}
virtual write_lock_guard_t write_lock() { return coreChecks->write_lock(); }
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index 2f6dfb9..d986a40 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -33,6 +33,7 @@
* Author: Tony Barbour <tony@LunarG.com>
* Author: John Zulauf <jzulauf@lunarg.com>
* Author: Shannon McPherson <shannon@lunarg.com>
+ * Author: Jeremy Kniager <jeremyk@lunarg.com>
*/
#include <algorithm>
@@ -61,9 +62,7 @@
#include "buffer_validation.h"
#include "shader_validation.h"
#include "vk_layer_utils.h"
-
-// Array of command names indexed by CMD_TYPE enum
-static const std::array<const char *, CMD_RANGE_SIZE> command_name_list = {{VUID_CMD_NAME_LIST}};
+#include "command_counter.h"
static VkImageLayout NormalizeImageLayout(VkImageLayout layout, VkImageLayout non_normal, VkImageLayout normal) {
return (layout == non_normal) ? normal : layout;
@@ -154,14 +153,6 @@
return qfo_release_buffer_barrier_map;
}
-std::string FormatDebugLabel(const char *prefix, const LoggingLabel &label) {
- if (label.Empty()) return std::string();
- std::string out;
- string_sprintf(&out, "%sVkDebugUtilsLabel(name='%s' color=[%g, %g %g, %g])", prefix, label.name.c_str(), label.color[0],
- label.color[1], label.color[2], label.color[3]);
- return out;
-}
-
static std::unique_ptr<ImageSubresourceLayoutMap> LayoutMapFactory(const IMAGE_STATE &image_state) {
std::unique_ptr<ImageSubresourceLayoutMap> map(new ImageSubresourceLayoutMap(image_state));
return map;
@@ -192,12 +183,23 @@
void AddInitialLayoutintoImageLayoutMap(const IMAGE_STATE &image_state, GlobalImageLayoutMap &image_layout_map) {
auto *range_map = GetLayoutRangeMap(&image_layout_map, image_state);
- auto range_gen = subresource_adapter::RangeGenerator(image_state.range_encoder, image_state.full_range);
+ auto range_gen = subresource_adapter::RangeGenerator(image_state.subresource_encoder, image_state.full_range);
for (; range_gen->non_empty(); ++range_gen) {
range_map->insert(range_map->end(), std::make_pair(*range_gen, image_state.createInfo.initialLayout));
}
}
+// Override base class, we have some extra work to do here
+void CoreChecks::InitDeviceValidationObject(bool add_obj, ValidationObject *inst_obj, ValidationObject *dev_obj) {
+ if (add_obj) {
+ if (dev_obj->device_extensions.vk_khr_performance_query) {
+ auto command_counter = new CommandCounter(this);
+ dev_obj->object_dispatch.emplace_back(command_counter);
+ }
+ ValidationStateTracker::InitDeviceValidationObject(add_obj, inst_obj, dev_obj);
+ }
+}
+
// Tracks the number of commands recorded in a command buffer.
void CoreChecks::IncrementCommandCount(VkCommandBuffer commandBuffer) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
@@ -212,14 +214,14 @@
bool result = false;
auto type_name = object_string[typed_handle.type];
if (!mem_state) {
- result =
+ result |=
LogError(object, error_code, "%s: %s used with no memory bound. Memory should be bound by calling vkBind%sMemory().",
api_name, report_data->FormatHandle(typed_handle).c_str(), type_name + 2);
} else if (mem_state->destroyed) {
- result = LogError(object, error_code,
- "%s: %s used with no memory bound and previously bound memory was freed. Memory must not be freed "
- "prior to this operation.",
- api_name, report_data->FormatHandle(typed_handle).c_str());
+ result |= LogError(object, error_code,
+ "%s: %s used with no memory bound and previously bound memory was freed. Memory must not be freed "
+ "prior to this operation.",
+ api_name, report_data->FormatHandle(typed_handle).c_str());
}
return result;
}
@@ -231,25 +233,29 @@
if (image_state->bind_swapchain == VK_NULL_HANDLE) {
LogObjectList objlist(image_state->image);
objlist.add(image_state->create_from_swapchain);
- LogError(objlist, error_code,
- "%s: %s is created by %s, and the image should be bound by calling vkBindImageMemory2(), and the pNext chain "
- "includes VkBindImageMemorySwapchainInfoKHR.",
- api_name, report_data->FormatHandle(image_state->image).c_str(),
- report_data->FormatHandle(image_state->create_from_swapchain).c_str());
+ result |= LogError(
+ objlist, error_code,
+ "%s: %s is created by %s, and the image should be bound by calling vkBindImageMemory2(), and the pNext chain "
+ "includes VkBindImageMemorySwapchainInfoKHR.",
+ api_name, report_data->FormatHandle(image_state->image).c_str(),
+ report_data->FormatHandle(image_state->create_from_swapchain).c_str());
} else if (image_state->create_from_swapchain != image_state->bind_swapchain) {
LogObjectList objlist(image_state->image);
objlist.add(image_state->create_from_swapchain);
objlist.add(image_state->bind_swapchain);
- LogError(objlist, error_code,
- "%s: %s is created by %s, but the image is bound by %s. The image should be created and bound by the same "
- "swapchain",
- api_name, report_data->FormatHandle(image_state->image).c_str(),
- report_data->FormatHandle(image_state->create_from_swapchain).c_str(),
- report_data->FormatHandle(image_state->bind_swapchain).c_str());
+ result |=
+ LogError(objlist, error_code,
+ "%s: %s is created by %s, but the image is bound by %s. The image should be created and bound by the same "
+ "swapchain",
+ api_name, report_data->FormatHandle(image_state->image).c_str(),
+ report_data->FormatHandle(image_state->create_from_swapchain).c_str(),
+ report_data->FormatHandle(image_state->bind_swapchain).c_str());
}
+ } else if (image_state->external_ahb) {
+ // TODO look into how to properly check for a valid bound memory for an external AHB
} else if (0 == (static_cast<uint32_t>(image_state->createInfo.flags) & VK_IMAGE_CREATE_SPARSE_BINDING_BIT)) {
- result = VerifyBoundMemoryIsValid(image_state->binding.mem_state.get(), image_state->image,
- VulkanTypedHandle(image_state->image, kVulkanObjectTypeImage), api_name, error_code);
+ result |= VerifyBoundMemoryIsValid(image_state->binding.mem_state.get(), image_state->image,
+ VulkanTypedHandle(image_state->image, kVulkanObjectTypeImage), api_name, error_code);
}
return result;
}
@@ -259,8 +265,8 @@
const char *error_code) const {
bool result = false;
if (0 == (static_cast<uint32_t>(buffer_state->createInfo.flags) & VK_BUFFER_CREATE_SPARSE_BINDING_BIT)) {
- result = VerifyBoundMemoryIsValid(buffer_state->binding.mem_state.get(), buffer_state->buffer,
- VulkanTypedHandle(buffer_state->buffer, kVulkanObjectTypeBuffer), api_name, error_code);
+ result |= VerifyBoundMemoryIsValid(buffer_state->binding.mem_state.get(), buffer_state->buffer,
+ VulkanTypedHandle(buffer_state->buffer, kVulkanObjectTypeBuffer), api_name, error_code);
}
return result;
}
@@ -287,14 +293,27 @@
const BINDABLE *mem_binding = ValidationStateTracker::GetObjectMemBinding(typed_handle);
assert(mem_binding);
if (mem_binding->sparse) {
- const char *error_code = "VUID-vkBindImageMemory-image-01045";
- const char *handle_type = "IMAGE";
+ const char *error_code = nullptr;
+ const char *handle_type = nullptr;
if (typed_handle.type == kVulkanObjectTypeBuffer) {
- error_code = "VUID-vkBindBufferMemory-buffer-01030";
handle_type = "BUFFER";
+ if (strcmp(apiName, "vkBindBufferMemory()") == 0) {
+ error_code = "VUID-vkBindBufferMemory-buffer-01030";
+ } else {
+ error_code = "VUID-VkBindBufferMemoryInfo-buffer-01594";
+ }
+ } else if (typed_handle.type == kVulkanObjectTypeImage) {
+ handle_type = "IMAGE";
+ if (strcmp(apiName, "vkBindImageMemory()") == 0) {
+ error_code = "VUID-vkBindImageMemory-image-01045";
+ } else {
+ error_code = "VUID-VkBindImageMemoryInfo-image-01610";
+ }
} else {
- assert(typed_handle.type == kVulkanObjectTypeImage);
+ // Unsupported object type
+ assert(false);
}
+
LogObjectList objlist(mem);
objlist.add(typed_handle);
skip |= LogError(objlist, error_code,
@@ -308,12 +327,24 @@
const DEVICE_MEMORY_STATE *prev_binding = mem_binding->binding.mem_state.get();
if (prev_binding) {
if (!prev_binding->destroyed) {
- const char *error_code = "VUID-vkBindImageMemory-image-01044";
+ const char *error_code = nullptr;
if (typed_handle.type == kVulkanObjectTypeBuffer) {
- error_code = "VUID-vkBindBufferMemory-buffer-01029";
+ if (strcmp(apiName, "vkBindBufferMemory()") == 0) {
+ error_code = "VUID-vkBindBufferMemory-buffer-01029";
+ } else {
+ error_code = "VUID-VkBindBufferMemoryInfo-buffer-01593";
+ }
+ } else if (typed_handle.type == kVulkanObjectTypeImage) {
+ if (strcmp(apiName, "vkBindImageMemory()") == 0) {
+ error_code = "VUID-vkBindImageMemory-image-01044";
+ } else {
+ error_code = "VUID-VkBindImageMemoryInfo-image-01609";
+ }
} else {
- assert(typed_handle.type == kVulkanObjectTypeImage);
+ // Unsupported object type
+ assert(false);
}
+
LogObjectList objlist(mem);
objlist.add(typed_handle);
objlist.add(prev_binding->mem);
@@ -355,9 +386,10 @@
return skip;
}
-bool CoreChecks::ValidateQueueFamilies(uint32_t queue_family_count, const uint32_t *queue_families, const char *cmd_name,
- const char *array_parameter_name, const char *unique_error_code,
- const char *valid_error_code, bool optional = false) const {
+// Validate the specified queue families against the families supported by the physical device that owns this device
+bool CoreChecks::ValidatePhysicalDeviceQueueFamilies(uint32_t queue_family_count, const uint32_t *queue_families,
+ const char *cmd_name, const char *array_parameter_name,
+ const char *vuid) const {
bool skip = false;
if (queue_families) {
std::unordered_set<uint32_t> set;
@@ -365,11 +397,25 @@
std::string parameter_name = std::string(array_parameter_name) + "[" + std::to_string(i) + "]";
if (set.count(queue_families[i])) {
- skip |= LogError(device, unique_error_code, "%s: %s (=%" PRIu32 ") is not unique within %s array.", cmd_name,
+ skip |= LogError(device, vuid, "%s: %s (=%" PRIu32 ") is not unique within %s array.", cmd_name,
parameter_name.c_str(), queue_families[i], array_parameter_name);
} else {
set.insert(queue_families[i]);
- skip |= ValidateDeviceQueueFamily(queue_families[i], cmd_name, parameter_name.c_str(), valid_error_code, optional);
+ if (queue_families[i] == VK_QUEUE_FAMILY_IGNORED) {
+ skip |= LogError(
+ device, vuid,
+ "%s: %s is VK_QUEUE_FAMILY_IGNORED, but it is required to provide a valid queue family index value.",
+ cmd_name, parameter_name.c_str());
+ } else if (queue_families[i] >= physical_device_state->queue_family_known_count) {
+ LogObjectList obj_list(physical_device);
+ obj_list.add(device);
+ skip |=
+ LogError(obj_list, vuid,
+ "%s: %s (= %" PRIu32
+ ") is not one of the queue families supported by the parent PhysicalDevice %s of this device %s.",
+ cmd_name, parameter_name.c_str(), queue_families[i],
+ report_data->FormatHandle(physical_device).c_str(), report_data->FormatHandle(device).c_str());
+ }
}
}
}
@@ -609,14 +655,22 @@
if (pPipeline->vertex_binding_descriptions_.size() > 0) {
for (size_t i = 0; i < pPipeline->vertex_binding_descriptions_.size(); i++) {
const auto vertex_binding = pPipeline->vertex_binding_descriptions_[i].binding;
- if ((current_vtx_bfr_binding_info.size() < (vertex_binding + 1)) ||
- (current_vtx_bfr_binding_info[vertex_binding].buffer == VK_NULL_HANDLE)) {
- skip |=
- LogError(pCB->commandBuffer, vuid.vertex_binding,
- "%s expects that this Command Buffer's vertex binding Index %u should be set via "
- "vkCmdBindVertexBuffers. This is because VkVertexInputBindingDescription struct at "
- "index " PRINTF_SIZE_T_SPECIFIER " of pVertexBindingDescriptions has a binding value of %u.",
- report_data->FormatHandle(state.pipeline_state->pipeline).c_str(), vertex_binding, i, vertex_binding);
+ if (current_vtx_bfr_binding_info.size() < (vertex_binding + 1)) {
+ skip |= LogError(pCB->commandBuffer, vuid.vertex_binding,
+ "%s: %s expects that this Command Buffer's vertex binding Index %u should be set via "
+ "vkCmdBindVertexBuffers. This is because VkVertexInputBindingDescription struct at "
+ "index " PRINTF_SIZE_T_SPECIFIER " of pVertexBindingDescriptions has a binding value of %u.",
+ caller, report_data->FormatHandle(state.pipeline_state->pipeline).c_str(), vertex_binding, i,
+ vertex_binding);
+ } else if ((current_vtx_bfr_binding_info[vertex_binding].buffer == VK_NULL_HANDLE) &&
+ !enabled_features.robustness2_features.nullDescriptor) {
+ skip |= LogError(pCB->commandBuffer, vuid.vertex_binding_null,
+ "%s: Vertex binding %d must not be VK_NULL_HANDLE %s expects that this Command Buffer's vertex "
+ "binding Index %u should be set via "
+ "vkCmdBindVertexBuffers. This is because VkVertexInputBindingDescription struct at "
+ "index " PRINTF_SIZE_T_SPECIFIER " of pVertexBindingDescriptions has a binding value of %u.",
+ caller, vertex_binding, report_data->FormatHandle(state.pipeline_state->pipeline).c_str(),
+ vertex_binding, i, vertex_binding);
}
}
@@ -630,7 +684,19 @@
if ((vertex_binding_map_it != pPipeline->vertex_binding_to_index_map_.cend()) &&
(vertex_binding < current_vtx_bfr_binding_info.size()) &&
(current_vtx_bfr_binding_info[vertex_binding].buffer != VK_NULL_HANDLE)) {
- const auto vertex_buffer_stride = pPipeline->vertex_binding_descriptions_[vertex_binding_map_it->second].stride;
+ auto vertex_buffer_stride = pPipeline->vertex_binding_descriptions_[vertex_binding_map_it->second].stride;
+ if (IsDynamic(pPipeline, VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT)) {
+ vertex_buffer_stride = (uint32_t)current_vtx_bfr_binding_info[vertex_binding].stride;
+ uint32_t attribute_binding_extent =
+ attribute_description.offset + FormatElementSize(attribute_description.format);
+ if (vertex_buffer_stride < attribute_binding_extent) {
+ skip |=
+ LogError(pCB->commandBuffer, "VUID-vkCmdBindVertexBuffers2EXT-pStrides-03363",
+ "The pStrides[%u] (%u) parameter in the last call to vkCmdBindVertexBuffers2EXT is less than "
+ "the extent of the binding for attribute %u (%u).",
+ vertex_binding, vertex_buffer_stride, i, attribute_binding_extent);
+ }
+ }
const auto vertex_buffer_offset = current_vtx_bfr_binding_info[vertex_binding].offset;
// Use 1 as vertex/instance index to use buffer stride as well
@@ -642,9 +708,9 @@
LogObjectList objlist(current_vtx_bfr_binding_info[vertex_binding].buffer);
objlist.add(state.pipeline_state->pipeline);
skip |= LogError(objlist, kVUID_Core_DrawState_InvalidVtxAttributeAlignment,
- "Invalid attribAddress alignment for vertex attribute " PRINTF_SIZE_T_SPECIFIER
+ "%s: Invalid attribAddress alignment for vertex attribute " PRINTF_SIZE_T_SPECIFIER
" from %s and vertex %s.",
- i, report_data->FormatHandle(state.pipeline_state->pipeline).c_str(),
+ caller, i, report_data->FormatHandle(state.pipeline_state->pipeline).c_str(),
report_data->FormatHandle(current_vtx_bfr_binding_info[vertex_binding].buffer).c_str());
}
}
@@ -664,7 +730,7 @@
const auto missingViewportMask = ~pCB->viewportMask & requiredViewportsMask;
if (missingViewportMask) {
std::stringstream ss;
- ss << "Dynamic viewport(s) ";
+ ss << caller << ": Dynamic viewport(s) ";
ListBits(ss, missingViewportMask);
ss << " are used by pipeline state object, but were not provided via calls to vkCmdSetViewport().";
skip |= LogError(device, kVUID_Core_DrawState_ViewportScissorMismatch, "%s", ss.str().c_str());
@@ -676,12 +742,53 @@
const auto missingScissorMask = ~pCB->scissorMask & requiredScissorMask;
if (missingScissorMask) {
std::stringstream ss;
- ss << "Dynamic scissor(s) ";
+ ss << caller << ": Dynamic scissor(s) ";
ListBits(ss, missingScissorMask);
ss << " are used by pipeline state object, but were not provided via calls to vkCmdSetScissor().";
skip |= LogError(device, kVUID_Core_DrawState_ViewportScissorMismatch, "%s", ss.str().c_str());
}
}
+
+ bool dynViewportCount = IsDynamic(pPipeline, VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT);
+ bool dynScissorCount = IsDynamic(pPipeline, VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT);
+
+ // VUID {refpage}-viewportCount-03417
+ if (dynViewportCount && !dynScissorCount) {
+ const auto requiredViewportMask = (1 << pPipeline->graphicsPipelineCI.pViewportState->scissorCount) - 1;
+ const auto missingViewportMask = ~pCB->viewportWithCountMask & requiredViewportMask;
+ if (missingViewportMask) {
+ std::stringstream ss;
+ ss << caller << ": Dynamic viewport with count ";
+ ListBits(ss, missingViewportMask);
+ ss << " are used by pipeline state object, but were not provided via calls to vkCmdSetViewportWithCountEXT().";
+ skip |= LogError(device, vuid.viewport_count, "%s", ss.str().c_str());
+ }
+ }
+
+ // VUID {refpage}-scissorCount-03418
+ if (dynScissorCount && !dynViewportCount) {
+ const auto requiredScissorMask = (1 << pPipeline->graphicsPipelineCI.pViewportState->viewportCount) - 1;
+ const auto missingScissorMask = ~pCB->scissorWithCountMask & requiredScissorMask;
+ if (missingScissorMask) {
+ std::stringstream ss;
+ ss << caller << ": Dynamic scissor with count ";
+ ListBits(ss, missingScissorMask);
+ ss << " are used by pipeline state object, but were not provided via calls to vkCmdSetScissorWithCountEXT().";
+ skip |= LogError(device, vuid.scissor_count, "%s", ss.str().c_str());
+ }
+ }
+
+ // VUID {refpage}-viewportCount-03419
+ if (dynScissorCount && dynViewportCount) {
+ if (pCB->viewportWithCountMask != pCB->scissorWithCountMask) {
+ std::stringstream ss;
+ ss << caller << ": Dynamic viewport and scissor with count ";
+ ListBits(ss, pCB->viewportWithCountMask ^ pCB->scissorWithCountMask);
+ ss << " are used by pipeline state object, but were not provided via matching calls to "
+ "vkCmdSetViewportWithCountEXT and vkCmdSetScissorWithCountEXT().";
+ skip |= LogError(device, vuid.viewport_scissor_count, "%s", ss.str().c_str());
+ }
+ }
}
// Verify that any MSAA request in PSO matches sample# in bound FB
@@ -712,15 +819,15 @@
LogObjectList objlist(pPipeline->pipeline);
objlist.add(pCB->activeRenderPass->renderPass);
skip |= LogError(objlist, kVUID_Core_DrawState_NumSamplesMismatch,
- "Num samples mismatch! At draw-time in %s with %u samples while current %s w/ "
+ "%s: Num samples mismatch! At draw-time in %s with %u samples while current %s w/ "
"%u samples!",
- report_data->FormatHandle(pPipeline->pipeline).c_str(), pso_num_samples,
+ caller, report_data->FormatHandle(pPipeline->pipeline).c_str(), pso_num_samples,
report_data->FormatHandle(pCB->activeRenderPass->renderPass).c_str(), subpass_num_samples);
}
} else {
- skip |=
- LogError(pPipeline->pipeline, kVUID_Core_DrawState_NoActiveRenderpass,
- "No active render pass found at draw-time in %s!", report_data->FormatHandle(pPipeline->pipeline).c_str());
+ skip |= LogError(pPipeline->pipeline, kVUID_Core_DrawState_NoActiveRenderpass,
+ "%s: No active render pass found at draw-time in %s!", caller,
+ report_data->FormatHandle(pPipeline->pipeline).c_str());
}
}
// Verify that PSO creation renderPass is compatible with active renderPass
@@ -728,12 +835,103 @@
// TODO: AMD extension codes are included here, but actual function entrypoints are not yet intercepted
if (pCB->activeRenderPass->renderPass != pPipeline->rp_state->renderPass) {
// renderPass that PSO was created with must be compatible with active renderPass that PSO is being used with
- skip |= ValidateRenderPassCompatibility("active render pass", pCB->activeRenderPass, "pipeline state object",
+ skip |= ValidateRenderPassCompatibility("active render pass", pCB->activeRenderPass.get(), "pipeline state object",
pPipeline->rp_state.get(), caller, vuid.render_pass_compatible);
}
if (pPipeline->graphicsPipelineCI.subpass != pCB->activeSubpass) {
- skip |= LogError(pPipeline->pipeline, vuid.subpass_index, "Pipeline was built for subpass %u but used in subpass %u.",
- pPipeline->graphicsPipelineCI.subpass, pCB->activeSubpass);
+ skip |=
+ LogError(pPipeline->pipeline, vuid.subpass_index, "%s: Pipeline was built for subpass %u but used in subpass %u.",
+ caller, pPipeline->graphicsPipelineCI.subpass, pCB->activeSubpass);
+ }
+ // Check if depth stencil attachment was created with sample location compatible bit
+ if (pPipeline->sample_location_enabled == VK_TRUE) {
+ const safe_VkAttachmentReference2 *ds_attachment =
+ pCB->activeRenderPass->createInfo.pSubpasses[pCB->activeSubpass].pDepthStencilAttachment;
+ const FRAMEBUFFER_STATE *fb_state = pCB->activeFramebuffer.get();
+ if ((ds_attachment != nullptr) && (fb_state != nullptr)) {
+ const uint32_t attachment = ds_attachment->attachment;
+ if (attachment != VK_ATTACHMENT_UNUSED) {
+ const IMAGE_VIEW_STATE *imageview_state = GetAttachmentImageViewState(pCB, fb_state, attachment);
+ if (imageview_state != nullptr) {
+ const IMAGE_STATE *image_state = GetImageState(imageview_state->create_info.image);
+ if (image_state != nullptr) {
+ if ((image_state->createInfo.flags & VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT) == 0) {
+ skip |= LogError(pPipeline->pipeline, vuid.sample_location,
+ "%s: sampleLocationsEnable is true for the pipeline, but the subpass (%u) depth "
+ "stencil attachment's VkImage was not created with "
+ "VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT.",
+ caller, pCB->activeSubpass);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // VUID {refpage}-primitiveTopology-03420
+ skip |= ValidateStatus(pCB, CBSTATUS_PRIMITIVE_TOPOLOGY_SET, "Dynamic primitive topology state not set for this command buffer",
+ vuid.primitive_topology);
+ if (IsDynamic(pPipeline, VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT)) {
+ bool compatible_topology = false;
+ switch (pPipeline->graphicsPipelineCI.pInputAssemblyState->topology) {
+ case VK_PRIMITIVE_TOPOLOGY_POINT_LIST:
+ switch (pCB->primitiveTopology) {
+ case VK_PRIMITIVE_TOPOLOGY_POINT_LIST:
+ compatible_topology = true;
+ break;
+ default:
+ break;
+ }
+ break;
+ case VK_PRIMITIVE_TOPOLOGY_LINE_LIST:
+ case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP:
+ case VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY:
+ case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY:
+ switch (pCB->primitiveTopology) {
+ case VK_PRIMITIVE_TOPOLOGY_LINE_LIST:
+ case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP:
+ compatible_topology = true;
+ break;
+ default:
+ break;
+ }
+ break;
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN:
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY:
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY:
+ switch (pCB->primitiveTopology) {
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN:
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY:
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY:
+ compatible_topology = true;
+ break;
+ default:
+ break;
+ }
+ break;
+ case VK_PRIMITIVE_TOPOLOGY_PATCH_LIST:
+ switch (pCB->primitiveTopology) {
+ case VK_PRIMITIVE_TOPOLOGY_PATCH_LIST:
+ compatible_topology = true;
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ if (!compatible_topology) {
+ skip |= LogError(pPipeline->pipeline, vuid.primitive_topology,
+ "%s: the last primitive topology %s state set by vkCmdSetPrimitiveTopologyEXT is "
+ "not compatible with the pipeline topology %s.",
+ caller, string_VkPrimitiveTopology(pCB->primitiveTopology),
+ string_VkPrimitiveTopology(pPipeline->graphicsPipelineCI.pInputAssemblyState->topology));
}
}
@@ -772,14 +970,17 @@
if (nullptr == pPipe) {
return LogError(cb_node->commandBuffer, vuid.pipeline_bound,
"Must not call %s on this command buffer while there is no %s pipeline bound.", function,
- bind_point == VK_PIPELINE_BIND_POINT_GRAPHICS ? "Graphics" : "Compute");
+ bind_point == VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR
+ ? "RayTracing"
+ : bind_point == VK_PIPELINE_BIND_POINT_GRAPHICS ? "Graphics" : "Compute");
}
bool result = false;
auto const &state = last_bound_it->second;
// First check flag states
- if (VK_PIPELINE_BIND_POINT_GRAPHICS == bind_point) result = ValidateDrawStateFlags(cb_node, pPipe, indexed, vuid.dynamic_state);
+ if (VK_PIPELINE_BIND_POINT_GRAPHICS == bind_point)
+ result |= ValidateDrawStateFlags(cb_node, pPipe, indexed, vuid.dynamic_state);
// Now complete other state checks
string errorString;
@@ -793,7 +994,7 @@
result |= LogError(objlist, vuid.compatible_pipeline,
"%s(): %s defined with %s is not compatible for maximum set statically used %" PRIu32
" with bound descriptor sets, last bound with %s",
- command_name_list[cmd_type], report_data->FormatHandle(pPipe->pipeline).c_str(),
+ CommandTypeString(cmd_type), report_data->FormatHandle(pPipe->pipeline).c_str(),
report_data->FormatHandle(pipeline_layout->layout).c_str(), pPipe->max_active_slot,
report_data->FormatHandle(state.pipeline_layout).c_str());
}
@@ -820,55 +1021,46 @@
const cvdescriptorset::DescriptorSet *descriptor_set = state.per_set[setIndex].bound_descriptor_set;
// Validate the draw-time state for this descriptor set
std::string err_str;
- if (!descriptor_set->IsPushDescriptor()) {
- // For the "bindless" style resource usage with many descriptors, need to optimize command <-> descriptor
- // binding validation. Take the requested binding set and prefilter it to eliminate redundant validation checks.
- // Here, the currently bound pipeline determines whether an image validation check is redundant...
- // for images are the "req" portion of the binding_req is indirectly (but tightly) coupled to the pipeline.
- cvdescriptorset::PrefilterBindRequestMap reduced_map(*descriptor_set, set_binding_pair.second);
- const auto &binding_req_map = reduced_map.FilteredMap(*cb_node, *pPipe);
+ // For the "bindless" style resource usage with many descriptors, need to optimize command <-> descriptor
+ // binding validation. Take the requested binding set and prefilter it to eliminate redundant validation checks.
+ // Here, the currently bound pipeline determines whether an image validation check is redundant...
+ // for images are the "req" portion of the binding_req is indirectly (but tightly) coupled to the pipeline.
+ cvdescriptorset::PrefilterBindRequestMap reduced_map(*descriptor_set, set_binding_pair.second);
+ const auto &binding_req_map = reduced_map.FilteredMap(*cb_node, *pPipe);
- // We can skip validating the descriptor set if "nothing" has changed since the last validation.
- // Same set, no image layout changes, and same "pipeline state" (binding_req_map). If there are
- // any dynamic descriptors, always revalidate rather than caching the values. We currently only
- // apply this optimization if IsManyDescriptors is true, to avoid the overhead of copying the
- // binding_req_map which could potentially be expensive.
- bool descriptor_set_changed =
- !reduced_map.IsManyDescriptors() ||
- // Revalidate each time if the set has dynamic offsets
- state.per_set[setIndex].dynamicOffsets.size() > 0 ||
- // Revalidate if descriptor set (or contents) has changed
- state.per_set[setIndex].validated_set != descriptor_set ||
- state.per_set[setIndex].validated_set_change_count != descriptor_set->GetChangeCount() ||
- (!disabled.image_layout_validation &&
- state.per_set[setIndex].validated_set_image_layout_change_count != cb_node->image_layout_change_count);
- bool need_validate = descriptor_set_changed ||
- // Revalidate if previous bindingReqMap doesn't include new bindingReqMap
- !std::includes(state.per_set[setIndex].validated_set_binding_req_map.begin(),
- state.per_set[setIndex].validated_set_binding_req_map.end(),
- binding_req_map.begin(), binding_req_map.end());
+ // We can skip validating the descriptor set if "nothing" has changed since the last validation.
+ // Same set, no image layout changes, and same "pipeline state" (binding_req_map). If there are
+ // any dynamic descriptors, always revalidate rather than caching the values. We currently only
+ // apply this optimization if IsManyDescriptors is true, to avoid the overhead of copying the
+ // binding_req_map which could potentially be expensive.
+ bool descriptor_set_changed =
+ !reduced_map.IsManyDescriptors() ||
+ // Revalidate each time if the set has dynamic offsets
+ state.per_set[setIndex].dynamicOffsets.size() > 0 ||
+ // Revalidate if descriptor set (or contents) has changed
+ state.per_set[setIndex].validated_set != descriptor_set ||
+ state.per_set[setIndex].validated_set_change_count != descriptor_set->GetChangeCount() ||
+ (!disabled[image_layout_validation] &&
+ state.per_set[setIndex].validated_set_image_layout_change_count != cb_node->image_layout_change_count);
+ bool need_validate = descriptor_set_changed ||
+ // Revalidate if previous bindingReqMap doesn't include new bindingReqMap
+ !std::includes(state.per_set[setIndex].validated_set_binding_req_map.begin(),
+ state.per_set[setIndex].validated_set_binding_req_map.end(),
+ binding_req_map.begin(), binding_req_map.end());
- if (need_validate) {
- bool success;
- if (!descriptor_set_changed && reduced_map.IsManyDescriptors()) {
- // Only validate the bindings that haven't already been validated
- BindingReqMap delta_reqs;
- std::set_difference(binding_req_map.begin(), binding_req_map.end(),
- state.per_set[setIndex].validated_set_binding_req_map.begin(),
- state.per_set[setIndex].validated_set_binding_req_map.end(),
- std::inserter(delta_reqs, delta_reqs.begin()));
- success = ValidateDrawState(descriptor_set, delta_reqs, state.per_set[setIndex].dynamicOffsets, cb_node,
- function, &err_str);
- } else {
- success = ValidateDrawState(descriptor_set, binding_req_map, state.per_set[setIndex].dynamicOffsets,
- cb_node, function, &err_str);
- }
- if (!success) {
- auto set = descriptor_set->GetSet();
- result |= LogError(set, kVUID_Core_DrawState_DescriptorSetNotUpdated,
- "%s bound as set #%u encountered the following validation error at %s time: %s",
- report_data->FormatHandle(set).c_str(), setIndex, function, err_str.c_str());
- }
+ if (need_validate) {
+ if (!descriptor_set_changed && reduced_map.IsManyDescriptors()) {
+ // Only validate the bindings that haven't already been validated
+ BindingReqMap delta_reqs;
+ std::set_difference(binding_req_map.begin(), binding_req_map.end(),
+ state.per_set[setIndex].validated_set_binding_req_map.begin(),
+ state.per_set[setIndex].validated_set_binding_req_map.end(),
+ std::inserter(delta_reqs, delta_reqs.begin()));
+ result |= ValidateDrawState(descriptor_set, delta_reqs, state.per_set[setIndex].dynamicOffsets, cb_node,
+ setIndex, function, vuid);
+ } else {
+ result |= ValidateDrawState(descriptor_set, binding_req_map, state.per_set[setIndex].dynamicOffsets, cb_node,
+ setIndex, function, vuid);
}
}
}
@@ -890,28 +1082,30 @@
// pipeline correctly, and that the base pipeline was created to allow
// derivatives.
if (pPipeline->graphicsPipelineCI.flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
- const PIPELINE_STATE *pBasePipeline = nullptr;
+ const PIPELINE_STATE *base_pipeline = nullptr;
if (!((pPipeline->graphicsPipelineCI.basePipelineHandle != VK_NULL_HANDLE) ^
(pPipeline->graphicsPipelineCI.basePipelineIndex != -1))) {
- // This check is a superset of "VUID-VkGraphicsPipelineCreateInfo-flags-00724" and
- // "VUID-VkGraphicsPipelineCreateInfo-flags-00725"
+ // TODO: This check is a superset of VUID-VkGraphicsPipelineCreateInfo-flags-00724 and
+ // TODO: VUID-VkGraphicsPipelineCreateInfo-flags-00725
skip |= LogError(device, kVUID_Core_DrawState_InvalidPipelineCreateState,
- "Invalid Pipeline CreateInfo: exactly one of base pipeline index and handle must be specified");
+ "Invalid Pipeline CreateInfo[%d]: exactly one of base pipeline index and handle must be specified",
+ pipelineIndex);
} else if (pPipeline->graphicsPipelineCI.basePipelineIndex != -1) {
if (pPipeline->graphicsPipelineCI.basePipelineIndex >= pipelineIndex) {
skip |=
LogError(device, "VUID-vkCreateGraphicsPipelines-flags-00720",
- "Invalid Pipeline CreateInfo: base pipeline must occur earlier in array than derivative pipeline.");
+ "Invalid Pipeline CreateInfo[%d]: base pipeline must occur earlier in array than derivative pipeline.",
+ pipelineIndex);
} else {
- pBasePipeline = pPipelines[pPipeline->graphicsPipelineCI.basePipelineIndex].get();
+ base_pipeline = pPipelines[pPipeline->graphicsPipelineCI.basePipelineIndex].get();
}
} else if (pPipeline->graphicsPipelineCI.basePipelineHandle != VK_NULL_HANDLE) {
- pBasePipeline = GetPipelineState(pPipeline->graphicsPipelineCI.basePipelineHandle);
+ base_pipeline = GetPipelineState(pPipeline->graphicsPipelineCI.basePipelineHandle);
}
- if (pBasePipeline && !(pBasePipeline->graphicsPipelineCI.flags & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT)) {
+ if (base_pipeline && !(base_pipeline->graphicsPipelineCI.flags & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT)) {
skip |= LogError(device, kVUID_Core_DrawState_InvalidPipelineCreateState,
- "Invalid Pipeline CreateInfo: base pipeline does not allow derivatives.");
+ "Invalid Pipeline CreateInfo[%d]: base pipeline does not allow derivatives.", pipelineIndex);
}
}
@@ -928,20 +1122,20 @@
auto subpass_desc = &pPipeline->rp_state->createInfo.pSubpasses[pPipeline->graphicsPipelineCI.subpass];
if (pPipeline->graphicsPipelineCI.subpass >= pPipeline->rp_state->createInfo.subpassCount) {
skip |= LogError(device, "VUID-VkGraphicsPipelineCreateInfo-subpass-00759",
- "Invalid Pipeline CreateInfo State: Subpass index %u is out of range for this renderpass (0..%u).",
- pPipeline->graphicsPipelineCI.subpass, pPipeline->rp_state->createInfo.subpassCount - 1);
+ "Invalid Pipeline CreateInfo[%u] State: Subpass index %u is out of range for this renderpass (0..%u).",
+ pipelineIndex, pPipeline->graphicsPipelineCI.subpass, pPipeline->rp_state->createInfo.subpassCount - 1);
subpass_desc = nullptr;
}
if (pPipeline->graphicsPipelineCI.pColorBlendState != NULL) {
const safe_VkPipelineColorBlendStateCreateInfo *color_blend_state = pPipeline->graphicsPipelineCI.pColorBlendState;
if (subpass_desc && color_blend_state->attachmentCount != subpass_desc->colorAttachmentCount) {
- skip |=
- LogError(device, "VUID-VkGraphicsPipelineCreateInfo-attachmentCount-00746",
- "vkCreateGraphicsPipelines(): %s subpass %u has colorAttachmentCount of %u which doesn't "
- "match the pColorBlendState->attachmentCount of %u.",
- report_data->FormatHandle(pPipeline->rp_state->renderPass).c_str(), pPipeline->graphicsPipelineCI.subpass,
- subpass_desc->colorAttachmentCount, color_blend_state->attachmentCount);
+ skip |= LogError(
+ device, "VUID-VkGraphicsPipelineCreateInfo-attachmentCount-00746",
+ "vkCreateGraphicsPipelines() pCreateInfo[%u]: %s subpass %u has colorAttachmentCount of %u which doesn't "
+ "match the pColorBlendState->attachmentCount of %u.",
+ pipelineIndex, report_data->FormatHandle(pPipeline->rp_state->renderPass).c_str(),
+ pPipeline->graphicsPipelineCI.subpass, subpass_desc->colorAttachmentCount, color_blend_state->attachmentCount);
}
if (!enabled_features.core.independentBlend) {
if (pPipeline->attachments.size() > 1) {
@@ -952,18 +1146,21 @@
// only attachment state, so memcmp is best suited for the comparison
if (memcmp(static_cast<const void *>(pAttachments), static_cast<const void *>(&pAttachments[i]),
sizeof(pAttachments[0]))) {
- skip |= LogError(device, "VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605",
- "Invalid Pipeline CreateInfo: If independent blend feature not enabled, all elements of "
- "pAttachments must be identical.");
+ skip |=
+ LogError(device, "VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605",
+ "Invalid Pipeline CreateInfo[%u]: If independent blend feature not enabled, all elements of "
+ "pAttachments must be identical.",
+ pipelineIndex);
break;
}
}
}
}
if (!enabled_features.core.logicOp && (pPipeline->graphicsPipelineCI.pColorBlendState->logicOpEnable != VK_FALSE)) {
- skip |=
- LogError(device, "VUID-VkPipelineColorBlendStateCreateInfo-logicOpEnable-00606",
- "Invalid Pipeline CreateInfo: If logic operations feature not enabled, logicOpEnable must be VK_FALSE.");
+ skip |= LogError(
+ device, "VUID-VkPipelineColorBlendStateCreateInfo-logicOpEnable-00606",
+ "Invalid Pipeline CreateInfo[%u]: If logic operations feature not enabled, logicOpEnable must be VK_FALSE.",
+ pipelineIndex);
}
for (size_t i = 0; i < pPipeline->attachments.size(); i++) {
if ((pPipeline->attachments[i].srcColorBlendFactor == VK_BLEND_FACTOR_SRC1_COLOR) ||
@@ -1029,7 +1226,7 @@
for (uint32_t stage = VK_SHADER_STAGE_VERTEX_BIT; stage & VK_SHADER_STAGE_ALL_GRAPHICS; stage <<= 1) {
if (pPipeline->duplicate_shaders & stage) {
skip |= LogError(device, kVUID_Core_DrawState_InvalidPipelineCreateState,
- "Invalid Pipeline CreateInfo State: Multiple shaders provided for stage %s",
+ "Invalid Pipeline CreateInfo[%u] State: Multiple shaders provided for stage %s", pipelineIndex,
string_VkShaderStageFlagBits(VkShaderStageFlagBits(stage)));
}
}
@@ -1038,7 +1235,7 @@
// VS or mesh is required
if (!(pPipeline->active_shaders & (VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_MESH_BIT_NV))) {
skip |= LogError(device, "VUID-VkGraphicsPipelineCreateInfo-stage-02096",
- "Invalid Pipeline CreateInfo State: Vertex Shader or Mesh Shader required.");
+ "Invalid Pipeline CreateInfo[%u] State: Vertex Shader or Mesh Shader required.", pipelineIndex);
}
// Can't mix mesh and VTG
if ((pPipeline->active_shaders & (VK_SHADER_STAGE_MESH_BIT_NV | VK_SHADER_STAGE_TASK_BIT_NV)) &&
@@ -1046,25 +1243,26 @@
(VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_GEOMETRY_BIT | VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT |
VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT))) {
skip |= LogError(device, "VUID-VkGraphicsPipelineCreateInfo-pStages-02095",
- "Invalid Pipeline CreateInfo State: Geometric shader stages must either be all mesh (mesh | task) "
- "or all VTG (vertex, tess control, tess eval, geom).");
+ "Invalid Pipeline CreateInfo[%u] State: Geometric shader stages must either be all mesh (mesh | task) "
+ "or all VTG (vertex, tess control, tess eval, geom).",
+ pipelineIndex);
}
} else {
// VS is required
if (!(pPipeline->active_shaders & VK_SHADER_STAGE_VERTEX_BIT)) {
skip |= LogError(device, "VUID-VkGraphicsPipelineCreateInfo-stage-00727",
- "Invalid Pipeline CreateInfo State: Vertex Shader required.");
+ "Invalid Pipeline CreateInfo[%u] State: Vertex Shader required.", pipelineIndex);
}
}
if (!enabled_features.mesh_shader.meshShader && (pPipeline->active_shaders & VK_SHADER_STAGE_MESH_BIT_NV)) {
skip |= LogError(device, "VUID-VkPipelineShaderStageCreateInfo-stage-02091",
- "Invalid Pipeline CreateInfo State: Mesh Shader not supported.");
+ "Invalid Pipeline CreateInfo[%u] State: Mesh Shader not supported.", pipelineIndex);
}
if (!enabled_features.mesh_shader.taskShader && (pPipeline->active_shaders & VK_SHADER_STAGE_TASK_BIT_NV)) {
skip |= LogError(device, "VUID-VkPipelineShaderStageCreateInfo-stage-02092",
- "Invalid Pipeline CreateInfo State: Task Shader not supported.");
+ "Invalid Pipeline CreateInfo[%u] State: Task Shader not supported.", pipelineIndex);
}
// Either both or neither TC/TE shaders should be defined
@@ -1072,21 +1270,23 @@
bool has_eval = (pPipeline->active_shaders & VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT) != 0;
if (has_control && !has_eval) {
skip |= LogError(device, "VUID-VkGraphicsPipelineCreateInfo-pStages-00729",
- "Invalid Pipeline CreateInfo State: TE and TC shaders must be included or excluded as a pair.");
+ "Invalid Pipeline CreateInfo[%u] State: TE and TC shaders must be included or excluded as a pair.",
+ pipelineIndex);
}
if (!has_control && has_eval) {
skip |= LogError(device, "VUID-VkGraphicsPipelineCreateInfo-pStages-00730",
- "Invalid Pipeline CreateInfo State: TE and TC shaders must be included or excluded as a pair.");
+ "Invalid Pipeline CreateInfo[%u] State: TE and TC shaders must be included or excluded as a pair.",
+ pipelineIndex);
}
// Compute shaders should be specified independent of Gfx shaders
if (pPipeline->active_shaders & VK_SHADER_STAGE_COMPUTE_BIT) {
skip |= LogError(device, "VUID-VkGraphicsPipelineCreateInfo-stage-00728",
- "Invalid Pipeline CreateInfo State: Do not specify Compute Shader for Gfx Pipeline.");
+ "Invalid Pipeline CreateInfo[%u] State: Do not specify Compute Shader for Gfx Pipeline.", pipelineIndex);
}
if ((pPipeline->active_shaders & VK_SHADER_STAGE_VERTEX_BIT) && !pPipeline->graphicsPipelineCI.pInputAssemblyState) {
skip |= LogError(device, "VUID-VkGraphicsPipelineCreateInfo-pStages-02098",
- "Invalid Pipeline CreateInfo State: Missing pInputAssemblyState.");
+ "Invalid Pipeline CreateInfo[%u] State: Missing pInputAssemblyState.", pipelineIndex);
}
// VK_PRIMITIVE_TOPOLOGY_PATCH_LIST primitive topology is only valid for tessellation pipelines.
@@ -1095,16 +1295,18 @@
(!pPipeline->graphicsPipelineCI.pInputAssemblyState ||
pPipeline->graphicsPipelineCI.pInputAssemblyState->topology != VK_PRIMITIVE_TOPOLOGY_PATCH_LIST)) {
skip |= LogError(device, "VUID-VkGraphicsPipelineCreateInfo-pStages-00736",
- "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH_LIST must be set as IA topology for "
- "tessellation pipelines.");
+ "Invalid Pipeline CreateInfo[%u] State: VK_PRIMITIVE_TOPOLOGY_PATCH_LIST must be set as IA topology for "
+ "tessellation pipelines.",
+ pipelineIndex);
}
if (pPipeline->graphicsPipelineCI.pInputAssemblyState) {
if (pPipeline->graphicsPipelineCI.pInputAssemblyState->topology == VK_PRIMITIVE_TOPOLOGY_PATCH_LIST) {
if (!has_control || !has_eval) {
- skip |=
- LogError(device, "VUID-VkGraphicsPipelineCreateInfo-topology-00737",
- "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH_LIST primitive topology is only valid "
- "for tessellation pipelines.");
+ skip |= LogError(
+ device, "VUID-VkGraphicsPipelineCreateInfo-topology-00737",
+ "Invalid Pipeline CreateInfo[%u] State: VK_PRIMITIVE_TOPOLOGY_PATCH_LIST primitive topology is only valid "
+ "for tessellation pipelines.",
+ pipelineIndex);
}
}
@@ -1115,24 +1317,29 @@
pPipeline->graphicsPipelineCI.pInputAssemblyState->topology == VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY ||
pPipeline->graphicsPipelineCI.pInputAssemblyState->topology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY ||
pPipeline->graphicsPipelineCI.pInputAssemblyState->topology == VK_PRIMITIVE_TOPOLOGY_PATCH_LIST)) {
- skip |= LogError(device, "VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00428",
- "topology is %s and primitiveRestartEnable is VK_TRUE. It is invalid.",
- string_VkPrimitiveTopology(pPipeline->graphicsPipelineCI.pInputAssemblyState->topology));
+ skip |= LogError(
+ device, "VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00428",
+ "vkCreateGraphicsPipelines() pCreateInfo[%u]: topology is %s and primitiveRestartEnable is VK_TRUE. It is invalid.",
+ pipelineIndex, string_VkPrimitiveTopology(pPipeline->graphicsPipelineCI.pInputAssemblyState->topology));
}
if ((enabled_features.core.geometryShader == VK_FALSE) &&
(pPipeline->graphicsPipelineCI.pInputAssemblyState->topology == VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY ||
pPipeline->graphicsPipelineCI.pInputAssemblyState->topology == VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY ||
pPipeline->graphicsPipelineCI.pInputAssemblyState->topology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY ||
pPipeline->graphicsPipelineCI.pInputAssemblyState->topology == VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY)) {
- skip |= LogError(device, "VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00429",
- "topology is %s and geometry shaders feature is not enabled. It is invalid.",
- string_VkPrimitiveTopology(pPipeline->graphicsPipelineCI.pInputAssemblyState->topology));
+ skip |=
+ LogError(device, "VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00429",
+ "vkCreateGraphicsPipelines() pCreateInfo[%u]: topology is %s and geometry shaders feature is not enabled. "
+ "It is invalid.",
+ pipelineIndex, string_VkPrimitiveTopology(pPipeline->graphicsPipelineCI.pInputAssemblyState->topology));
}
if ((enabled_features.core.tessellationShader == VK_FALSE) &&
(pPipeline->graphicsPipelineCI.pInputAssemblyState->topology == VK_PRIMITIVE_TOPOLOGY_PATCH_LIST)) {
- skip |= LogError(device, "VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00430",
- "topology is %s and tessellation shaders feature is not enabled. It is invalid.",
- string_VkPrimitiveTopology(pPipeline->graphicsPipelineCI.pInputAssemblyState->topology));
+ skip |=
+ LogError(device, "VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00430",
+ "vkCreateGraphicsPipelines() pCreateInfo[%u]: topology is %s and tessellation shaders feature is not "
+ "enabled. It is invalid.",
+ pipelineIndex, string_VkPrimitiveTopology(pPipeline->graphicsPipelineCI.pInputAssemblyState->topology));
}
}
@@ -1141,42 +1348,50 @@
if ((pPipeline->graphicsPipelineCI.pRasterizationState->depthClampEnable == VK_TRUE) &&
(!enabled_features.core.depthClamp)) {
skip |= LogError(device, "VUID-VkPipelineRasterizationStateCreateInfo-depthClampEnable-00782",
- "vkCreateGraphicsPipelines(): the depthClamp device feature is disabled: the depthClampEnable member "
- "of the VkPipelineRasterizationStateCreateInfo structure must be set to VK_FALSE.");
+ "vkCreateGraphicsPipelines() pCreateInfo[%u]: the depthClamp device feature is disabled: the "
+ "depthClampEnable member "
+ "of the VkPipelineRasterizationStateCreateInfo structure must be set to VK_FALSE.",
+ pipelineIndex);
}
if (!IsDynamic(pPipeline, VK_DYNAMIC_STATE_DEPTH_BIAS) &&
(pPipeline->graphicsPipelineCI.pRasterizationState->depthBiasClamp != 0.0) && (!enabled_features.core.depthBiasClamp)) {
- skip |=
- LogError(device, kVUID_Core_DrawState_InvalidFeature,
- "vkCreateGraphicsPipelines(): the depthBiasClamp device feature is disabled: the depthBiasClamp member "
- "of the VkPipelineRasterizationStateCreateInfo structure must be set to 0.0 unless the "
- "VK_DYNAMIC_STATE_DEPTH_BIAS dynamic state is enabled");
+ skip |= LogError(device, kVUID_Core_DrawState_InvalidFeature,
+ "vkCreateGraphicsPipelines() pCreateInfo[%u]: the depthBiasClamp device feature is disabled: the "
+ "depthBiasClamp member "
+ "of the VkPipelineRasterizationStateCreateInfo structure must be set to 0.0 unless the "
+ "VK_DYNAMIC_STATE_DEPTH_BIAS dynamic state is enabled",
+ pipelineIndex);
}
// If rasterization is enabled...
if (pPipeline->graphicsPipelineCI.pRasterizationState->rasterizerDiscardEnable == VK_FALSE) {
if ((pPipeline->graphicsPipelineCI.pMultisampleState->alphaToOneEnable == VK_TRUE) &&
(!enabled_features.core.alphaToOne)) {
- skip |= LogError(device, "VUID-VkPipelineMultisampleStateCreateInfo-alphaToOneEnable-00785",
- "vkCreateGraphicsPipelines(): the alphaToOne device feature is disabled: the alphaToOneEnable "
- "member of the VkPipelineMultisampleStateCreateInfo structure must be set to VK_FALSE.");
+ skip |= LogError(
+ device, "VUID-VkPipelineMultisampleStateCreateInfo-alphaToOneEnable-00785",
+ "vkCreateGraphicsPipelines() pCreateInfo[%u]: the alphaToOne device feature is disabled: the alphaToOneEnable "
+ "member of the VkPipelineMultisampleStateCreateInfo structure must be set to VK_FALSE.",
+ pipelineIndex);
}
// If subpass uses a depth/stencil attachment, pDepthStencilState must be a pointer to a valid structure
if (subpass_desc && subpass_desc->pDepthStencilAttachment &&
subpass_desc->pDepthStencilAttachment->attachment != VK_ATTACHMENT_UNUSED) {
if (!pPipeline->graphicsPipelineCI.pDepthStencilState) {
- skip |= LogError(device, "VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00752",
- "Invalid Pipeline CreateInfo State: pDepthStencilState is NULL when rasterization is enabled "
- "and subpass uses a depth/stencil attachment.");
+ skip |=
+ LogError(device, "VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00752",
+ "Invalid Pipeline CreateInfo[%u] State: pDepthStencilState is NULL when rasterization is enabled "
+ "and subpass uses a depth/stencil attachment.",
+ pipelineIndex);
} else if ((pPipeline->graphicsPipelineCI.pDepthStencilState->depthBoundsTestEnable == VK_TRUE) &&
(!enabled_features.core.depthBounds)) {
skip |= LogError(device, "VUID-VkPipelineDepthStencilStateCreateInfo-depthBoundsTestEnable-00598",
- "vkCreateGraphicsPipelines(): the depthBounds device feature is disabled: the "
+ "vkCreateGraphicsPipelines() pCreateInfo[%u]: the depthBounds device feature is disabled: the "
"depthBoundsTestEnable member of the VkPipelineDepthStencilStateCreateInfo structure must be "
- "set to VK_FALSE.");
+ "set to VK_FALSE.",
+ pipelineIndex);
}
}
@@ -1189,10 +1404,11 @@
}
}
if (color_attachment_count > 0 && pPipeline->graphicsPipelineCI.pColorBlendState == nullptr) {
- skip |=
- LogError(device, "VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00753",
- "Invalid Pipeline CreateInfo State: pColorBlendState is NULL when rasterization is enabled and "
- "subpass uses color attachments.");
+ skip |= LogError(
+ device, "VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00753",
+ "Invalid Pipeline CreateInfo[%u] State: pColorBlendState is NULL when rasterization is enabled and "
+ "subpass uses color attachments.",
+ pipelineIndex);
}
}
}
@@ -1200,7 +1416,7 @@
if ((pPipeline->active_shaders & VK_SHADER_STAGE_VERTEX_BIT) && !pPipeline->graphicsPipelineCI.pVertexInputState) {
skip |= LogError(device, "VUID-VkGraphicsPipelineCreateInfo-pStages-02097",
- "Invalid Pipeline CreateInfo State: Missing pVertexInputState.");
+ "Invalid Pipeline CreateInfo[%u] State: Missing pVertexInputState.", pipelineIndex);
}
auto vi = pPipeline->graphicsPipelineCI.pVertexInputState;
@@ -1221,6 +1437,7 @@
}
if (subpass_desc && pPipeline->graphicsPipelineCI.pMultisampleState) {
+ const safe_VkPipelineMultisampleStateCreateInfo *multisample_state = pPipeline->graphicsPipelineCI.pMultisampleState;
auto accumColorSamples = [subpass_desc, pPipeline](uint32_t &samples) {
for (uint32_t i = 0; i < subpass_desc->colorAttachmentCount; i++) {
const auto attachment = subpass_desc->pColorAttachments[i].attachment;
@@ -1268,14 +1485,12 @@
pPipeline->rp_state->createInfo.pAttachments[subpass_desc->pDepthStencilAttachment->attachment].samples);
}
if ((pPipeline->graphicsPipelineCI.pRasterizationState->rasterizerDiscardEnable == VK_FALSE) &&
- (pPipeline->graphicsPipelineCI.pMultisampleState->rasterizationSamples != max_sample_count)) {
- skip |=
- LogError(device, "VUID-VkGraphicsPipelineCreateInfo-subpass-01505",
- "vkCreateGraphicsPipelines: pCreateInfo[%d].pMultisampleState->rasterizationSamples (%s) != max "
- "attachment samples (%s) used in subpass %u.",
- pipelineIndex,
- string_VkSampleCountFlagBits(pPipeline->graphicsPipelineCI.pMultisampleState->rasterizationSamples),
- string_VkSampleCountFlagBits(max_sample_count), pPipeline->graphicsPipelineCI.subpass);
+ (multisample_state->rasterizationSamples != max_sample_count)) {
+ skip |= LogError(device, "VUID-VkGraphicsPipelineCreateInfo-subpass-01505",
+ "vkCreateGraphicsPipelines: pCreateInfo[%d].pMultisampleState->rasterizationSamples (%s) != max "
+ "attachment samples (%s) used in subpass %u.",
+ pipelineIndex, string_VkSampleCountFlagBits(multisample_state->rasterizationSamples),
+ string_VkSampleCountFlagBits(max_sample_count), pPipeline->graphicsPipelineCI.subpass);
}
}
@@ -1314,9 +1529,8 @@
pipelineIndex, raster_samples, subpass_color_samples);
}
- if (pPipeline->graphicsPipelineCI.pMultisampleState) {
- if ((raster_samples > subpass_color_samples) &&
- (pPipeline->graphicsPipelineCI.pMultisampleState->sampleShadingEnable == VK_TRUE)) {
+ if (multisample_state) {
+ if ((raster_samples > subpass_color_samples) && (multisample_state->sampleShadingEnable == VK_TRUE)) {
skip |=
LogError(device, "VUID-VkPipelineMultisampleStateCreateInfo-rasterizationSamples-01415",
"vkCreateGraphicsPipelines: pCreateInfo[%d].pMultisampleState->sampleShadingEnable must be "
@@ -1327,8 +1541,8 @@
pipelineIndex, pipelineIndex, raster_samples, subpass_color_samples);
}
- const auto *coverage_modulation_state = lvl_find_in_chain<VkPipelineCoverageModulationStateCreateInfoNV>(
- pPipeline->graphicsPipelineCI.pMultisampleState->pNext);
+ const auto *coverage_modulation_state =
+ lvl_find_in_chain<VkPipelineCoverageModulationStateCreateInfoNV>(multisample_state->pNext);
if (coverage_modulation_state && (coverage_modulation_state->coverageModulationTableEnable == VK_TRUE)) {
if (coverage_modulation_state->coverageModulationTableCount != (raster_samples / subpass_color_samples)) {
@@ -1344,8 +1558,7 @@
}
if (device_extensions.vk_nv_fragment_coverage_to_color) {
- const auto coverage_to_color_state =
- lvl_find_in_chain<VkPipelineCoverageToColorStateCreateInfoNV>(pPipeline->graphicsPipelineCI.pMultisampleState);
+ const auto coverage_to_color_state = lvl_find_in_chain<VkPipelineCoverageToColorStateCreateInfoNV>(multisample_state);
if (coverage_to_color_state && coverage_to_color_state->coverageToColorEnable == VK_TRUE) {
bool attachment_is_valid = false;
@@ -1367,21 +1580,24 @@
attachment_is_valid = true;
break;
default:
- string_sprintf(&error_detail, "references an attachment with an invalid format (%s).",
- string_VkFormat(color_attachment.format));
+ std::ostringstream str;
+ str << "references an attachment with an invalid format ("
+ << string_VkFormat(color_attachment.format) << ").";
+ error_detail = str.str();
break;
}
} else {
- string_sprintf(&error_detail,
- "references an invalid attachment. The subpass pColorAttachments[%" PRIu32
- "].attachment has the value "
- "VK_ATTACHMENT_UNUSED.",
- coverage_to_color_state->coverageToColorLocation);
+ std::ostringstream str;
+ str << "references an invalid attachment. The subpass pColorAttachments["
+ << coverage_to_color_state->coverageToColorLocation
+ << "].attachment has the value VK_ATTACHMENT_UNUSED.";
+ error_detail = str.str();
}
} else {
- string_sprintf(&error_detail,
- "references an non-existing attachment since the subpass colorAttachmentCount is %" PRIu32 ".",
- subpass_desc->colorAttachmentCount);
+ std::ostringstream str;
+ str << "references an non-existing attachment since the subpass colorAttachmentCount is "
+ << subpass_desc->colorAttachmentCount << ".";
+ error_detail = str.str();
}
if (!attachment_is_valid) {
@@ -1393,6 +1609,74 @@
}
}
}
+
+ if (device_extensions.vk_ext_sample_locations) {
+ const VkPipelineSampleLocationsStateCreateInfoEXT *sample_location_state =
+ lvl_find_in_chain<VkPipelineSampleLocationsStateCreateInfoEXT>(multisample_state->pNext);
+
+ if (sample_location_state != nullptr) {
+ if ((sample_location_state->sampleLocationsEnable == VK_TRUE) &&
+ (IsDynamic(pPipeline, VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT) == false)) {
+ const VkSampleLocationsInfoEXT sample_location_info = sample_location_state->sampleLocationsInfo;
+ skip |= ValidateSampleLocationsInfo(&sample_location_info, "vkCreateGraphicsPipelines");
+ const VkExtent2D grid_size = sample_location_info.sampleLocationGridSize;
+
+ VkMultisamplePropertiesEXT multisample_prop;
+ DispatchGetPhysicalDeviceMultisamplePropertiesEXT(physical_device, multisample_state->rasterizationSamples,
+ &multisample_prop);
+ const VkExtent2D max_grid_size = multisample_prop.maxSampleLocationGridSize;
+
+ // Note order or "divide" in "sampleLocationsInfo must evenly divide VkMultisamplePropertiesEXT"
+ if (SafeModulo(max_grid_size.width, grid_size.width) != 0) {
+ skip |= LogError(
+ device, "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01521",
+ "vkCreateGraphicsPipelines() pCreateInfo[%u]: Because there is no dynamic state for Sample Location "
+ "and sampleLocationEnable is true, the "
+ "VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsInfo::sampleLocationGridSize.width (%u) "
+ "must be evenly divided by VkMultisamplePropertiesEXT::sampleLocationGridSize.width (%u).",
+ pipelineIndex, grid_size.width, max_grid_size.width);
+ }
+ if (SafeModulo(max_grid_size.height, grid_size.height) != 0) {
+ skip |= LogError(
+ device, "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01522",
+ "vkCreateGraphicsPipelines() pCreateInfo[%u]: Because there is no dynamic state for Sample Location "
+ "and sampleLocationEnable is true, the "
+ "VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsInfo::sampleLocationGridSize.height (%u) "
+ "must be evenly divided by VkMultisamplePropertiesEXT::sampleLocationGridSize.height (%u).",
+ pipelineIndex, grid_size.height, max_grid_size.height);
+ }
+ if (sample_location_info.sampleLocationsPerPixel != multisample_state->rasterizationSamples) {
+ skip |= LogError(
+ device, "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01523",
+ "vkCreateGraphicsPipelines() pCreateInfo[%u]: Because there is no dynamic state for Sample Location "
+ "and sampleLocationEnable is true, the "
+ "VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsInfo::sampleLocationsPerPixel (%s) must "
+ "be the same as the VkPipelineMultisampleStateCreateInfo::rasterizationSamples (%s).",
+ pipelineIndex, string_VkSampleCountFlagBits(sample_location_info.sampleLocationsPerPixel),
+ string_VkSampleCountFlagBits(multisample_state->rasterizationSamples));
+ }
+ }
+ }
+ }
+ }
+
+ skip |= ValidatePipelineCacheControlFlags(pPipeline->graphicsPipelineCI.flags, pipelineIndex, "vkCreateGraphicsPipelines",
+ "VUID-VkGraphicsPipelineCreateInfo-pipelineCreationCacheControl-02878");
+
+ // VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03378
+ if (!enabled_features.extended_dynamic_state_features.extendedDynamicState &&
+ (IsDynamic(pPipeline, VK_DYNAMIC_STATE_CULL_MODE_EXT) || IsDynamic(pPipeline, VK_DYNAMIC_STATE_FRONT_FACE_EXT) ||
+ IsDynamic(pPipeline, VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT) ||
+ IsDynamic(pPipeline, VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT) ||
+ IsDynamic(pPipeline, VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT) ||
+ IsDynamic(pPipeline, VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT) ||
+ IsDynamic(pPipeline, VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT) ||
+ IsDynamic(pPipeline, VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT) ||
+ IsDynamic(pPipeline, VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT) ||
+ IsDynamic(pPipeline, VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT) ||
+ IsDynamic(pPipeline, VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT) || IsDynamic(pPipeline, VK_DYNAMIC_STATE_STENCIL_OP_EXT))) {
+ skip |= LogError(device, "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03378",
+ "Extended dynamic state used by the extendedDynamicState feature is not enabled");
}
return skip;
@@ -1405,7 +1689,7 @@
// Return false if no errors occur
// Return true if validation error occurs and callback returns true (to skip upcoming API call down the chain)
bool CoreChecks::ValidateIdleDescriptorSet(VkDescriptorSet set, const char *func_str) const {
- if (disabled.idle_descriptor_set) return false;
+ if (disabled[idle_descriptor_set]) return false;
bool skip = false;
auto set_node = setMap.find(set);
if (set_node == setMap.end()) {
@@ -1461,6 +1745,28 @@
return false;
}
+bool CoreChecks::ValidateSampleLocationsInfo(const VkSampleLocationsInfoEXT *pSampleLocationsInfo, const char *apiName) const {
+ bool skip = false;
+ const VkSampleCountFlagBits sample_count = pSampleLocationsInfo->sampleLocationsPerPixel;
+ const uint32_t sample_total_size = pSampleLocationsInfo->sampleLocationGridSize.width *
+ pSampleLocationsInfo->sampleLocationGridSize.height * SampleCountSize(sample_count);
+ if (pSampleLocationsInfo->sampleLocationsCount != sample_total_size) {
+ skip |= LogError(device, "VUID-VkSampleLocationsInfoEXT-sampleLocationsCount-01527",
+ "%s: VkSampleLocationsInfoEXT::sampleLocationsCount (%u) must equal grid width * grid height * pixel "
+ "sample rate which currently is (%u * %u * %u).",
+ apiName, pSampleLocationsInfo->sampleLocationsCount, pSampleLocationsInfo->sampleLocationGridSize.width,
+ pSampleLocationsInfo->sampleLocationGridSize.height, SampleCountSize(sample_count));
+ }
+ if ((phys_dev_ext_props.sample_locations_props.sampleLocationSampleCounts & sample_count) == 0) {
+ skip |= LogError(device, "VUID-VkSampleLocationsInfoEXT-sampleLocationsPerPixel-01526",
+ "%s: VkSampleLocationsInfoEXT::sampleLocationsPerPixel of %s is not supported by the device, please check "
+ "VkPhysicalDeviceSampleLocationsPropertiesEXT::sampleLocationSampleCounts for valid sample counts.",
+ apiName, string_VkSampleCountFlagBits(sample_count));
+ }
+
+ return skip;
+}
+
static char const *GetCauseStr(VulkanTypedHandle obj) {
if (obj.type == kVulkanObjectTypeDescriptorSet) return "destroyed or updated";
if (obj.type == kVulkanObjectTypeCommandBuffer) return "destroyed or rerecorded";
@@ -1472,7 +1778,9 @@
for (auto obj : cb_state->broken_bindings) {
const char *cause_str = GetCauseStr(obj);
string VUID;
- string_sprintf(&VUID, "%s-%s", kVUID_Core_DrawState_InvalidCommandBuffer, object_string[obj.type]);
+ std::ostringstream str;
+ str << kVUID_Core_DrawState_InvalidCommandBuffer << "-" << object_string[obj.type];
+ VUID = str.str();
LogObjectList objlist(cb_state->commandBuffer);
objlist.add(obj);
skip |=
@@ -1485,6 +1793,105 @@
// 'commandBuffer must be in the recording state' valid usage error code for each command
// Autogenerated as part of the vk_validation_error_message.h codegen
static const std::array<const char *, CMD_RANGE_SIZE> must_be_recording_list = {{VUID_MUST_BE_RECORDING_LIST}};
+// This accounts for the following VUIDs, enumerated here for search and tracking purposes:
+// VUID-vkCmdBeginConditionalRenderingEXT-commandBuffer-recording
+// VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-recording
+// VUID-vkCmdBeginQuery-commandBuffer-recording
+// VUID-vkCmdBeginQueryIndexedEXT-commandBuffer-recording
+// VUID-vkCmdBeginRenderPass-commandBuffer-recording
+// VUID-vkCmdBeginRenderPass2-commandBuffer-recording
+// VUID-vkCmdBeginTransformFeedbackEXT-commandBuffer-recording
+// VUID-vkCmdBindDescriptorSets-commandBuffer-recording
+// VUID-vkCmdBindIndexBuffer-commandBuffer-recording
+// VUID-vkCmdBindPipeline-commandBuffer-recording
+// VUID-vkCmdBindPipelineShaderGroupNV-commandBuffer-recording
+// VUID-vkCmdBindShadingRateImageNV-commandBuffer-recording
+// VUID-vkCmdBindTransformFeedbackBuffersEXT-commandBuffer-recording
+// VUID-vkCmdBindVertexBuffers-commandBuffer-recording
+// VUID-vkCmdBlitImage-commandBuffer-recording
+// VUID-vkCmdBuildAccelerationStructureIndirectKHR-commandBuffer-recording
+// VUID-vkCmdBuildAccelerationStructureKHR-commandBuffer-recording
+// VUID-vkCmdBuildAccelerationStructureNV-commandBuffer-recording
+// VUID-vkCmdClearAttachments-commandBuffer-recording
+// VUID-vkCmdClearColorImage-commandBuffer-recording
+// VUID-vkCmdClearDepthStencilImage-commandBuffer-recording
+// VUID-vkCmdCopyAccelerationStructureKHR-commandBuffer-recording
+// VUID-vkCmdCopyAccelerationStructureNV-commandBuffer-recording
+// VUID-vkCmdCopyAccelerationStructureToMemoryKHR-commandBuffer-recording
+// VUID-vkCmdCopyBuffer-commandBuffer-recording
+// VUID-vkCmdCopyBufferToImage-commandBuffer-recording
+// VUID-vkCmdCopyImage-commandBuffer-recording
+// VUID-vkCmdCopyImageToBuffer-commandBuffer-recording
+// VUID-vkCmdCopyMemoryToAccelerationStructureKHR-commandBuffer-recording
+// VUID-vkCmdCopyQueryPoolResults-commandBuffer-recording
+// VUID-vkCmdDebugMarkerBeginEXT-commandBuffer-recording
+// VUID-vkCmdDebugMarkerEndEXT-commandBuffer-recording
+// VUID-vkCmdDebugMarkerInsertEXT-commandBuffer-recording
+// VUID-vkCmdDispatch-commandBuffer-recording
+// VUID-vkCmdDispatchBase-commandBuffer-recording
+// VUID-vkCmdDispatchIndirect-commandBuffer-recording
+// VUID-vkCmdDraw-commandBuffer-recording
+// VUID-vkCmdDrawIndexed-commandBuffer-recording
+// VUID-vkCmdDrawIndexedIndirect-commandBuffer-recording
+// VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-recording
+// VUID-vkCmdDrawIndirect-commandBuffer-recording
+// VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-recording
+// VUID-vkCmdDrawIndirectCount-commandBuffer-recording
+// VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-recording
+// VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-recording
+// VUID-vkCmdDrawMeshTasksNV-commandBuffer-recording
+// VUID-vkCmdEndConditionalRenderingEXT-commandBuffer-recording
+// VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-recording
+// VUID-vkCmdEndQuery-commandBuffer-recording
+// VUID-vkCmdEndQueryIndexedEXT-commandBuffer-recording
+// VUID-vkCmdEndRenderPass-commandBuffer-recording
+// VUID-vkCmdEndRenderPass2-commandBuffer-recording
+// VUID-vkCmdEndTransformFeedbackEXT-commandBuffer-recording
+// VUID-vkCmdExecuteCommands-commandBuffer-recording
+// VUID-vkCmdExecuteGeneratedCommandsNV-commandBuffer-recording
+// VUID-vkCmdFillBuffer-commandBuffer-recording
+// VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-recording
+// VUID-vkCmdNextSubpass-commandBuffer-recording
+// VUID-vkCmdNextSubpass2-commandBuffer-recording
+// VUID-vkCmdPipelineBarrier-commandBuffer-recording
+// VUID-vkCmdPreprocessGeneratedCommandsNV-commandBuffer-recording
+// VUID-vkCmdPushConstants-commandBuffer-recording
+// VUID-vkCmdPushDescriptorSetKHR-commandBuffer-recording
+// VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-recording
+// VUID-vkCmdResetEvent-commandBuffer-recording
+// VUID-vkCmdResetQueryPool-commandBuffer-recording
+// VUID-vkCmdResolveImage-commandBuffer-recording
+// VUID-vkCmdSetBlendConstants-commandBuffer-recording
+// VUID-vkCmdSetCheckpointNV-commandBuffer-recording
+// VUID-vkCmdSetCoarseSampleOrderNV-commandBuffer-recording
+// VUID-vkCmdSetDepthBias-commandBuffer-recording
+// VUID-vkCmdSetDepthBounds-commandBuffer-recording
+// VUID-vkCmdSetDeviceMask-commandBuffer-recording
+// VUID-vkCmdSetDiscardRectangleEXT-commandBuffer-recording
+// VUID-vkCmdSetEvent-commandBuffer-recording
+// VUID-vkCmdSetExclusiveScissorNV-commandBuffer-recording
+// VUID-vkCmdSetLineStippleEXT-commandBuffer-recording
+// VUID-vkCmdSetLineWidth-commandBuffer-recording
+// VUID-vkCmdSetPerformanceMarkerINTEL-commandBuffer-recording
+// VUID-vkCmdSetPerformanceOverrideINTEL-commandBuffer-recording
+// VUID-vkCmdSetPerformanceStreamMarkerINTEL-commandBuffer-recording
+// VUID-vkCmdSetSampleLocationsEXT-commandBuffer-recording
+// VUID-vkCmdSetScissor-commandBuffer-recording
+// VUID-vkCmdSetStencilCompareMask-commandBuffer-recording
+// VUID-vkCmdSetStencilReference-commandBuffer-recording
+// VUID-vkCmdSetStencilWriteMask-commandBuffer-recording
+// VUID-vkCmdSetViewport-commandBuffer-recording
+// VUID-vkCmdSetViewportShadingRatePaletteNV-commandBuffer-recording
+// VUID-vkCmdSetViewportWScalingNV-commandBuffer-recording
+// VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-recording
+// VUID-vkCmdTraceRaysKHR-commandBuffer-recording
+// VUID-vkCmdTraceRaysNV-commandBuffer-recording
+// VUID-vkCmdUpdateBuffer-commandBuffer-recording
+// VUID-vkCmdWaitEvents-commandBuffer-recording
+// VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-commandBuffer-recording
+// VUID-vkCmdWriteBufferMarkerAMD-commandBuffer-recording
+// VUID-vkCmdWriteTimestamp-commandBuffer-recording
+// VUID-vkEndCommandBuffer-commandBuffer-00059
// Validate the given command being added to the specified cmd buffer, flagging errors if CB is not in the recording state or if
// there's an issue with the Cmd ordering
@@ -1505,6 +1912,25 @@
}
}
+bool CoreChecks::ValidateIndirectCmd(VkCommandBuffer command_buffer, VkBuffer buffer, CMD_TYPE cmd_type,
+ const char *caller_name) const {
+ bool skip = false;
+ const DrawDispatchVuid vuid = GetDrawDispatchVuid(cmd_type);
+ const CMD_BUFFER_STATE *cb_state = GetCBState(command_buffer);
+ const BUFFER_STATE *buffer_state = GetBufferState(buffer);
+
+ if ((cb_state != nullptr) && (buffer_state != nullptr)) {
+ skip |= ValidateMemoryIsBoundToBuffer(buffer_state, caller_name, vuid.indirect_contiguous_memory);
+ skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true, vuid.indirect_buffer_bit,
+ caller_name, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
+ if (cb_state->unprotected == false) {
+ skip |= LogError(cb_state->commandBuffer, vuid.indirect_protected_cb,
+ "%s: Indirect commands can't be used in protected command buffers.", caller_name);
+ }
+ }
+ return skip;
+}
+
template <typename T1>
bool CoreChecks::ValidateDeviceMaskToPhysicalDeviceCount(uint32_t deviceMask, const T1 object, const char *VUID) const {
bool skip = false;
@@ -1715,6 +2141,17 @@
return skip;
}
+bool CoreChecks::ValidateStageMaskHost(VkPipelineStageFlags stageMask, const char *caller, const char *vuid) const {
+ bool skip = false;
+ if ((stageMask & VK_PIPELINE_STAGE_HOST_BIT) != 0) {
+ skip |= LogError(
+ device, vuid,
+ "%s: stage mask must not include VK_PIPELINE_STAGE_HOST_BIT as the stage can't be invoked inside a command buffer.",
+ caller);
+ }
+ return skip;
+}
+
// Note: This function assumes that the global lock is held by the calling thread.
// For the given queue, verify the queue state up to the given seq number.
// Currently the only check is to make sure that if there are events to be waited on prior to
@@ -1785,7 +2222,7 @@
bool CoreChecks::ValidateCommandBufferState(const CMD_BUFFER_STATE *cb_state, const char *call_source, int current_submit_count,
const char *vu_id) const {
bool skip = false;
- if (disabled.command_buffer_state) return skip;
+ if (disabled[command_buffer_state]) return skip;
// Validate ONE_TIME_SUBMIT_BIT CB is not being submitted more than once
if ((cb_state->beginInfo.flags & VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT) &&
(cb_state->submitCount + current_submit_count > 1)) {
@@ -1884,68 +2321,6 @@
return skip;
}
-// Validate that a command buffer submitted had the performance locked hold
-// when recording command if it contains performance queries.
-bool CoreChecks::ValidatePerformanceQueries(const CMD_BUFFER_STATE *pCB, VkQueue queue, VkQueryPool &first_query_pool,
- uint32_t counterPassIndex) const {
- bool skip = false;
- bool different_pools = false;
- bool indexed_different_pool = false;
-
- if (pCB->createInfo.level == VK_COMMAND_BUFFER_LEVEL_PRIMARY) {
- for (const auto &secondaryCB : pCB->linkedCommandBuffers)
- skip |= ValidatePerformanceQueries(secondaryCB, queue, first_query_pool, counterPassIndex);
- }
-
- for (const auto &query : pCB->startedQueries) {
- const auto query_pool_state = GetQueryPoolState(query.pool);
-
- if (query_pool_state->createInfo.queryType != VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) continue;
-
- if (counterPassIndex >= query_pool_state->n_performance_passes) {
- skip |= LogError(pCB->commandBuffer, "VUID-VkPerformanceQuerySubmitInfoKHR-counterPassIndex-03221",
- "Invalid counterPassIndex (%u, maximum allowed %u) value for query pool %s.", counterPassIndex,
- query_pool_state->n_performance_passes, report_data->FormatHandle(query.pool).c_str());
- }
-
- if (!pCB->performance_lock_acquired || pCB->performance_lock_released) {
- skip |= LogError(pCB->commandBuffer, "VUID-vkQueueSubmit-pCommandBuffers-03220",
- "Commandbuffer %s was submitted and contains a performance query but the"
- "profiling lock was not held continuously throughout the recording of commands.",
- report_data->FormatHandle(pCB->commandBuffer).c_str());
- }
-
- if (query_pool_state->has_perf_scope_command_buffer && (pCB->commandCount - 1) != query.endCommandIndex) {
- LogObjectList objlist(pCB->commandBuffer);
- objlist.add(query.pool);
- skip |= LogError(objlist, "VUID-vkCmdEndQuery-queryPool-03227",
- "vkCmdEndQuery: Query pool %s was created with a counter of scope"
- "VK_QUERY_SCOPE_COMMAND_BUFFER_KHR but the end of the query is not the last "
- "command in the command buffer %s.",
- report_data->FormatHandle(query.pool).c_str(), report_data->FormatHandle(pCB->commandBuffer).c_str());
- }
-
- if (first_query_pool != VK_NULL_HANDLE) {
- if (query_pool_state->pool != first_query_pool) {
- different_pools = true;
- indexed_different_pool = query.indexed;
- }
- } else
- first_query_pool = query_pool_state->pool;
- }
-
- if (different_pools && !enabled_features.performance_query_features.performanceCounterMultipleQueryPools) {
- skip |= LogError(
- pCB->commandBuffer,
- indexed_different_pool ? "VUID-vkCmdBeginQueryIndexedEXT-queryPool-03226" : "VUID-vkCmdBeginQuery-queryPool-03226",
- "Commandbuffer %s contains more than one performance query pool but "
- "performanceCounterMultipleQueryPools is not enabled.",
- report_data->FormatHandle(pCB->commandBuffer).c_str());
- }
-
- return skip;
-}
-
bool CoreChecks::ValidatePrimaryCommandBufferState(const CMD_BUFFER_STATE *pCB, int current_submit_count,
QFOTransferCBScoreboards<VkImageMemoryBarrier> *qfo_image_scoreboards,
QFOTransferCBScoreboards<VkBufferMemoryBarrier> *qfo_buffer_scoreboards) const {
@@ -1993,14 +2368,14 @@
if (pFence && pFence->scope == kSyncScopeInternal) {
if (pFence->state == FENCE_INFLIGHT) {
// TODO: opportunities for "VUID-vkQueueSubmit-fence-00064", "VUID-vkQueueBindSparse-fence-01114",
- // "VUID-vkAcquireNextImageKHR-fence-01287"
+ // TODO: "VUID-vkAcquireNextImageKHR-fence-01287"
skip |= LogError(pFence->fence, kVUID_Core_DrawState_InvalidFence, "%s is already in use by another submission.",
report_data->FormatHandle(pFence->fence).c_str());
}
else if (pFence->state == FENCE_RETIRED) {
// TODO: opportunities for "VUID-vkQueueSubmit-fence-00063", "VUID-vkQueueBindSparse-fence-01113",
- // "VUID-vkAcquireNextImageKHR-fence-01287"
+ // TODO: "VUID-vkAcquireNextImageKHR-fence-01287"
skip |= LogError(pFence->fence, kVUID_Core_MemTrack_FenceState,
"%s submitted in SIGNALED state. Fences must be reset before being submitted",
report_data->FormatHandle(pFence->fence).c_str());
@@ -2014,6 +2389,7 @@
VkResult result) {
StateTracker::PostCallRecordQueueSubmit(queue, submitCount, pSubmits, fence, result);
+ if (result != VK_SUCCESS) return;
// The triply nested for duplicates that in the StateTracker, but avoids the need for two additional callbacks.
for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
const VkSubmitInfo *submit = &pSubmits[submit_idx];
@@ -2063,6 +2439,7 @@
ValidateStageMaskGsTsEnables(submit->pWaitDstStageMask[i], "vkQueueSubmit()",
"VUID-VkSubmitInfo-pWaitDstStageMask-00076", "VUID-VkSubmitInfo-pWaitDstStageMask-00077",
"VUID-VkSubmitInfo-pWaitDstStageMask-02089", "VUID-VkSubmitInfo-pWaitDstStageMask-02090");
+ skip |= ValidateStageMaskHost(submit->pWaitDstStageMask[i], "vkQueueSubmit()", "VUID-VkSubmitInfo-pWaitDstStageMask-00078");
VkSemaphore semaphore = submit->pWaitSemaphores[i];
const auto *pSemaphore = GetSemaphoreState(semaphore);
if (pSemaphore && pSemaphore->type == VK_SEMAPHORE_TYPE_TIMELINE_KHR && !timeline_semaphore_submit_info) {
@@ -2087,8 +2464,8 @@
objlist.add(queue);
skip |= LogError(objlist,
pSemaphore->scope == kSyncScopeInternal ? vuid_error : kVUID_Core_DrawState_QueueForwardProgress,
- "%s is waiting on %s that has no way to be signaled.", report_data->FormatHandle(queue).c_str(),
- report_data->FormatHandle(semaphore).c_str());
+ "vkQueueSubmit: %s is waiting on %s that has no way to be signaled.",
+ report_data->FormatHandle(queue).c_str(), report_data->FormatHandle(semaphore).c_str());
} else {
signaled_semaphores.erase(semaphore);
unsignaled_semaphores.insert(semaphore);
@@ -2128,7 +2505,7 @@
objlist.add(queue);
objlist.add(pSemaphore->signaler.first);
skip |= LogError(objlist, kVUID_Core_DrawState_QueueForwardProgress,
- "%s is signaling %s that was previously signaled by %s but has not since "
+ "vkQueueSubmit: %s is signaling %s that was previously signaled by %s but has not since "
"been waited on by any queue.",
report_data->FormatHandle(queue).c_str(), report_data->FormatHandle(semaphore).c_str(),
report_data->FormatHandle(pSemaphore->signaler.first).c_str());
@@ -2146,6 +2523,9 @@
const char *vuid) const {
bool skip = false;
const auto pSemaphore = GetSemaphoreState(semaphore);
+
+ if (pSemaphore->type != VK_SEMAPHORE_TYPE_TIMELINE_KHR) return false;
+
uint64_t diff = value > pSemaphore->payload ? value - pSemaphore->payload : pSemaphore->payload - value;
if (diff > phys_dev_props_core12.maxTimelineSemaphoreValueDifference) {
@@ -2195,6 +2575,7 @@
EventToStageMap localEventToStageMap;
const auto perf_submit = lvl_find_in_chain<VkPerformanceQuerySubmitInfoKHR>(submit->pNext);
+ uint32_t perf_pass = perf_submit ? perf_submit->counterPassIndex : 0;
for (uint32_t i = 0; i < submit->commandBufferCount; i++) {
const auto *cb_node = GetCBState(submit->pCommandBuffers[i]);
@@ -2205,8 +2586,6 @@
cb_node, (int)std::count(current_cmds.begin(), current_cmds.end(), submit->pCommandBuffers[i]),
&qfo_image_scoreboards, &qfo_buffer_scoreboards);
skip |= ValidateQueueFamilyIndices(cb_node, queue);
- VkQueryPool first_query_pool = VK_NULL_HANDLE;
- skip |= ValidatePerformanceQueries(cb_node, queue, first_query_pool, perf_submit ? perf_submit->counterPassIndex : 0);
for (auto descriptorSet : cb_node->validate_descriptorsets_in_queuesubmit) {
const cvdescriptorset::DescriptorSet *set_node = GetSetNode(descriptorSet.first);
@@ -2216,13 +2595,9 @@
std::string error;
std::vector<uint32_t> dynamicOffsets;
// dynamic data isn't allowed in UPDATE_AFTER_BIND, so dynamicOffsets is always empty.
- if (!ValidateDescriptorSetBindingData(cb_node, set_node, dynamicOffsets, binding.first, binding.second,
- "vkQueueSubmit()", &error)) {
- skip |= LogError(descriptorSet.first, kVUID_Core_DrawState_DescriptorSetNotUpdated,
- "%s bound the following validation error at %s time: %s",
- report_data->FormatHandle(descriptorSet.first).c_str(), "vkQueueSubmit()",
- error.c_str());
- }
+ skip |= ValidateDescriptorSetBindingData(cb_node, set_node, dynamicOffsets, binding.first,
+ binding.second.requirements, "vkQueueSubmit()",
+ GetDrawDispatchVuid(binding.second.cmd_type));
}
}
}
@@ -2240,8 +2615,9 @@
for (auto &function : cb_node->eventUpdates) {
skip |= function(this, /*do_validate*/ true, &localEventToStageMap);
}
+ VkQueryPool first_perf_query_pool = VK_NULL_HANDLE;
for (auto &function : cb_node->queryUpdates) {
- skip |= function(this, /*do_validate*/ true, local_query_to_state_map);
+ skip |= function(this, /*do_validate*/ true, first_perf_query_pool, perf_pass, local_query_to_state_map);
}
}
}
@@ -2285,16 +2661,20 @@
const VkSubmitInfo *submit = &pSubmits[submit_idx];
auto *info = lvl_find_in_chain<VkTimelineSemaphoreSubmitInfoKHR>(submit->pNext);
if (info) {
- for (uint32_t i = 0; i < submit->waitSemaphoreCount; ++i) {
- VkSemaphore semaphore = submit->pWaitSemaphores[i];
- skip |= ValidateMaxTimelineSemaphoreValueDifference(semaphore, info->pWaitSemaphoreValues[i], "VkQueueSubmit",
- "VUID-VkSubmitInfo-pWaitSemaphores-03243");
- }
- for (uint32_t i = 0; i < submit->signalSemaphoreCount; ++i) {
- VkSemaphore semaphore = submit->pSignalSemaphores[i];
- skip |= ValidateMaxTimelineSemaphoreValueDifference(semaphore, info->pSignalSemaphoreValues[i], "VkQueueSubmit",
- "VUID-VkSubmitInfo-pSignalSemaphores-03244");
- }
+ // If there are any timeline semaphores, this condition gets checked before the early return above
+ if (info->waitSemaphoreValueCount)
+ for (uint32_t i = 0; i < submit->waitSemaphoreCount; ++i) {
+ VkSemaphore semaphore = submit->pWaitSemaphores[i];
+ skip |= ValidateMaxTimelineSemaphoreValueDifference(semaphore, info->pWaitSemaphoreValues[i], "VkQueueSubmit",
+ "VUID-VkSubmitInfo-pWaitSemaphores-03243");
+ }
+ // If there are any timeline semaphores, this condition gets checked before the early return above
+ if (info->signalSemaphoreValueCount)
+ for (uint32_t i = 0; i < submit->signalSemaphoreCount; ++i) {
+ VkSemaphore semaphore = submit->pSignalSemaphores[i];
+ skip |= ValidateMaxTimelineSemaphoreValueDifference(semaphore, info->pSignalSemaphoreValues[i], "VkQueueSubmit",
+ "VUID-VkSubmitInfo-pSignalSemaphores-03244");
+ }
}
}
@@ -2349,7 +2729,8 @@
// None VK_IMAGE_USAGE_TRANSFER_DST_BIT
// AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE VK_IMAGE_USAGE_SAMPLED_BIT
// AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
-// AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
+// AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
+// AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
// AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT
// AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE None
// AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT VK_IMAGE_CREATE_PROTECTED_BIT
@@ -2359,7 +2740,7 @@
// Same casting rationale. De-mixing the table to prevent type confusion and aliasing
std::map<uint64_t, VkImageUsageFlags> ahb_usage_map_a2v = {
{ (uint64_t)AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE, (VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT) },
- { (uint64_t)AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT },
+ { (uint64_t)AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER, (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) },
{ (uint64_t)AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE, 0 }, // No equivalent
};
@@ -2372,7 +2753,8 @@
std::map<VkImageUsageFlags, uint64_t> ahb_usage_map_v2a = {
{ VK_IMAGE_USAGE_SAMPLED_BIT, (uint64_t)AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE },
{ VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, (uint64_t)AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE },
- { VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, (uint64_t)AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT },
+ { VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, (uint64_t)AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER },
+ { VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, (uint64_t)AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER },
};
std::map<VkImageCreateFlags, uint64_t> ahb_create_map_v2a = {
@@ -2391,7 +2773,7 @@
// buffer must be a valid Android hardware buffer object with at least one of the AHARDWAREBUFFER_USAGE_GPU_* usage flags.
AHardwareBuffer_Desc ahb_desc;
AHardwareBuffer_describe(buffer, &ahb_desc);
- uint32_t required_flags = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE | AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT |
+ uint32_t required_flags = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE | AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER |
AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP | AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE |
AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER;
if (0 == (ahb_desc.usage & required_flags)) {
@@ -2403,16 +2785,6 @@
return skip;
}
-void CoreChecks::PostCallRecordGetAndroidHardwareBufferPropertiesANDROID(VkDevice device, const struct AHardwareBuffer *buffer,
- VkAndroidHardwareBufferPropertiesANDROID *pProperties,
- VkResult result) {
- if (VK_SUCCESS != result) return;
- auto ahb_format_props = lvl_find_in_chain<VkAndroidHardwareBufferFormatPropertiesANDROID>(pProperties->pNext);
- if (ahb_format_props) {
- ahb_ext_formats_set.insert(ahb_format_props->externalFormat);
- }
-}
-
bool CoreChecks::PreCallValidateGetMemoryAndroidHardwareBufferANDROID(VkDevice device,
const VkMemoryGetAndroidHardwareBufferInfoANDROID *pInfo,
struct AHardwareBuffer **pBuffer) const {
@@ -2465,21 +2837,20 @@
AHardwareBuffer_Desc ahb_desc = {};
AHardwareBuffer_describe(import_ahb_info->buffer, &ahb_desc);
- // If buffer is not NULL, it must be a valid Android hardware buffer object with AHardwareBuffer_Desc::format and
- // AHardwareBuffer_Desc::usage compatible with Vulkan as described in Android Hardware Buffers.
+ // Validate AHardwareBuffer_Desc::usage is a valid usage for imported AHB
//
// BLOB & GPU_DATA_BUFFER combo specifically allowed
if ((AHARDWAREBUFFER_FORMAT_BLOB != ahb_desc.format) || (0 == (ahb_desc.usage & AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER))) {
// Otherwise, must be a combination from the AHardwareBuffer Format and Usage Equivalence tables
// Usage must have at least one bit from the table. It may have additional bits not in the table
- uint64_t ahb_equiv_usage_bits = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE | AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT |
+ uint64_t ahb_equiv_usage_bits = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE | AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER |
AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP | AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE |
AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT;
- if ((0 == (ahb_desc.usage & ahb_equiv_usage_bits)) || (0 == ahb_format_map_a2v.count(ahb_desc.format))) {
- skip |= LogError(device, "VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01881",
- "vkAllocateMemory: The AHardwareBuffer_Desc's format ( %u ) and/or usage ( 0x%" PRIx64
- " ) are not compatible with Vulkan.",
- ahb_desc.format, ahb_desc.usage);
+ if (0 == (ahb_desc.usage & ahb_equiv_usage_bits)) {
+ skip |=
+ LogError(device, "VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01881",
+ "vkAllocateMemory: The AHardwareBuffer_Desc's usage (0x%" PRIx64 ") is not compatible with Vulkan.",
+ ahb_desc.usage);
}
}
@@ -2490,48 +2861,48 @@
if (AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE & ahb_desc.usage) {
pdebi.usage |= ahb_usage_map_a2v[AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE];
}
- if (AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT & ahb_desc.usage) {
- pdebi.usage |= ahb_usage_map_a2v[AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT];
+ if (AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER & ahb_desc.usage) {
+ pdebi.usage |= ahb_usage_map_a2v[AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER];
}
VkExternalBufferProperties ext_buf_props = {};
ext_buf_props.sType = VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES;
DispatchGetPhysicalDeviceExternalBufferProperties(physical_device, &pdebi, &ext_buf_props);
- // Collect external format info
- VkPhysicalDeviceExternalImageFormatInfo pdeifi = {};
- pdeifi.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO;
- pdeifi.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
- VkPhysicalDeviceImageFormatInfo2 pdifi2 = {};
- pdifi2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2;
- pdifi2.pNext = &pdeifi;
- if (0 < ahb_format_map_a2v.count(ahb_desc.format)) pdifi2.format = ahb_format_map_a2v[ahb_desc.format];
- pdifi2.type = VK_IMAGE_TYPE_2D; // Seems likely
- pdifi2.tiling = VK_IMAGE_TILING_OPTIMAL; // Ditto
- if (AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE & ahb_desc.usage) {
- pdifi2.usage |= ahb_usage_map_a2v[AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE];
- }
- if (AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT & ahb_desc.usage) {
- pdifi2.usage |= ahb_usage_map_a2v[AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT];
- }
- if (AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP & ahb_desc.usage) {
- pdifi2.flags |= ahb_create_map_a2v[AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP];
- }
- if (AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT & ahb_desc.usage) {
- pdifi2.flags |= ahb_create_map_a2v[AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT];
- }
-
- VkExternalImageFormatProperties ext_img_fmt_props = {};
- ext_img_fmt_props.sType = VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES;
- VkImageFormatProperties2 ifp2 = {};
- ifp2.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2;
- ifp2.pNext = &ext_img_fmt_props;
-
- VkResult fmt_lookup_result = DispatchGetPhysicalDeviceImageFormatProperties2(physical_device, &pdifi2, &ifp2);
-
// If buffer is not NULL, Android hardware buffers must be supported for import, as reported by
// VkExternalImageFormatProperties or VkExternalBufferProperties.
if (0 == (ext_buf_props.externalMemoryProperties.externalMemoryFeatures & VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT)) {
+ // Collect external format info
+ VkPhysicalDeviceExternalImageFormatInfo pdeifi = {};
+ pdeifi.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO;
+ pdeifi.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
+ VkPhysicalDeviceImageFormatInfo2 pdifi2 = {};
+ pdifi2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2;
+ pdifi2.pNext = &pdeifi;
+ if (0 < ahb_format_map_a2v.count(ahb_desc.format)) pdifi2.format = ahb_format_map_a2v[ahb_desc.format];
+ pdifi2.type = VK_IMAGE_TYPE_2D; // Seems likely
+ pdifi2.tiling = VK_IMAGE_TILING_OPTIMAL; // Ditto
+ if (AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE & ahb_desc.usage) {
+ pdifi2.usage |= ahb_usage_map_a2v[AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE];
+ }
+ if (AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER & ahb_desc.usage) {
+ pdifi2.usage |= ahb_usage_map_a2v[AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER];
+ }
+ if (AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP & ahb_desc.usage) {
+ pdifi2.flags |= ahb_create_map_a2v[AHARDWAREBUFFER_USAGE_GPU_CUBE_MAP];
+ }
+ if (AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT & ahb_desc.usage) {
+ pdifi2.flags |= ahb_create_map_a2v[AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT];
+ }
+
+ VkExternalImageFormatProperties ext_img_fmt_props = {};
+ ext_img_fmt_props.sType = VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES;
+ VkImageFormatProperties2 ifp2 = {};
+ ifp2.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2;
+ ifp2.pNext = &ext_img_fmt_props;
+
+ VkResult fmt_lookup_result = DispatchGetPhysicalDeviceImageFormatProperties2(physical_device, &pdifi2, &ifp2);
+
if ((VK_SUCCESS != fmt_lookup_result) || (0 == (ext_img_fmt_props.externalMemoryProperties.externalMemoryFeatures &
VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT))) {
skip |= LogError(device, "VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01880",
@@ -2585,14 +2956,14 @@
} else { // Checks specific to import with a dedicated allocation requirement
const VkImageCreateInfo *ici = &(GetImageState(mem_ded_alloc_info->image)->createInfo);
- // The Android hardware buffer's usage must include at least one of AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT or
+ // The Android hardware buffer's usage must include at least one of AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER or
// AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE
- if (0 == (ahb_desc.usage & (AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT | AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE))) {
+ if (0 == (ahb_desc.usage & (AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER | AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE))) {
skip |= LogError(
device, "VUID-VkMemoryAllocateInfo-pNext-02386",
"vkAllocateMemory: VkMemoryAllocateInfo struct with chained VkImportAndroidHardwareBufferInfoANDROID and a "
"dedicated allocation requirement, while the AHardwareBuffer's usage (0x%" PRIx64
- ") contains neither AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT nor AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE.",
+ ") contains neither AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER nor AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE.",
ahb_desc.usage);
}
@@ -2642,30 +3013,32 @@
// each bit set in the usage of image must be listed in AHardwareBuffer Usage Equivalence, and if there is a
// corresponding AHARDWAREBUFFER_USAGE bit listed that bit must be included in the Android hardware buffer's
// AHardwareBuffer_Desc::usage
- if (ici->usage &
- ~(VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT |
- VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT)) {
+ if (ici->usage & ~(VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT |
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT |
+ VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
skip |=
LogError(device, "VUID-VkMemoryAllocateInfo-pNext-02390",
"vkAllocateMemory: VkMemoryAllocateInfo struct with chained VkImportAndroidHardwareBufferInfoANDROID, "
- "dedicated image usage bits include one or more with no AHardwareBuffer equivalent.");
+ "dedicated image usage bits (0x%" PRIx64
+ ") include an issue not listed in the AHardwareBuffer Usage Equivalence table.",
+ ici->usage);
}
- bool illegal_usage = false;
std::vector<VkImageUsageFlags> usages = {VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT,
- VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT};
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
+ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT};
for (VkImageUsageFlags ubit : usages) {
if (ici->usage & ubit) {
uint64_t ahb_usage = ahb_usage_map_v2a[ubit];
- if (0 == (ahb_usage & ahb_desc.usage)) illegal_usage = true;
+ if (0 == (ahb_usage & ahb_desc.usage)) {
+ skip |= LogError(
+ device, "VUID-VkMemoryAllocateInfo-pNext-02390",
+ "vkAllocateMemory: VkMemoryAllocateInfo struct with chained VkImportAndroidHardwareBufferInfoANDROID, "
+ "The dedicated image usage bit %s equivalent is not in AHardwareBuffer_Desc.usage (0x%" PRIx64 ") ",
+ string_VkImageUsageFlags(ubit).c_str(), ahb_desc.usage);
+ }
}
}
- if (illegal_usage) {
- skip |= LogError(device, "VUID-VkMemoryAllocateInfo-pNext-02390",
- "vkAllocateMemory: VkMemoryAllocateInfo struct with chained "
- "VkImportAndroidHardwareBufferInfoANDROID, one or more AHardwareBuffer usage bits equivalent to "
- "the provided image's usage bits are missing from AHardwareBuffer_Desc.usage.");
- }
}
} else { // Not an import
if ((exp_mem_alloc_info) && (mem_ded_alloc_info) &&
@@ -2688,15 +3061,22 @@
return skip;
}
-bool CoreChecks::ValidateGetImageMemoryRequirements2ANDROID(const VkImage image) const {
+bool CoreChecks::ValidateGetImageMemoryRequirementsANDROID(const VkImage image, const char *func_name) const {
bool skip = false;
const IMAGE_STATE *image_state = GetImageState(image);
- if (image_state->imported_ahb && (0 == image_state->GetBoundMemory().size())) {
- skip |= LogError(image, "VUID-VkImageMemoryRequirementsInfo2-image-01897",
- "vkGetImageMemoryRequirements2: Attempt to query layout from an image created with "
+ if (image_state != nullptr) {
+ if (image_state->external_ahb && (0 == image_state->GetBoundMemory().size())) {
+ const char *vuid = strcmp(func_name, "vkGetImageMemoryRequirements()") == 0
+ ? "VUID-vkGetImageMemoryRequirements-image-04004"
+ : "VUID-VkImageMemoryRequirementsInfo2-image-01897";
+ skip |=
+ LogError(image, vuid,
+ "%s: Attempt get image memory requirements for an image created with a "
"VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID handleType, which has not yet been "
- "bound to memory.");
+ "bound to memory.",
+ func_name);
+ }
}
return skip;
}
@@ -2720,20 +3100,40 @@
return skip;
}
-bool CoreChecks::ValidateCreateSamplerYcbcrConversionANDROID(const VkSamplerYcbcrConversionCreateInfo *create_info) const {
- const VkExternalFormatANDROID *ext_format_android = lvl_find_in_chain<VkExternalFormatANDROID>(create_info->pNext);
- if ((nullptr != ext_format_android) && (0 != ext_format_android->externalFormat)) {
- if (VK_FORMAT_UNDEFINED != create_info->format) {
- return LogError(device, "VUID-VkSamplerYcbcrConversionCreateInfo-format-01904",
- "vkCreateSamplerYcbcrConversion[KHR]: CreateInfo format is not VK_FORMAT_UNDEFINED while "
- "there is a chained VkExternalFormatANDROID struct.");
- }
- } else if (VK_FORMAT_UNDEFINED == create_info->format) {
- return LogError(device, "VUID-VkSamplerYcbcrConversionCreateInfo-format-01904",
- "vkCreateSamplerYcbcrConversion[KHR]: CreateInfo format is VK_FORMAT_UNDEFINED with no chained "
- "VkExternalFormatANDROID struct.");
+bool CoreChecks::ValidateBufferImportedHandleANDROID(const char *func_name, VkExternalMemoryHandleTypeFlags handleType,
+ VkDeviceMemory memory, VkBuffer buffer) const {
+ bool skip = false;
+ if ((handleType & VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID) == 0) {
+ const char *vuid = (strcmp(func_name, "vkBindBufferMemory()") == 0) ? "VUID-vkBindBufferMemory-memory-02986"
+ : "VUID-VkBindBufferMemoryInfo-memory-02988";
+ LogObjectList objlist(buffer);
+ objlist.add(memory);
+ skip |= LogError(objlist, vuid,
+ "%s: The VkDeviceMemory (%s) was created with an AHB import operation which is not set "
+ "VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID in the VkBuffer (%s) "
+ "VkExternalMemoryBufferreateInfo::handleType (%s)",
+ func_name, report_data->FormatHandle(memory).c_str(), report_data->FormatHandle(buffer).c_str(),
+ string_VkExternalMemoryHandleTypeFlags(handleType).c_str());
}
- return false;
+ return skip;
+}
+
+bool CoreChecks::ValidateImageImportedHandleANDROID(const char *func_name, VkExternalMemoryHandleTypeFlags handleType,
+ VkDeviceMemory memory, VkImage image) const {
+ bool skip = false;
+ if ((handleType & VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID) == 0) {
+ const char *vuid = (strcmp(func_name, "vkBindImageMemory()") == 0) ? "VUID-vkBindImageMemory-memory-02990"
+ : "VUID-VkBindImageMemoryInfo-memory-02992";
+ LogObjectList objlist(image);
+ objlist.add(memory);
+ skip |= LogError(objlist, vuid,
+ "%s: The VkDeviceMemory (%s) was created with an AHB import operation which is not set "
+ "VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID in the VkImage (%s) "
+ "VkExternalMemoryImageCreateInfo::handleType (%s)",
+ func_name, report_data->FormatHandle(memory).c_str(), report_data->FormatHandle(image).c_str(),
+ string_VkExternalMemoryHandleTypeFlags(handleType).c_str());
+ }
+ return skip;
}
#else // !VK_USE_PLATFORM_ANDROID_KHR
@@ -2745,11 +3145,17 @@
return false;
}
-bool CoreChecks::ValidateCreateSamplerYcbcrConversionANDROID(const VkSamplerYcbcrConversionCreateInfo *create_info) const {
+bool CoreChecks::ValidateGetImageMemoryRequirementsANDROID(const VkImage image, const char *func_name) const { return false; }
+
+bool CoreChecks::ValidateBufferImportedHandleANDROID(const char *func_name, VkExternalMemoryHandleTypeFlags handleType,
+ VkDeviceMemory memory, VkBuffer buffer) const {
return false;
}
-bool CoreChecks::ValidateGetImageMemoryRequirements2ANDROID(const VkImage image) const { return false; }
+bool CoreChecks::ValidateImageImportedHandleANDROID(const char *func_name, VkExternalMemoryHandleTypeFlags handleType,
+ VkDeviceMemory memory, VkImage image) const {
+ return false;
+}
#endif // VK_USE_PLATFORM_ANDROID_KHR
@@ -2757,9 +3163,9 @@
const VkAllocationCallbacks *pAllocator, VkDeviceMemory *pMemory) const {
bool skip = false;
if (memObjMap.size() >= phys_dev_props.limits.maxMemoryAllocationCount) {
- skip |=
- LogError(device, kVUIDUndefined, "Number of currently valid memory objects is not less than the maximum allowed (%u).",
- phys_dev_props.limits.maxMemoryAllocationCount);
+ skip |= LogError(device, kVUIDUndefined,
+ "vkAllocateMemory: Number of currently valid memory objects is not less than the maximum allowed (%u).",
+ phys_dev_props.limits.maxMemoryAllocationCount);
}
if (device_extensions.vk_android_external_memory_android_hardware_buffer) {
@@ -2784,69 +3190,96 @@
"advertises %u memory types.",
pAllocateInfo->memoryTypeIndex, phys_dev_mem_props.memoryTypeCount);
} else {
- if (pAllocateInfo->allocationSize >
- phys_dev_mem_props.memoryHeaps[phys_dev_mem_props.memoryTypes[pAllocateInfo->memoryTypeIndex].heapIndex].size) {
- skip |= LogError(
- device, "VUID-vkAllocateMemory-pAllocateInfo-01713",
- "vkAllocateMemory: attempting to allocate %" PRIu64
- " bytes from heap %u,"
- "but size of that heap is only %" PRIu64 " bytes.",
- pAllocateInfo->allocationSize, phys_dev_mem_props.memoryTypes[pAllocateInfo->memoryTypeIndex].heapIndex,
- phys_dev_mem_props.memoryHeaps[phys_dev_mem_props.memoryTypes[pAllocateInfo->memoryTypeIndex].heapIndex].size);
+ const VkMemoryType memory_type = phys_dev_mem_props.memoryTypes[pAllocateInfo->memoryTypeIndex];
+ if (pAllocateInfo->allocationSize > phys_dev_mem_props.memoryHeaps[memory_type.heapIndex].size) {
+ skip |= LogError(device, "VUID-vkAllocateMemory-pAllocateInfo-01713",
+ "vkAllocateMemory: attempting to allocate %" PRIu64
+ " bytes from heap %u,"
+ "but size of that heap is only %" PRIu64 " bytes.",
+ pAllocateInfo->allocationSize, memory_type.heapIndex,
+ phys_dev_mem_props.memoryHeaps[memory_type.heapIndex].size);
}
if (!enabled_features.device_coherent_memory_features.deviceCoherentMemory &&
- ((phys_dev_mem_props.memoryTypes[pAllocateInfo->memoryTypeIndex].propertyFlags &
- VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD) != 0)) {
+ ((memory_type.propertyFlags & VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD) != 0)) {
skip |= LogError(device, "VUID-vkAllocateMemory-deviceCoherentMemory-02790",
"vkAllocateMemory: attempting to allocate memory type %u, which includes the "
"VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD memory property, but the deviceCoherentMemory feature "
"is not enabled.",
pAllocateInfo->memoryTypeIndex);
}
+
+ if ((enabled_features.core11.protectedMemory == VK_FALSE) &&
+ ((memory_type.propertyFlags & VK_MEMORY_PROPERTY_PROTECTED_BIT) != 0)) {
+ skip |= LogError(device, "VUID-VkMemoryAllocateInfo-memoryTypeIndex-01872",
+ "vkAllocateMemory(): attempting to allocate memory type %u, which includes the "
+ "VK_MEMORY_PROPERTY_PROTECTED_BIT memory property, but the protectedMemory feature "
+ "is not enabled.",
+ pAllocateInfo->memoryTypeIndex);
+ }
}
+ bool imported_ahb = false;
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
+ // "memory is not an imported Android Hardware Buffer" refers to VkImportAndroidHardwareBufferInfoANDROID with a non-NULL
+ // buffer value. Memory imported has another VUID to check size and allocationSize match up
+ auto imported_ahb_info = lvl_find_in_chain<VkImportAndroidHardwareBufferInfoANDROID>(pAllocateInfo->pNext);
+ if (imported_ahb_info != nullptr) {
+ imported_ahb = imported_ahb_info->buffer != nullptr;
+ }
+#endif
auto dedicated_allocate_info = lvl_find_in_chain<VkMemoryDedicatedAllocateInfo>(pAllocateInfo->pNext);
if (dedicated_allocate_info) {
if ((dedicated_allocate_info->buffer != VK_NULL_HANDLE) && (dedicated_allocate_info->image != VK_NULL_HANDLE)) {
skip |= LogError(device, "VUID-VkMemoryDedicatedAllocateInfo-image-01432",
- "Either buffer or image has to be VK_NULL_HANDLE in VkMemoryDedicatedAllocateInfo");
+ "vkAllocateMemory: Either buffer or image has to be VK_NULL_HANDLE in VkMemoryDedicatedAllocateInfo");
} else if (dedicated_allocate_info->image != VK_NULL_HANDLE) {
// Dedicated VkImage
const IMAGE_STATE *image_state = GetImageState(dedicated_allocate_info->image);
- if (pAllocateInfo->allocationSize != image_state->requirements.size) {
- skip |= LogError(device, "VUID-VkMemoryDedicatedAllocateInfo-image-01433",
- "Allocation Size (%u) needs to be equal to VkImage %s VkMemoryRequirements::size (%u)",
- pAllocateInfo->allocationSize, report_data->FormatHandle(dedicated_allocate_info->image).c_str(),
- image_state->requirements.size);
- }
- if ((image_state->createInfo.flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != 0) {
- skip |= LogError(device, "VUID-VkMemoryDedicatedAllocateInfo-image-01434",
- "VkImage %s can't be used in VkMemoryDedicatedAllocateInfo because it was created with "
- "VK_IMAGE_CREATE_SPARSE_BINDING_BIT",
- report_data->FormatHandle(dedicated_allocate_info->image).c_str());
- }
- if ((device_extensions.vk_khr_sampler_ycbcr_conversion) &&
- ((image_state->createInfo.flags & VK_IMAGE_CREATE_DISJOINT_BIT) != 0)) {
- skip |= LogError(device, "VUID-VkMemoryDedicatedAllocateInfo-image-01797",
- "VkImage %s can't be used in VkMemoryDedicatedAllocateInfo because it was created with "
- "VK_IMAGE_CREATE_DISJOINT_BIT",
- report_data->FormatHandle(dedicated_allocate_info->image).c_str());
+ if (image_state->disjoint == true) {
+ skip |= LogError(
+ device, "VUID-VkMemoryDedicatedAllocateInfo-image-01797",
+ "vkAllocateMemory: VkImage %s can't be used in VkMemoryDedicatedAllocateInfo because it was created with "
+ "VK_IMAGE_CREATE_DISJOINT_BIT",
+ report_data->FormatHandle(dedicated_allocate_info->image).c_str());
+ } else {
+ if ((pAllocateInfo->allocationSize != image_state->requirements.size) && (imported_ahb == false)) {
+ const char *vuid = (device_extensions.vk_android_external_memory_android_hardware_buffer)
+ ? "VUID-VkMemoryDedicatedAllocateInfo-image-02964"
+ : "VUID-VkMemoryDedicatedAllocateInfo-image-01433";
+ skip |= LogError(
+ device, vuid,
+ "vkAllocateMemory: Allocation Size (%u) needs to be equal to VkImage %s VkMemoryRequirements::size (%u)",
+ pAllocateInfo->allocationSize, report_data->FormatHandle(dedicated_allocate_info->image).c_str(),
+ image_state->requirements.size);
+ }
+ if ((image_state->createInfo.flags & VK_IMAGE_CREATE_SPARSE_BINDING_BIT) != 0) {
+ skip |= LogError(
+ device, "VUID-VkMemoryDedicatedAllocateInfo-image-01434",
+ "vkAllocateMemory: VkImage %s can't be used in VkMemoryDedicatedAllocateInfo because it was created with "
+ "VK_IMAGE_CREATE_SPARSE_BINDING_BIT",
+ report_data->FormatHandle(dedicated_allocate_info->image).c_str());
+ }
}
} else if (dedicated_allocate_info->buffer != VK_NULL_HANDLE) {
// Dedicated VkBuffer
const BUFFER_STATE *buffer_state = GetBufferState(dedicated_allocate_info->buffer);
- if (pAllocateInfo->allocationSize != buffer_state->requirements.size) {
- skip |= LogError(device, "VUID-VkMemoryDedicatedAllocateInfo-buffer-01435",
- "Allocation Size (%u) needs to be equal to VkBuffer %s VkMemoryRequirements::size (%u)",
- pAllocateInfo->allocationSize, report_data->FormatHandle(dedicated_allocate_info->buffer).c_str(),
- buffer_state->requirements.size);
+ if ((pAllocateInfo->allocationSize != buffer_state->requirements.size) && (imported_ahb == false)) {
+ const char *vuid = (device_extensions.vk_android_external_memory_android_hardware_buffer)
+ ? "VUID-VkMemoryDedicatedAllocateInfo-buffer-02965"
+ : "VUID-VkMemoryDedicatedAllocateInfo-buffer-01435";
+ skip |= LogError(
+ device, vuid,
+ "vkAllocateMemory: Allocation Size (%u) needs to be equal to VkBuffer %s VkMemoryRequirements::size (%u)",
+ pAllocateInfo->allocationSize, report_data->FormatHandle(dedicated_allocate_info->buffer).c_str(),
+ buffer_state->requirements.size);
}
if ((buffer_state->createInfo.flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) != 0) {
- skip |= LogError(device, "VUID-VkMemoryDedicatedAllocateInfo-buffer-01436",
- "VkBuffer %s can't be used in VkMemoryDedicatedAllocateInfo because it was created with "
- "VK_BUFFER_CREATE_SPARSE_BINDING_BIT",
- report_data->FormatHandle(dedicated_allocate_info->buffer).c_str());
+ skip |= LogError(
+ device, "VUID-VkMemoryDedicatedAllocateInfo-buffer-01436",
+ "vkAllocateMemory: VkBuffer %s can't be used in VkMemoryDedicatedAllocateInfo because it was created with "
+ "VK_BUFFER_CREATE_SPARSE_BINDING_BIT",
+ report_data->FormatHandle(dedicated_allocate_info->buffer).c_str());
}
}
}
@@ -2858,7 +3291,7 @@
// For given obj node, if it is use, flag a validation error and return callback result, else return false
bool CoreChecks::ValidateObjectNotInUse(const BASE_NODE *obj_node, const VulkanTypedHandle &obj_struct, const char *caller_name,
const char *error_code) const {
- if (disabled.object_in_use) return false;
+ if (disabled[object_in_use]) return false;
bool skip = false;
if (obj_node->in_use.load()) {
skip |= LogError(device, error_code, "Cannot call %s on %s that is currently in use by a command buffer.", caller_name,
@@ -2906,8 +3339,9 @@
if (size != VK_WHOLE_SIZE) {
if ((offset + size) > mem_info->alloc_info.allocationSize) {
skip = LogError(mem, "VUID-vkMapMemory-size-00681",
- "Mapping Memory from 0x%" PRIx64 " to 0x%" PRIx64 " oversteps total array size 0x%" PRIx64 ".", offset,
- size + offset, mem_info->alloc_info.allocationSize);
+ "VkMapMemory: Mapping Memory from 0x%" PRIx64 " to 0x%" PRIx64 " oversteps total array size 0x%" PRIx64
+ ".",
+ offset, size + offset, mem_info->alloc_info.allocationSize);
}
}
return skip;
@@ -2960,26 +3394,29 @@
return skip;
}
-bool CoreChecks::ValidateGetDeviceQueue(uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue *pQueue, const char *valid_qfi_vuid,
- const char *qfi_in_range_vuid) const {
+bool CoreChecks::PreCallValidateGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex,
+ VkQueue *pQueue) const {
bool skip = false;
- skip |= ValidateDeviceQueueFamily(queueFamilyIndex, "vkGetDeviceQueue", "queueFamilyIndex", valid_qfi_vuid);
+ skip |= ValidateDeviceQueueFamily(queueFamilyIndex, "vkGetDeviceQueue", "queueFamilyIndex",
+ "VUID-vkGetDeviceQueue-queueFamilyIndex-00384");
const auto &queue_data = queue_family_index_map.find(queueFamilyIndex);
- if (queue_data != queue_family_index_map.end() && queue_data->second <= queueIndex) {
- skip |= LogError(device, qfi_in_range_vuid,
+ if ((queue_data != queue_family_index_map.end()) && (queue_data->second <= queueIndex)) {
+ skip |= LogError(device, "VUID-vkGetDeviceQueue-queueIndex-00385",
"vkGetDeviceQueue: queueIndex (=%" PRIu32
") is not less than the number of queues requested from queueFamilyIndex (=%" PRIu32
") when the device was created (i.e. is not less than %" PRIu32 ").",
queueIndex, queueFamilyIndex, queue_data->second);
}
- return skip;
-}
-bool CoreChecks::PreCallValidateGetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex,
- VkQueue *pQueue) const {
- return ValidateGetDeviceQueue(queueFamilyIndex, queueIndex, pQueue, "VUID-vkGetDeviceQueue-queueFamilyIndex-00384",
- "VUID-vkGetDeviceQueue-queueIndex-00385");
+ const auto &queue_flags = queue_family_create_flags_map.find(queueFamilyIndex);
+ if ((queue_flags != queue_family_create_flags_map.end()) && (queue_flags->second != 0)) {
+ skip |= LogError(device, "VUID-vkGetDeviceQueue-flags-01841",
+ "vkGetDeviceQueue: queueIndex (=%" PRIu32
+ ") was created with a non-zero VkDeviceQueueCreateFlags. Need to use vkGetDeviceQueue2 instead.",
+ queueIndex);
+ }
+ return skip;
}
bool CoreChecks::PreCallValidateQueueWaitIdle(VkQueue queue) const {
@@ -3016,8 +3453,16 @@
return skip;
}
+bool CoreChecks::PreCallValidateWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfoKHR *pWaitInfo, uint64_t timeout) const {
+ return ValidateWaitSemaphores(device, pWaitInfo, timeout);
+}
+
bool CoreChecks::PreCallValidateWaitSemaphoresKHR(VkDevice device, const VkSemaphoreWaitInfoKHR *pWaitInfo,
uint64_t timeout) const {
+ return ValidateWaitSemaphores(device, pWaitInfo, timeout);
+}
+
+bool CoreChecks::ValidateWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfoKHR *pWaitInfo, uint64_t timeout) const {
bool skip = false;
for (uint32_t i = 0; i < pWaitInfo->semaphoreCount; i++) {
@@ -3066,7 +3511,7 @@
bool CoreChecks::PreCallValidateDestroyQueryPool(VkDevice device, VkQueryPool queryPool,
const VkAllocationCallbacks *pAllocator) const {
- if (disabled.query_validation) return false;
+ if (disabled[query_validation]) return false;
const QUERY_POOL_STATE *qp_state = GetQueryPoolState(queryPool);
const VulkanTypedHandle obj_struct(queryPool, kVulkanObjectTypeQueryPool);
bool skip = false;
@@ -3098,13 +3543,12 @@
cmd_name, report_data->FormatHandle(query_pool_state->pool).c_str(), invalid_flags_string.c_str());
}
- QueryObject query_obj{query_pool_state->pool, 0u};
for (uint32_t queryIndex = firstQuery; queryIndex < queryCount; queryIndex++) {
- query_obj.query = queryIndex;
uint32_t submitted = 0;
for (uint32_t passIndex = 0; passIndex < query_pool_state->n_performance_passes; passIndex++) {
- auto query_pass_iter = queryPassToStateMap.find(QueryObjectPass(query_obj, passIndex));
- if (query_pass_iter != queryPassToStateMap.end() && query_pass_iter->second == QUERYSTATE_AVAILABLE) submitted++;
+ QueryObject obj(QueryObject(query_pool_state->pool, queryIndex), passIndex);
+ auto query_pass_iter = queryToStateMap.find(obj);
+ if (query_pass_iter != queryToStateMap.end() && query_pass_iter->second == QUERYSTATE_AVAILABLE) submitted++;
}
if (submitted < query_pool_state->n_performance_passes) {
skip |= LogError(query_pool_state->pool, "VUID-vkGetQueryPoolResults-queryType-03231",
@@ -3160,7 +3604,7 @@
query_obj.query = firstQuery + i;
if (queryToStateMap.count(query_obj) == 0) {
skip |= LogError(queryPool, kVUID_Core_DrawState_InvalidQuery,
- "vkGetQueryPoolResults() on %s and query %" PRIu32 ": unknown query",
+ "vkGetQueryPoolResults() on %s and query %" PRIu32 ": unknown query due to not being recorded.",
report_data->FormatHandle(queryPool).c_str(), query_obj.query);
}
}
@@ -3170,28 +3614,37 @@
bool CoreChecks::PreCallValidateGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
uint32_t queryCount, size_t dataSize, void *pData, VkDeviceSize stride,
VkQueryResultFlags flags) const {
- if (disabled.query_validation) return false;
+ if (disabled[query_validation]) return false;
bool skip = false;
skip |= ValidateQueryPoolStride("VUID-vkGetQueryPoolResults-flags-02827", "VUID-vkGetQueryPoolResults-flags-00815", stride,
"dataSize", dataSize, flags);
skip |= ValidateGetQueryPoolResultsFlags(queryPool, flags);
skip |= ValidateGetQueryPoolResultsQueries(queryPool, firstQuery, queryCount);
+ skip |= ValidateQueryPoolIndex(queryPool, firstQuery, queryCount, "vkGetQueryPoolResults()",
+ "VUID-vkGetQueryPoolResults-firstQuery-00813", "VUID-vkGetQueryPoolResults-firstQuery-00816");
skip |= ValidateGetQueryPoolPerformanceResults(queryPool, firstQuery, queryCount, pData, stride, flags);
return skip;
}
bool CoreChecks::ValidateInsertMemoryRange(const VulkanTypedHandle &typed_handle, const DEVICE_MEMORY_STATE *mem_info,
- VkDeviceSize memoryOffset, const VkMemoryRequirements &memRequirements, bool is_linear,
- const char *api_name) const {
+ VkDeviceSize memoryOffset, const char *api_name) const {
bool skip = false;
if (memoryOffset >= mem_info->alloc_info.allocationSize) {
const char *error_code = nullptr;
if (typed_handle.type == kVulkanObjectTypeBuffer) {
- error_code = "VUID-vkBindBufferMemory-memoryOffset-01031";
+ if (strcmp(api_name, "vkBindBufferMemory()") == 0) {
+ error_code = "VUID-vkBindBufferMemory-memoryOffset-01031";
+ } else {
+ error_code = "VUID-VkBindBufferMemoryInfo-memoryOffset-01595";
+ }
} else if (typed_handle.type == kVulkanObjectTypeImage) {
- error_code = "VUID-vkBindImageMemory-memoryOffset-01046";
+ if (strcmp(api_name, "vkBindImageMemory()") == 0) {
+ error_code = "VUID-vkBindImageMemory-memoryOffset-01046";
+ } else {
+ error_code = "VUID-VkBindImageMemoryInfo-memoryOffset-01611";
+ }
} else if (typed_handle.type == kVulkanObjectTypeAccelerationStructureNV) {
error_code = "VUID-VkBindAccelerationStructureMemoryInfoKHR-memoryOffset-02451";
} else {
@@ -3212,22 +3665,19 @@
}
bool CoreChecks::ValidateInsertImageMemoryRange(VkImage image, const DEVICE_MEMORY_STATE *mem_info, VkDeviceSize mem_offset,
- const VkMemoryRequirements &mem_reqs, bool is_linear, const char *api_name) const {
- return ValidateInsertMemoryRange(VulkanTypedHandle(image, kVulkanObjectTypeImage), mem_info, mem_offset, mem_reqs, is_linear,
- api_name);
+ const char *api_name) const {
+ return ValidateInsertMemoryRange(VulkanTypedHandle(image, kVulkanObjectTypeImage), mem_info, mem_offset, api_name);
}
bool CoreChecks::ValidateInsertBufferMemoryRange(VkBuffer buffer, const DEVICE_MEMORY_STATE *mem_info, VkDeviceSize mem_offset,
- const VkMemoryRequirements &mem_reqs, const char *api_name) const {
- return ValidateInsertMemoryRange(VulkanTypedHandle(buffer, kVulkanObjectTypeBuffer), mem_info, mem_offset, mem_reqs, true,
- api_name);
+ const char *api_name) const {
+ return ValidateInsertMemoryRange(VulkanTypedHandle(buffer, kVulkanObjectTypeBuffer), mem_info, mem_offset, api_name);
}
bool CoreChecks::ValidateInsertAccelerationStructureMemoryRange(VkAccelerationStructureNV as, const DEVICE_MEMORY_STATE *mem_info,
- VkDeviceSize mem_offset, const VkMemoryRequirements &mem_reqs,
- const char *api_name) const {
+ VkDeviceSize mem_offset, const char *api_name) const {
return ValidateInsertMemoryRange(VulkanTypedHandle(as, kVulkanObjectTypeAccelerationStructureNV), mem_info, mem_offset,
- mem_reqs, true, api_name);
+ api_name);
}
bool CoreChecks::ValidateMemoryTypes(const DEVICE_MEMORY_STATE *mem_info, const uint32_t memory_type_bits, const char *funcName,
@@ -3246,6 +3696,7 @@
bool CoreChecks::ValidateBindBufferMemory(VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memoryOffset,
const char *api_name) const {
const BUFFER_STATE *buffer_state = GetBufferState(buffer);
+ bool bind_buffer_mem_2 = strcmp(api_name, "vkBindBufferMemory()") != 0;
bool skip = false;
if (buffer_state) {
@@ -3253,17 +3704,13 @@
const VulkanTypedHandle obj_struct(buffer, kVulkanObjectTypeBuffer);
skip = ValidateSetMemBinding(mem, obj_struct, api_name);
- // Validate bound memory range information
const auto mem_info = GetDevMemState(mem);
- if (mem_info) {
- skip |= ValidateInsertBufferMemoryRange(buffer, mem_info, memoryOffset, buffer_state->requirements, api_name);
- skip |= ValidateMemoryTypes(mem_info, buffer_state->requirements.memoryTypeBits, api_name,
- "VUID-vkBindBufferMemory-memory-01035");
- }
// Validate memory requirements alignment
if (SafeModulo(memoryOffset, buffer_state->requirements.alignment) != 0) {
- skip |= LogError(buffer, "VUID-vkBindBufferMemory-memoryOffset-01036",
+ const char *vuid =
+ bind_buffer_mem_2 ? "VUID-VkBindBufferMemoryInfo-memoryOffset-01600" : "VUID-vkBindBufferMemory-memoryOffset-01036";
+ skip |= LogError(buffer, vuid,
"%s: memoryOffset is 0x%" PRIxLEAST64
" but must be an integer multiple of the VkMemoryRequirements::alignment value 0x%" PRIxLEAST64
", returned from a call to vkGetBufferMemoryRequirements with buffer.",
@@ -3271,9 +3718,18 @@
}
if (mem_info) {
+ // Validate bound memory range information
+ skip |= ValidateInsertBufferMemoryRange(buffer, mem_info, memoryOffset, api_name);
+
+ const char *mem_type_vuid =
+ bind_buffer_mem_2 ? "VUID-VkBindBufferMemoryInfo-memory-01599" : "VUID-vkBindBufferMemory-memory-01035";
+ skip |= ValidateMemoryTypes(mem_info, buffer_state->requirements.memoryTypeBits, api_name, mem_type_vuid);
+
// Validate memory requirements size
if (buffer_state->requirements.size > (mem_info->alloc_info.allocationSize - memoryOffset)) {
- skip |= LogError(buffer, "VUID-vkBindBufferMemory-size-01037",
+ const char *vuid =
+ bind_buffer_mem_2 ? "VUID-VkBindBufferMemoryInfo-size-01601" : "VUID-vkBindBufferMemory-size-01037";
+ skip |= LogError(buffer, vuid,
"%s: memory size minus memoryOffset is 0x%" PRIxLEAST64
" but must be at least as large as VkMemoryRequirements::size value 0x%" PRIxLEAST64
", returned from a call to vkGetBufferMemoryRequirements with buffer.",
@@ -3282,15 +3738,12 @@
// Validate dedicated allocation
if (mem_info->is_dedicated && ((mem_info->dedicated_buffer != buffer) || (memoryOffset != 0))) {
- // TODO: Add vkBindBufferMemory2KHR error message when added to spec.
- auto validation_error = kVUIDUndefined;
- if (strcmp(api_name, "vkBindBufferMemory()") == 0) {
- validation_error = "VUID-vkBindBufferMemory-memory-01508";
- }
+ const char *vuid =
+ bind_buffer_mem_2 ? "VUID-VkBindBufferMemoryInfo-memory-01900" : "VUID-vkBindBufferMemory-memory-01508";
LogObjectList objlist(buffer);
objlist.add(mem);
objlist.add(mem_info->dedicated_buffer);
- skip |= LogError(objlist, validation_error,
+ skip |= LogError(objlist, vuid,
"%s: for dedicated %s, VkMemoryDedicatedAllocateInfoKHR::buffer %s must be equal "
"to %s and memoryOffset 0x%" PRIxLEAST64 " must be zero.",
api_name, report_data->FormatHandle(mem).c_str(),
@@ -3307,6 +3760,72 @@
"memory must have been allocated with the VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR bit set.",
api_name);
}
+
+ // Validate export memory handles
+ if ((mem_info->export_handle_type_flags != 0) &&
+ ((mem_info->export_handle_type_flags & buffer_state->external_memory_handle) == 0)) {
+ const char *vuid =
+ bind_buffer_mem_2 ? "VUID-VkBindBufferMemoryInfo-handleTypes-02791" : "VUID-vkBindBufferMemory-memory-02726";
+ LogObjectList objlist(buffer);
+ objlist.add(mem);
+ skip |= LogError(objlist, vuid,
+ "%s: The VkDeviceMemory (%s) has an external handleType of %s which does not include at least one "
+ "handle from VkBuffer (%s) handleType %s.",
+ api_name, report_data->FormatHandle(mem).c_str(),
+ string_VkExternalMemoryHandleTypeFlags(mem_info->export_handle_type_flags).c_str(),
+ report_data->FormatHandle(buffer).c_str(),
+ string_VkExternalMemoryHandleTypeFlags(buffer_state->external_memory_handle).c_str());
+ }
+
+ // Validate import memory handles
+ if (mem_info->is_import_ahb == true) {
+ skip |= ValidateBufferImportedHandleANDROID(api_name, buffer_state->external_memory_handle, mem, buffer);
+ } else if (mem_info->is_import == true) {
+ if ((mem_info->import_handle_type_flags & buffer_state->external_memory_handle) == 0) {
+ const char *vuid = nullptr;
+ if ((bind_buffer_mem_2) && (device_extensions.vk_android_external_memory_android_hardware_buffer)) {
+ vuid = "VUID-VkBindBufferMemoryInfo-memory-02987";
+ } else if ((!bind_buffer_mem_2) && (device_extensions.vk_android_external_memory_android_hardware_buffer)) {
+ vuid = "VUID-vkBindBufferMemory-memory-02985";
+ } else if ((bind_buffer_mem_2) && (!device_extensions.vk_android_external_memory_android_hardware_buffer)) {
+ vuid = "VUID-VkBindBufferMemoryInfo-memory-02792";
+ } else if ((!bind_buffer_mem_2) && (!device_extensions.vk_android_external_memory_android_hardware_buffer)) {
+ vuid = "VUID-vkBindBufferMemory-memory-02727";
+ }
+ LogObjectList objlist(buffer);
+ objlist.add(mem);
+ skip |= LogError(objlist, vuid,
+ "%s: The VkDeviceMemory (%s) was created with an import operation with handleType of %s which "
+ "is not set in the VkBuffer (%s) VkExternalMemoryBufferCreateInfo::handleType (%s)",
+ api_name, report_data->FormatHandle(mem).c_str(),
+ string_VkExternalMemoryHandleTypeFlags(mem_info->import_handle_type_flags).c_str(),
+ report_data->FormatHandle(buffer).c_str(),
+ string_VkExternalMemoryHandleTypeFlags(buffer_state->external_memory_handle).c_str());
+ }
+ }
+
+ // Validate mix of protected buffer and memory
+ if ((buffer_state->unprotected == false) && (mem_info->unprotected == true)) {
+ // TODO label when spec change is upstreamed
+ const char *vuid =
+ bind_buffer_mem_2 ? "UNASSIGNED-VkBindBufferMemoryInfo-protected" : "VUID-vkBindBufferMemory-None-01898";
+ LogObjectList objlist(buffer);
+ objlist.add(mem);
+ skip |= LogError(objlist, vuid,
+ "%s: The VkDeviceMemory (%s) was not created with protected memory but the VkBuffer (%s) was set "
+ "to use protected memory.",
+ api_name, report_data->FormatHandle(mem).c_str(), report_data->FormatHandle(buffer).c_str());
+ } else if ((buffer_state->unprotected == true) && (mem_info->unprotected == false)) {
+ // TODO label when spec change is upstreamed
+ const char *vuid =
+ bind_buffer_mem_2 ? "UNASSIGNED-VkBindBufferMemoryInfo-protected" : "VUID-vkBindBufferMemory-None-01899";
+ LogObjectList objlist(buffer);
+ objlist.add(mem);
+ skip |= LogError(objlist, vuid,
+ "%s: The VkDeviceMemory (%s) was created with protected memory but the VkBuffer (%s) was not set "
+ "to use protected memory.",
+ api_name, report_data->FormatHandle(mem).c_str(), report_data->FormatHandle(buffer).c_str());
+ }
}
}
return skip;
@@ -3345,23 +3864,27 @@
bool CoreChecks::PreCallValidateGetImageMemoryRequirements(VkDevice device, VkImage image,
VkMemoryRequirements *pMemoryRequirements) const {
bool skip = false;
+ if (device_extensions.vk_android_external_memory_android_hardware_buffer) {
+ skip |= ValidateGetImageMemoryRequirementsANDROID(image, "vkGetImageMemoryRequirements()");
+ }
+
const IMAGE_STATE *image_state = GetImageState(image);
if (image_state) {
// Checks for no disjoint bit
- if (0 != (image_state->createInfo.flags & VK_IMAGE_CREATE_DISJOINT_BIT)) {
- skip |= LogError(
- image, "VUID-vkGetImageMemoryRequirements-image-01588",
- "%s must not have been created with the VK_IMAGE_CREATE_DISJOINT_BIT (need to use vkGetImageMemoryRequirements2).",
- report_data->FormatHandle(image).c_str());
+ if (image_state->disjoint == true) {
+ skip |= LogError(image, "VUID-vkGetImageMemoryRequirements-image-01588",
+ "vkGetImageMemoryRequirements(): %s must not have been created with the VK_IMAGE_CREATE_DISJOINT_BIT "
+ "(need to use vkGetImageMemoryRequirements2).",
+ report_data->FormatHandle(image).c_str());
}
}
return skip;
}
-bool CoreChecks::ValidateGetImageMemoryRequirements2(const VkImageMemoryRequirementsInfo2 *pInfo) const {
+bool CoreChecks::ValidateGetImageMemoryRequirements2(const VkImageMemoryRequirementsInfo2 *pInfo, const char *func_name) const {
bool skip = false;
if (device_extensions.vk_android_external_memory_android_hardware_buffer) {
- skip |= ValidateGetImageMemoryRequirements2ANDROID(pInfo->image);
+ skip |= ValidateGetImageMemoryRequirementsANDROID(pInfo->image, func_name);
}
const IMAGE_STATE *image_state = GetImageState(pInfo->image);
@@ -3370,29 +3893,28 @@
const VkImagePlaneMemoryRequirementsInfo *image_plane_info =
lvl_find_in_chain<VkImagePlaneMemoryRequirementsInfo>(pInfo->pNext);
- if ((FormatIsMultiplane(image_format)) && (0 != (image_state->createInfo.flags & VK_IMAGE_CREATE_DISJOINT_BIT)) &&
- (image_plane_info == nullptr)) {
+ if ((FormatIsMultiplane(image_format)) && (image_state->disjoint == true) && (image_plane_info == nullptr)) {
skip |= LogError(pInfo->image, "VUID-VkImageMemoryRequirementsInfo2-image-01589",
- "vkGetImageMemoryRequirements2: %s image was created with a multi-planar format (%s) and "
+ "%s: %s image was created with a multi-planar format (%s) and "
"VK_IMAGE_CREATE_DISJOINT_BIT, but the current pNext doesn't include a "
"VkImagePlaneMemoryRequirementsInfo struct",
- report_data->FormatHandle(pInfo->image).c_str(), string_VkFormat(image_format));
+ func_name, report_data->FormatHandle(pInfo->image).c_str(), string_VkFormat(image_format));
}
- if ((0 == (image_state->createInfo.flags & VK_IMAGE_CREATE_DISJOINT_BIT)) && (image_plane_info != nullptr)) {
+ if ((image_state->disjoint == false) && (image_plane_info != nullptr)) {
skip |= LogError(pInfo->image, "VUID-VkImageMemoryRequirementsInfo2-image-01590",
- "vkGetImageMemoryRequirements2: %s image was created not created with VK_IMAGE_CREATE_DISJOINT_BIT,"
+ "%s: %s image was not created with VK_IMAGE_CREATE_DISJOINT_BIT,"
"but the current pNext includes a VkImagePlaneMemoryRequirementsInfo struct",
- report_data->FormatHandle(pInfo->image).c_str());
+ func_name, report_data->FormatHandle(pInfo->image).c_str());
}
if ((FormatIsMultiplane(image_format) == false) && (image_tiling != VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) &&
(image_plane_info != nullptr)) {
skip |= LogError(pInfo->image, "VUID-VkImageMemoryRequirementsInfo2-image-02280",
- "vkGetImageMemoryRequirements2: %s image is a single-plane format (%s) and does not have tiling of "
+ "%s: %s image is a single-plane format (%s) and does not have tiling of "
"VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT,"
"but the current pNext includes a VkImagePlaneMemoryRequirementsInfo struct",
- report_data->FormatHandle(pInfo->image).c_str(), string_VkFormat(image_format));
+ func_name, report_data->FormatHandle(pInfo->image).c_str(), string_VkFormat(image_format));
}
if (image_plane_info != nullptr) {
@@ -3403,17 +3925,17 @@
if ((2 == planes) && (aspect != VK_IMAGE_ASPECT_PLANE_0_BIT) && (aspect != VK_IMAGE_ASPECT_PLANE_1_BIT)) {
skip |= LogError(
pInfo->image, "VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-02281",
- "Image %s VkImagePlaneMemoryRequirementsInfo::planeAspect is %s but can only be VK_IMAGE_ASPECT_PLANE_0_BIT"
+ "%s: Image %s VkImagePlaneMemoryRequirementsInfo::planeAspect is %s but can only be VK_IMAGE_ASPECT_PLANE_0_BIT"
"or VK_IMAGE_ASPECT_PLANE_1_BIT.",
- report_data->FormatHandle(image_state->image).c_str(), string_VkImageAspectFlags(aspect).c_str());
+ func_name, report_data->FormatHandle(image_state->image).c_str(), string_VkImageAspectFlags(aspect).c_str());
}
if ((3 == planes) && (aspect != VK_IMAGE_ASPECT_PLANE_0_BIT) && (aspect != VK_IMAGE_ASPECT_PLANE_1_BIT) &&
(aspect != VK_IMAGE_ASPECT_PLANE_2_BIT)) {
skip |= LogError(
pInfo->image, "VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-02281",
- "Image %s VkImagePlaneMemoryRequirementsInfo::planeAspect is %s but can only be VK_IMAGE_ASPECT_PLANE_0_BIT"
+ "%s: Image %s VkImagePlaneMemoryRequirementsInfo::planeAspect is %s but can only be VK_IMAGE_ASPECT_PLANE_0_BIT"
"or VK_IMAGE_ASPECT_PLANE_1_BIT or VK_IMAGE_ASPECT_PLANE_2_BIT.",
- report_data->FormatHandle(image_state->image).c_str(), string_VkImageAspectFlags(aspect).c_str());
+ func_name, report_data->FormatHandle(image_state->image).c_str(), string_VkImageAspectFlags(aspect).c_str());
}
}
}
@@ -3422,12 +3944,12 @@
bool CoreChecks::PreCallValidateGetImageMemoryRequirements2(VkDevice device, const VkImageMemoryRequirementsInfo2 *pInfo,
VkMemoryRequirements2 *pMemoryRequirements) const {
- return ValidateGetImageMemoryRequirements2(pInfo);
+ return ValidateGetImageMemoryRequirements2(pInfo, "vkGetImageMemoryRequirements2()");
}
bool CoreChecks::PreCallValidateGetImageMemoryRequirements2KHR(VkDevice device, const VkImageMemoryRequirementsInfo2 *pInfo,
VkMemoryRequirements2 *pMemoryRequirements) const {
- return ValidateGetImageMemoryRequirements2(pInfo);
+ return ValidateGetImageMemoryRequirements2(pInfo, "vkGetImageMemoryRequirements2KHR()");
}
bool CoreChecks::PreCallValidateGetPhysicalDeviceImageFormatProperties2(VkPhysicalDevice physicalDevice,
@@ -3516,46 +4038,59 @@
bool CoreChecks::PreCallValidateCreateCommandPool(VkDevice device, const VkCommandPoolCreateInfo *pCreateInfo,
const VkAllocationCallbacks *pAllocator, VkCommandPool *pCommandPool) const {
- return ValidateDeviceQueueFamily(pCreateInfo->queueFamilyIndex, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex",
- "VUID-vkCreateCommandPool-queueFamilyIndex-01937");
+ bool skip = false;
+ skip |= ValidateDeviceQueueFamily(pCreateInfo->queueFamilyIndex, "vkCreateCommandPool", "pCreateInfo->queueFamilyIndex",
+ "VUID-vkCreateCommandPool-queueFamilyIndex-01937");
+ if ((enabled_features.core11.protectedMemory == VK_FALSE) &&
+ ((pCreateInfo->flags & VK_COMMAND_POOL_CREATE_PROTECTED_BIT) != 0)) {
+ skip |= LogError(device, "VUID-VkCommandPoolCreateInfo-flags-02860",
+ "vkCreateCommandPool(): the protectedMemory device feature is disabled: CommandPools cannot be created "
+ "with the VK_COMMAND_POOL_CREATE_PROTECTED_BIT set.");
+ }
+
+ return skip;
}
bool CoreChecks::PreCallValidateCreateQueryPool(VkDevice device, const VkQueryPoolCreateInfo *pCreateInfo,
const VkAllocationCallbacks *pAllocator, VkQueryPool *pQueryPool) const {
- if (disabled.query_validation) return false;
+ if (disabled[query_validation]) return false;
bool skip = false;
if (pCreateInfo && pCreateInfo->queryType == VK_QUERY_TYPE_PIPELINE_STATISTICS) {
if (!enabled_features.core.pipelineStatisticsQuery) {
skip |= LogError(device, "VUID-VkQueryPoolCreateInfo-queryType-00791",
- "Query pool with type VK_QUERY_TYPE_PIPELINE_STATISTICS created on a device with "
+ "vkCreateQueryPool(): Query pool with type VK_QUERY_TYPE_PIPELINE_STATISTICS created on a device with "
"VkDeviceCreateInfo.pEnabledFeatures.pipelineStatisticsQuery == VK_FALSE.");
}
}
if (pCreateInfo && pCreateInfo->queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
if (!enabled_features.performance_query_features.performanceCounterQueryPools) {
- skip |= LogError(device, "VUID-VkQueryPoolPerformanceCreateInfoKHR-performanceCounterQueryPools-03237",
- "Query pool with type VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR created on a device with "
- "VkPhysicalDevicePerformanceQueryFeaturesKHR.performanceCounterQueryPools == VK_FALSE.");
+ skip |=
+ LogError(device, "VUID-VkQueryPoolPerformanceCreateInfoKHR-performanceCounterQueryPools-03237",
+ "vkCreateQueryPool(): Query pool with type VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR created on a device with "
+ "VkPhysicalDevicePerformanceQueryFeaturesKHR.performanceCounterQueryPools == VK_FALSE.");
}
auto perf_ci = lvl_find_in_chain<VkQueryPoolPerformanceCreateInfoKHR>(pCreateInfo->pNext);
if (!perf_ci) {
- skip |= LogError(device, "VUID-VkQueryPoolCreateInfo-queryType-03222",
- "Query pool with type VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR created but the pNext chain of "
- "pCreateInfo does not contain in instance of VkQueryPoolPerformanceCreateInfoKHR.");
+ skip |= LogError(
+ device, "VUID-VkQueryPoolCreateInfo-queryType-03222",
+ "vkCreateQueryPool(): Query pool with type VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR created but the pNext chain of "
+ "pCreateInfo does not contain in instance of VkQueryPoolPerformanceCreateInfoKHR.");
} else {
const auto &perf_counter_iter = physical_device_state->perf_counters.find(perf_ci->queueFamilyIndex);
if (perf_counter_iter == physical_device_state->perf_counters.end()) {
- skip |= LogError(device, "VUID-VkQueryPoolPerformanceCreateInfoKHR-queueFamilyIndex-03236",
- "VkQueryPerformanceCreateInfoKHR::queueFamilyIndex is not a valid queue family index.");
+ skip |= LogError(
+ device, "VUID-VkQueryPoolPerformanceCreateInfoKHR-queueFamilyIndex-03236",
+ "vkCreateQueryPool(): VkQueryPerformanceCreateInfoKHR::queueFamilyIndex is not a valid queue family index.");
} else {
const QUEUE_FAMILY_PERF_COUNTERS *perf_counters = perf_counter_iter->second.get();
for (uint32_t idx = 0; idx < perf_ci->counterIndexCount; idx++) {
if (perf_ci->pCounterIndices[idx] >= perf_counters->counters.size()) {
- skip |= LogError(device, "VUID-VkQueryPoolPerformanceCreateInfoKHR-pCounterIndices-03321",
- "VkQueryPerformanceCreateInfoKHR::pCounterIndices[%u] = %u is not a valid "
- "counter index.",
- idx, perf_ci->pCounterIndices[idx]);
+ skip |= LogError(
+ device, "VUID-VkQueryPoolPerformanceCreateInfoKHR-pCounterIndices-03321",
+ "vkCreateQueryPool(): VkQueryPerformanceCreateInfoKHR::pCounterIndices[%u] = %u is not a valid "
+ "counter index.",
+ idx, perf_ci->pCounterIndices[idx]);
}
}
}
@@ -3687,6 +4222,37 @@
return skip;
}
+bool CoreChecks::ValidatePipelineCacheControlFlags(VkPipelineCreateFlags flags, uint32_t index, const char *caller_name,
+ const char *vuid) const {
+ bool skip = false;
+ if (enabled_features.pipeline_creation_cache_control_features.pipelineCreationCacheControl == VK_FALSE) {
+ const VkPipelineCreateFlags invalid_flags =
+ VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT | VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT;
+ if ((flags & invalid_flags) != 0) {
+ skip |= LogError(device, vuid,
+ "%s(): pipelineCreationCacheControl is turned off but pipeline[%u] has VkPipelineCreateFlags "
+ "containing VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT or "
+ "VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT",
+ caller_name, index);
+ }
+ }
+ return skip;
+}
+
+bool CoreChecks::PreCallValidateCreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo *pCreateInfo,
+ const VkAllocationCallbacks *pAllocator,
+ VkPipelineCache *pPipelineCache) const {
+ bool skip = false;
+ if (enabled_features.pipeline_creation_cache_control_features.pipelineCreationCacheControl == VK_FALSE) {
+ if ((pCreateInfo->flags & VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT) != 0) {
+ skip |= LogError(device, "VUID-VkPipelineCacheCreateInfo-pipelineCreationCacheControl-02892",
+ "vkCreatePipelineCache(): pipelineCreationCacheControl is turned off but pCreateInfo::flags contains "
+ "VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT");
+ }
+ }
+ return skip;
+}
+
bool CoreChecks::PreCallValidateCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
const VkGraphicsPipelineCreateInfo *pCreateInfos,
const VkAllocationCallbacks *pAllocator, VkPipeline *pPipelines,
@@ -3720,7 +4286,9 @@
auto *ccpl_state = reinterpret_cast<create_compute_pipeline_api_state *>(ccpl_state_data);
for (uint32_t i = 0; i < count; i++) {
// TODO: Add Compute Pipeline Verification
- skip |= ValidateComputePipelineShaderState(ccpl_state->pipe_state.back().get());
+ skip |= ValidateComputePipelineShaderState(ccpl_state->pipe_state[i].get());
+ skip |= ValidatePipelineCacheControlFlags(pCreateInfos->flags, i, "vkCreateComputePipelines",
+ "VUID-VkComputePipelineCreateInfo-pipelineCreationCacheControl-02875");
}
return skip;
}
@@ -3734,7 +4302,25 @@
auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_api_state *>(crtpl_state_data);
for (uint32_t i = 0; i < count; i++) {
- skip |= ValidateRayTracingPipeline(crtpl_state->pipe_state[i].get(), /*isKHR*/ false);
+ PIPELINE_STATE *pipeline = crtpl_state->pipe_state[i].get();
+ if (pipeline->raytracingPipelineCI.flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
+ const PIPELINE_STATE *base_pipeline = nullptr;
+ if (pipeline->raytracingPipelineCI.basePipelineIndex != -1) {
+ base_pipeline = crtpl_state->pipe_state[pipeline->raytracingPipelineCI.basePipelineIndex].get();
+ } else if (pipeline->raytracingPipelineCI.basePipelineHandle != VK_NULL_HANDLE) {
+ base_pipeline = GetPipelineState(pipeline->raytracingPipelineCI.basePipelineHandle);
+ }
+ if (!base_pipeline || !(base_pipeline->getPipelineCreateFlags() & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT)) {
+ skip |= LogError(
+ device, "VUID-vkCreateRayTracingPipelinesNV-flags-03416",
+ "vkCreateRayTracingPipelinesNV: If the flags member of any element of pCreateInfos contains the "
+ "VK_PIPELINE_CREATE_DERIVATIVE_BIT flag,"
+ "the base pipeline must have been created with the VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT flag set.");
+ }
+ }
+ skip |= ValidateRayTracingPipeline(pipeline, /*isKHR*/ false);
+ skip |= ValidatePipelineCacheControlFlags(pCreateInfos->flags, i, "vkCreateRayTracingPipelinesNV",
+ "VUID-VkRayTracingPipelineCreateInfoNV-pipelineCreationCacheControl-02905");
}
return skip;
}
@@ -3748,7 +4334,25 @@
auto *crtpl_state = reinterpret_cast<create_ray_tracing_pipeline_khr_api_state *>(crtpl_state_data);
for (uint32_t i = 0; i < count; i++) {
- skip |= ValidateRayTracingPipeline(crtpl_state->pipe_state[i].get(), /*isKHR*/ true);
+ PIPELINE_STATE *pipeline = crtpl_state->pipe_state[i].get();
+ if (pipeline->raytracingPipelineCI.flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
+ const PIPELINE_STATE *base_pipeline = nullptr;
+ if (pipeline->raytracingPipelineCI.basePipelineIndex != -1) {
+ base_pipeline = crtpl_state->pipe_state[pipeline->raytracingPipelineCI.basePipelineIndex].get();
+ } else if (pipeline->raytracingPipelineCI.basePipelineHandle != VK_NULL_HANDLE) {
+ base_pipeline = GetPipelineState(pipeline->raytracingPipelineCI.basePipelineHandle);
+ }
+ if (!base_pipeline || !(base_pipeline->getPipelineCreateFlags() & VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT)) {
+ skip |= LogError(
+ device, "VUID-vkCreateRayTracingPipelinesKHR-flags-03416",
+ "vkCreateRayTracingPipelinesKHR: If the flags member of any element of pCreateInfos contains the "
+ "VK_PIPELINE_CREATE_DERIVATIVE_BIT flag,"
+ "the base pipeline must have been created with the VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT flag set.");
+ }
+ }
+ skip |= ValidateRayTracingPipeline(pipeline, /*isKHR*/ true);
+ skip |= ValidatePipelineCacheControlFlags(pCreateInfos->flags, i, "vkCreateRayTracingPipelinesKHR",
+ "VUID-VkRayTracingPipelineCreateInfoKHR-pipelineCreationCacheControl-02905");
}
return skip;
}
@@ -3837,7 +4441,7 @@
// Note that the index argument is optional and only used by CreatePipelineLayout.
bool CoreChecks::ValidatePushConstantRange(const uint32_t offset, const uint32_t size, const char *caller_name,
uint32_t index = 0) const {
- if (disabled.push_constant_range) return false;
+ if (disabled[push_constant_range]) return false;
uint32_t const maxPushConstantsSize = phys_dev_props.limits.maxPushConstantsSize;
bool skip = false;
// Check that offset + size don't exceed the max.
@@ -4438,13 +5042,51 @@
phys_dev_ext_props.inline_uniform_block_props.maxDescriptorSetUpdateAfterBindInlineUniformBlocks);
}
}
+
+ if (device_extensions.vk_ext_fragment_density_map_2) {
+ uint32_t sum_subsampled_samplers = 0;
+ for (auto dsl : set_layouts) {
+ // find the number of subsampled samplers across all stages
+ // NOTE: this does not use the GetDescriptorSum patter because it needs the GetSamplerState method
+ if ((dsl->GetCreateFlags() & VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT)) {
+ continue;
+ }
+ for (uint32_t binding_idx = 0; binding_idx < dsl->GetBindingCount(); binding_idx++) {
+ const VkDescriptorSetLayoutBinding *binding = dsl->GetDescriptorSetLayoutBindingPtrFromIndex(binding_idx);
+
+ // Bindings with a descriptorCount of 0 are "reserved" and should be skipped
+ if (binding->descriptorCount > 0) {
+ if (((binding->descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) ||
+ (binding->descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER)) &&
+ (binding->pImmutableSamplers != nullptr)) {
+ for (uint32_t sampler_idx = 0; sampler_idx < binding->descriptorCount; sampler_idx++) {
+ const SAMPLER_STATE *state = GetSamplerState(binding->pImmutableSamplers[sampler_idx]);
+ if (state->createInfo.flags & (VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT |
+ VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT)) {
+ sum_subsampled_samplers++;
+ }
+ }
+ }
+ }
+ }
+ }
+ if (sum_subsampled_samplers > phys_dev_ext_props.fragment_density_map2_props.maxDescriptorSetSubsampledSamplers) {
+ skip |= LogError(device, "VUID-VkPipelineLayoutCreateInfo-pImmutableSamplers-03566",
+ "vkCreatePipelineLayout(): sum of sampler bindings with flags containing "
+ "VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT or "
+ "VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT among all stages(% d) "
+ "exceeds device maxDescriptorSetSubsampledSamplers limit (%d).",
+ sum_subsampled_samplers,
+ phys_dev_ext_props.fragment_density_map2_props.maxDescriptorSetSubsampledSamplers);
+ }
+ }
return skip;
}
bool CoreChecks::PreCallValidateResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool,
VkDescriptorPoolResetFlags flags) const {
// Make sure sets being destroyed are not currently in-use
- if (disabled.idle_descriptor_set) return false;
+ if (disabled[idle_descriptor_set]) return false;
bool skip = false;
const DESCRIPTOR_POOL_STATE *pPool = GetDescriptorPoolState(descriptorPool);
if (pPool != nullptr) {
@@ -4517,7 +5159,17 @@
"command buffer fence before this call.",
report_data->FormatHandle(commandBuffer).c_str());
}
- if (cb_state->createInfo.level != VK_COMMAND_BUFFER_LEVEL_PRIMARY) {
+ if (cb_state->createInfo.level == VK_COMMAND_BUFFER_LEVEL_PRIMARY) {
+ // Primary Command Buffer
+ const VkCommandBufferUsageFlags invalid_usage =
+ (VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT);
+ if ((pBeginInfo->flags & invalid_usage) == invalid_usage) {
+ skip |= LogError(commandBuffer, "VUID-vkBeginCommandBuffer-commandBuffer-02840",
+ "vkBeginCommandBuffer(): Primary %s can't have both VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT and "
+ "VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set.",
+ report_data->FormatHandle(commandBuffer).c_str());
+ }
+ } else {
// Secondary Command Buffer
const VkCommandBufferInheritanceInfo *pInfo = pBeginInfo->pInheritanceInfo;
if (!pInfo) {
@@ -4600,7 +5252,7 @@
skip |= ValidateCmd(cb_state, CMD_ENDCOMMANDBUFFER, "vkEndCommandBuffer()");
for (auto query : cb_state->activeQueries) {
skip |= LogError(commandBuffer, "VUID-vkEndCommandBuffer-commandBuffer-00061",
- "Ending command buffer with in progress query: %s, query %d.",
+ "vkEndCommandBuffer(): Ending command buffer with in progress query: %s, query %d.",
report_data->FormatHandle(query.pool).c_str(), query.query);
}
return skip;
@@ -4617,7 +5269,7 @@
LogObjectList objlist(commandBuffer);
objlist.add(cmdPool);
skip |= LogError(objlist, "VUID-vkResetCommandBuffer-commandBuffer-00046",
- "Attempt to reset %s created from %s that does NOT have the "
+ "vkResetCommandBuffer(): Attempt to reset %s created from %s that does NOT have the "
"VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT bit set.",
report_data->FormatHandle(commandBuffer).c_str(), report_data->FormatHandle(cmdPool).c_str());
}
@@ -4639,6 +5291,41 @@
}
}
+bool CoreChecks::ValidateGraphicsPipelineBindPoint(const CMD_BUFFER_STATE *cb_state, const PIPELINE_STATE *pipeline_state) const {
+ bool skip = false;
+ const FRAMEBUFFER_STATE *fb_state = cb_state->activeFramebuffer.get();
+
+ if (fb_state) {
+ auto subpass_desc = &pipeline_state->rp_state->createInfo.pSubpasses[pipeline_state->graphicsPipelineCI.subpass];
+
+ for (size_t i = 0; i < pipeline_state->attachments.size() && i < subpass_desc->colorAttachmentCount; i++) {
+ const auto attachment = subpass_desc->pColorAttachments[i].attachment;
+ if (attachment == VK_ATTACHMENT_UNUSED) continue;
+
+ const IMAGE_VIEW_STATE *imageview_state = GetAttachmentImageViewState(cb_state, fb_state, attachment);
+ if (!imageview_state) continue;
+
+ const IMAGE_STATE *image_state = GetImageState(imageview_state->create_info.image);
+ if (!image_state) continue;
+
+ const VkFormat format = pipeline_state->rp_state->createInfo.pAttachments[attachment].format;
+
+ if (pipeline_state->graphicsPipelineCI.pRasterizationState &&
+ !pipeline_state->graphicsPipelineCI.pRasterizationState->rasterizerDiscardEnable &&
+ pipeline_state->attachments[i].blendEnable &&
+ !(image_state->format_features & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT)) {
+ skip |= LogError(device, "VUID-VkGraphicsPipelineCreateInfo-blendEnable-02023",
+ "vkCreateGraphicsPipelines(): pipeline.pColorBlendState.pAttachments[" PRINTF_SIZE_T_SPECIFIER
+ "].blendEnable is VK_TRUE but format %s associated with this attached image (%s) does "
+ "not support VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT.",
+ i, report_data->FormatHandle(image_state->image).c_str(), string_VkFormat(format));
+ }
+ }
+ }
+
+ return skip;
+}
+
bool CoreChecks::PreCallValidateCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
VkPipeline pipeline) const {
const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
@@ -4673,6 +5360,9 @@
"Cannot bind a pipeline of type %s to the ray-tracing pipeline bind point",
GetPipelineTypeName(pipeline_state_bind_point));
}
+ } else {
+ if (pipelineBindPoint == VK_PIPELINE_BIND_POINT_GRAPHICS)
+ skip |= ValidateGraphicsPipelineBindPoint(cb_state, pipeline_state);
}
return skip;
@@ -4853,8 +5543,31 @@
return skip;
}
-bool CoreChecks::ValidateBindAccelerationStructureMemoryNV(VkDevice device,
- const VkBindAccelerationStructureMemoryInfoNV &info) const {
+bool CoreChecks::PreCallValidateCreateAccelerationStructureKHR(VkDevice device,
+ const VkAccelerationStructureCreateInfoKHR *pCreateInfo,
+ const VkAllocationCallbacks *pAllocator,
+ VkAccelerationStructureKHR *pAccelerationStructure) const {
+ bool skip = false;
+ if (pCreateInfo) {
+ for (uint32_t i = 0; i < pCreateInfo->maxGeometryCount; ++i) {
+ if (pCreateInfo->pGeometryInfos[i].geometryType == VK_GEOMETRY_TYPE_TRIANGLES_KHR) {
+ const VkFormatProperties format_properties = GetPDFormatProperties(pCreateInfo->pGeometryInfos[i].vertexFormat);
+ if (!(format_properties.bufferFeatures & VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR)) {
+ skip |= LogError(
+ device, "VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-geometryType-03501",
+ "VkAccelerationStructureCreateGeometryTypeInfoKHR: If geometryType is VK_GEOMETRY_TYPE_TRIANGLES_KHR,"
+ "pCreateInfo->pGeometryInfos[%u].vertexFormat %s must support the "
+ "VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR in"
+ "VkFormatProperties::bufferFeatures as returned by vkGetPhysicalDeviceFormatProperties2.",
+ i, string_VkFormat(pCreateInfo->pGeometryInfos[i].vertexFormat));
+ }
+ }
+ }
+ }
+ return skip;
+}
+bool CoreChecks::ValidateBindAccelerationStructureMemory(VkDevice device,
+ const VkBindAccelerationStructureMemoryInfoKHR &info) const {
bool skip = false;
const ACCELERATION_STRUCTURE_STATE *as_state = GetAccelerationStructureState(info.accelerationStructure);
@@ -4871,7 +5584,6 @@
const auto mem_info = GetDevMemState(info.memory);
if (mem_info) {
skip |= ValidateInsertAccelerationStructureMemoryRange(info.accelerationStructure, mem_info, info.memoryOffset,
- as_state->memory_requirements.memoryRequirements,
"vkBindAccelerationStructureMemoryNV()");
skip |= ValidateMemoryTypes(mem_info, as_state->memory_requirements.memoryRequirements.memoryTypeBits,
"vkBindAccelerationStructureMemoryNV()",
@@ -4903,15 +5615,20 @@
return skip;
}
-bool CoreChecks::PreCallValidateBindAccelerationStructureMemoryNV(VkDevice device, uint32_t bindInfoCount,
- const VkBindAccelerationStructureMemoryInfoNV *pBindInfos) const {
+bool CoreChecks::PreCallValidateBindAccelerationStructureMemoryKHR(
+ VkDevice device, uint32_t bindInfoCount, const VkBindAccelerationStructureMemoryInfoKHR *pBindInfos) const {
bool skip = false;
for (uint32_t i = 0; i < bindInfoCount; i++) {
- skip |= ValidateBindAccelerationStructureMemoryNV(device, pBindInfos[i]);
+ skip |= ValidateBindAccelerationStructureMemory(device, pBindInfos[i]);
}
return skip;
}
+bool CoreChecks::PreCallValidateBindAccelerationStructureMemoryNV(VkDevice device, uint32_t bindInfoCount,
+ const VkBindAccelerationStructureMemoryInfoNV *pBindInfos) const {
+ return PreCallValidateBindAccelerationStructureMemoryKHR(device, bindInfoCount, pBindInfos);
+}
+
bool CoreChecks::PreCallValidateGetAccelerationStructureHandleNV(VkDevice device, VkAccelerationStructureNV accelerationStructure,
size_t dataSize, void *pData) const {
bool skip = false;
@@ -4927,6 +5644,42 @@
return skip;
}
+bool CoreChecks::PreCallValidateCmdBuildAccelerationStructureKHR(
+ VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
+ const VkAccelerationStructureBuildOffsetInfoKHR *const *ppOffsetInfos) const {
+ bool skip = false;
+ const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ assert(cb_state);
+ skip = ValidateCmdQueueFlags(cb_state, "vkCmdBuildAccelerationStructureKHR()", VK_QUEUE_COMPUTE_BIT,
+ "VUID-vkCmdBuildAccelerationStructureKHR-commandBuffer-cmdpool");
+ skip |= ValidateCmd(cb_state, CMD_BUILDACCELERATIONSTRUCTUREKHR, "vkCmdBuildAccelerationStructureKHR()");
+ skip |=
+ InsideRenderPass(cb_state, "vkCmdBuildAccelerationStructureKHR()", "VUID-vkCmdBuildAccelerationStructureKHR-renderpass");
+ if (pInfos != NULL) {
+ for (uint32_t info_index = 0; info_index < infoCount; ++info_index) {
+ const ACCELERATION_STRUCTURE_STATE *src_as_state =
+ GetAccelerationStructureState(pInfos[info_index].srcAccelerationStructure);
+ if (pInfos[info_index].update == VK_TRUE) {
+ if (pInfos[info_index].srcAccelerationStructure == VK_NULL_HANDLE) {
+ skip |= LogError(commandBuffer, "VUID-VkAccelerationStructureBuildGeometryInfoKHR-update-03537",
+ "vkCmdBuildAccelerationStructureKHR(): If update is VK_TRUE, srcAccelerationStructure must "
+ "not be VK_NULL_HANDLE");
+ } else {
+ if (src_as_state == nullptr || !src_as_state->built ||
+ !(src_as_state->build_info_khr.flags & VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR)) {
+ skip |= LogError(
+ commandBuffer, "VUID-VkAccelerationStructureBuildGeometryInfoKHR-update-03538",
+ "vkCmdBuildAccelerationStructureKHR(): If update is VK_TRUE, srcAccelerationStructure must have "
+ "been built before with VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR set "
+ "in VkAccelerationStructureBuildGeometryInfoKHR flags");
+ }
+ }
+ }
+ }
+ }
+ return skip;
+}
+
bool CoreChecks::PreCallValidateCmdBuildAccelerationStructureNV(VkCommandBuffer commandBuffer,
const VkAccelerationStructureInfoNV *pInfo, VkBuffer instanceData,
VkDeviceSize instanceOffset, VkBool32 update,
@@ -4938,6 +5691,7 @@
"VUID-vkCmdBuildAccelerationStructureNV-commandBuffer-cmdpool");
skip |= ValidateCmd(cb_state, CMD_BUILDACCELERATIONSTRUCTURENV, "vkCmdBuildAccelerationStructureNV()");
+ skip |= InsideRenderPass(cb_state, "vkCmdBuildAccelerationStructureNV()", "VUID-vkCmdBuildAccelerationStructureNV-renderpass");
if (pInfo != nullptr && pInfo->type == VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV) {
for (uint32_t i = 0; i < pInfo->geometryCount; i++) {
@@ -4957,33 +5711,33 @@
const BUFFER_STATE *scratch_buffer_state = GetBufferState(scratch);
if (dst_as_state != nullptr && pInfo != nullptr) {
- if (dst_as_state->create_info.info.type != pInfo->type) {
+ if (dst_as_state->create_infoNV.info.type != pInfo->type) {
skip |= LogError(commandBuffer, "VUID-vkCmdBuildAccelerationStructureNV-dst-02488",
"vkCmdBuildAccelerationStructureNV(): create info VkAccelerationStructureInfoNV::type"
"[%s] must be identical to build info VkAccelerationStructureInfoNV::type [%s].",
- string_VkAccelerationStructureTypeNV(dst_as_state->create_info.info.type),
+ string_VkAccelerationStructureTypeNV(dst_as_state->create_infoNV.info.type),
string_VkAccelerationStructureTypeNV(pInfo->type));
}
- if (dst_as_state->create_info.info.flags != pInfo->flags) {
+ if (dst_as_state->create_infoNV.info.flags != pInfo->flags) {
skip |= LogError(commandBuffer, "VUID-vkCmdBuildAccelerationStructureNV-dst-02488",
"vkCmdBuildAccelerationStructureNV(): create info VkAccelerationStructureInfoNV::flags"
"[0x%X] must be identical to build info VkAccelerationStructureInfoNV::flags [0x%X].",
- dst_as_state->create_info.info.flags, pInfo->flags);
+ dst_as_state->create_infoNV.info.flags, pInfo->flags);
}
- if (dst_as_state->create_info.info.instanceCount < pInfo->instanceCount) {
+ if (dst_as_state->create_infoNV.info.instanceCount < pInfo->instanceCount) {
skip |= LogError(commandBuffer, "VUID-vkCmdBuildAccelerationStructureNV-dst-02488",
"vkCmdBuildAccelerationStructureNV(): create info VkAccelerationStructureInfoNV::instanceCount "
"[%d] must be greater than or equal to build info VkAccelerationStructureInfoNV::instanceCount [%d].",
- dst_as_state->create_info.info.instanceCount, pInfo->instanceCount);
+ dst_as_state->create_infoNV.info.instanceCount, pInfo->instanceCount);
}
- if (dst_as_state->create_info.info.geometryCount < pInfo->geometryCount) {
+ if (dst_as_state->create_infoNV.info.geometryCount < pInfo->geometryCount) {
skip |= LogError(commandBuffer, "VUID-vkCmdBuildAccelerationStructureNV-dst-02488",
"vkCmdBuildAccelerationStructureNV(): create info VkAccelerationStructureInfoNV::geometryCount"
"[%d] must be greater than or equal to build info VkAccelerationStructureInfoNV::geometryCount [%d].",
- dst_as_state->create_info.info.geometryCount, pInfo->geometryCount);
+ dst_as_state->create_infoNV.info.geometryCount, pInfo->geometryCount);
} else {
for (uint32_t i = 0; i < pInfo->geometryCount; i++) {
- const VkGeometryDataNV &create_geometry_data = dst_as_state->create_info.info.pGeometries[i].geometry;
+ const VkGeometryDataNV &create_geometry_data = dst_as_state->create_infoNV.info.pGeometries[i].geometry;
const VkGeometryDataNV &build_geometry_data = pInfo->pGeometries[i].geometry;
if (create_geometry_data.triangles.vertexCount < build_geometry_data.triangles.vertexCount) {
skip |= LogError(
@@ -5072,6 +5826,19 @@
"or equal to the size of scratch minus scratchOffset");
}
}
+ if (instanceData != VK_NULL_HANDLE) {
+ const auto buffer_state = GetBufferState(instanceData);
+ if (buffer_state != nullptr) {
+ skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_RAY_TRACING_BIT_NV, true,
+ "VUID-VkAccelerationStructureInfoNV-instanceData-02782",
+ "vkCmdBuildAccelerationStructureNV()", "VK_BUFFER_USAGE_RAY_TRACING_BIT_NV");
+ }
+ }
+ if (scratch_buffer_state != nullptr) {
+ skip |= ValidateBufferUsageFlags(scratch_buffer_state, VK_BUFFER_USAGE_RAY_TRACING_BIT_NV, true,
+ "VUID-VkAccelerationStructureInfoNV-scratch-02781", "vkCmdBuildAccelerationStructureNV()",
+ "VK_BUFFER_USAGE_RAY_TRACING_BIT_NV");
+ }
return skip;
}
@@ -5084,7 +5851,7 @@
"VUID-vkCmdCopyAccelerationStructureNV-commandBuffer-cmdpool");
skip |= ValidateCmd(cb_state, CMD_COPYACCELERATIONSTRUCTURENV, "vkCmdCopyAccelerationStructureNV()");
-
+ skip |= InsideRenderPass(cb_state, "vkCmdCopyAccelerationStructureNV()", "VUID-vkCmdCopyAccelerationStructureNV-renderpass");
const ACCELERATION_STRUCTURE_STATE *dst_as_state = GetAccelerationStructureState(dst);
const ACCELERATION_STRUCTURE_STATE *src_as_state = GetAccelerationStructureState(src);
@@ -5103,6 +5870,11 @@
"VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_NV.");
}
}
+ if (!(mode == VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_NV || mode == VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR)) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdCopyAccelerationStructureNV-mode-03410",
+ "vkCmdCopyAccelerationStructureNV():mode must be VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR"
+ "or VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR.");
+ }
return skip;
}
@@ -5118,6 +5890,23 @@
return skip;
}
+bool CoreChecks::PreCallValidateDestroyAccelerationStructureKHR(VkDevice device, VkAccelerationStructureKHR accelerationStructure,
+ const VkAllocationCallbacks *pAllocator) const {
+ const ACCELERATION_STRUCTURE_STATE *as_state = GetAccelerationStructureState(accelerationStructure);
+ const VulkanTypedHandle obj_struct(accelerationStructure, kVulkanObjectTypeAccelerationStructureKHR);
+ bool skip = false;
+ if (as_state) {
+ skip |= ValidateObjectNotInUse(as_state, obj_struct, "vkDestroyAccelerationStructureKHR",
+ "VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-02442");
+ }
+ if (pAllocator && !as_state->allocator) {
+ skip |= LogError(device, "VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-02444",
+ "vkDestroyAccelerationStructureKH:If no VkAllocationCallbacks were provided when accelerationStructure"
+ "was created, pAllocator must be NULL.");
+ }
+ return skip;
+}
+
bool CoreChecks::PreCallValidateCmdSetViewportWScalingNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
uint32_t viewportCount,
const VkViewportWScalingNV *pViewportWScalings) const {
@@ -5253,11 +6042,11 @@
if (descriptor_set) {
// Verify that set being bound is compatible with overlapping setLayout of pipelineLayout
if (!VerifySetLayoutCompatibility(report_data, descriptor_set, pipeline_layout, set_idx + firstSet, error_string)) {
- skip |=
- LogError(pDescriptorSets[set_idx], "VUID-vkCmdBindDescriptorSets-pDescriptorSets-00358",
- "descriptorSet #%u being bound is not compatible with overlapping descriptorSetLayout at index %u of "
- "%s due to: %s.",
- set_idx, set_idx + firstSet, report_data->FormatHandle(layout).c_str(), error_string.c_str());
+ skip |= LogError(pDescriptorSets[set_idx], "VUID-vkCmdBindDescriptorSets-pDescriptorSets-00358",
+ "vkCmdBindDescriptorSets(): descriptorSet #%u being bound is not compatible with overlapping "
+ "descriptorSetLayout at index %u of "
+ "%s due to: %s.",
+ set_idx, set_idx + firstSet, report_data->FormatHandle(layout).c_str(), error_string.c_str());
}
auto set_dynamic_descriptor_count = descriptor_set->GetDynamicDescriptorCount();
@@ -5267,7 +6056,8 @@
// Test/report this here, such that we don't run past the end of pDynamicOffsets in the else clause
skip |=
LogError(pDescriptorSets[set_idx], "VUID-vkCmdBindDescriptorSets-dynamicOffsetCount-00359",
- "descriptorSet #%u (%s) requires %u dynamicOffsets, but only %u dynamicOffsets are left in "
+ "vkCmdBindDescriptorSets(): descriptorSet #%u (%s) requires %u dynamicOffsets, but only %u "
+ "dynamicOffsets are left in "
"pDynamicOffsets array. There must be one dynamic offset for each dynamic descriptor being bound.",
set_idx, report_data->FormatHandle(pDescriptorSets[set_idx]).c_str(),
descriptor_set->GetDynamicDescriptorCount(), (dynamicOffsetCount - total_dynamic_descriptors));
@@ -5295,25 +6085,26 @@
}
}
} else {
- skip |= LogError(pDescriptorSets[set_idx], kVUID_Core_DrawState_InvalidSet, "Attempt to bind %s that doesn't exist!",
+ skip |= LogError(pDescriptorSets[set_idx], kVUID_Core_DrawState_InvalidSet,
+ "vkCmdBindDescriptorSets(): Attempt to bind %s that doesn't exist!",
report_data->FormatHandle(pDescriptorSets[set_idx]).c_str());
}
}
// dynamicOffsetCount must equal the total number of dynamic descriptors in the sets being bound
if (total_dynamic_descriptors != dynamicOffsetCount) {
- skip |=
- LogError(cb_state->commandBuffer, "VUID-vkCmdBindDescriptorSets-dynamicOffsetCount-00359",
- "Attempting to bind %u descriptorSets with %u dynamic descriptors, but dynamicOffsetCount is %u. It should "
- "exactly match the number of dynamic descriptors.",
- setCount, total_dynamic_descriptors, dynamicOffsetCount);
+ skip |= LogError(cb_state->commandBuffer, "VUID-vkCmdBindDescriptorSets-dynamicOffsetCount-00359",
+ "vkCmdBindDescriptorSets(): Attempting to bind %u descriptorSets with %u dynamic descriptors, but "
+ "dynamicOffsetCount is %u. It should "
+ "exactly match the number of dynamic descriptors.",
+ setCount, total_dynamic_descriptors, dynamicOffsetCount);
}
// firstSet and descriptorSetCount sum must be less than setLayoutCount
if ((firstSet + setCount) > static_cast<uint32_t>(pipeline_layout->set_layouts.size())) {
- skip |=
- LogError(cb_state->commandBuffer, "VUID-vkCmdBindDescriptorSets-firstSet-00360",
- "Sum of firstSet (%u) and descriptorSetCount (%u) is greater than VkPipelineLayoutCreateInfo::setLayoutCount "
- "(%zu) when pipeline layout was created",
- firstSet, setCount, pipeline_layout->set_layouts.size());
+ skip |= LogError(cb_state->commandBuffer, "VUID-vkCmdBindDescriptorSets-firstSet-00360",
+ "vkCmdBindDescriptorSets(): Sum of firstSet (%u) and descriptorSetCount (%u) is greater than "
+ "VkPipelineLayoutCreateInfo::setLayoutCount "
+ "(%zu) when pipeline layout was created",
+ firstSet, setCount, pipeline_layout->set_layouts.size());
}
return skip;
}
@@ -5393,21 +6184,6 @@
return skip;
}
-static VkDeviceSize GetIndexAlignment(VkIndexType indexType) {
- switch (indexType) {
- case VK_INDEX_TYPE_UINT16:
- return 2;
- case VK_INDEX_TYPE_UINT32:
- return 4;
- case VK_INDEX_TYPE_UINT8_EXT:
- return 1;
- default:
- // Not a real index type. Express no alignment requirement here; we expect upper layer
- // to have already picked up on the enum being nonsense.
- return 1;
- }
-}
-
bool CoreChecks::PreCallValidateCmdBindIndexBuffer(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
VkIndexType indexType) const {
const auto buffer_state = GetBufferState(buffer);
@@ -5428,6 +6204,12 @@
"vkCmdBindIndexBuffer() offset (0x%" PRIxLEAST64 ") does not fall on alignment (%s) boundary.", offset,
string_VkIndexType(indexType));
}
+ if (offset >= buffer_state->requirements.size) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdBindIndexBuffer-offset-00431",
+ "vkCmdBindIndexBuffer() offset (0x%" PRIxLEAST64 ") is not less than the size (0x%" PRIxLEAST64
+ ") of buffer (%s).",
+ offset, buffer_state->requirements.size, report_data->FormatHandle(buffer_state->buffer).c_str());
+ }
return skip;
}
@@ -5442,15 +6224,17 @@
skip |= ValidateCmd(cb_state, CMD_BINDVERTEXBUFFERS, "vkCmdBindVertexBuffers()");
for (uint32_t i = 0; i < bindingCount; ++i) {
const auto buffer_state = GetBufferState(pBuffers[i]);
- assert(buffer_state);
- skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, true,
- "VUID-vkCmdBindVertexBuffers-pBuffers-00627", "vkCmdBindVertexBuffers()",
- "VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
- skip |=
- ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdBindVertexBuffers()", "VUID-vkCmdBindVertexBuffers-pBuffers-00628");
- if (pOffsets[i] >= buffer_state->createInfo.size) {
- skip |= LogError(buffer_state->buffer, "VUID-vkCmdBindVertexBuffers-pOffsets-00626",
+ if (buffer_state) {
+ skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, true,
+ "VUID-vkCmdBindVertexBuffers-pBuffers-00627", "vkCmdBindVertexBuffers()",
+ "VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
+ skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdBindVertexBuffers()",
+ "VUID-vkCmdBindVertexBuffers-pBuffers-00628");
+ if (pOffsets[i] >= buffer_state->createInfo.size) {
+ skip |=
+ LogError(buffer_state->buffer, "VUID-vkCmdBindVertexBuffers-pOffsets-00626",
"vkCmdBindVertexBuffers() offset (0x%" PRIxLEAST64 ") is beyond the end of the buffer.", pOffsets[i]);
+ }
}
}
return skip;
@@ -5496,9 +6280,10 @@
"VUID-vkCmdSetEvent-commandBuffer-cmdpool");
skip |= ValidateCmd(cb_state, CMD_SETEVENT, "vkCmdSetEvent()");
skip |= InsideRenderPass(cb_state, "vkCmdSetEvent()", "VUID-vkCmdSetEvent-renderpass");
- skip |= ValidateStageMaskGsTsEnables(stageMask, "vkCmdSetEvent()", "VUID-vkCmdSetEvent-stageMask-01150",
- "VUID-vkCmdSetEvent-stageMask-01151", "VUID-vkCmdSetEvent-stageMask-02107",
- "VUID-vkCmdSetEvent-stageMask-02108");
+ skip |= ValidateStageMaskGsTsEnables(stageMask, "vkCmdSetEvent()", "VUID-vkCmdSetEvent-stageMask-04090",
+ "VUID-vkCmdSetEvent-stageMask-04091", "VUID-vkCmdSetEvent-stageMask-04095",
+ "VUID-vkCmdSetEvent-stageMask-04096");
+ skip |= ValidateStageMaskHost(stageMask, "vkCmdSetEvent()", "VUID-vkCmdSetEvent-stageMask-01149");
return skip;
}
@@ -5510,9 +6295,10 @@
"VUID-vkCmdResetEvent-commandBuffer-cmdpool");
skip |= ValidateCmd(cb_state, CMD_RESETEVENT, "vkCmdResetEvent()");
skip |= InsideRenderPass(cb_state, "vkCmdResetEvent()", "VUID-vkCmdResetEvent-renderpass");
- skip |= ValidateStageMaskGsTsEnables(stageMask, "vkCmdResetEvent()", "VUID-vkCmdResetEvent-stageMask-01154",
- "VUID-vkCmdResetEvent-stageMask-01155", "VUID-vkCmdResetEvent-stageMask-02109",
- "VUID-vkCmdResetEvent-stageMask-02110");
+ skip |= ValidateStageMaskGsTsEnables(stageMask, "vkCmdResetEvent()", "VUID-vkCmdResetEvent-stageMask-04090",
+ "VUID-vkCmdResetEvent-stageMask-04091", "VUID-vkCmdResetEvent-stageMask-04095",
+ "VUID-vkCmdResetEvent-stageMask-04096");
+ skip |= ValidateStageMaskHost(stageMask, "vkCmdResetEvent()", "VUID-vkCmdResetEvent-stageMask-01153");
return skip;
}
@@ -5531,7 +6317,8 @@
(extensions.vk_ext_conditional_rendering ? VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT : 0) |
(extensions.vk_ext_transform_feedback ? VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT : 0) |
(extensions.vk_nv_shading_rate_image ? VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV : 0) |
- (extensions.vk_ext_fragment_density_map ? VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT : 0));
+ (extensions.vk_ext_fragment_density_map ? VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT : 0) |
+ (extensions.vk_ext_fragment_density_map_2 ? VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT : 0));
}
static bool HasNonFramebufferStagePipelineStageFlags(VkPipelineStageFlags inflags) {
@@ -5621,12 +6408,12 @@
}
// Verify image barrier image state and that the image is consistent with FB image
-bool CoreChecks::ValidateImageBarrierAttachment(const char *funcName, CMD_BUFFER_STATE const *cb_state, VkFramebuffer framebuffer,
- uint32_t active_subpass, const safe_VkSubpassDescription2 &sub_desc,
- const VkRenderPass rp_handle, uint32_t img_index,
- const VkImageMemoryBarrier &img_barrier) const {
+bool CoreChecks::ValidateImageBarrierAttachment(const char *funcName, CMD_BUFFER_STATE const *cb_state,
+ const FRAMEBUFFER_STATE *framebuffer, uint32_t active_subpass,
+ const safe_VkSubpassDescription2 &sub_desc, const VkRenderPass rp_handle,
+ uint32_t img_index, const VkImageMemoryBarrier &img_barrier) const {
bool skip = false;
- const auto &fb_state = GetFramebufferState(framebuffer);
+ const auto *fb_state = framebuffer;
assert(fb_state);
const auto img_bar_image = img_barrier.image;
bool image_match = false;
@@ -5636,7 +6423,7 @@
// Verify that a framebuffer image matches barrier image
const auto attachmentCount = fb_state->createInfo.attachmentCount;
for (uint32_t attachment = 0; attachment < attachmentCount; ++attachment) {
- auto view_state = GetAttachmentImageViewState(fb_state, attachment);
+ auto view_state = GetAttachmentImageViewState(cb_state, fb_state, attachment);
if (view_state && (img_bar_image == view_state->create_info.image)) {
image_match = true;
attach_index = attachment;
@@ -5672,7 +6459,7 @@
}
}
if (!sub_image_found) {
- skip |= LogError(rp_handle, "VUID-vkCmdPipelineBarrier-image-02635",
+ skip |= LogError(rp_handle, "VUID-vkCmdPipelineBarrier-image-04073",
"%s: Barrier pImageMemoryBarriers[%d].%s is not referenced by the VkSubpassDescription for "
"active subpass (%d) of current %s.",
funcName, img_index, report_data->FormatHandle(img_bar_image).c_str(), active_subpass,
@@ -5680,7 +6467,7 @@
}
} else { // !image_match
skip |=
- LogError(fb_state->framebuffer, "VUID-vkCmdPipelineBarrier-image-02635",
+ LogError(fb_state->framebuffer, "VUID-vkCmdPipelineBarrier-image-04073",
"%s: Barrier pImageMemoryBarriers[%d].%s does not match an image from the current %s.", funcName, img_index,
report_data->FormatHandle(img_bar_image).c_str(), report_data->FormatHandle(fb_state->framebuffer).c_str());
}
@@ -5694,7 +6481,7 @@
if (sub_image_found && sub_image_layout != img_barrier.oldLayout) {
LogObjectList objlist(rp_handle);
objlist.add(img_bar_image);
- skip |= LogError(objlist, "VUID-vkCmdPipelineBarrier-oldLayout-02636",
+ skip |= LogError(objlist, "VUID-vkCmdPipelineBarrier-oldLayout-01181",
"%s: Barrier pImageMemoryBarriers[%d].%s is referenced by the VkSubpassDescription for active "
"subpass (%d) of current %s as having layout %s, but image barrier has layout %s.",
funcName, img_index, report_data->FormatHandle(img_bar_image).c_str(), active_subpass,
@@ -5746,7 +6533,7 @@
}
// Secondary CBs can have null framebuffer so record will queue up validation in that case 'til FB is known
if (VK_NULL_HANDLE != cb_state->activeFramebuffer) {
- skip |= ValidateImageBarrierAttachment(funcName, cb_state, cb_state->activeFramebuffer, active_subpass, sub_desc,
+ skip |= ValidateImageBarrierAttachment(funcName, cb_state, cb_state->activeFramebuffer.get(), active_subpass, sub_desc,
rp_handle, i, img_barrier);
}
}
@@ -5954,11 +6741,9 @@
enum VuIndex {
kSrcOrDstMustBeIgnore,
kSpecialOrIgnoreOnly,
- kSrcIgnoreRequiresDstIgnore,
- kDstValidOrSpecialIfNotIgnore,
- kSrcValidOrSpecialIfNotIgnore,
+ kSrcAndDstValidOrSpecial,
kSrcAndDestMustBeIgnore,
- kBothIgnoreOrBothValid,
+ kSrcAndDstBothValid,
kSubmitQueueMustMatchSrcOrDst
};
static const char *vu_summary[] = {"Source or destination queue family must be ignored.",
@@ -5971,25 +6756,21 @@
"Source or destination queue family must match submit queue family, if not ignored."};
static const std::string image_error_codes[] = {
- "VUID-VkImageMemoryBarrier-image-01381", // kSrcOrDstMustBeIgnore
- "VUID-VkImageMemoryBarrier-image-01766", // kSpecialOrIgnoreOnly
- "VUID-VkImageMemoryBarrier-image-01201", // kSrcIgnoreRequiresDstIgnore
- "VUID-VkImageMemoryBarrier-image-01768", // kDstValidOrSpecialIfNotIgnore
- "VUID-VkImageMemoryBarrier-image-01767", // kSrcValidOrSpecialIfNotIgnore
- "VUID-VkImageMemoryBarrier-image-01199", // kSrcAndDestMustBeIgnore
- "VUID-VkImageMemoryBarrier-image-01200", // kBothIgnoreOrBothValid
- "VUID-VkImageMemoryBarrier-image-01205", // kSubmitQueueMustMatchSrcOrDst
+ "VUID-VkImageMemoryBarrier-image-01381", // kSrcOrDstMustBeIgnore
+ "VUID-VkImageMemoryBarrier-image-04071", // kSpecialOrIgnoreOnly
+ "VUID-VkImageMemoryBarrier-image-04072", // kSrcAndDstValidOrSpecial
+ "VUID-VkImageMemoryBarrier-image-01199", // kSrcAndDestMustBeIgnore
+ "VUID-VkImageMemoryBarrier-image-04069", // kSrcAndDstBothValid
+ "UNASSIGNED-CoreValidation-vkImageMemoryBarrier-sharing-mode-exclusive-same-family", // kSubmitQueueMustMatchSrcOrDst
};
static const std::string buffer_error_codes[] = {
- "VUID-VkBufferMemoryBarrier-buffer-01191", // kSrcOrDstMustBeIgnore
- "VUID-VkBufferMemoryBarrier-buffer-01763", // kSpecialOrIgnoreOnly
- "VUID-VkBufferMemoryBarrier-buffer-01193", // kSrcIgnoreRequiresDstIgnore
- "VUID-VkBufferMemoryBarrier-buffer-01765", // kDstValidOrSpecialIfNotIgnore
- "VUID-VkBufferMemoryBarrier-buffer-01764", // kSrcValidOrSpecialIfNotIgnore
- "VUID-VkBufferMemoryBarrier-buffer-01190", // kSrcAndDestMustBeIgnore
- "VUID-VkBufferMemoryBarrier-buffer-01192", // kBothIgnoreOrBothValid
- "VUID-VkBufferMemoryBarrier-buffer-01196", // kSubmitQueueMustMatchSrcOrDst
+ "VUID-VkBufferMemoryBarrier-buffer-01191", // kSrcOrDstMustBeIgnore
+ "VUID-VkBufferMemoryBarrier-buffer-04088", // kSpecialOrIgnoreOnly
+ "VUID-VkBufferMemoryBarrier-buffer-04089", // kSrcAndDstValidOrSpecial
+ "VUID-VkBufferMemoryBarrier-buffer-01190", // kSrcAndDestMustBeIgnore
+ "VUID-VkBufferMemoryBarrier-buffer-04086", // kSrcAndDstBothValid
+ "UNASSIGNED-CoreValidation-vkBufferMemoryBarrier-sharing-mode-exclusive-same-family", // kSubmitQueueMustMatchSrcOrDst
};
class ValidatorState {
@@ -6051,7 +6832,7 @@
inline bool KhrExternalMem() const { return mem_ext_; }
inline bool IsValid(uint32_t queue_family) const { return (queue_family < limit_); }
inline bool IsValidOrSpecial(uint32_t queue_family) const {
- return IsValid(queue_family) || (mem_ext_ && QueueFamilyIsSpecial(queue_family));
+ return IsValid(queue_family) || (mem_ext_ && QueueFamilyIsExternal(queue_family));
}
// Helpers for LogMsg
@@ -6104,20 +6885,19 @@
if (!(src_ignored || dst_ignored)) {
skip |= val.LogMsg(kSrcOrDstMustBeIgnore, src_queue_family, dst_queue_family);
}
- if ((src_ignored && !(dst_ignored || QueueFamilyIsSpecial(dst_queue_family))) ||
- (dst_ignored && !(src_ignored || QueueFamilyIsSpecial(src_queue_family)))) {
+ if ((src_ignored && !(dst_ignored || QueueFamilyIsExternal(dst_queue_family))) ||
+ (dst_ignored && !(src_ignored || QueueFamilyIsExternal(src_queue_family)))) {
skip |= val.LogMsg(kSpecialOrIgnoreOnly, src_queue_family, dst_queue_family);
}
} else {
// VK_SHARING_MODE_EXCLUSIVE
- if (src_ignored && !dst_ignored) {
- skip |= val.LogMsg(kSrcIgnoreRequiresDstIgnore, src_queue_family, dst_queue_family);
- }
- if (!dst_ignored && !val.IsValidOrSpecial(dst_queue_family)) {
- skip |= val.LogMsg(kDstValidOrSpecialIfNotIgnore, dst_queue_family, "dstQueueFamilyIndex");
- }
- if (!src_ignored && !val.IsValidOrSpecial(src_queue_family)) {
- skip |= val.LogMsg(kSrcValidOrSpecialIfNotIgnore, src_queue_family, "srcQueueFamilyIndex");
+ if (src_queue_family != dst_queue_family) {
+ if (!val.IsValidOrSpecial(dst_queue_family)) {
+ skip |= val.LogMsg(kSrcAndDstValidOrSpecial, dst_queue_family, "dstQueueFamilyIndex");
+ }
+ if (!val.IsValidOrSpecial(src_queue_family)) {
+ skip |= val.LogMsg(kSrcAndDstValidOrSpecial, src_queue_family, "srcQueueFamilyIndex");
+ }
}
}
} else {
@@ -6128,8 +6908,8 @@
}
} else {
// VK_SHARING_MODE_EXCLUSIVE
- if (!((src_ignored && dst_ignored) || (val.IsValid(src_queue_family) && val.IsValid(dst_queue_family)))) {
- skip |= val.LogMsg(kBothIgnoreOrBothValid, src_queue_family, dst_queue_family);
+ if ((src_queue_family != dst_queue_family) && !(val.IsValid(src_queue_family) && val.IsValid(dst_queue_family))) {
+ skip |= val.LogMsg(kSrcAndDstBothValid, src_queue_family, dst_queue_family);
}
}
}
@@ -6438,13 +7218,13 @@
auto barrier_op_type = ComputeBarrierOperationsType(cb_state, bufferMemoryBarrierCount, pBufferMemoryBarriers,
imageMemoryBarrierCount, pImageMemoryBarriers);
bool skip = ValidateStageMasksAgainstQueueCapabilities(cb_state, sourceStageMask, dstStageMask, barrier_op_type,
- "vkCmdWaitEvents", "VUID-vkCmdWaitEvents-srcStageMask-01164");
- skip |= ValidateStageMaskGsTsEnables(sourceStageMask, "vkCmdWaitEvents()", "VUID-vkCmdWaitEvents-srcStageMask-01159",
- "VUID-vkCmdWaitEvents-srcStageMask-01161", "VUID-vkCmdWaitEvents-srcStageMask-02111",
- "VUID-vkCmdWaitEvents-srcStageMask-02112");
- skip |= ValidateStageMaskGsTsEnables(dstStageMask, "vkCmdWaitEvents()", "VUID-vkCmdWaitEvents-dstStageMask-01160",
- "VUID-vkCmdWaitEvents-dstStageMask-01162", "VUID-vkCmdWaitEvents-dstStageMask-02113",
- "VUID-vkCmdWaitEvents-dstStageMask-02114");
+ "vkCmdWaitEvents", "VUID-vkCmdWaitEvents-srcStageMask-4098");
+ skip |= ValidateStageMaskGsTsEnables(sourceStageMask, "vkCmdWaitEvents()", "VUID-vkCmdWaitEvents-srcStageMask-04090",
+ "VUID-vkCmdWaitEvents-srcStageMask-04091", "VUID-vkCmdWaitEvents-srcStageMask-04095",
+ "VUID-vkCmdWaitEvents-srcStageMask-04096");
+ skip |= ValidateStageMaskGsTsEnables(dstStageMask, "vkCmdWaitEvents()", "VUID-vkCmdWaitEvents-dstStageMask-04090",
+ "VUID-vkCmdWaitEvents-dstStageMask-04091", "VUID-vkCmdWaitEvents-dstStageMask-04095",
+ "VUID-vkCmdWaitEvents-dstStageMask-04096");
skip |= ValidateCmdQueueFlags(cb_state, "vkCmdWaitEvents()", VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT,
"VUID-vkCmdWaitEvents-commandBuffer-cmdpool");
skip |= ValidateCmd(cb_state, CMD_WAITEVENTS, "vkCmdWaitEvents()");
@@ -6503,20 +7283,20 @@
auto barrier_op_type = ComputeBarrierOperationsType(cb_state, bufferMemoryBarrierCount, pBufferMemoryBarriers,
imageMemoryBarrierCount, pImageMemoryBarriers);
skip |= ValidateStageMasksAgainstQueueCapabilities(cb_state, srcStageMask, dstStageMask, barrier_op_type,
- "vkCmdPipelineBarrier", "VUID-vkCmdPipelineBarrier-srcStageMask-01183");
+ "vkCmdPipelineBarrier", "VUID-vkCmdPipelineBarrier-srcStageMask-4098");
}
skip |= ValidateCmdQueueFlags(cb_state, "vkCmdPipelineBarrier()",
VK_QUEUE_TRANSFER_BIT | VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT,
"VUID-vkCmdPipelineBarrier-commandBuffer-cmdpool");
skip |= ValidateCmd(cb_state, CMD_PIPELINEBARRIER, "vkCmdPipelineBarrier()");
skip |=
- ValidateStageMaskGsTsEnables(srcStageMask, "vkCmdPipelineBarrier()", "VUID-vkCmdPipelineBarrier-srcStageMask-01168",
- "VUID-vkCmdPipelineBarrier-srcStageMask-01170", "VUID-vkCmdPipelineBarrier-srcStageMask-02115",
- "VUID-vkCmdPipelineBarrier-srcStageMask-02116");
+ ValidateStageMaskGsTsEnables(srcStageMask, "vkCmdPipelineBarrier()", "VUID-vkCmdPipelineBarrier-srcStageMask-04090",
+ "VUID-vkCmdPipelineBarrier-srcStageMask-04091", "VUID-vkCmdPipelineBarrier-srcStageMask-04095",
+ "VUID-vkCmdPipelineBarrier-srcStageMask-04096");
skip |=
- ValidateStageMaskGsTsEnables(dstStageMask, "vkCmdPipelineBarrier()", "VUID-vkCmdPipelineBarrier-dstStageMask-01169",
- "VUID-vkCmdPipelineBarrier-dstStageMask-01171", "VUID-vkCmdPipelineBarrier-dstStageMask-02117",
- "VUID-vkCmdPipelineBarrier-dstStageMask-02118");
+ ValidateStageMaskGsTsEnables(dstStageMask, "vkCmdPipelineBarrier()", "VUID-vkCmdPipelineBarrier-dstStageMask-04090",
+ "VUID-vkCmdPipelineBarrier-dstStageMask-04091", "VUID-vkCmdPipelineBarrier-dstStageMask-04095",
+ "VUID-vkCmdPipelineBarrier-dstStageMask-04096");
if (cb_state->activeRenderPass) {
skip |= ValidateRenderPassPipelineBarriers("vkCmdPipelineBarrier()", cb_state, srcStageMask, dstStageMask, dependencyFlags,
memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
@@ -6541,10 +7321,11 @@
for (uint32_t i = 0; i < imageMemBarrierCount; ++i) {
const auto &img_barrier = pImageMemBarriers[i];
// Secondary CB case w/o FB specified delay validation
- cb_state->cmd_execute_commands_functions.emplace_back([=](const CMD_BUFFER_STATE *primary_cb, VkFramebuffer fb) {
- return ValidateImageBarrierAttachment(func_name, cb_state, fb, active_subpass, sub_desc, rp_state->renderPass, i,
- img_barrier);
- });
+ cb_state->cmd_execute_commands_functions.emplace_back(
+ [=](const CMD_BUFFER_STATE *primary_cb, const FRAMEBUFFER_STATE *fb) {
+ return ValidateImageBarrierAttachment(func_name, cb_state, fb, active_subpass, sub_desc, rp_state->renderPass,
+ i, img_barrier);
+ });
}
}
}
@@ -6567,9 +7348,7 @@
}
bool CoreChecks::ValidateBeginQuery(const CMD_BUFFER_STATE *cb_state, const QueryObject &query_obj, VkFlags flags, CMD_TYPE cmd,
- const char *cmd_name, const char *vuid_queue_flags, const char *vuid_queue_feedback,
- const char *vuid_queue_occlusion, const char *vuid_precise,
- const char *vuid_query_count) const {
+ const char *cmd_name, const ValidateBeginQueryVuids *vuids) const {
bool skip = false;
const auto *query_pool_state = GetQueryPoolState(query_obj.pool);
const auto &query_pool_ci = query_pool_state->createInfo;
@@ -6579,61 +7358,73 @@
"%s: The querypool's query type must not be VK_QUERY_TYPE_TIMESTAMP.", cmd_name);
}
+ // Check for nexted queries
+ if (cb_state->activeQueries.size()) {
+ for (auto a_query : cb_state->activeQueries) {
+ auto active_query_pool_state = GetQueryPoolState(a_query.pool);
+ if (active_query_pool_state->createInfo.queryType == query_pool_ci.queryType) {
+ LogObjectList obj_list(cb_state->commandBuffer);
+ obj_list.add(query_obj.pool);
+ obj_list.add(a_query.pool);
+ skip |= LogError(obj_list, vuids->vuid_dup_query_type,
+ "%s: Within the same command buffer %s, query %d from pool %s has same queryType as active query "
+ "%d from pool %s.",
+ cmd_name, report_data->FormatHandle(cb_state->commandBuffer).c_str(), query_obj.index,
+ report_data->FormatHandle(query_obj.pool).c_str(), a_query.index,
+ report_data->FormatHandle(a_query.pool).c_str());
+ }
+ }
+ }
+
// There are tighter queue constraints to test for certain query pools
if (query_pool_ci.queryType == VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT) {
- skip |= ValidateCmdQueueFlags(cb_state, cmd_name, VK_QUEUE_GRAPHICS_BIT, vuid_queue_feedback);
+ skip |= ValidateCmdQueueFlags(cb_state, cmd_name, VK_QUEUE_GRAPHICS_BIT, vuids->vuid_queue_feedback);
}
if (query_pool_ci.queryType == VK_QUERY_TYPE_OCCLUSION) {
- skip |= ValidateCmdQueueFlags(cb_state, cmd_name, VK_QUEUE_GRAPHICS_BIT, vuid_queue_occlusion);
+ skip |= ValidateCmdQueueFlags(cb_state, cmd_name, VK_QUEUE_GRAPHICS_BIT, vuids->vuid_queue_occlusion);
}
if (query_pool_ci.queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
if (!cb_state->performance_lock_acquired) {
- skip |= LogError(
- cb_state->commandBuffer,
- query_obj.indexed ? "VUID-vkCmdBeginQueryIndexedEXT-queryPool-03223" : "VUID-vkCmdBeginQuery-queryPool-03223",
- "%s: profiling lock must be held before vkBeginCommandBuffer is called on "
- "a command buffer where performance queries are recorded.",
- cmd_name);
+ skip |= LogError(cb_state->commandBuffer, vuids->vuid_profile_lock,
+ "%s: profiling lock must be held before vkBeginCommandBuffer is called on "
+ "a command buffer where performance queries are recorded.",
+ cmd_name);
}
if (query_pool_state->has_perf_scope_command_buffer && cb_state->commandCount > 0) {
- skip |= LogError(
- cb_state->commandBuffer,
- query_obj.indexed ? "VUID-vkCmdBeginQueryIndexedEXT-queryPool-03224" : "VUID-vkCmdBeginQuery-queryPool-03224",
- "%s: Query pool %s was created with a counter of scope "
- "VK_QUERY_SCOPE_COMMAND_BUFFER_KHR but %s is not the first recorded "
- "command in the command buffer.",
- cmd_name, report_data->FormatHandle(query_obj.pool).c_str(), cmd_name);
+ skip |= LogError(cb_state->commandBuffer, vuids->vuid_scope_not_first,
+ "%s: Query pool %s was created with a counter of scope "
+ "VK_QUERY_SCOPE_COMMAND_BUFFER_KHR but %s is not the first recorded "
+ "command in the command buffer.",
+ cmd_name, report_data->FormatHandle(query_obj.pool).c_str(), cmd_name);
}
if (query_pool_state->has_perf_scope_render_pass && cb_state->activeRenderPass) {
- skip |= LogError(
- cb_state->commandBuffer,
- query_obj.indexed ? "VUID-vkCmdBeginQueryIndexedEXT-queryPool-03225" : "VUID-vkCmdBeginQuery-queryPool-03225",
- "%s: Query pool %s was created with a counter of scope "
- "VK_QUERY_SCOPE_RENDER_PASS_KHR but %s is inside a render pass.",
- cmd_name, report_data->FormatHandle(query_obj.pool).c_str(), cmd_name);
+ skip |= LogError(cb_state->commandBuffer, vuids->vuid_scope_in_rp,
+ "%s: Query pool %s was created with a counter of scope "
+ "VK_QUERY_SCOPE_RENDER_PASS_KHR but %s is inside a render pass.",
+ cmd_name, report_data->FormatHandle(query_obj.pool).c_str(), cmd_name);
}
}
- skip |= ValidateCmdQueueFlags(cb_state, cmd_name, VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT, vuid_queue_flags);
+ skip |= ValidateCmdQueueFlags(cb_state, cmd_name, VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT, vuids->vuid_queue_flags);
if (flags & VK_QUERY_CONTROL_PRECISE_BIT) {
if (!enabled_features.core.occlusionQueryPrecise) {
- skip |= LogError(cb_state->commandBuffer, vuid_precise,
+ skip |= LogError(cb_state->commandBuffer, vuids->vuid_precise,
"%s: VK_QUERY_CONTROL_PRECISE_BIT provided, but precise occlusion queries not enabled on the device.",
cmd_name);
}
if (query_pool_ci.queryType != VK_QUERY_TYPE_OCCLUSION) {
skip |=
- LogError(cb_state->commandBuffer, vuid_precise,
+ LogError(cb_state->commandBuffer, vuids->vuid_precise,
"%s: VK_QUERY_CONTROL_PRECISE_BIT provided, but pool query type is not VK_QUERY_TYPE_OCCLUSION", cmd_name);
}
}
if (query_obj.query >= query_pool_ci.queryCount) {
- skip |= LogError(cb_state->commandBuffer, vuid_query_count,
+ skip |= LogError(cb_state->commandBuffer, vuids->vuid_query_count,
"%s: Query index %" PRIu32 " must be less than query count %" PRIu32 " of %s.", cmd_name, query_obj.query,
query_pool_ci.queryCount, report_data->FormatHandle(query_obj.pool).c_str());
}
@@ -6644,21 +7435,39 @@
bool CoreChecks::PreCallValidateCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
VkFlags flags) const {
- if (disabled.query_validation) return false;
+ if (disabled[query_validation]) return false;
const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
assert(cb_state);
QueryObject query_obj(queryPool, slot);
- return ValidateBeginQuery(cb_state, query_obj, flags, CMD_BEGINQUERY, "vkCmdBeginQuery()",
- "VUID-vkCmdBeginQuery-commandBuffer-cmdpool", "VUID-vkCmdBeginQuery-queryType-02327",
- "VUID-vkCmdBeginQuery-queryType-00803", "VUID-vkCmdBeginQuery-queryType-00800",
- "VUID-vkCmdBeginQuery-query-00802");
+ ValidateBeginQueryVuids vuids = {"VUID-vkCmdBeginQuery-commandBuffer-cmdpool", "VUID-vkCmdBeginQuery-queryType-02327",
+ "VUID-vkCmdBeginQuery-queryType-00803", "VUID-vkCmdBeginQuery-queryType-00800",
+ "VUID-vkCmdBeginQuery-query-00802", "VUID-vkCmdBeginQuery-queryPool-03223",
+ "VUID-vkCmdBeginQuery-queryPool-03224", "VUID-vkCmdBeginQuery-queryPool-03225",
+ "VUID-vkCmdBeginQuery-queryPool-01922"};
+ return ValidateBeginQuery(cb_state, query_obj, flags, CMD_BEGINQUERY, "vkCmdBeginQuery()", &vuids);
}
bool CoreChecks::VerifyQueryIsReset(const ValidationStateTracker *state_data, VkCommandBuffer commandBuffer, QueryObject query_obj,
- const char *func_name, QueryMap *localQueryToStateMap) {
+ const char *func_name, VkQueryPool &firstPerfQueryPool, uint32_t perfPass,
+ QueryMap *localQueryToStateMap) {
bool skip = false;
- QueryState state = state_data->GetQueryState(localQueryToStateMap, query_obj.pool, query_obj.query);
+ const auto *query_pool_state = state_data->GetQueryPoolState(query_obj.pool);
+ const auto &query_pool_ci = query_pool_state->createInfo;
+
+ QueryState state = state_data->GetQueryState(localQueryToStateMap, query_obj.pool, query_obj.query, perfPass);
+ // If reset was in another command buffer, check the global map
+ if (state == QUERYSTATE_UNKNOWN)
+ state = state_data->GetQueryState(&state_data->queryToStateMap, query_obj.pool, query_obj.query, perfPass);
+ // Performance queries have limitation upon when they can be
+ // reset.
+ if (query_pool_ci.queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR && state == QUERYSTATE_UNKNOWN &&
+ perfPass >= query_pool_state->n_performance_passes) {
+ // If the pass is invalid, assume RESET state, another error
+ // will be raised in ValidatePerformanceQuery().
+ state = QUERYSTATE_RESET;
+ }
+
if (state != QUERYSTATE_RESET) {
skip |= state_data->LogError(commandBuffer, kVUID_Core_DrawState_QueryNotReset,
"%s: %s and query %" PRIu32
@@ -6671,19 +7480,85 @@
return skip;
}
+bool CoreChecks::ValidatePerformanceQuery(const ValidationStateTracker *state_data, VkCommandBuffer commandBuffer,
+ QueryObject query_obj, const char *func_name, VkQueryPool &firstPerfQueryPool,
+ uint32_t perfPass, QueryMap *localQueryToStateMap) {
+ const auto *query_pool_state = state_data->GetQueryPoolState(query_obj.pool);
+ const auto &query_pool_ci = query_pool_state->createInfo;
+
+ if (query_pool_ci.queryType != VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) return false;
+
+ const CMD_BUFFER_STATE *cb_state = state_data->GetCBState(commandBuffer);
+ bool skip = false;
+
+ if (perfPass >= query_pool_state->n_performance_passes) {
+ skip |= state_data->LogError(commandBuffer, "VUID-VkPerformanceQuerySubmitInfoKHR-counterPassIndex-03221",
+ "Invalid counterPassIndex (%u, maximum allowed %u) value for query pool %s.", perfPass,
+ query_pool_state->n_performance_passes,
+ state_data->report_data->FormatHandle(query_obj.pool).c_str());
+ }
+
+ if (!cb_state->performance_lock_acquired || cb_state->performance_lock_released) {
+ skip |= state_data->LogError(commandBuffer, "VUID-vkQueueSubmit-pCommandBuffers-03220",
+ "Commandbuffer %s was submitted and contains a performance query but the"
+ "profiling lock was not held continuously throughout the recording of commands.",
+ state_data->report_data->FormatHandle(commandBuffer).c_str());
+ }
+
+ if (query_pool_state->has_perf_scope_command_buffer && (cb_state->commandCount - 1) != query_obj.endCommandIndex) {
+ skip |= state_data->LogError(commandBuffer, "VUID-vkCmdEndQuery-queryPool-03227",
+ "vkCmdEndQuery: Query pool %s was created with a counter of scope"
+ "VK_QUERY_SCOPE_COMMAND_BUFFER_KHR but the end of the query is not the last "
+ "command in the command buffer %s.",
+ state_data->report_data->FormatHandle(query_obj.pool).c_str(),
+ state_data->report_data->FormatHandle(commandBuffer).c_str());
+ }
+
+ QueryState command_buffer_state = state_data->GetQueryState(localQueryToStateMap, query_obj.pool, query_obj.query, perfPass);
+ if (command_buffer_state == QUERYSTATE_RESET) {
+ skip |= state_data->LogError(
+ commandBuffer, query_obj.indexed ? "VUID-vkCmdBeginQueryIndexedEXT-None-02863" : "VUID-vkCmdBeginQuery-None-02863",
+ "VkQuery begin command recorded in a command buffer that, either directly or "
+ "through secondary command buffers, also contains a vkCmdResetQueryPool command "
+ "affecting the same query.");
+ }
+
+ if (firstPerfQueryPool != VK_NULL_HANDLE) {
+ if (firstPerfQueryPool != query_obj.pool &&
+ !state_data->enabled_features.performance_query_features.performanceCounterMultipleQueryPools) {
+ skip |= state_data->LogError(
+ commandBuffer,
+ query_obj.indexed ? "VUID-vkCmdBeginQueryIndexedEXT-queryPool-03226" : "VUID-vkCmdBeginQuery-queryPool-03226",
+ "Commandbuffer %s contains more than one performance query pool but "
+ "performanceCounterMultipleQueryPools is not enabled.",
+ state_data->report_data->FormatHandle(commandBuffer).c_str());
+ }
+ } else {
+ firstPerfQueryPool = query_obj.pool;
+ }
+
+ return skip;
+}
+
void CoreChecks::EnqueueVerifyBeginQuery(VkCommandBuffer command_buffer, const QueryObject &query_obj, const char *func_name) {
CMD_BUFFER_STATE *cb_state = GetCBState(command_buffer);
// Enqueue the submit time validation here, ahead of the submit time state update in the StateTracker's PostCallRecord
cb_state->queryUpdates.emplace_back([command_buffer, query_obj, func_name](const ValidationStateTracker *device_data,
- bool do_validate, QueryMap *localQueryToStateMap) {
+ bool do_validate, VkQueryPool &firstPerfQueryPool,
+ uint32_t perfPass, QueryMap *localQueryToStateMap) {
if (!do_validate) return false;
- return VerifyQueryIsReset(device_data, command_buffer, query_obj, func_name, localQueryToStateMap);
+ bool skip = false;
+ skip |= ValidatePerformanceQuery(device_data, command_buffer, query_obj, func_name, firstPerfQueryPool, perfPass,
+ localQueryToStateMap);
+ skip |= VerifyQueryIsReset(device_data, command_buffer, query_obj, func_name, firstPerfQueryPool, perfPass,
+ localQueryToStateMap);
+ return skip;
});
}
void CoreChecks::PreCallRecordCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkFlags flags) {
- if (disabled.query_validation) return;
+ if (disabled[query_validation]) return;
QueryObject query_obj = {queryPool, slot};
EnqueueVerifyBeginQuery(commandBuffer, query_obj, "vkCmdBeginQuery()");
}
@@ -6697,12 +7572,13 @@
}
const auto *query_pool_state = GetQueryPoolState(query_obj.pool);
const auto &query_pool_ci = query_pool_state->createInfo;
- if (query_pool_ci.queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR && query_pool_state->has_perf_scope_render_pass &&
- cb_state->activeRenderPass) {
- skip |= LogError(cb_state->commandBuffer, "VUID-vkCmdEndQuery-queryPool-03228",
- "%s: Query pool %s was created with a counter of scope "
- "VK_QUERY_SCOPE_RENDER_PASS_KHR but %s is inside a render pass.",
- cmd_name, report_data->FormatHandle(query_obj.pool).c_str(), cmd_name);
+ if (query_pool_ci.queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
+ if (query_pool_state->has_perf_scope_render_pass && cb_state->activeRenderPass) {
+ skip |= LogError(cb_state->commandBuffer, "VUID-vkCmdEndQuery-queryPool-03228",
+ "%s: Query pool %s was created with a counter of scope "
+ "VK_QUERY_SCOPE_RENDER_PASS_KHR but %s is inside a render pass.",
+ cmd_name, report_data->FormatHandle(query_obj.pool).c_str(), cmd_name);
+ }
}
skip |= ValidateCmdQueueFlags(cb_state, cmd_name, VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT, vuid_queue_flags);
skip |= ValidateCmd(cb_state, cmd, cmd_name);
@@ -6710,23 +7586,62 @@
}
bool CoreChecks::PreCallValidateCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) const {
- if (disabled.query_validation) return false;
+ if (disabled[query_validation]) return false;
+ bool skip = false;
QueryObject query_obj = {queryPool, slot};
const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
assert(cb_state);
- return ValidateCmdEndQuery(cb_state, query_obj, CMD_ENDQUERY, "vkCmdEndQuery()", "VUID-vkCmdEndQuery-commandBuffer-cmdpool",
- "VUID-vkCmdEndQuery-None-01923");
+
+ const QUERY_POOL_STATE *query_pool_state = GetQueryPoolState(queryPool);
+ if (query_pool_state) {
+ const uint32_t available_query_count = query_pool_state->createInfo.queryCount;
+ // Only continue validating if the slot is even within range
+ if (slot >= available_query_count) {
+ skip |= LogError(cb_state->commandBuffer, "VUID-vkCmdEndQuery-query-00810",
+ "vkCmdEndQuery(): query index (%u) is greater or equal to the queryPool size (%u).", slot,
+ available_query_count);
+ } else {
+ skip |= ValidateCmdEndQuery(cb_state, query_obj, CMD_ENDQUERY, "vkCmdEndQuery()",
+ "VUID-vkCmdEndQuery-commandBuffer-cmdpool", "VUID-vkCmdEndQuery-None-01923");
+ }
+ }
+ return skip;
+}
+
+bool CoreChecks::ValidateQueryPoolIndex(VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, const char *func_name,
+ const char *first_vuid, const char *sum_vuid) const {
+ bool skip = false;
+ const QUERY_POOL_STATE *query_pool_state = GetQueryPoolState(queryPool);
+ if (query_pool_state) {
+ const uint32_t available_query_count = query_pool_state->createInfo.queryCount;
+ if (firstQuery >= available_query_count) {
+ skip |= LogError(queryPool, first_vuid,
+ "%s: In Query %s the firstQuery (%u) is greater or equal to the queryPool size (%u).", func_name,
+ report_data->FormatHandle(queryPool).c_str(), firstQuery, available_query_count);
+ }
+ if ((firstQuery + queryCount) > available_query_count) {
+ skip |=
+ LogError(queryPool, sum_vuid,
+ "%s: In Query %s the sum of firstQuery (%u) + queryCount (%u) is greater than the queryPool size (%u).",
+ func_name, report_data->FormatHandle(queryPool).c_str(), firstQuery, queryCount, available_query_count);
+ }
+ }
+ return false;
}
bool CoreChecks::PreCallValidateCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
uint32_t queryCount) const {
- if (disabled.query_validation) return false;
+ if (disabled[query_validation]) return false;
const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ assert(cb_state);
bool skip = InsideRenderPass(cb_state, "vkCmdResetQueryPool()", "VUID-vkCmdResetQueryPool-renderpass");
skip |= ValidateCmd(cb_state, CMD_RESETQUERYPOOL, "VkCmdResetQueryPool()");
skip |= ValidateCmdQueueFlags(cb_state, "VkCmdResetQueryPool()", VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT,
"VUID-vkCmdResetQueryPool-commandBuffer-cmdpool");
+ skip |= ValidateQueryPoolIndex(queryPool, firstQuery, queryCount, "VkCmdResetQueryPool()",
+ "VUID-vkCmdResetQueryPool-firstQuery-00796", "VUID-vkCmdResetQueryPool-firstQuery-00797");
+
return skip;
}
@@ -6758,11 +7673,11 @@
}
bool CoreChecks::ValidateCopyQueryPoolResults(const ValidationStateTracker *state_data, VkCommandBuffer commandBuffer,
- VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
+ VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, uint32_t perfPass,
VkQueryResultFlags flags, QueryMap *localQueryToStateMap) {
bool skip = false;
for (uint32_t i = 0; i < queryCount; i++) {
- QueryState state = state_data->GetQueryState(localQueryToStateMap, queryPool, firstQuery + i);
+ QueryState state = state_data->GetQueryState(localQueryToStateMap, queryPool, firstQuery + i, perfPass);
QueryResultType result_type = GetQueryResultType(state, flags);
if (result_type != QUERYRESULT_SOME_DATA && result_type != QUERYRESULT_UNKNOWN) {
skip |= state_data->LogError(
@@ -6777,7 +7692,7 @@
bool CoreChecks::PreCallValidateCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
VkDeviceSize stride, VkQueryResultFlags flags) const {
- if (disabled.query_validation) return false;
+ if (disabled[query_validation]) return false;
const auto cb_state = GetCBState(commandBuffer);
const auto dst_buff_state = GetBufferState(dstBuffer);
assert(cb_state);
@@ -6794,6 +7709,16 @@
"VUID-vkCmdCopyQueryPoolResults-commandBuffer-cmdpool");
skip |= ValidateCmd(cb_state, CMD_COPYQUERYPOOLRESULTS, "vkCmdCopyQueryPoolResults()");
skip |= InsideRenderPass(cb_state, "vkCmdCopyQueryPoolResults()", "VUID-vkCmdCopyQueryPoolResults-renderpass");
+ skip |= ValidateQueryPoolIndex(queryPool, firstQuery, queryCount, "vkCmdCopyQueryPoolResults()",
+ "VUID-vkCmdCopyQueryPoolResults-firstQuery-00820",
+ "VUID-vkCmdCopyQueryPoolResults-firstQuery-00821");
+
+ if (dstOffset >= dst_buff_state->requirements.size) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdCopyQueryPoolResults-dstOffset-00819",
+ "vkCmdCopyQueryPoolResults() dstOffset (0x%" PRIxLEAST64 ") is not less than the size (0x%" PRIxLEAST64
+ ") of buffer (%s).",
+ dstOffset, dst_buff_state->requirements.size, report_data->FormatHandle(dst_buff_state->buffer).c_str());
+ }
auto query_pool_state_iter = queryPoolMap.find(queryPool);
if (query_pool_state_iter != queryPoolMap.end()) {
@@ -6808,6 +7733,12 @@
report_data->FormatHandle(queryPool).c_str());
}
}
+ if ((query_pool_state->createInfo.queryType == VK_QUERY_TYPE_TIMESTAMP) && ((flags & VK_QUERY_RESULT_PARTIAL_BIT) != 0)) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdCopyQueryPoolResults-queryType-00827",
+ "vkCmdCopyQueryPoolResults() query pool %s was created with VK_QUERY_TYPE_TIMESTAMP so flags must not "
+ "contain VK_QUERY_RESULT_PARTIAL_BIT.",
+ report_data->FormatHandle(queryPool).c_str());
+ }
}
return skip;
@@ -6816,15 +7747,15 @@
void CoreChecks::PreCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
VkDeviceSize stride, VkQueryResultFlags flags) {
- if (disabled.query_validation) return;
+ if (disabled[query_validation]) return;
auto cb_state = GetCBState(commandBuffer);
- cb_state->queryUpdates.emplace_back(
- [commandBuffer, queryPool, firstQuery, queryCount, flags](const ValidationStateTracker *device_data, bool do_validate,
- QueryMap *localQueryToStateMap) {
- if (!do_validate) return false;
- return ValidateCopyQueryPoolResults(device_data, commandBuffer, queryPool, firstQuery, queryCount, flags,
- localQueryToStateMap);
- });
+ cb_state->queryUpdates.emplace_back([commandBuffer, queryPool, firstQuery, queryCount, flags](
+ const ValidationStateTracker *device_data, bool do_validate,
+ VkQueryPool &firstPerfQueryPool, uint32_t perfPass, QueryMap *localQueryToStateMap) {
+ if (!do_validate) return false;
+ return ValidateCopyQueryPoolResults(device_data, commandBuffer, queryPool, firstQuery, queryCount, perfPass, flags,
+ localQueryToStateMap);
+ });
}
bool CoreChecks::PreCallValidateCmdPushConstants(VkCommandBuffer commandBuffer, VkPipelineLayout layout,
@@ -6851,7 +7782,6 @@
if ((offset >= range.offset) && (offset + size <= range.offset + range.size)) {
VkShaderStageFlags matching_stages = range.stageFlags & stageFlags;
if (matching_stages != range.stageFlags) {
- // "VUID-vkCmdPushConstants-offset-01796" VUID-vkCmdPushConstants-offset-01796
skip |= LogError(commandBuffer, "VUID-vkCmdPushConstants-offset-01796",
"vkCmdPushConstants(): stageFlags (0x%" PRIx32 ", offset (%" PRIu32 "), and size (%" PRIu32
"), must contain all stages in overlapping VkPushConstantRange stageFlags (0x%" PRIx32
@@ -6865,7 +7795,6 @@
}
}
if (found_stages != stageFlags) {
- // "VUID-vkCmdPushConstants-offset-01795" VUID-vkCmdPushConstants-offset-01795
uint32_t missing_stages = ~found_stages & stageFlags;
skip |= LogError(commandBuffer, "VUID-vkCmdPushConstants-offset-01795",
"vkCmdPushConstants(): stageFlags = 0x%" PRIx32
@@ -6879,27 +7808,44 @@
bool CoreChecks::PreCallValidateCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
VkQueryPool queryPool, uint32_t slot) const {
- if (disabled.query_validation) return false;
+ if (disabled[query_validation]) return false;
const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
assert(cb_state);
bool skip = ValidateCmdQueueFlags(cb_state, "vkCmdWriteTimestamp()",
VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT,
"VUID-vkCmdWriteTimestamp-commandBuffer-cmdpool");
skip |= ValidateCmd(cb_state, CMD_WRITETIMESTAMP, "vkCmdWriteTimestamp()");
+
+ const QUERY_POOL_STATE *query_pool_state = GetQueryPoolState(queryPool);
+ if ((query_pool_state != nullptr) && (query_pool_state->createInfo.queryType != VK_QUERY_TYPE_TIMESTAMP)) {
+ skip |= LogError(cb_state->commandBuffer, "VUID-vkCmdWriteTimestamp-queryPool-01416",
+ "vkCmdWriteTimestamp(): Query Pool %s was not created with VK_QUERY_TYPE_TIMESTAMP.",
+ report_data->FormatHandle(queryPool).c_str());
+ }
+
+ const uint32_t timestampValidBits =
+ GetPhysicalDeviceState()->queue_family_properties[cb_state->command_pool->queueFamilyIndex].timestampValidBits;
+ if (timestampValidBits == 0) {
+ skip |= LogError(cb_state->commandBuffer, "VUID-vkCmdWriteTimestamp-timestampValidBits-00829",
+ "vkCmdWriteTimestamp(): Query Pool %s has a timestampValidBits value of zero.",
+ report_data->FormatHandle(queryPool).c_str());
+ }
+
return skip;
}
void CoreChecks::PreCallRecordCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
VkQueryPool queryPool, uint32_t slot) {
- if (disabled.query_validation) return;
+ if (disabled[query_validation]) return;
// Enqueue the submit time validation check here, before the submit time state update in StateTracker::PostCall...
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
QueryObject query = {queryPool, slot};
const char *func_name = "vkCmdWriteTimestamp()";
cb_state->queryUpdates.emplace_back([commandBuffer, query, func_name](const ValidationStateTracker *device_data,
- bool do_validate, QueryMap *localQueryToStateMap) {
+ bool do_validate, VkQueryPool &firstPerfQueryPool,
+ uint32_t perfPass, QueryMap *localQueryToStateMap) {
if (!do_validate) return false;
- return VerifyQueryIsReset(device_data, commandBuffer, query, func_name, localQueryToStateMap);
+ return VerifyQueryIsReset(device_data, commandBuffer, query, func_name, firstPerfQueryPool, perfPass, localQueryToStateMap);
});
}
@@ -6918,7 +7864,12 @@
if (view_state) {
const VkImageCreateInfo *ici = &GetImageState(view_state->create_info.image)->createInfo;
if (ici != nullptr) {
- if ((ici->usage & usage_flag) == 0) {
+ auto creation_usage = ici->usage;
+ const auto stencil_usage_info = lvl_find_in_chain<VkImageStencilUsageCreateInfo>(ici->pNext);
+ if (stencil_usage_info) {
+ creation_usage |= stencil_usage_info->stencilUsage;
+ }
+ if ((creation_usage & usage_flag) == 0) {
skip |= LogError(device, error_code,
"vkCreateFramebuffer: Framebuffer Attachment (%d) conflicts with the image's "
"IMAGE_USAGE flags (%s).",
@@ -6948,15 +7899,6 @@
return skip;
}
-// Validate VkFramebufferCreateInfo which includes:
-// 1. attachmentCount equals renderPass attachmentCount
-// 2. corresponding framebuffer and renderpass attachments have matching formats
-// 3. corresponding framebuffer and renderpass attachments have matching sample counts
-// 4. fb attachments only have a single mip level
-// 5. fb attachment dimensions are each at least as large as the fb
-// 6. fb attachments use idenity swizzle
-// 7. fb attachments used by renderPass for color/input/ds have correct usage bit set
-// 8. fb dimensions are within physical device limits
bool CoreChecks::ValidateFramebufferCreateInfo(const VkFramebufferCreateInfo *pCreateInfo) const {
bool skip = false;
@@ -7003,7 +7945,7 @@
auto view_state = GetImageViewState(image_views[i]);
if (view_state == nullptr) {
skip |= LogError(
- image_views[i], "VUID-VkFramebufferCreateInfo-flags-03188",
+ image_views[i], "VUID-VkFramebufferCreateInfo-flags-02778",
"vkCreateFramebuffer(): VkFramebufferCreateInfo attachment #%u is not a valid VkImageView.", i);
} else {
auto &ivci = view_state->create_info;
@@ -7026,6 +7968,12 @@
string_VkSampleCountFlagBits(rpci->pAttachments[i].samples),
report_data->FormatHandle(pCreateInfo->renderPass).c_str());
}
+
+ // Verify that image memory is valid
+ auto image_data = GetImageState(ivci.image);
+ skip |= ValidateMemoryIsBoundToImage(image_data, "vkCreateFramebuffer()",
+ "UNASSIGNED-CoreValidation-BoundResourceFreedMemoryAccess");
+
// Verify that view only has a single mip level
if (ivci.subresourceRange.levelCount != 1) {
skip |= LogError(
@@ -7053,7 +8001,7 @@
pCreateInfo->height, ivci.subresourceRange.layerCount, pCreateInfo->layers);
}
} else {
- if (device_extensions.vk_ext_fragment_density_map) {
+ if (device_extensions.vk_ext_fragment_density_map || device_extensions.vk_ext_fragment_density_map_2) {
uint32_t ceiling_width = (uint32_t)ceil(
(float)pCreateInfo->width /
std::max((float)phys_dev_ext_props.fragment_density_map_props.maxFragmentDensityTexelSize.width,
@@ -7087,14 +8035,7 @@
}
}
}
- if (((ivci.components.r != VK_COMPONENT_SWIZZLE_IDENTITY) &&
- (ivci.components.r != VK_COMPONENT_SWIZZLE_R)) ||
- ((ivci.components.g != VK_COMPONENT_SWIZZLE_IDENTITY) &&
- (ivci.components.g != VK_COMPONENT_SWIZZLE_G)) ||
- ((ivci.components.b != VK_COMPONENT_SWIZZLE_IDENTITY) &&
- (ivci.components.b != VK_COMPONENT_SWIZZLE_B)) ||
- ((ivci.components.a != VK_COMPONENT_SWIZZLE_IDENTITY) &&
- (ivci.components.a != VK_COMPONENT_SWIZZLE_A))) {
+ if (IsIdentitySwizzle(ivci.components) == false) {
skip |= LogError(
device, "VUID-VkFramebufferCreateInfo-pAttachments-00884",
"vkCreateFramebuffer(): VkFramebufferCreateInfo attachment #%u has non-identy swizzle. All "
@@ -7107,6 +8048,23 @@
i, string_VkComponentSwizzle(ivci.components.r), string_VkComponentSwizzle(ivci.components.g),
string_VkComponentSwizzle(ivci.components.b), string_VkComponentSwizzle(ivci.components.a));
}
+ if ((ivci.viewType == VK_IMAGE_VIEW_TYPE_2D) || (ivci.viewType == VK_IMAGE_VIEW_TYPE_2D)) {
+ const auto image_state = GetImageState(ivci.image);
+ if (image_state->createInfo.imageType == VK_IMAGE_TYPE_3D) {
+ if (FormatIsDepthOrStencil(ivci.format)) {
+ LogObjectList objlist(device);
+ objlist.add(ivci.image);
+ skip |= LogError(
+ objlist, "VUID-VkFramebufferCreateInfo-pAttachments-00891",
+ "vkCreateFramebuffer(): VkFramebufferCreateInfo attachment #%u has an image view type of "
+ "%s "
+ "which was taken from image %s of type VK_IMAGE_TYPE_3D, but the image view format is a "
+ "depth/stencil format %s",
+ i, string_VkImageViewType(ivci.viewType), report_data->FormatHandle(ivci.image).c_str(),
+ string_VkFormat(ivci.format));
+ }
+ }
+ }
}
}
} else if (pFramebufferAttachmentsCreateInfo) {
@@ -7141,7 +8099,7 @@
}
}
- if (!device_extensions.vk_ext_fragment_density_map) {
+ if (!device_extensions.vk_ext_fragment_density_map && !device_extensions.vk_ext_fragment_density_map_2) {
if (aii.width < pCreateInfo->width) {
skip |= LogError(
device, "VUID-VkFramebufferCreateInfo-flags-03192",
@@ -7288,18 +8246,27 @@
if ((pCreateInfo->flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR) == 0) {
// Verify correct attachment usage flags
for (uint32_t subpass = 0; subpass < rpci->subpassCount; subpass++) {
+ const VkSubpassDescription2 &subpass_description = rpci->pSubpasses[subpass];
// Verify input attachments:
- skip |= MatchUsage(rpci->pSubpasses[subpass].inputAttachmentCount, rpci->pSubpasses[subpass].pInputAttachments,
- pCreateInfo, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT,
- "VUID-VkFramebufferCreateInfo-pAttachments-00879");
+ skip |= MatchUsage(subpass_description.inputAttachmentCount, subpass_description.pInputAttachments, pCreateInfo,
+ VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, "VUID-VkFramebufferCreateInfo-pAttachments-00879");
// Verify color attachments:
- skip |= MatchUsage(rpci->pSubpasses[subpass].colorAttachmentCount, rpci->pSubpasses[subpass].pColorAttachments,
- pCreateInfo, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
- "VUID-VkFramebufferCreateInfo-pAttachments-00877");
+ skip |= MatchUsage(subpass_description.colorAttachmentCount, subpass_description.pColorAttachments, pCreateInfo,
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, "VUID-VkFramebufferCreateInfo-pAttachments-00877");
// Verify depth/stencil attachments:
skip |=
- MatchUsage(1, rpci->pSubpasses[subpass].pDepthStencilAttachment, pCreateInfo,
+ MatchUsage(1, subpass_description.pDepthStencilAttachment, pCreateInfo,
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, "VUID-VkFramebufferCreateInfo-pAttachments-02633");
+ // Verify depth/stecnil resolve
+ if (device_extensions.vk_khr_depth_stencil_resolve) {
+ const VkSubpassDescriptionDepthStencilResolve *ds_resolve =
+ lvl_find_in_chain<VkSubpassDescriptionDepthStencilResolve>(subpass_description.pNext);
+ if (ds_resolve) {
+ skip |= MatchUsage(1, ds_resolve->pDepthStencilResolveAttachment, pCreateInfo,
+ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
+ "VUID-VkFramebufferCreateInfo-pAttachments-02634");
+ }
+ }
}
}
@@ -7648,7 +8615,7 @@
i, dependency.srcSubpass, dependency.dstSubpass);
} else if (dependency.srcSubpass == dependency.dstSubpass) {
if (dependency.viewOffset != 0) {
- vuid = use_rp2 ? kVUID_Core_DrawState_InvalidRenderpass : "VUID-VkRenderPassCreateInfo-pNext-01930";
+ vuid = use_rp2 ? "VUID-VkSubpassDependency2-viewOffset-02530" : "VUID-VkRenderPassCreateInfo-pNext-01930";
skip |= LogError(device, vuid, "Dependency %u specifies a self-dependency but has a non-zero view offset of %u", i,
dependency.viewOffset);
} else if ((dependency.dependencyFlags | VK_DEPENDENCY_VIEW_LOCAL_BIT) != dependency.dependencyFlags &&
@@ -7667,6 +8634,14 @@
device, vuid,
"Dependency %u specifies a self-dependency from logically-later stage (%s) to a logically-earlier stage (%s).",
i, string_VkPipelineStageFlagBits(latest_src_stage), string_VkPipelineStageFlagBits(earliest_dst_stage));
+ } else if ((HasNonFramebufferStagePipelineStageFlags(dependency.srcStageMask) == false) &&
+ (HasNonFramebufferStagePipelineStageFlags(dependency.dstStageMask) == false) &&
+ ((dependency.dependencyFlags & VK_DEPENDENCY_BY_REGION_BIT) == 0)) {
+ vuid = use_rp2 ? "VUID-VkSubpassDependency2-srcSubpass-02245" : "VUID-VkSubpassDependency-srcSubpass-02243";
+ skip |= LogError(device, vuid,
+ "Dependency %u specifies a self-dependency for subpass %u with both stages including a "
+ "framebuffer-space stage, but does not specify VK_DEPENDENCY_BY_REGION_BIT in dependencyFlags.",
+ i, dependency.srcSubpass);
}
}
}
@@ -7726,9 +8701,9 @@
if (uses & new_use) {
if (attachment_layouts[attachment] != new_layout) {
vuid = use_rp2 ? "VUID-VkSubpassDescription2-layout-02528" : "VUID-VkSubpassDescription-layout-02519";
- LogError(device, vuid, "%s: subpass %u already uses attachment %u with a different image layout (%s vs %s).",
- function_name, subpass, attachment, string_VkImageLayout(attachment_layouts[attachment]),
- string_VkImageLayout(new_layout));
+ skip |= LogError(device, vuid, "%s: subpass %u already uses attachment %u with a different image layout (%s vs %s).",
+ function_name, subpass, attachment, string_VkImageLayout(attachment_layouts[attachment]),
+ string_VkImageLayout(new_layout));
}
} else if (uses & ~ATTACHMENT_INPUT || (uses && (new_use == ATTACHMENT_RESOLVE || new_use == ATTACHMENT_PRESERVE))) {
/* Note: input attachments are assumed to be done first. */
@@ -7774,14 +8749,14 @@
skip |= LogError(
device, vuid,
"%s: Aspect mask for input attachment reference %d in subpass %d includes VK_IMAGE_ASPECT_METADATA_BIT.",
- function_name, i, j);
+ function_name, j, i);
}
if (attachment_ref.attachment < pCreateInfo->attachmentCount) {
skip |= AddAttachmentUse(rp_version, i, attachment_uses, attachment_layouts, attachment_ref.attachment,
ATTACHMENT_INPUT, attachment_ref.layout);
- vuid = use_rp2 ? kVUID_Core_DrawState_InvalidRenderpass : "VUID-VkRenderPassCreateInfo-pNext-01963";
+ vuid = use_rp2 ? "VUID-VkRenderPassCreateInfo2-attachment-02525" : "VUID-VkRenderPassCreateInfo-pNext-01963";
skip |= ValidateImageAspectMask(VK_NULL_HANDLE, pCreateInfo->pAttachments[attachment_ref.attachment].format,
attachment_ref.aspectMask, function_name, vuid);
}
@@ -7810,6 +8785,19 @@
}
}
}
+
+ const VkFormatFeatureFlags valid_flags =
+ VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT;
+ const VkFormat attachment_format = pCreateInfo->pAttachments[attachment_ref.attachment].format;
+ const VkFormatFeatureFlags format_features = GetPotentialFormatFeatures(attachment_format);
+ if ((format_features & valid_flags) == 0) {
+ vuid = use_rp2 ? "VUID-VkSubpassDescription2-pInputAttachments-02897"
+ : "VUID-VkSubpassDescription-pInputAttachments-02647";
+ skip |= LogError(device, vuid,
+ "%s: Input attachment reference %d in subpass %d format (%s) does not contain "
+ "VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT.",
+ function_name, j, i, string_VkFormat(attachment_format));
+ }
}
}
@@ -7853,19 +8841,40 @@
string_VkSampleCountFlagBits(pCreateInfo->pAttachments[attachment_ref.attachment].samples));
}
}
+
+ const VkFormat attachment_format = pCreateInfo->pAttachments[attachment_ref.attachment].format;
+ const VkFormatFeatureFlags format_features = GetPotentialFormatFeatures(attachment_format);
+ if ((format_features & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) == 0) {
+ vuid = use_rp2 ? "VUID-VkSubpassDescription2-pResolveAttachments-02899"
+ : "VUID-VkSubpassDescription-pResolveAttachments-02649";
+ skip |= LogError(device, vuid,
+ "%s: Resolve attachment reference %d in subpass %d format (%s) does not contain "
+ "VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT.",
+ function_name, j, i, string_VkFormat(attachment_format));
+ }
}
}
}
if (subpass.pDepthStencilAttachment) {
- if (subpass.pDepthStencilAttachment->attachment != VK_ATTACHMENT_UNUSED) {
- skip |= ValidateAttachmentIndex(rp_version, subpass.pDepthStencilAttachment->attachment,
- pCreateInfo->attachmentCount, "Depth", function_name);
- if (subpass.pDepthStencilAttachment->attachment < pCreateInfo->attachmentCount) {
- skip |= AddAttachmentUse(rp_version, i, attachment_uses, attachment_layouts,
- subpass.pDepthStencilAttachment->attachment, ATTACHMENT_DEPTH,
+ const uint32_t attachment = subpass.pDepthStencilAttachment->attachment;
+ if (attachment != VK_ATTACHMENT_UNUSED) {
+ skip |= ValidateAttachmentIndex(rp_version, attachment, pCreateInfo->attachmentCount, "Depth", function_name);
+ if (attachment < pCreateInfo->attachmentCount) {
+ skip |= AddAttachmentUse(rp_version, i, attachment_uses, attachment_layouts, attachment, ATTACHMENT_DEPTH,
subpass.pDepthStencilAttachment->layout);
}
+
+ const VkFormat attachment_format = pCreateInfo->pAttachments[attachment].format;
+ const VkFormatFeatureFlags format_features = GetPotentialFormatFeatures(attachment_format);
+ if ((format_features & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) == 0) {
+ vuid = use_rp2 ? "VUID-VkSubpassDescription2-pDepthStencilAttachment-02900"
+ : "VUID-VkSubpassDescription-pDepthStencilAttachment-02650";
+ skip |= LogError(device, vuid,
+ "%s: Depth Stencil attachment in subpass %d format (%s) does not contain "
+ "VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT.",
+ function_name, i, string_VkFormat(attachment_format));
+ }
}
}
@@ -7939,6 +8948,17 @@
break;
}
}
+
+ const VkFormat attachment_format = pCreateInfo->pAttachments[attachment_ref.attachment].format;
+ const VkFormatFeatureFlags format_features = GetPotentialFormatFeatures(attachment_format);
+ if ((format_features & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) == 0) {
+ vuid = use_rp2 ? "VUID-VkSubpassDescription2-pColorAttachments-02898"
+ : "VUID-VkSubpassDescription-pColorAttachments-02648";
+ skip |= LogError(device, vuid,
+ "%s: Color attachment reference %d in subpass %d format (%s) does not contain "
+ "VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT.",
+ function_name, j, i, string_VkFormat(attachment_format));
+ }
}
if (subpass_performs_resolve && subpass.pResolveAttachments[j].attachment != VK_ATTACHMENT_UNUSED &&
@@ -8077,11 +9097,11 @@
if (pMultiviewInfo) {
if (pMultiviewInfo->subpassCount && pMultiviewInfo->subpassCount != pCreateInfo->subpassCount) {
skip |= LogError(device, "VUID-VkRenderPassCreateInfo-pNext-01928",
- "Subpass count is %u but multiview info has a subpass count of %u.", pCreateInfo->subpassCount,
- pMultiviewInfo->subpassCount);
+ "vkCreateRenderPass(): Subpass count is %u but multiview info has a subpass count of %u.",
+ pCreateInfo->subpassCount, pMultiviewInfo->subpassCount);
} else if (pMultiviewInfo->dependencyCount && pMultiviewInfo->dependencyCount != pCreateInfo->dependencyCount) {
skip |= LogError(device, "VUID-VkRenderPassCreateInfo-pNext-01929",
- "Dependency count is %u but multiview info has a dependency count of %u.",
+ "vkCreateRenderPass(): Dependency count is %u but multiview info has a dependency count of %u.",
pCreateInfo->dependencyCount, pMultiviewInfo->dependencyCount);
}
}
@@ -8093,12 +9113,14 @@
uint32_t attachment = pInputAttachmentAspectInfo->pAspectReferences[i].inputAttachmentIndex;
if (subpass >= pCreateInfo->subpassCount) {
skip |= LogError(device, "VUID-VkRenderPassCreateInfo-pNext-01926",
- "Subpass index %u specified by input attachment aspect info %u is greater than the subpass "
+ "vkCreateRenderPass(): Subpass index %u specified by input attachment aspect info %u is greater "
+ "than the subpass "
"count of %u for this render pass.",
subpass, i, pCreateInfo->subpassCount);
} else if (pCreateInfo->pSubpasses && attachment >= pCreateInfo->pSubpasses[subpass].inputAttachmentCount) {
skip |= LogError(device, "VUID-VkRenderPassCreateInfo-pNext-01927",
- "Input attachment index %u specified by input attachment aspect info %u is greater than the "
+ "vkCreateRenderPass(): Input attachment index %u specified by input attachment aspect info %u is "
+ "greater than the "
"input attachment count of %u for this subpass.",
attachment, i, pCreateInfo->pSubpasses[subpass].inputAttachmentCount);
}
@@ -8110,14 +9132,15 @@
if (pFragmentDensityMapInfo->fragmentDensityMapAttachment.attachment != VK_ATTACHMENT_UNUSED) {
if (pFragmentDensityMapInfo->fragmentDensityMapAttachment.attachment >= pCreateInfo->attachmentCount) {
skip |= LogError(device, "VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02547",
- "fragmentDensityMapAttachment %u must be less than attachmentCount %u of for this render pass.",
+ "vkCreateRenderPass(): fragmentDensityMapAttachment %u must be less than attachmentCount %u of "
+ "for this render pass.",
pFragmentDensityMapInfo->fragmentDensityMapAttachment.attachment, pCreateInfo->attachmentCount);
} else {
if (!(pFragmentDensityMapInfo->fragmentDensityMapAttachment.layout ==
VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT ||
pFragmentDensityMapInfo->fragmentDensityMapAttachment.layout == VK_IMAGE_LAYOUT_GENERAL)) {
skip |= LogError(device, "VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02549",
- "Layout of fragmentDensityMapAttachment %u' must be equal to "
+ "vkCreateRenderPass(): Layout of fragmentDensityMapAttachment %u' must be equal to "
"VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT, or VK_IMAGE_LAYOUT_GENERAL.",
pFragmentDensityMapInfo->fragmentDensityMapAttachment.attachment);
}
@@ -8125,17 +9148,19 @@
VK_ATTACHMENT_LOAD_OP_LOAD ||
pCreateInfo->pAttachments[pFragmentDensityMapInfo->fragmentDensityMapAttachment.attachment].loadOp ==
VK_ATTACHMENT_LOAD_OP_DONT_CARE)) {
- skip |= LogError(device, "VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02550",
- "FragmentDensityMapAttachment %u' must reference an attachment with a loadOp "
- "equal to VK_ATTACHMENT_LOAD_OP_LOAD or VK_ATTACHMENT_LOAD_OP_DONT_CARE.",
- pFragmentDensityMapInfo->fragmentDensityMapAttachment.attachment);
+ skip |= LogError(
+ device, "VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02550",
+ "vkCreateRenderPass(): FragmentDensityMapAttachment %u' must reference an attachment with a loadOp "
+ "equal to VK_ATTACHMENT_LOAD_OP_LOAD or VK_ATTACHMENT_LOAD_OP_DONT_CARE.",
+ pFragmentDensityMapInfo->fragmentDensityMapAttachment.attachment);
}
if (pCreateInfo->pAttachments[pFragmentDensityMapInfo->fragmentDensityMapAttachment.attachment].storeOp !=
VK_ATTACHMENT_STORE_OP_DONT_CARE) {
- skip |= LogError(device, "VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02551",
- "FragmentDensityMapAttachment %u' must reference an attachment with a storeOp "
- "equal to VK_ATTACHMENT_STORE_OP_DONT_CARE.",
- pFragmentDensityMapInfo->fragmentDensityMapAttachment.attachment);
+ skip |= LogError(
+ device, "VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02551",
+ "vkCreateRenderPass(): FragmentDensityMapAttachment %u' must reference an attachment with a storeOp "
+ "equal to VK_ATTACHMENT_STORE_OP_DONT_CARE.",
+ pFragmentDensityMapInfo->fragmentDensityMapAttachment.attachment);
}
}
}
@@ -8144,14 +9169,14 @@
if (!skip) {
safe_VkRenderPassCreateInfo2 create_info_2;
ConvertVkRenderPassCreateInfoToV2KHR(*pCreateInfo, &create_info_2);
- skip |= ValidateCreateRenderPass(device, RENDER_PASS_VERSION_1, create_info_2.ptr(), "ValidateCreateRenderPass()");
+ skip |= ValidateCreateRenderPass(device, RENDER_PASS_VERSION_1, create_info_2.ptr(), "vkCreateRenderPass()");
}
return skip;
}
bool CoreChecks::ValidateDepthStencilResolve(const VkPhysicalDeviceVulkan12Properties &core12_props,
- const VkRenderPassCreateInfo2 *pCreateInfo) const {
+ const VkRenderPassCreateInfo2 *pCreateInfo, const char *function_name) const {
bool skip = false;
// If the pNext list of VkSubpassDescription2 includes a VkSubpassDescriptionDepthStencilResolve structure,
@@ -8177,35 +9202,35 @@
if (resolve_attachment_not_unused && subpass.pDepthStencilAttachment != nullptr &&
subpass.pDepthStencilAttachment->attachment == VK_ATTACHMENT_UNUSED) {
skip |= LogError(device, "VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03177",
- "vkCreateRenderPass2KHR(): Subpass %u includes a VkSubpassDescriptionDepthStencilResolve "
+ "%s: Subpass %u includes a VkSubpassDescriptionDepthStencilResolve "
"structure with resolve attachment %u, but pDepthStencilAttachment=VK_ATTACHMENT_UNUSED.",
- i, resolve->pDepthStencilResolveAttachment->attachment);
+ function_name, i, resolve->pDepthStencilResolveAttachment->attachment);
}
if (resolve_attachment_not_unused && resolve->depthResolveMode == VK_RESOLVE_MODE_NONE_KHR &&
resolve->stencilResolveMode == VK_RESOLVE_MODE_NONE_KHR) {
skip |= LogError(device, "VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03178",
- "vkCreateRenderPass2KHR(): Subpass %u includes a VkSubpassDescriptionDepthStencilResolve "
+ "%s: Subpass %u includes a VkSubpassDescriptionDepthStencilResolve "
"structure with resolve attachment %u, but both depth and stencil resolve modes are "
"VK_RESOLVE_MODE_NONE_KHR.",
- i, resolve->pDepthStencilResolveAttachment->attachment);
+ function_name, i, resolve->pDepthStencilResolveAttachment->attachment);
}
if (resolve_attachment_not_unused && valid_ds_attachment_index &&
pCreateInfo->pAttachments[subpass.pDepthStencilAttachment->attachment].samples == VK_SAMPLE_COUNT_1_BIT) {
skip |= LogError(
device, "VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03179",
- "vkCreateRenderPass2(): Subpass %u includes a VkSubpassDescriptionDepthStencilResolve "
+ "%s: Subpass %u includes a VkSubpassDescriptionDepthStencilResolve "
"structure with resolve attachment %u. However pDepthStencilAttachment has sample count=VK_SAMPLE_COUNT_1_BIT.",
- i, resolve->pDepthStencilResolveAttachment->attachment);
+ function_name, i, resolve->pDepthStencilResolveAttachment->attachment);
}
if (valid_resolve_attachment_index &&
pCreateInfo->pAttachments[resolve->pDepthStencilResolveAttachment->attachment].samples != VK_SAMPLE_COUNT_1_BIT) {
skip |= LogError(device, "VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03180",
- "vkCreateRenderPass2(): Subpass %u includes a VkSubpassDescriptionDepthStencilResolve "
+ "%s: Subpass %u includes a VkSubpassDescriptionDepthStencilResolve "
"structure with resolve attachment %u which has sample count=VK_SAMPLE_COUNT_1_BIT.",
- i, resolve->pDepthStencilResolveAttachment->attachment);
+ function_name, i, resolve->pDepthStencilResolveAttachment->attachment);
}
VkFormat pDepthStencilAttachmentFormat =
@@ -8221,10 +9246,10 @@
FormatDepthNumericalType(pDepthStencilResolveAttachmentFormat)))) {
skip |=
LogError(device, "VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03181",
- "vkCreateRenderPass2(): Subpass %u includes a VkSubpassDescriptionDepthStencilResolve "
+ "%s: Subpass %u includes a VkSubpassDescriptionDepthStencilResolve "
"structure with resolve attachment %u which has a depth component (size %u). The depth component "
"of pDepthStencilAttachment must have the same number of bits (currently %u) and the same numerical type.",
- i, resolve->pDepthStencilResolveAttachment->attachment,
+ function_name, i, resolve->pDepthStencilResolveAttachment->attachment,
FormatDepthSize(pDepthStencilResolveAttachmentFormat), FormatDepthSize(pDepthStencilAttachmentFormat));
}
@@ -8234,36 +9259,36 @@
FormatStencilNumericalType(pDepthStencilResolveAttachmentFormat)))) {
skip |=
LogError(device, "VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03182",
- "vkCreateRenderPass2(): Subpass %u includes a VkSubpassDescriptionDepthStencilResolve "
+ "%s: Subpass %u includes a VkSubpassDescriptionDepthStencilResolve "
"structure with resolve attachment %u which has a stencil component (size %u). The stencil component "
"of pDepthStencilAttachment must have the same number of bits (currently %u) and the same numerical type.",
- i, resolve->pDepthStencilResolveAttachment->attachment,
+ function_name, i, resolve->pDepthStencilResolveAttachment->attachment,
FormatStencilSize(pDepthStencilResolveAttachmentFormat), FormatStencilSize(pDepthStencilAttachmentFormat));
}
if (!(resolve->depthResolveMode == VK_RESOLVE_MODE_NONE_KHR ||
resolve->depthResolveMode & core12_props.supportedDepthResolveModes)) {
skip |= LogError(device, "VUID-VkSubpassDescriptionDepthStencilResolve-depthResolveMode-03183",
- "vkCreateRenderPass2(): Subpass %u includes a VkSubpassDescriptionDepthStencilResolve "
+ "%s: Subpass %u includes a VkSubpassDescriptionDepthStencilResolve "
"structure with invalid depthResolveMode=%u.",
- i, resolve->depthResolveMode);
+ function_name, i, resolve->depthResolveMode);
}
if (!(resolve->stencilResolveMode == VK_RESOLVE_MODE_NONE_KHR ||
resolve->stencilResolveMode & core12_props.supportedStencilResolveModes)) {
skip |= LogError(device, "VUID-VkSubpassDescriptionDepthStencilResolve-stencilResolveMode-03184",
- "vkCreateRenderPass2(): Subpass %u includes a VkSubpassDescriptionDepthStencilResolve "
+ "%s: Subpass %u includes a VkSubpassDescriptionDepthStencilResolve "
"structure with invalid stencilResolveMode=%u.",
- i, resolve->stencilResolveMode);
+ function_name, i, resolve->stencilResolveMode);
}
if (valid_resolve_attachment_index && FormatIsDepthAndStencil(pDepthStencilResolveAttachmentFormat) &&
core12_props.independentResolve == VK_FALSE && core12_props.independentResolveNone == VK_FALSE &&
!(resolve->depthResolveMode == resolve->stencilResolveMode)) {
skip |= LogError(device, "VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03185",
- "vkCreateRenderPass2(): Subpass %u includes a VkSubpassDescriptionDepthStencilResolve "
+ "%s: Subpass %u includes a VkSubpassDescriptionDepthStencilResolve "
"structure. The values of depthResolveMode (%u) and stencilResolveMode (%u) must be identical.",
- i, resolve->depthResolveMode, resolve->stencilResolveMode);
+ function_name, i, resolve->depthResolveMode, resolve->stencilResolveMode);
}
if (valid_resolve_attachment_index && FormatIsDepthAndStencil(pDepthStencilResolveAttachmentFormat) &&
@@ -8271,10 +9296,10 @@
!(resolve->depthResolveMode == resolve->stencilResolveMode || resolve->depthResolveMode == VK_RESOLVE_MODE_NONE_KHR ||
resolve->stencilResolveMode == VK_RESOLVE_MODE_NONE_KHR)) {
skip |= LogError(device, "VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03186",
- "vkCreateRenderPass2(): Subpass %u includes a VkSubpassDescriptionDepthStencilResolve "
+ "%s: Subpass %u includes a VkSubpassDescriptionDepthStencilResolve "
"structure. The values of depthResolveMode (%u) and stencilResolveMode (%u) must be identical, or "
"one of them must be %u.",
- i, resolve->depthResolveMode, resolve->stencilResolveMode, VK_RESOLVE_MODE_NONE_KHR);
+ function_name, i, resolve->depthResolveMode, resolve->stencilResolveMode, VK_RESOLVE_MODE_NONE_KHR);
}
}
@@ -8287,7 +9312,7 @@
bool skip = false;
if (device_extensions.vk_khr_depth_stencil_resolve) {
- skip |= ValidateDepthStencilResolve(phys_dev_props_core12, pCreateInfo);
+ skip |= ValidateDepthStencilResolve(phys_dev_props_core12, pCreateInfo, function_name);
}
safe_VkRenderPassCreateInfo2 create_info_2(pCreateInfo);
@@ -8298,12 +9323,12 @@
bool CoreChecks::PreCallValidateCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateInfo2KHR *pCreateInfo,
const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) const {
- return ValidateCreateRenderPass2(device, pCreateInfo, pAllocator, pRenderPass, "CreateRenderPass2KHR()");
+ return ValidateCreateRenderPass2(device, pCreateInfo, pAllocator, pRenderPass, "vkCreateRenderPass2KHR()");
}
bool CoreChecks::PreCallValidateCreateRenderPass2(VkDevice device, const VkRenderPassCreateInfo2 *pCreateInfo,
const VkAllocationCallbacks *pAllocator, VkRenderPass *pRenderPass) const {
- return ValidateCreateRenderPass2(device, pCreateInfo, pAllocator, pRenderPass, "CreateRenderPass2()");
+ return ValidateCreateRenderPass2(device, pCreateInfo, pAllocator, pRenderPass, "vkCreateRenderPass2()");
}
bool CoreChecks::ValidatePrimaryCommandBuffer(const CMD_BUFFER_STATE *pCB, char const *cmd_name, const char *error_code) const {
@@ -8451,14 +9476,7 @@
i, pImageViewCreateInfo->subresourceRange.levelCount);
}
- if (((pImageViewCreateInfo->components.r != VK_COMPONENT_SWIZZLE_IDENTITY) &&
- (pImageViewCreateInfo->components.r != VK_COMPONENT_SWIZZLE_R)) ||
- ((pImageViewCreateInfo->components.g != VK_COMPONENT_SWIZZLE_IDENTITY) &&
- (pImageViewCreateInfo->components.g != VK_COMPONENT_SWIZZLE_G)) ||
- ((pImageViewCreateInfo->components.b != VK_COMPONENT_SWIZZLE_IDENTITY) &&
- (pImageViewCreateInfo->components.b != VK_COMPONENT_SWIZZLE_B)) ||
- ((pImageViewCreateInfo->components.a != VK_COMPONENT_SWIZZLE_IDENTITY) &&
- (pImageViewCreateInfo->components.a != VK_COMPONENT_SWIZZLE_A))) {
+ if (IsIdentitySwizzle(pImageViewCreateInfo->components) == false) {
skip |= LogError(
pRenderPassAttachmentBeginInfo->pAttachments[i],
"VUID-VkRenderPassAttachmentBeginInfo-pAttachments-03219",
@@ -8516,24 +9534,27 @@
lvl_find_in_chain<VkRenderPassSampleLocationsBeginInfoEXT>(pRenderPassBegin->pNext);
if (pSampleLocationsBeginInfo) {
for (uint32_t i = 0; i < pSampleLocationsBeginInfo->attachmentInitialSampleLocationsCount; ++i) {
- if (pSampleLocationsBeginInfo->pAttachmentInitialSampleLocations[i].attachmentIndex >=
- render_pass_state->createInfo.attachmentCount) {
- skip |= LogError(device, "VUID-VkAttachmentSampleLocationsEXT-attachmentIndex-01531",
- "Attachment index %u specified by attachment sample locations %u is greater than the "
- "attachment count of %u for the render pass being begun.",
- pSampleLocationsBeginInfo->pAttachmentInitialSampleLocations[i].attachmentIndex, i,
- render_pass_state->createInfo.attachmentCount);
+ const VkAttachmentSampleLocationsEXT &sample_location =
+ pSampleLocationsBeginInfo->pAttachmentInitialSampleLocations[i];
+ skip |= ValidateSampleLocationsInfo(&sample_location.sampleLocationsInfo, function_name);
+ if (sample_location.attachmentIndex >= render_pass_state->createInfo.attachmentCount) {
+ skip |=
+ LogError(device, "VUID-VkAttachmentSampleLocationsEXT-attachmentIndex-01531",
+ "%s: Attachment index %u specified by attachment sample locations %u is greater than the "
+ "attachment count of %u for the render pass being begun.",
+ function_name, sample_location.attachmentIndex, i, render_pass_state->createInfo.attachmentCount);
}
}
for (uint32_t i = 0; i < pSampleLocationsBeginInfo->postSubpassSampleLocationsCount; ++i) {
- if (pSampleLocationsBeginInfo->pPostSubpassSampleLocations[i].subpassIndex >=
- render_pass_state->createInfo.subpassCount) {
- skip |= LogError(device, "VUID-VkSubpassSampleLocationsEXT-subpassIndex-01532",
- "Subpass index %u specified by subpass sample locations %u is greater than the subpass count "
- "of %u for the render pass being begun.",
- pSampleLocationsBeginInfo->pPostSubpassSampleLocations[i].subpassIndex, i,
- render_pass_state->createInfo.subpassCount);
+ const VkSubpassSampleLocationsEXT &sample_location = pSampleLocationsBeginInfo->pPostSubpassSampleLocations[i];
+ skip |= ValidateSampleLocationsInfo(&sample_location.sampleLocationsInfo, function_name);
+ if (sample_location.subpassIndex >= render_pass_state->createInfo.subpassCount) {
+ skip |=
+ LogError(device, "VUID-VkSubpassSampleLocationsEXT-subpassIndex-01532",
+ "%s: Subpass index %u specified by subpass sample locations %u is greater than the subpass count "
+ "of %u for the render pass being begun.",
+ function_name, sample_location.subpassIndex, i, render_pass_state->createInfo.subpassCount);
}
}
}
@@ -8591,8 +9612,8 @@
if (chained_device_group_struct->deviceRenderAreaCount != 0 &&
chained_device_group_struct->deviceRenderAreaCount != physical_device_count) {
skip |= LogError(pRenderPassBegin->renderPass, "VUID-VkDeviceGroupRenderPassBeginInfo-deviceRenderAreaCount-00908",
- "deviceRenderAreaCount[%" PRIu32 "] is invaild. Physical device count is %" PRIu32 ".",
- chained_device_group_struct->deviceRenderAreaCount, physical_device_count);
+ "%s: deviceRenderAreaCount[%" PRIu32 "] is invaild. Physical device count is %" PRIu32 ".",
+ function_name, chained_device_group_struct->deviceRenderAreaCount, physical_device_count);
}
}
return skip;
@@ -8639,6 +9660,12 @@
RecordCmdBeginRenderPassLayouts(commandBuffer, pRenderPassBegin, pSubpassBeginInfo->contents);
}
+void CoreChecks::PreCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
+ const VkSubpassBeginInfoKHR *pSubpassBeginInfo) {
+ StateTracker::PreCallRecordCmdBeginRenderPass2(commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
+ RecordCmdBeginRenderPassLayouts(commandBuffer, pRenderPassBegin, pSubpassBeginInfo->contents);
+}
+
bool CoreChecks::ValidateCmdNextSubpass(RenderPassCreateVersion rp_version, VkCommandBuffer commandBuffer) const {
const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
assert(cb_state);
@@ -8682,8 +9709,8 @@
void CoreChecks::RecordCmdNextSubpassLayouts(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
- TransitionSubpassLayouts(cb_state, cb_state->activeRenderPass, cb_state->activeSubpass,
- GetFramebufferState(cb_state->activeRenderPassBeginInfo.framebuffer));
+ TransitionSubpassLayouts(cb_state, cb_state->activeRenderPass.get(), cb_state->activeSubpass,
+ Get<FRAMEBUFFER_STATE>(cb_state->activeRenderPassBeginInfo.framebuffer));
}
void CoreChecks::PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
@@ -8711,7 +9738,7 @@
const char *vuid;
const char *const function_name = use_rp2 ? "vkCmdEndRenderPass2KHR()" : "vkCmdEndRenderPass()";
- RENDER_PASS_STATE *rp_state = cb_state->activeRenderPass;
+ RENDER_PASS_STATE *rp_state = cb_state->activeRenderPass.get();
if (rp_state) {
if (cb_state->activeSubpass != rp_state->createInfo.subpassCount - 1) {
vuid = use_rp2 ? "VUID-vkCmdEndRenderPass2-None-03103" : "VUID-vkCmdEndRenderPass-None-00910";
@@ -8751,8 +9778,7 @@
void CoreChecks::RecordCmdEndRenderPassLayouts(VkCommandBuffer commandBuffer) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
- FRAMEBUFFER_STATE *framebuffer = GetFramebufferState(cb_state->activeFramebuffer);
- TransitionFinalSubpassLayouts(cb_state, cb_state->activeRenderPassBeginInfo.ptr(), framebuffer);
+ TransitionFinalSubpassLayouts(cb_state, cb_state->activeRenderPassBeginInfo.ptr(), cb_state->activeFramebuffer.get());
}
void CoreChecks::PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) {
@@ -8778,7 +9804,7 @@
if (!pSubCB->beginInfo.pInheritanceInfo) {
return skip;
}
- VkFramebuffer primary_fb = pCB->activeFramebuffer;
+ VkFramebuffer primary_fb = pCB->activeFramebuffer ? pCB->activeFramebuffer->framebuffer : VK_NULL_HANDLE;
VkFramebuffer secondary_fb = pSubCB->beginInfo.pInheritanceInfo->framebuffer;
if (secondary_fb != VK_NULL_HANDLE) {
if (primary_fb != secondary_fb) {
@@ -8809,7 +9835,7 @@
bool CoreChecks::ValidateSecondaryCommandBufferState(const CMD_BUFFER_STATE *pCB, const CMD_BUFFER_STATE *pSubCB) const {
bool skip = false;
unordered_set<int> activeTypes;
- if (!disabled.query_validation) {
+ if (!disabled[query_validation]) {
for (auto queryObject : pCB->activeQueries) {
auto query_pool_state = GetQueryPoolState(queryObject.pool);
if (query_pool_state) {
@@ -8902,8 +9928,8 @@
// Make sure render pass is compatible with parent command buffer pass if has continue
if (cb_state->activeRenderPass->renderPass != secondary_rp_state->renderPass) {
skip |= ValidateRenderPassCompatibility(
- "primary command buffer", cb_state->activeRenderPass, "secondary command buffer", secondary_rp_state,
- "vkCmdExecuteCommands()", "VUID-vkCmdExecuteCommands-pInheritanceInfo-00098");
+ "primary command buffer", cb_state->activeRenderPass.get(), "secondary command buffer",
+ secondary_rp_state, "vkCmdExecuteCommands()", "VUID-vkCmdExecuteCommands-pInheritanceInfo-00098");
}
// If framebuffer for secondary CB is not NULL, then it must match active FB from primaryCB
skip |=
@@ -8911,7 +9937,7 @@
if (!sub_cb_state->cmd_execute_commands_functions.empty()) {
// Inherit primary's activeFramebuffer and while running validate functions
for (auto &function : sub_cb_state->cmd_execute_commands_functions) {
- skip |= function(cb_state, cb_state->activeFramebuffer);
+ skip |= function(cb_state, cb_state->activeFramebuffer.get());
}
}
}
@@ -8924,25 +9950,27 @@
"VUID-vkCmdExecuteCommands-pCommandBuffers-00089");
if (!(sub_cb_state->beginInfo.flags & VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT)) {
if (sub_cb_state->in_use.load()) {
- skip |= LogError(cb_state->commandBuffer, "VUID-vkCmdExecuteCommands-pCommandBuffers-00091",
- "Cannot execute pending %s without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set.",
- report_data->FormatHandle(sub_cb_state->commandBuffer).c_str());
+ skip |= LogError(
+ cb_state->commandBuffer, "VUID-vkCmdExecuteCommands-pCommandBuffers-00091",
+ "vkCmdExecuteCommands(): Cannot execute pending %s without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set.",
+ report_data->FormatHandle(sub_cb_state->commandBuffer).c_str());
}
// We use an const_cast, because one cannot query a container keyed on a non-const pointer using a const pointer
if (cb_state->linkedCommandBuffers.count(const_cast<CMD_BUFFER_STATE *>(sub_cb_state))) {
LogObjectList objlist(cb_state->commandBuffer);
objlist.add(sub_cb_state->commandBuffer);
- skip |= LogError(
- objlist, "VUID-vkCmdExecuteCommands-pCommandBuffers-00092",
- "Cannot execute %s without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set if previously executed in %s",
- report_data->FormatHandle(sub_cb_state->commandBuffer).c_str(),
- report_data->FormatHandle(cb_state->commandBuffer).c_str());
+ skip |= LogError(objlist, "VUID-vkCmdExecuteCommands-pCommandBuffers-00092",
+ "vkCmdExecuteCommands(): Cannot execute %s without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT "
+ "set if previously executed in %s",
+ report_data->FormatHandle(sub_cb_state->commandBuffer).c_str(),
+ report_data->FormatHandle(cb_state->commandBuffer).c_str());
}
const auto insert_pair = linked_command_buffers.insert(sub_cb_state);
if (!insert_pair.second) {
skip |= LogError(cb_state->commandBuffer, "VUID-vkCmdExecuteCommands-pCommandBuffers-00093",
- "Cannot duplicate %s in pCommandBuffers without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set.",
+ "vkCmdExecuteCommands(): Cannot duplicate %s in pCommandBuffers without "
+ "VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set.",
report_data->FormatHandle(cb_state->commandBuffer).c_str());
}
@@ -8995,12 +10023,12 @@
layout_type = "initial";
}
if ((cb_layout != kInvalidLayout) && (cb_layout != sub_layout)) {
- LogError(pCommandBuffers[i], "UNASSIGNED-vkCmdExecuteCommands-commandBuffer-00001",
- "%s: Executed secondary command buffer using %s (subresource: aspectMask 0x%X array layer %u, "
- "mip level %u) which expects layout %s--instead, image %s layout is %s.",
- "vkCmdExecuteCommands():", report_data->FormatHandle(image).c_str(), subresource.aspectMask,
- subresource.arrayLayer, subresource.mipLevel, string_VkImageLayout(sub_layout), layout_type,
- string_VkImageLayout(cb_layout));
+ skip |= LogError(pCommandBuffers[i], "UNASSIGNED-vkCmdExecuteCommands-commandBuffer-00001",
+ "%s: Executed secondary command buffer using %s (subresource: aspectMask 0x%X array layer %u, "
+ "mip level %u) which expects layout %s--instead, image %s layout is %s.",
+ "vkCmdExecuteCommands():", report_data->FormatHandle(image).c_str(), subresource.aspectMask,
+ subresource.arrayLayer, subresource.mipLevel, string_VkImageLayout(sub_layout), layout_type,
+ string_VkImageLayout(cb_layout));
}
}
}
@@ -9201,174 +10229,402 @@
if ((phys_dev_mem_props.memoryTypes[mem_info->alloc_info.memoryTypeIndex].propertyFlags &
VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) == 0) {
skip = LogError(mem, "VUID-vkGetDeviceMemoryCommitment-memory-00690",
- "Querying commitment for memory without VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT set: %s.",
+ "vkGetDeviceMemoryCommitment(): Querying commitment for memory without "
+ "VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT set: %s.",
report_data->FormatHandle(mem).c_str());
}
}
return skip;
}
-bool CoreChecks::ValidateBindImageMemory(const VkBindImageMemoryInfo &bindInfo, const char *api_name) const {
+bool CoreChecks::ValidateBindImageMemory(uint32_t bindInfoCount, const VkBindImageMemoryInfo *pBindInfos,
+ const char *api_name) const {
bool skip = false;
- const IMAGE_STATE *image_state = GetImageState(bindInfo.image);
- if (image_state) {
- // Track objects tied to memory
- skip = ValidateSetMemBinding(bindInfo.memory, VulkanTypedHandle(bindInfo.image, kVulkanObjectTypeImage), api_name);
-#ifdef VK_USE_PLATFORM_ANDROID_KHR
- if (image_state->external_format_android) {
- if (image_state->memory_requirements_checked) {
- skip |= LogError(bindInfo.image, kVUID_Core_BindImage_InvalidMemReqQuery,
- "%s: Must not call vkGetImageMemoryRequirements on %s that will be bound to an external "
- "Android hardware buffer.",
- api_name, report_data->FormatHandle(bindInfo.image).c_str());
- }
- return skip;
- }
-#endif // VK_USE_PLATFORM_ANDROID_KHR
- // Validate bound memory range information
- const auto mem_info = GetDevMemState(bindInfo.memory);
- if (mem_info) {
- skip |= ValidateInsertImageMemoryRange(bindInfo.image, mem_info, bindInfo.memoryOffset, image_state->requirements,
- image_state->createInfo.tiling == VK_IMAGE_TILING_LINEAR, api_name);
- skip |= ValidateMemoryTypes(mem_info, image_state->requirements.memoryTypeBits, api_name,
- "VUID-vkBindImageMemory-memory-01047");
+ bool bind_image_mem_2 = strcmp(api_name, "vkBindImageMemory()") != 0;
+ char error_prefix[128];
+ strcpy(error_prefix, api_name);
+
+ // Track all image sub resources if they are bound for bind_image_mem_2
+ // uint32_t[3] is which index in pBindInfos for max 3 planes
+ // Non disjoint images act as a single plane
+ std::unordered_map<VkImage, std::array<uint32_t, 3>> resources_bound;
+
+ for (uint32_t i = 0; i < bindInfoCount; i++) {
+ if (bind_image_mem_2 == true) {
+ sprintf(error_prefix, "%s pBindInfos[%u]", api_name, i);
}
- // Validate memory requirements alignment
- if (SafeModulo(bindInfo.memoryOffset, image_state->requirements.alignment) != 0) {
- skip |= LogError(bindInfo.image, "VUID-vkBindImageMemory-memoryOffset-01048",
- "%s: memoryOffset is 0x%" PRIxLEAST64
- " but must be an integer multiple of the VkMemoryRequirements::alignment value 0x%" PRIxLEAST64
- ", returned from a call to vkGetImageMemoryRequirements with image.",
- api_name, bindInfo.memoryOffset, image_state->requirements.alignment);
- }
+ const VkBindImageMemoryInfo &bindInfo = pBindInfos[i];
+ const IMAGE_STATE *image_state = GetImageState(bindInfo.image);
+ if (image_state) {
+ // Track objects tied to memory
+ skip |= ValidateSetMemBinding(bindInfo.memory, VulkanTypedHandle(bindInfo.image, kVulkanObjectTypeImage), error_prefix);
- if (mem_info) {
- // Validate memory requirements size
- if (image_state->requirements.size > mem_info->alloc_info.allocationSize - bindInfo.memoryOffset) {
- skip |=
- LogError(bindInfo.image, "VUID-vkBindImageMemory-size-01049",
- "%s: memory size minus memoryOffset is 0x%" PRIxLEAST64
- " but must be at least as large as VkMemoryRequirements::size value 0x%" PRIxLEAST64
- ", returned from a call to vkGetImageMemoryRequirements with image.",
- api_name, mem_info->alloc_info.allocationSize - bindInfo.memoryOffset, image_state->requirements.size);
- }
+ const auto plane_info = lvl_find_in_chain<VkBindImagePlaneMemoryInfo>(bindInfo.pNext);
+ const auto mem_info = GetDevMemState(bindInfo.memory);
- // Validate dedicated allocation
- if (mem_info->is_dedicated) {
- if (enabled_features.dedicated_allocation_image_aliasing_features.dedicatedAllocationImageAliasing) {
- const auto orig_image_state = GetImageState(mem_info->dedicated_image);
- const auto current_image_state = GetImageState(bindInfo.image);
- if ((bindInfo.memoryOffset != 0) || !orig_image_state || !current_image_state ||
- !current_image_state->IsCreateInfoDedicatedAllocationImageAliasingCompatible(
- orig_image_state->createInfo)) {
+ // Need extra check for disjoint flag incase called without bindImage2 and don't want false postive errors
+ // no 'else' case as if that happens another VUID is already being triggered for it being invalid
+ if ((plane_info == nullptr) && (image_state->disjoint == false)) {
+ // Check non-disjoint images VkMemoryRequirements
+
+ // All validation using the image_state->requirements for external AHB is check in android only section
+ if (image_state->external_ahb == false) {
+ const VkMemoryRequirements mem_req = image_state->requirements;
+
+ // Validate memory requirements alignment
+ if (SafeModulo(bindInfo.memoryOffset, mem_req.alignment) != 0) {
const char *validation_error;
- if (strcmp(api_name, "vkBindImageMemory()") == 0) {
- validation_error = "VUID-vkBindImageMemory-memory-02629";
+ if (bind_image_mem_2 == false) {
+ validation_error = "VUID-vkBindImageMemory-memoryOffset-01048";
+ } else if (device_extensions.vk_khr_sampler_ycbcr_conversion) {
+ validation_error = "VUID-VkBindImageMemoryInfo-pNext-01616";
} else {
- validation_error = "VUID-VkBindImageMemoryInfo-memory-02631";
+ validation_error = "VUID-VkBindImageMemoryInfo-memoryOffset-01613";
}
- LogObjectList objlist(bindInfo.image);
- objlist.add(bindInfo.memory);
- objlist.add(mem_info->dedicated_image);
- skip |= LogError(
- objlist, validation_error,
- "%s: for dedicated memory allocation %s, VkMemoryDedicatedAllocateInfoKHR:: %s must compatible "
- "with %s and memoryOffset 0x%" PRIxLEAST64 " must be zero.",
- api_name, report_data->FormatHandle(bindInfo.memory).c_str(),
- report_data->FormatHandle(mem_info->dedicated_image).c_str(),
- report_data->FormatHandle(bindInfo.image).c_str(), bindInfo.memoryOffset);
- }
- } else {
- if ((bindInfo.memoryOffset != 0) || (mem_info->dedicated_image != bindInfo.image)) {
- const char *validation_error;
- if (strcmp(api_name, "vkBindImageMemory()") == 0) {
- validation_error = "VUID-vkBindImageMemory-memory-01509";
- } else {
- validation_error = "VUID-VkBindImageMemoryInfo-memory-01903";
- }
- LogObjectList objlist(bindInfo.image);
- objlist.add(bindInfo.memory);
- objlist.add(mem_info->dedicated_image);
skip |=
- LogError(objlist, validation_error,
- "%s: for dedicated memory allocation %s, VkMemoryDedicatedAllocateInfoKHR:: %s must be equal "
- "to %s and memoryOffset 0x%" PRIxLEAST64 " must be zero.",
- api_name, report_data->FormatHandle(bindInfo.memory).c_str(),
- report_data->FormatHandle(mem_info->dedicated_image).c_str(),
- report_data->FormatHandle(bindInfo.image).c_str(), bindInfo.memoryOffset);
+ LogError(bindInfo.image, validation_error,
+ "%s: memoryOffset is 0x%" PRIxLEAST64
+ " but must be an integer multiple of the VkMemoryRequirements::alignment value 0x%" PRIxLEAST64
+ ", returned from a call to vkGetImageMemoryRequirements with image.",
+ error_prefix, bindInfo.memoryOffset, mem_req.alignment);
+ }
+
+ if (mem_info) {
+ safe_VkMemoryAllocateInfo alloc_info = mem_info->alloc_info;
+ // Validate memory requirements size
+ if (mem_req.size > alloc_info.allocationSize - bindInfo.memoryOffset) {
+ const char *validation_error;
+ if (bind_image_mem_2 == false) {
+ validation_error = "VUID-vkBindImageMemory-size-01049";
+ } else if (device_extensions.vk_khr_sampler_ycbcr_conversion) {
+ validation_error = "VUID-VkBindImageMemoryInfo-pNext-01617";
+ } else {
+ validation_error = "VUID-VkBindImageMemoryInfo-memory-01614";
+ }
+ skip |= LogError(bindInfo.image, validation_error,
+ "%s: memory size minus memoryOffset is 0x%" PRIxLEAST64
+ " but must be at least as large as VkMemoryRequirements::size value 0x%" PRIxLEAST64
+ ", returned from a call to vkGetImageMemoryRequirements with image.",
+ error_prefix, alloc_info.allocationSize - bindInfo.memoryOffset, mem_req.size);
+ }
+
+ // Validate memory type used
+ {
+ const char *validation_error;
+ if (bind_image_mem_2 == false) {
+ validation_error = "VUID-vkBindImageMemory-memory-01047";
+ } else if (device_extensions.vk_khr_sampler_ycbcr_conversion) {
+ validation_error = "VUID-VkBindImageMemoryInfo-pNext-01615";
+ } else {
+ validation_error = "VUID-VkBindImageMemoryInfo-memory-01612";
+ }
+ skip |= ValidateMemoryTypes(mem_info, mem_req.memoryTypeBits, error_prefix, validation_error);
+ }
+ }
+ }
+
+ if (bind_image_mem_2 == true) {
+ // since its a non-disjoint image, finding VkImage in map is a duplicate
+ auto it = resources_bound.find(image_state->image);
+ if (it == resources_bound.end()) {
+ std::array<uint32_t, 3> bound_index = {i, UINT32_MAX, UINT32_MAX};
+ resources_bound.emplace(image_state->image, bound_index);
+ } else {
+ skip |= LogError(
+ bindInfo.image, "VUID-vkBindImageMemory2-pBindInfos-04006",
+ "%s: The same non-disjoint image resource is being bound twice at pBindInfos[%d] and pBindInfos[%d]",
+ error_prefix, it->second[0], i);
+ }
+ }
+ } else if ((plane_info != nullptr) && (image_state->disjoint == true)) {
+ // Check disjoint images VkMemoryRequirements for given plane
+ int plane = 0;
+
+ // All validation using the image_state->plane*_requirements for external AHB is check in android only section
+ if (image_state->external_ahb == false) {
+ VkMemoryRequirements disjoint_mem_req = {};
+ const VkImageAspectFlagBits aspect = plane_info->planeAspect;
+ switch (aspect) {
+ case VK_IMAGE_ASPECT_PLANE_0_BIT:
+ plane = 0;
+ disjoint_mem_req = image_state->plane0_requirements;
+ break;
+ case VK_IMAGE_ASPECT_PLANE_1_BIT:
+ plane = 1;
+ disjoint_mem_req = image_state->plane1_requirements;
+ break;
+ case VK_IMAGE_ASPECT_PLANE_2_BIT:
+ plane = 2;
+ disjoint_mem_req = image_state->plane2_requirements;
+ break;
+ default:
+ assert(false); // parameter validation should have caught this
+ break;
+ }
+
+ // Validate memory requirements alignment
+ if (SafeModulo(bindInfo.memoryOffset, disjoint_mem_req.alignment) != 0) {
+ skip |= LogError(
+ bindInfo.image, "VUID-VkBindImageMemoryInfo-pNext-01620",
+ "%s: memoryOffset is 0x%" PRIxLEAST64
+ " but must be an integer multiple of the VkMemoryRequirements::alignment value 0x%" PRIxLEAST64
+ ", returned from a call to vkGetImageMemoryRequirements2 with disjoint image for aspect plane %s.",
+ error_prefix, bindInfo.memoryOffset, disjoint_mem_req.alignment, string_VkImageAspectFlagBits(aspect));
+ }
+
+ if (mem_info) {
+ safe_VkMemoryAllocateInfo alloc_info = mem_info->alloc_info;
+
+ // Validate memory requirements size
+ if (disjoint_mem_req.size > alloc_info.allocationSize - bindInfo.memoryOffset) {
+ skip |= LogError(
+ bindInfo.image, "VUID-VkBindImageMemoryInfo-pNext-01621",
+ "%s: memory size minus memoryOffset is 0x%" PRIxLEAST64
+ " but must be at least as large as VkMemoryRequirements::size value 0x%" PRIxLEAST64
+ ", returned from a call to vkGetImageMemoryRequirements with disjoint image for aspect plane %s.",
+ error_prefix, alloc_info.allocationSize - bindInfo.memoryOffset, disjoint_mem_req.size,
+ string_VkImageAspectFlagBits(aspect));
+ }
+
+ // Validate memory type used
+ {
+ skip |= ValidateMemoryTypes(mem_info, disjoint_mem_req.memoryTypeBits, error_prefix,
+ "VUID-VkBindImageMemoryInfo-pNext-01619");
+ }
+ }
+ }
+
+ auto it = resources_bound.find(image_state->image);
+ if (it == resources_bound.end()) {
+ std::array<uint32_t, 3> bound_index = {UINT32_MAX, UINT32_MAX, UINT32_MAX};
+ bound_index[plane] = i;
+ resources_bound.emplace(image_state->image, bound_index);
+ } else {
+ if (it->second[plane] == UINT32_MAX) {
+ it->second[plane] = i;
+ } else {
+ skip |= LogError(bindInfo.image, "VUID-vkBindImageMemory2-pBindInfos-04006",
+ "%s: The same disjoint image sub-resource for plane %d is being bound twice at "
+ "pBindInfos[%d] and pBindInfos[%d]",
+ error_prefix, plane, it->second[plane], i);
}
}
}
- }
- const auto swapchain_info = lvl_find_in_chain<VkBindImageMemorySwapchainInfoKHR>(bindInfo.pNext);
- if (swapchain_info) {
- if (bindInfo.memory != VK_NULL_HANDLE) {
- skip |= LogError(bindInfo.image, "VUID-VkBindImageMemoryInfo-pNext-01631", "%s: %s is not VK_NULL_HANDLE.",
- api_name, report_data->FormatHandle(bindInfo.memory).c_str());
- }
- if (image_state->create_from_swapchain != swapchain_info->swapchain) {
- LogObjectList objlist(image_state->image);
- objlist.add(image_state->create_from_swapchain);
- objlist.add(swapchain_info->swapchain);
- skip |= LogError(
- objlist, kVUID_Core_BindImageMemory_Swapchain,
- "%s: %s is created by %s, but the image is bound by %s. The image should be created and bound by the same "
- "swapchain",
- api_name, report_data->FormatHandle(image_state->image).c_str(),
- report_data->FormatHandle(image_state->create_from_swapchain).c_str(),
- report_data->FormatHandle(swapchain_info->swapchain).c_str());
- }
- const auto swapchain_state = GetSwapchainState(swapchain_info->swapchain);
- if (swapchain_state && swapchain_state->images.size() <= swapchain_info->imageIndex) {
- skip |=
- LogError(bindInfo.image, "VUID-VkBindImageMemorySwapchainInfoKHR-imageIndex-01644",
- "%s: imageIndex (%i) is out of bounds of %s images (size: %i)", api_name, swapchain_info->imageIndex,
- report_data->FormatHandle(swapchain_info->swapchain).c_str(), (int)swapchain_state->images.size());
- }
- } else {
- if (image_state->create_from_swapchain) {
- skip |= LogError(bindInfo.image, "VUID-VkBindImageMemoryInfo-image-01630",
- "%s: pNext of VkBindImageMemoryInfo doesn't include VkBindImageMemorySwapchainInfoKHR.", api_name);
- }
- if (!mem_info) {
- skip |= LogError(bindInfo.image, "VUID-VkBindImageMemoryInfo-pNext-01632", "%s: %s is invalid.", api_name,
- report_data->FormatHandle(bindInfo.memory).c_str());
- }
- }
+ if (mem_info) {
+ // Validate bound memory range information
+ // if memory is exported to an AHB then the mem_info->allocationSize must be zero and this check is not needed
+ if ((mem_info->is_export == false) || ((mem_info->export_handle_type_flags &
+ VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID) == 0)) {
+ skip |= ValidateInsertImageMemoryRange(bindInfo.image, mem_info, bindInfo.memoryOffset, error_prefix);
+ }
- const auto plane_info = lvl_find_in_chain<VkBindImagePlaneMemoryInfo>(bindInfo.pNext);
- if (plane_info) {
- // Checks for disjoint bit in image
- if (0 == (image_state->createInfo.flags & VK_IMAGE_CREATE_DISJOINT_BIT)) {
- skip |= LogError(bindInfo.image, "VUID-VkBindImageMemoryInfo-pNext-01618",
- "pNext of VkBindImageMemoryInfo contains VkBindImagePlaneMemoryInfo and %s is not created with "
- "VK_IMAGE_CREATE_DISJOINT_BIT.",
- report_data->FormatHandle(image_state->image).c_str());
+ // Validate dedicated allocation
+ if (mem_info->is_dedicated) {
+ if (enabled_features.dedicated_allocation_image_aliasing_features.dedicatedAllocationImageAliasing) {
+ const auto orig_image_state = GetImageState(mem_info->dedicated_image);
+ const auto current_image_state = GetImageState(bindInfo.image);
+ if ((bindInfo.memoryOffset != 0) || !orig_image_state || !current_image_state ||
+ !current_image_state->IsCreateInfoDedicatedAllocationImageAliasingCompatible(
+ orig_image_state->createInfo)) {
+ const char *validation_error;
+ if (bind_image_mem_2 == false) {
+ validation_error = "VUID-vkBindImageMemory-memory-02629";
+ } else {
+ validation_error = "VUID-VkBindImageMemoryInfo-memory-02631";
+ }
+ LogObjectList objlist(bindInfo.image);
+ objlist.add(bindInfo.memory);
+ objlist.add(mem_info->dedicated_image);
+ skip |= LogError(
+ objlist, validation_error,
+ "%s: for dedicated memory allocation %s, VkMemoryDedicatedAllocateInfoKHR:: %s must compatible "
+ "with %s and memoryOffset 0x%" PRIxLEAST64 " must be zero.",
+ error_prefix, report_data->FormatHandle(bindInfo.memory).c_str(),
+ report_data->FormatHandle(mem_info->dedicated_image).c_str(),
+ report_data->FormatHandle(bindInfo.image).c_str(), bindInfo.memoryOffset);
+ }
+ } else {
+ if ((bindInfo.memoryOffset != 0) || (mem_info->dedicated_image != bindInfo.image)) {
+ const char *validation_error;
+ if (bind_image_mem_2 == false) {
+ validation_error = "VUID-vkBindImageMemory-memory-01509";
+ } else {
+ validation_error = "VUID-VkBindImageMemoryInfo-memory-01903";
+ }
+ LogObjectList objlist(bindInfo.image);
+ objlist.add(bindInfo.memory);
+ objlist.add(mem_info->dedicated_image);
+ skip |= LogError(
+ objlist, validation_error,
+ "%s: for dedicated memory allocation %s, VkMemoryDedicatedAllocateInfoKHR:: %s must be equal "
+ "to %s and memoryOffset 0x%" PRIxLEAST64 " must be zero.",
+ error_prefix, report_data->FormatHandle(bindInfo.memory).c_str(),
+ report_data->FormatHandle(mem_info->dedicated_image).c_str(),
+ report_data->FormatHandle(bindInfo.image).c_str(), bindInfo.memoryOffset);
+ }
+ }
+ }
+
+ // Validate export memory handles
+ if ((mem_info->export_handle_type_flags != 0) &&
+ ((mem_info->export_handle_type_flags & image_state->external_memory_handle) == 0)) {
+ const char *vuid =
+ bind_image_mem_2 ? "VUID-VkBindImageMemoryInfo-handleTypes-02793" : "VUID-vkBindImageMemory-memory-02728";
+ LogObjectList objlist(bindInfo.image);
+ objlist.add(bindInfo.memory);
+ skip |= LogError(objlist, vuid,
+ "%s: The VkDeviceMemory (%s) has an external handleType of %s which does not include at least "
+ "one handle from VkImage (%s) handleType %s.",
+ error_prefix, report_data->FormatHandle(bindInfo.memory).c_str(),
+ string_VkExternalMemoryHandleTypeFlags(mem_info->export_handle_type_flags).c_str(),
+ report_data->FormatHandle(bindInfo.image).c_str(),
+ string_VkExternalMemoryHandleTypeFlags(image_state->external_memory_handle).c_str());
+ }
+
+ // Validate import memory handles
+ if (mem_info->is_import_ahb == true) {
+ skip |= ValidateImageImportedHandleANDROID(api_name, image_state->external_memory_handle, bindInfo.memory,
+ bindInfo.image);
+ } else if (mem_info->is_import == true) {
+ if ((mem_info->import_handle_type_flags & image_state->external_memory_handle) == 0) {
+ const char *vuid = nullptr;
+ if ((bind_image_mem_2) && (device_extensions.vk_android_external_memory_android_hardware_buffer)) {
+ vuid = "VUID-VkBindImageMemoryInfo-memory-02991";
+ } else if ((!bind_image_mem_2) && (device_extensions.vk_android_external_memory_android_hardware_buffer)) {
+ vuid = "VUID-vkBindImageMemory-memory-02989";
+ } else if ((bind_image_mem_2) && (!device_extensions.vk_android_external_memory_android_hardware_buffer)) {
+ vuid = "VUID-VkBindImageMemoryInfo-memory-02794";
+ } else if ((!bind_image_mem_2) && (!device_extensions.vk_android_external_memory_android_hardware_buffer)) {
+ vuid = "VUID-vkBindImageMemory-memory-02729";
+ }
+ LogObjectList objlist(bindInfo.image);
+ objlist.add(bindInfo.memory);
+ skip |= LogError(objlist, vuid,
+ "%s: The VkDeviceMemory (%s) was created with an import operation with handleType of %s "
+ "which is not set in the VkImage (%s) VkExternalMemoryImageCreateInfo::handleType (%s)",
+ api_name, report_data->FormatHandle(bindInfo.memory).c_str(),
+ string_VkExternalMemoryHandleTypeFlags(mem_info->import_handle_type_flags).c_str(),
+ report_data->FormatHandle(bindInfo.image).c_str(),
+ string_VkExternalMemoryHandleTypeFlags(image_state->external_memory_handle).c_str());
+ }
+ }
+
+ // Validate mix of protected buffer and memory
+ if ((image_state->unprotected == false) && (mem_info->unprotected == true)) {
+ // TODO label when spec change is upstreamed
+ const char *vuid =
+ bind_image_mem_2 ? "UNASSIGNED-VkBindImageMemoryInfo-protected" : "VUID-vkBindImageMemory-None-01901";
+ LogObjectList objlist(bindInfo.image);
+ objlist.add(bindInfo.memory);
+ skip |= LogError(objlist, vuid,
+ "%s: The VkDeviceMemory (%s) was not created with protected memory but the VkImage (%s) was "
+ "set to use protected memory.",
+ api_name, report_data->FormatHandle(bindInfo.memory).c_str(),
+ report_data->FormatHandle(bindInfo.image).c_str());
+ } else if ((image_state->unprotected == true) && (mem_info->unprotected == false)) {
+ // TODO label when spec change is upstreamed
+ const char *vuid =
+ bind_image_mem_2 ? "UNASSIGNED-VkBindImageMemoryInfo-protected" : "VUID-vkBindImageMemory-None-01902";
+ LogObjectList objlist(bindInfo.image);
+ objlist.add(bindInfo.memory);
+ skip |= LogError(objlist, vuid,
+ "%s: The VkDeviceMemory (%s) was created with protected memory but the VkImage (%s) was not "
+ "set to use protected memory.",
+ api_name, report_data->FormatHandle(bindInfo.memory).c_str(),
+ report_data->FormatHandle(bindInfo.image).c_str());
+ }
}
- // Make sure planeAspect is only a single, valid plane
- uint32_t planes = FormatPlaneCount(image_state->createInfo.format);
- VkImageAspectFlags aspect = plane_info->planeAspect;
- if ((2 == planes) && (aspect != VK_IMAGE_ASPECT_PLANE_0_BIT) && (aspect != VK_IMAGE_ASPECT_PLANE_1_BIT)) {
- skip |=
- LogError(bindInfo.image, "VUID-VkBindImagePlaneMemoryInfo-planeAspect-02283",
- "Image %s VkBindImagePlaneMemoryInfo::planeAspect is %s but can only be VK_IMAGE_ASPECT_PLANE_0_BIT"
- "or VK_IMAGE_ASPECT_PLANE_1_BIT.",
- report_data->FormatHandle(image_state->image).c_str(), string_VkImageAspectFlags(aspect).c_str());
+ const auto swapchain_info = lvl_find_in_chain<VkBindImageMemorySwapchainInfoKHR>(bindInfo.pNext);
+ if (swapchain_info) {
+ if (bindInfo.memory != VK_NULL_HANDLE) {
+ skip |= LogError(bindInfo.image, "VUID-VkBindImageMemoryInfo-pNext-01631", "%s: %s is not VK_NULL_HANDLE.",
+ error_prefix, report_data->FormatHandle(bindInfo.memory).c_str());
+ }
+ if (image_state->create_from_swapchain != swapchain_info->swapchain) {
+ LogObjectList objlist(image_state->image);
+ objlist.add(image_state->create_from_swapchain);
+ objlist.add(swapchain_info->swapchain);
+ skip |= LogError(
+ objlist, kVUID_Core_BindImageMemory_Swapchain,
+ "%s: %s is created by %s, but the image is bound by %s. The image should be created and bound by the same "
+ "swapchain",
+ error_prefix, report_data->FormatHandle(image_state->image).c_str(),
+ report_data->FormatHandle(image_state->create_from_swapchain).c_str(),
+ report_data->FormatHandle(swapchain_info->swapchain).c_str());
+ }
+ const auto swapchain_state = GetSwapchainState(swapchain_info->swapchain);
+ if (swapchain_state && swapchain_state->images.size() <= swapchain_info->imageIndex) {
+ skip |= LogError(bindInfo.image, "VUID-VkBindImageMemorySwapchainInfoKHR-imageIndex-01644",
+ "%s: imageIndex (%i) is out of bounds of %s images (size: %i)", error_prefix,
+ swapchain_info->imageIndex, report_data->FormatHandle(swapchain_info->swapchain).c_str(),
+ (int)swapchain_state->images.size());
+ }
+ } else {
+ if (image_state->create_from_swapchain) {
+ skip |= LogError(bindInfo.image, "VUID-VkBindImageMemoryInfo-image-01630",
+ "%s: pNext of VkBindImageMemoryInfo doesn't include VkBindImageMemorySwapchainInfoKHR.",
+ error_prefix);
+ }
+ if (!mem_info) {
+ skip |= LogError(bindInfo.image, "VUID-VkBindImageMemoryInfo-pNext-01632", "%s: %s is invalid.", error_prefix,
+ report_data->FormatHandle(bindInfo.memory).c_str());
+ }
}
- if ((3 == planes) && (aspect != VK_IMAGE_ASPECT_PLANE_0_BIT) && (aspect != VK_IMAGE_ASPECT_PLANE_1_BIT) &&
- (aspect != VK_IMAGE_ASPECT_PLANE_2_BIT)) {
- skip |=
- LogError(bindInfo.image, "VUID-VkBindImagePlaneMemoryInfo-planeAspect-02283",
- "Image %s VkBindImagePlaneMemoryInfo::planeAspect is %s but can only be VK_IMAGE_ASPECT_PLANE_0_BIT"
- "or VK_IMAGE_ASPECT_PLANE_1_BIT or VK_IMAGE_ASPECT_PLANE_2_BIT.",
- report_data->FormatHandle(image_state->image).c_str(), string_VkImageAspectFlags(aspect).c_str());
+
+ if (plane_info) {
+ // Checks for disjoint bit in image
+ if (image_state->disjoint == false) {
+ skip |= LogError(
+ bindInfo.image, "VUID-VkBindImageMemoryInfo-pNext-01618",
+ "%s: pNext of VkBindImageMemoryInfo contains VkBindImagePlaneMemoryInfo and %s is not created with "
+ "VK_IMAGE_CREATE_DISJOINT_BIT.",
+ error_prefix, report_data->FormatHandle(image_state->image).c_str());
+ }
+
+ // Make sure planeAspect is only a single, valid plane
+ uint32_t planes = FormatPlaneCount(image_state->createInfo.format);
+ VkImageAspectFlags aspect = plane_info->planeAspect;
+ if ((2 == planes) && (aspect != VK_IMAGE_ASPECT_PLANE_0_BIT) && (aspect != VK_IMAGE_ASPECT_PLANE_1_BIT)) {
+ skip |= LogError(
+ bindInfo.image, "VUID-VkBindImagePlaneMemoryInfo-planeAspect-02283",
+ "%s: Image %s VkBindImagePlaneMemoryInfo::planeAspect is %s but can only be VK_IMAGE_ASPECT_PLANE_0_BIT"
+ "or VK_IMAGE_ASPECT_PLANE_1_BIT.",
+ error_prefix, report_data->FormatHandle(image_state->image).c_str(),
+ string_VkImageAspectFlags(aspect).c_str());
+ }
+ if ((3 == planes) && (aspect != VK_IMAGE_ASPECT_PLANE_0_BIT) && (aspect != VK_IMAGE_ASPECT_PLANE_1_BIT) &&
+ (aspect != VK_IMAGE_ASPECT_PLANE_2_BIT)) {
+ skip |= LogError(
+ bindInfo.image, "VUID-VkBindImagePlaneMemoryInfo-planeAspect-02283",
+ "%s: Image %s VkBindImagePlaneMemoryInfo::planeAspect is %s but can only be VK_IMAGE_ASPECT_PLANE_0_BIT"
+ "or VK_IMAGE_ASPECT_PLANE_1_BIT or VK_IMAGE_ASPECT_PLANE_2_BIT.",
+ error_prefix, report_data->FormatHandle(image_state->image).c_str(),
+ string_VkImageAspectFlags(aspect).c_str());
+ }
}
}
}
+
+ // Check to make sure all disjoint planes were bound
+ for (std::pair<const VkImage, std::array<uint32_t, 3>> &resource : resources_bound) {
+ const IMAGE_STATE *image_state = GetImageState(resource.first);
+ if (image_state->disjoint == true) {
+ uint32_t total_planes = FormatPlaneCount(image_state->createInfo.format);
+ for (uint32_t i = 0; i < total_planes; i++) {
+ if (resource.second[i] == UINT32_MAX) {
+ skip |= LogError(resource.first, "VUID-vkBindImageMemory2-pBindInfos-02858",
+ "%s: Plane %u of the disjoint image was not bound. All %d planes need to bound individually "
+ "in separate pBindInfos in a single call.",
+ api_name, i, total_planes);
+ }
+ }
+ }
+ }
+
return skip;
}
@@ -9378,7 +10634,7 @@
const IMAGE_STATE *image_state = GetImageState(image);
if (image_state) {
// Checks for no disjoint bit
- if (0 != (image_state->createInfo.flags & VK_IMAGE_CREATE_DISJOINT_BIT)) {
+ if (image_state->disjoint == true) {
skip |=
LogError(image, "VUID-vkBindImageMemory-image-01608",
"%s must not have been created with the VK_IMAGE_CREATE_DISJOINT_BIT (need to use vkBindImageMemory2).",
@@ -9392,30 +10648,18 @@
bindInfo.image = image;
bindInfo.memory = mem;
bindInfo.memoryOffset = memoryOffset;
- skip |= ValidateBindImageMemory(bindInfo, "vkBindImageMemory()");
+ skip |= ValidateBindImageMemory(1, &bindInfo, "vkBindImageMemory()");
return skip;
}
bool CoreChecks::PreCallValidateBindImageMemory2(VkDevice device, uint32_t bindInfoCount,
const VkBindImageMemoryInfoKHR *pBindInfos) const {
- bool skip = false;
- char api_name[128];
- for (uint32_t i = 0; i < bindInfoCount; i++) {
- sprintf(api_name, "vkBindImageMemory2() pBindInfos[%u]", i);
- skip |= ValidateBindImageMemory(pBindInfos[i], api_name);
- }
- return skip;
+ return ValidateBindImageMemory(bindInfoCount, pBindInfos, "vkBindImageMemory2()");
}
bool CoreChecks::PreCallValidateBindImageMemory2KHR(VkDevice device, uint32_t bindInfoCount,
const VkBindImageMemoryInfoKHR *pBindInfos) const {
- bool skip = false;
- char api_name[128];
- for (uint32_t i = 0; i < bindInfoCount; i++) {
- sprintf(api_name, "vkBindImageMemory2KHR() pBindInfos[%u]", i);
- skip |= ValidateBindImageMemory(pBindInfos[i], api_name);
- }
- return skip;
+ return ValidateBindImageMemory(bindInfoCount, pBindInfos, "vkBindImageMemory2KHR()");
}
bool CoreChecks::PreCallValidateSetEvent(VkDevice device, VkEvent event) const {
@@ -9557,16 +10801,22 @@
const VkBindSparseInfo *bindInfo = &pBindInfo[bindIdx];
auto *info = lvl_find_in_chain<VkTimelineSemaphoreSubmitInfoKHR>(bindInfo->pNext);
if (info) {
- for (uint32_t i = 0; i < bindInfo->waitSemaphoreCount; ++i) {
- VkSemaphore semaphore = bindInfo->pWaitSemaphores[i];
- skip |= ValidateMaxTimelineSemaphoreValueDifference(semaphore, info->pWaitSemaphoreValues[i], "VkQueueBindSparse",
+ // If there are any timeline semaphores, this condition gets checked before the early return above
+ if (info->waitSemaphoreValueCount)
+ for (uint32_t i = 0; i < bindInfo->waitSemaphoreCount; ++i) {
+ VkSemaphore semaphore = bindInfo->pWaitSemaphores[i];
+ skip |=
+ ValidateMaxTimelineSemaphoreValueDifference(semaphore, info->pWaitSemaphoreValues[i], "VkQueueBindSparse",
"VUID-VkBindSparseInfo-pWaitSemaphores-03250");
- }
- for (uint32_t i = 0; i < bindInfo->signalSemaphoreCount; ++i) {
- VkSemaphore semaphore = bindInfo->pSignalSemaphores[i];
- skip |= ValidateMaxTimelineSemaphoreValueDifference(semaphore, info->pSignalSemaphoreValues[i], "VkQueueBindSparse",
+ }
+ // If there are any timeline semaphores, this condition gets checked before the early return above
+ if (info->signalSemaphoreValueCount)
+ for (uint32_t i = 0; i < bindInfo->signalSemaphoreCount; ++i) {
+ VkSemaphore semaphore = bindInfo->pSignalSemaphores[i];
+ skip |=
+ ValidateMaxTimelineSemaphoreValueDifference(semaphore, info->pSignalSemaphoreValues[i], "VkQueueBindSparse",
"VUID-VkBindSparseInfo-pSignalSemaphores-03251");
- }
+ }
}
}
@@ -9984,10 +11234,9 @@
}
if ((pCreateInfo->imageSharingMode == VK_SHARING_MODE_CONCURRENT) && pCreateInfo->pQueueFamilyIndices) {
- bool skip1 =
- ValidateQueueFamilies(pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices, "vkCreateBuffer",
- "pCreateInfo->pQueueFamilyIndices", "VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01428",
- "VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01428", false);
+ bool skip1 = ValidatePhysicalDeviceQueueFamilies(pCreateInfo->queueFamilyIndexCount, pCreateInfo->pQueueFamilyIndices,
+ "vkCreateBuffer", "pCreateInfo->pQueueFamilyIndices",
+ "VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01428");
if (skip1) return true;
}
@@ -10069,13 +11318,12 @@
for (uint32_t i = 0; i < pPresentInfo->waitSemaphoreCount; ++i) {
const auto pSemaphore = GetSemaphoreState(pPresentInfo->pWaitSemaphores[i]);
if (pSemaphore && pSemaphore->type != VK_SEMAPHORE_TYPE_BINARY_KHR) {
- skip |= LogError(
- pPresentInfo->pWaitSemaphores[i],
- "VUID-vkQueuePresentKHR-pWaitSemaphores-03267", // VUID-VkPresentInfoKHR-pWaitSemaphores-03269 could fit also!!
- "VkQueuePresent: %s is not a VK_SEMAPHORE_TYPE_BINARY_KHR",
- report_data->FormatHandle(pPresentInfo->pWaitSemaphores[i]).c_str());
+ // TODO: VUID-VkPresentInfoKHR-pWaitSemaphores-03269 could fit also!!
+ skip |= LogError(pPresentInfo->pWaitSemaphores[i], "VUID-vkQueuePresentKHR-pWaitSemaphores-03267",
+ "VkQueuePresent: %s is not a VK_SEMAPHORE_TYPE_BINARY_KHR",
+ report_data->FormatHandle(pPresentInfo->pWaitSemaphores[i]).c_str());
}
- if (pSemaphore && (!pSemaphore->signaled || !SemaphoreWasSignaled(pPresentInfo->pWaitSemaphores[i]))) {
+ if (pSemaphore && !pSemaphore->signaled && !SemaphoreWasSignaled(pPresentInfo->pWaitSemaphores[i])) {
LogObjectList objlist(queue);
objlist.add(pPresentInfo->pWaitSemaphores[i]);
skip |= LogError(objlist, "VUID-vkQueuePresentKHR-pWaitSemaphores-03268",
@@ -10111,7 +11359,8 @@
? "VUID-VkPresentInfoKHR-pImageIndices-01430"
: "VUID-VkPresentInfoKHR-pImageIndices-01296";
skip |= LogError(queue, validation_error,
- "Images passed to present must be in layout VK_IMAGE_LAYOUT_PRESENT_SRC_KHR or "
+ "vkQueuePresentKHR(): Images passed to present must be in layout "
+ "VK_IMAGE_LAYOUT_PRESENT_SRC_KHR or "
"VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR but is in %s.",
string_VkImageLayout(layout));
}
@@ -10235,9 +11484,12 @@
auto physical_device_state = GetPhysicalDeviceState();
// TODO: this is technically wrong on many levels, but requires massive cleanup
if (physical_device_state->vkGetPhysicalDeviceSurfaceCapabilitiesKHR_called) {
- const uint32_t acquired_images =
- static_cast<uint32_t>(std::count_if(swapchain_data->images.begin(), swapchain_data->images.end(),
- [=](SWAPCHAIN_IMAGE image) { return GetImageState(image.image)->acquired; }));
+ const uint32_t acquired_images = static_cast<uint32_t>(
+ std::count_if(swapchain_data->images.begin(), swapchain_data->images.end(), [=](SWAPCHAIN_IMAGE image) {
+ auto const state = GetImageState(image.image);
+ return (state && state->acquired);
+ }));
+
const uint32_t swapchain_image_count = static_cast<uint32_t>(swapchain_data->images.size());
const auto min_image_count = physical_device_state->surfaceCapabilities.minImageCount;
const bool too_many_already_acquired = acquired_images > swapchain_image_count - min_image_count;
@@ -10361,7 +11613,8 @@
report_data->FormatHandle(pCreateInfo->descriptorSetLayout).c_str());
} else if (VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR == pCreateInfo->templateType) {
auto bind_point = pCreateInfo->pipelineBindPoint;
- bool valid_bp = (bind_point == VK_PIPELINE_BIND_POINT_GRAPHICS) || (bind_point == VK_PIPELINE_BIND_POINT_COMPUTE);
+ bool valid_bp = (bind_point == VK_PIPELINE_BIND_POINT_GRAPHICS) || (bind_point == VK_PIPELINE_BIND_POINT_COMPUTE) ||
+ (bind_point == VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
if (!valid_bp) {
skip |=
LogError(device, "VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00351",
@@ -10566,15 +11819,19 @@
bool CoreChecks::PreCallValidateCmdBeginQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query,
VkQueryControlFlags flags, uint32_t index) const {
- if (disabled.query_validation) return false;
+ if (disabled[query_validation]) return false;
const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
assert(cb_state);
QueryObject query_obj(queryPool, query, index);
const char *cmd_name = "vkCmdBeginQueryIndexedEXT()";
- bool skip = ValidateBeginQuery(
- cb_state, query_obj, flags, CMD_BEGINQUERYINDEXEDEXT, cmd_name, "VUID-vkCmdBeginQueryIndexedEXT-commandBuffer-cmdpool",
- "VUID-vkCmdBeginQueryIndexedEXT-queryType-02338", "VUID-vkCmdBeginQueryIndexedEXT-queryType-00803",
- "VUID-vkCmdBeginQueryIndexedEXT-queryType-00800", "VUID-vkCmdBeginQueryIndexedEXT-query-00802");
+ ValidateBeginQueryVuids vuids = {
+ "VUID-vkCmdBeginQueryIndexedEXT-commandBuffer-cmdpool", "VUID-vkCmdBeginQueryIndexedEXT-queryType-02338",
+ "VUID-vkCmdBeginQueryIndexedEXT-queryType-00803", "VUID-vkCmdBeginQueryIndexedEXT-queryType-00800",
+ "VUID-vkCmdBeginQueryIndexedEXT-query-00802", "VUID-vkCmdBeginQueryIndexedEXT-queryPool-03223",
+ "VUID-vkCmdBeginQueryIndexedEXT-queryPool-03224", "VUID-vkCmdBeginQueryIndexedEXT-queryPool-03225",
+ "VUID-vkCmdBeginQueryIndexedEXT-queryPool-01922"};
+
+ bool skip = ValidateBeginQuery(cb_state, query_obj, flags, CMD_BEGINQUERYINDEXEDEXT, cmd_name, &vuids);
// Extension specific VU's
const auto &query_pool_ci = GetQueryPoolState(query_obj.pool)->createInfo;
@@ -10598,14 +11855,14 @@
void CoreChecks::PreCallRecordCmdBeginQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query,
VkQueryControlFlags flags, uint32_t index) {
- if (disabled.query_validation) return;
+ if (disabled[query_validation]) return;
QueryObject query_obj = {queryPool, query, index};
EnqueueVerifyBeginQuery(commandBuffer, query_obj, "vkCmdBeginQueryIndexedEXT()");
}
bool CoreChecks::PreCallValidateCmdEndQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query,
uint32_t index) const {
- if (disabled.query_validation) return false;
+ if (disabled[query_validation]) return false;
QueryObject query_obj = {queryPool, query, index};
const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
assert(cb_state);
@@ -10623,22 +11880,135 @@
bool CoreChecks::PreCallValidateCmdSetSampleLocationsEXT(VkCommandBuffer commandBuffer,
const VkSampleLocationsInfoEXT *pSampleLocationsInfo) const {
+ bool skip = false;
const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
// Minimal validation for command buffer state
- return ValidateCmd(cb_state, CMD_SETSAMPLELOCATIONSEXT, "vkCmdSetSampleLocationsEXT()");
+ skip |= ValidateCmd(cb_state, CMD_SETSAMPLELOCATIONSEXT, "vkCmdSetSampleLocationsEXT()");
+ skip |= ValidateSampleLocationsInfo(pSampleLocationsInfo, "vkCmdSetSampleLocationsEXT");
+ const auto last_bound_it = cb_state->lastBound.find(VK_PIPELINE_BIND_POINT_GRAPHICS);
+ if (last_bound_it != cb_state->lastBound.cend()) {
+ const PIPELINE_STATE *pPipe = last_bound_it->second.pipeline_state;
+ if (pPipe != nullptr) {
+ // Check same error with different log messages
+ const safe_VkPipelineMultisampleStateCreateInfo *multisample_state = pPipe->graphicsPipelineCI.pMultisampleState;
+ if (multisample_state == nullptr) {
+ skip |= LogError(cb_state->commandBuffer, "VUID-vkCmdSetSampleLocationsEXT-sampleLocationsPerPixel-01529",
+ "vkCmdSetSampleLocationsEXT(): pSampleLocationsInfo->sampleLocationsPerPixel must be equal to "
+ "rasterizationSamples, but the bound graphics pipeline was created without a multisample state");
+ } else if (multisample_state->rasterizationSamples != pSampleLocationsInfo->sampleLocationsPerPixel) {
+ skip |= LogError(cb_state->commandBuffer, "VUID-vkCmdSetSampleLocationsEXT-sampleLocationsPerPixel-01529",
+ "vkCmdSetSampleLocationsEXT(): pSampleLocationsInfo->sampleLocationsPerPixel (%s) is not equal to "
+ "the last bound pipeline's rasterizationSamples (%s)",
+ string_VkSampleCountFlagBits(pSampleLocationsInfo->sampleLocationsPerPixel),
+ string_VkSampleCountFlagBits(multisample_state->rasterizationSamples));
+ }
+ }
+ }
+
+ return skip;
}
bool CoreChecks::ValidateCreateSamplerYcbcrConversion(const char *func_name,
const VkSamplerYcbcrConversionCreateInfo *create_info) const {
bool skip = false;
- if (device_extensions.vk_android_external_memory_android_hardware_buffer) {
- skip |= ValidateCreateSamplerYcbcrConversionANDROID(create_info);
- } else { // Not android hardware buffer
- if (VK_FORMAT_UNDEFINED == create_info->format) {
- skip |= LogError(device, "VUID-VkSamplerYcbcrConversionCreateInfo-format-01649",
- "%s: CreateInfo format type is VK_FORMAT_UNDEFINED.", func_name);
+ const VkFormat conversion_format = create_info->format;
+
+ // Need to check for external format conversion first as it allows for non-UNORM format
+ bool external_format = false;
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
+ const VkExternalFormatANDROID *ext_format_android = lvl_find_in_chain<VkExternalFormatANDROID>(create_info->pNext);
+ if ((nullptr != ext_format_android) && (0 != ext_format_android->externalFormat)) {
+ external_format = true;
+ if (VK_FORMAT_UNDEFINED != create_info->format) {
+ return LogError(device, "VUID-VkSamplerYcbcrConversionCreateInfo-format-01904",
+ "%s: CreateInfo format is not VK_FORMAT_UNDEFINED while "
+ "there is a chained VkExternalFormatANDROID struct with a non-zero externalFormat.",
+ func_name);
}
}
+#endif
+
+ if ((external_format == false) && (FormatIsUNorm(conversion_format) == false)) {
+ const char *vuid = (device_extensions.vk_android_external_memory_android_hardware_buffer)
+ ? "VUID-VkSamplerYcbcrConversionCreateInfo-format-04061"
+ : "VUID-VkSamplerYcbcrConversionCreateInfo-format-04060";
+ skip |=
+ LogError(device, vuid,
+ "%s: CreateInfo format (%s) is not an UNORM format and there is no external format conversion being created.",
+ func_name, string_VkFormat(conversion_format));
+ }
+
+ // Gets VkFormatFeatureFlags according to Sampler Ycbcr Conversion Format Features
+ // (vkspec.html#potential-format-features)
+ VkFormatFeatureFlags format_features = VK_FORMAT_FEATURE_FLAG_BITS_MAX_ENUM;
+ if (conversion_format == VK_FORMAT_UNDEFINED) {
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
+ // only check for external format inside VK_FORMAT_UNDEFINED check to prevent unnecessary extra errors from no format
+ // features being supported
+ if (external_format == true) {
+ auto it = ahb_ext_formats_map.find(ext_format_android->externalFormat);
+ if (it != ahb_ext_formats_map.end()) {
+ format_features = it->second;
+ }
+ }
+#endif
+ } else {
+ format_features = GetPotentialFormatFeatures(conversion_format);
+ }
+
+ // Check all VUID that are based off of VkFormatFeatureFlags
+ // These can't be in StatelessValidation due to needing possible External AHB state for feature support
+ if (((format_features & VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT) == 0) &&
+ ((format_features & VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT) == 0)) {
+ skip |= LogError(device, "VUID-VkSamplerYcbcrConversionCreateInfo-format-01650",
+ "%s: Format %s does not support either VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT or "
+ "VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT",
+ func_name, string_VkFormat(conversion_format));
+ }
+ if ((format_features & VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT) == 0) {
+ if (FormatIsXChromaSubsampled(conversion_format) && create_info->xChromaOffset == VK_CHROMA_LOCATION_COSITED_EVEN) {
+ skip |= LogError(device, "VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01651",
+ "%s: Format %s does not support VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT so xChromaOffset can't "
+ "be VK_CHROMA_LOCATION_COSITED_EVEN",
+ func_name, string_VkFormat(conversion_format));
+ }
+ if (FormatIsYChromaSubsampled(conversion_format) && create_info->yChromaOffset == VK_CHROMA_LOCATION_COSITED_EVEN) {
+ skip |= LogError(device, "VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01651",
+ "%s: Format %s does not support VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT so yChromaOffset can't "
+ "be VK_CHROMA_LOCATION_COSITED_EVEN",
+ func_name, string_VkFormat(conversion_format));
+ }
+ }
+ if ((format_features & VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT) == 0) {
+ if (FormatIsXChromaSubsampled(conversion_format) && create_info->xChromaOffset == VK_CHROMA_LOCATION_MIDPOINT) {
+ skip |= LogError(device, "VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01652",
+ "%s: Format %s does not support VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT so xChromaOffset can't "
+ "be VK_CHROMA_LOCATION_MIDPOINT",
+ func_name, string_VkFormat(conversion_format));
+ }
+ if (FormatIsYChromaSubsampled(conversion_format) && create_info->yChromaOffset == VK_CHROMA_LOCATION_MIDPOINT) {
+ skip |= LogError(device, "VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01652",
+ "%s: Format %s does not support VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT so yChromaOffset can't "
+ "be VK_CHROMA_LOCATION_MIDPOINT",
+ func_name, string_VkFormat(conversion_format));
+ }
+ }
+ if (((format_features & VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT) == 0) &&
+ (create_info->forceExplicitReconstruction == VK_TRUE)) {
+ skip |= LogError(device, "VUID-VkSamplerYcbcrConversionCreateInfo-forceExplicitReconstruction-01656",
+ "%s: Format %s does not support "
+ "VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT so "
+ "forceExplicitReconstruction must be VK_FALSE",
+ func_name, string_VkFormat(conversion_format));
+ }
+ if (((format_features & VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT) == 0) &&
+ (create_info->chromaFilter == VK_FILTER_LINEAR)) {
+ skip |= LogError(device, "VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-01657",
+ "%s: Format %s does not support VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT so "
+ "chromaFilter must not be VK_FILTER_LINEAR",
+ func_name, string_VkFormat(conversion_format));
+ }
+
return skip;
}
@@ -10655,19 +12025,96 @@
return ValidateCreateSamplerYcbcrConversion("vkCreateSamplerYcbcrConversionKHR()", pCreateInfo);
}
+bool CoreChecks::PreCallValidateCreateSampler(VkDevice device, const VkSamplerCreateInfo *pCreateInfo,
+ const VkAllocationCallbacks *pAllocator, VkSampler *pSampler) const {
+ bool skip = false;
+
+ if (samplerMap.size() >= phys_dev_props.limits.maxSamplerAllocationCount) {
+ skip |= LogError(device, kVUIDUndefined,
+ "vkCreateSampler(): Number of currently valid sampler objects is not less than the maximum allowed (%u).",
+ phys_dev_props.limits.maxSamplerAllocationCount);
+ }
+
+ if (enabled_features.core11.samplerYcbcrConversion == VK_TRUE) {
+ const VkSamplerYcbcrConversionInfo *conversion_info = lvl_find_in_chain<VkSamplerYcbcrConversionInfo>(pCreateInfo->pNext);
+ if (conversion_info != nullptr) {
+ const VkSamplerYcbcrConversion sampler_ycbcr_conversion = conversion_info->conversion;
+ const SAMPLER_YCBCR_CONVERSION_STATE *ycbcr_state = GetSamplerYcbcrConversionState(sampler_ycbcr_conversion);
+ if ((ycbcr_state->format_features &
+ VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT) == 0) {
+ const VkFilter chroma_filter = ycbcr_state->chromaFilter;
+ if (pCreateInfo->minFilter != chroma_filter) {
+ skip |= LogError(
+ device, "VUID-VkSamplerCreateInfo-minFilter-01645",
+ "VkCreateSampler: VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT is "
+ "not supported for SamplerYcbcrConversion's (%u) format %s so minFilter (%s) needs to be equal to "
+ "chromaFilter (%s)",
+ report_data->FormatHandle(sampler_ycbcr_conversion).c_str(), string_VkFormat(ycbcr_state->format),
+ string_VkFilter(pCreateInfo->minFilter), string_VkFilter(chroma_filter));
+ }
+ if (pCreateInfo->magFilter != chroma_filter) {
+ skip |= LogError(
+ device, "VUID-VkSamplerCreateInfo-minFilter-01645",
+ "VkCreateSampler: VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT is "
+ "not supported for SamplerYcbcrConversion's (%u) format %s so minFilter (%s) needs to be equal to "
+ "chromaFilter (%s)",
+ report_data->FormatHandle(sampler_ycbcr_conversion).c_str(), string_VkFormat(ycbcr_state->format),
+ string_VkFilter(pCreateInfo->minFilter), string_VkFilter(chroma_filter));
+ }
+ }
+ // At this point there is a known sampler YCbCr conversion enabled
+ const auto *sampler_reduction = lvl_find_in_chain<VkSamplerReductionModeCreateInfo>(pCreateInfo->pNext);
+ if (sampler_reduction != nullptr) {
+ if (sampler_reduction->reductionMode != VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE) {
+ skip |= LogError(device, "VUID-VkSamplerCreateInfo-None-01647",
+ "A sampler YCbCr Conversion is being used creating this sampler so the sampler reduction mode "
+ "must be VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE.");
+ }
+ }
+ }
+ }
+
+ if (pCreateInfo->borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
+ pCreateInfo->borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
+ if (!enabled_features.custom_border_color_features.customBorderColors) {
+ skip |= LogError(device, "VUID-VkSamplerCreateInfo-customBorderColors-04085",
+ "A custom border color was specified without enabling the custom border color feature");
+ }
+ auto custom_create_info = lvl_find_in_chain<VkSamplerCustomBorderColorCreateInfoEXT>(pCreateInfo->pNext);
+ if (custom_create_info) {
+ if (custom_create_info->format == VK_FORMAT_UNDEFINED &&
+ !enabled_features.custom_border_color_features.customBorderColorWithoutFormat) {
+ skip |= LogError(device, "VUID-VkSamplerCustomBorderColorCreateInfoEXT-format-04014",
+ "A custom border color was specified as VK_FORMAT_UNDEFINED without the "
+ "customBorderColorWithoutFormat feature being enabled");
+ }
+ }
+ if (custom_border_color_sampler_count >= phys_dev_ext_props.custom_border_color_props.maxCustomBorderColorSamplers) {
+ skip |=
+ LogError(device, "VUID-VkSamplerCreateInfo-None-04012",
+ "Creating a sampler with a custom border color will exceed the maxCustomBorderColorSamplers limit of %d",
+ phys_dev_ext_props.custom_border_color_props.maxCustomBorderColorSamplers);
+ }
+ }
+
+ return skip;
+}
+
bool CoreChecks::ValidateGetBufferDeviceAddress(VkDevice device, const VkBufferDeviceAddressInfoKHR *pInfo,
const char *apiName) const {
bool skip = false;
- if (!enabled_features.core12.bufferDeviceAddress) {
+ if (!enabled_features.core12.bufferDeviceAddress && !enabled_features.buffer_device_address_ext.bufferDeviceAddress) {
skip |= LogError(pInfo->buffer, "VUID-vkGetBufferDeviceAddress-bufferDeviceAddress-03324",
- "The bufferDeviceAddress feature must: be enabled.");
+ "%s: The bufferDeviceAddress feature must: be enabled.", apiName);
}
- if (physical_device_count > 1 && !enabled_features.core12.bufferDeviceAddressMultiDevice) {
+ if (physical_device_count > 1 && !enabled_features.core12.bufferDeviceAddressMultiDevice &&
+ !enabled_features.buffer_device_address_ext.bufferDeviceAddressMultiDevice) {
skip |= LogError(pInfo->buffer, "VUID-vkGetBufferDeviceAddress-device-03325",
- "If device was created with multiple physical devices, then the "
- "bufferDeviceAddressMultiDevice feature must: be enabled.");
+ "%s: If device was created with multiple physical devices, then the "
+ "bufferDeviceAddressMultiDevice feature must: be enabled.",
+ apiName);
}
const auto buffer_state = GetBufferState(pInfo->buffer);
@@ -10769,7 +12216,7 @@
}
bool CoreChecks::ValidateResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) const {
- if (disabled.query_validation) return false;
+ if (disabled[query_validation]) return false;
bool skip = false;
@@ -10932,6 +12379,554 @@
return skip;
}
+bool CoreChecks::PreCallValidateCmdSetCheckpointNV(VkCommandBuffer commandBuffer, const void *pCheckpointMarker) const {
+ {
+ const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ assert(cb_state);
+ bool skip = ValidateCmdQueueFlags(cb_state, "vkCmdSetCheckpointNV()",
+ VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT,
+ "VUID-vkCmdSetCheckpointNV-commandBuffer-cmdpool");
+ skip |= ValidateCmd(cb_state, CMD_SETCHECKPOINTNV, "vkCmdSetCheckpointNV()");
+ return skip;
+ }
+}
+
+bool CoreChecks::PreCallValidateWriteAccelerationStructuresPropertiesKHR(VkDevice device, uint32_t accelerationStructureCount,
+ const VkAccelerationStructureKHR *pAccelerationStructures,
+ VkQueryType queryType, size_t dataSize, void *pData,
+ size_t stride) const {
+ bool skip = false;
+ for (uint32_t i = 0; i < accelerationStructureCount; ++i) {
+ const ACCELERATION_STRUCTURE_STATE *as_state = GetAccelerationStructureState(pAccelerationStructures[i]);
+ const auto &as_info = as_state->create_infoKHR;
+ if (queryType == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR) {
+ if (!(as_info.flags & VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR)) {
+ skip |= LogError(device, "VUID-vkWriteAccelerationStructuresPropertiesKHR-accelerationStructures-03431",
+ "vkWriteAccelerationStructuresPropertiesKHR: All acceleration structures (%s) in "
+ "accelerationStructures must have been built with"
+ "VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR if queryType is "
+ "VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR.",
+ report_data->FormatHandle(as_state->acceleration_structure).c_str());
+ }
+ }
+ }
+ return skip;
+}
+
+bool CoreChecks::PreCallValidateCmdWriteAccelerationStructuresPropertiesKHR(
+ VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, const VkAccelerationStructureKHR *pAccelerationStructures,
+ VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery) const {
+ bool skip = false;
+ const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ skip |= ValidateCmdQueueFlags(cb_state, "vkCmdWriteAccelerationStructuresPropertiesKHR()", VK_QUEUE_COMPUTE_BIT,
+ "VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-commandBuffer-cmdpool");
+ skip |= ValidateCmd(cb_state, CMD_WRITEACCELERATIONSTRUCTURESPROPERTIESKHR, "vkCmdWriteAccelerationStructuresPropertiesKHR()");
+ // This command must only be called outside of a render pass instance
+ skip |= InsideRenderPass(cb_state, "vkCmdWriteAccelerationStructuresPropertiesKHR()",
+ "VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-renderpass");
+ const auto *query_pool_state = GetQueryPoolState(queryPool);
+ const auto &query_pool_ci = query_pool_state->createInfo;
+ if (query_pool_ci.queryType != queryType) {
+ skip |= LogError(
+ device, "VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryPool-02493",
+ "vkCmdWriteAccelerationStructuresPropertiesKHR: queryPool must have been created with a queryType matching queryType.");
+ }
+ for (uint32_t i = 0; i < accelerationStructureCount; ++i) {
+ if (queryType == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR) {
+ const ACCELERATION_STRUCTURE_STATE *as_state = GetAccelerationStructureState(pAccelerationStructures[i]);
+ if (!(as_state->create_infoKHR.flags & VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR)) {
+ skip |=
+ LogError(device, "VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-accelerationStructures-03431",
+ "vkCmdWriteAccelerationStructuresPropertiesKHR: All acceleration structures in accelerationStructures "
+ "must have been built with VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR if queryType is "
+ "VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR.");
+ }
+ }
+ }
+ return skip;
+}
+
+bool CoreChecks::PreCallValidateGetRayTracingShaderGroupHandlesKHR(VkDevice device, VkPipeline pipeline, uint32_t firstGroup,
+ uint32_t groupCount, size_t dataSize, void *pData) const {
+ bool skip = false;
+ const PIPELINE_STATE *pipeline_state = GetPipelineState(pipeline);
+ if (pipeline_state->getPipelineCreateFlags() & VK_PIPELINE_CREATE_LIBRARY_BIT_KHR) {
+ skip |= LogError(
+ device, "VUID-vkGetRayTracingShaderGroupHandlesKHR-pipeline-03482",
+ "vkGetRayTracingShaderGroupHandlesKHR: pipeline must have not been created with VK_PIPELINE_CREATE_LIBRARY_BIT_KHR.");
+ }
+ if (dataSize < phys_dev_ext_props.ray_tracing_propsKHR.shaderGroupHandleSize) {
+ skip |= LogError(device, "VUID-vkGetRayTracingShaderGroupHandlesKHR-dataSize-02420",
+ "vkGetRayTracingShaderGroupHandlesKHR: dataSize (%zu) must be at least "
+ "VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize.",
+ dataSize);
+ }
+ if (firstGroup >= pipeline_state->raytracingPipelineCI.groupCount) {
+ skip |=
+ LogError(device, "VUID-vkGetRayTracingShaderGroupHandlesKHR-firstGroup-04050",
+ "vkGetRayTracingShaderGroupHandlesKHR: firstGroup must be less than the number of shader groups in pipeline.");
+ }
+ if ((firstGroup + groupCount) > pipeline_state->raytracingPipelineCI.groupCount) {
+ skip |= LogError(
+ device, "VUID-vkGetRayTracingShaderGroupHandlesKHR-firstGroup-02419",
+ "vkGetRayTracingShaderGroupHandlesKHR: The sum of firstGroup and groupCount must be less than or equal the number "
+ "of shader groups in pipeline.");
+ }
+ return skip;
+}
+bool CoreChecks::PreCallValidateGetRayTracingCaptureReplayShaderGroupHandlesKHR(VkDevice device, VkPipeline pipeline,
+ uint32_t firstGroup, uint32_t groupCount,
+ size_t dataSize, void *pData) const {
+ bool skip = false;
+ if (dataSize < phys_dev_ext_props.ray_tracing_propsKHR.shaderGroupHandleCaptureReplaySize) {
+ skip |= LogError(device, "VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-dataSize-03484",
+ "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR: dataSize (%zu) must be at least "
+ "VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleCaptureReplaySize.",
+ dataSize);
+ }
+ const PIPELINE_STATE *pipeline_state = GetPipelineState(pipeline);
+ if (firstGroup >= pipeline_state->raytracingPipelineCI.groupCount) {
+ skip |= LogError(device, "VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-firstGroup-04051",
+ "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR: firstGroup must be less than the number of shader "
+ "groups in pipeline.");
+ }
+ if ((firstGroup + groupCount) > pipeline_state->raytracingPipelineCI.groupCount) {
+ skip |= LogError(device, "VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-firstGroup-03483",
+ "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR: The sum of firstGroup and groupCount must be less "
+ "than or equal to the number of shader groups in pipeline.");
+ }
+ return skip;
+}
+
+bool CoreChecks::PreCallValidateCmdBuildAccelerationStructureIndirectKHR(VkCommandBuffer commandBuffer,
+ const VkAccelerationStructureBuildGeometryInfoKHR *pInfo,
+ VkBuffer indirectBuffer, VkDeviceSize indirectOffset,
+ uint32_t indirectStride) const {
+ const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ assert(cb_state);
+ bool skip = ValidateCmdQueueFlags(cb_state, "vkCmdBuildAccelerationStructureIndirectKHR()", VK_QUEUE_COMPUTE_BIT,
+ "VUID-vkCmdBuildAccelerationStructureIndirectKHR-commandBuffer-cmdpool");
+ skip |= ValidateCmd(cb_state, CMD_BUILDACCELERATIONSTRUCTUREINDIRECTKHR, "vkCmdBuildAccelerationStructureIndirectKHR()");
+ skip |= InsideRenderPass(cb_state, "vkCmdBuildAccelerationStructureIndirectKHR()",
+ "VUID-vkCmdBuildAccelerationStructureIndirectKHR-renderpass");
+ return skip;
+}
+
+bool CoreChecks::ValidateCopyAccelerationStructureInfoKHR(const VkCopyAccelerationStructureInfoKHR *pInfo,
+ const char *api_name) const {
+ bool skip = false;
+ if (pInfo->mode == VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR) {
+ const ACCELERATION_STRUCTURE_STATE *src_as_state = GetAccelerationStructureState(pInfo->src);
+ if (!(src_as_state->create_infoKHR.flags & VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR)) {
+ skip |= LogError(device, "VUID-VkCopyAccelerationStructureInfoKHR-src-03411",
+ "(%s): src must have been built with VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR"
+ "if mode is VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR.",
+ api_name);
+ }
+ }
+ return skip;
+}
+bool CoreChecks::PreCallValidateCmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer,
+ const VkCopyAccelerationStructureInfoKHR *pInfo) const {
+ const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ assert(cb_state);
+ bool skip = ValidateCmdQueueFlags(cb_state, "vkCmdCopyAccelerationStructureKHR()", VK_QUEUE_COMPUTE_BIT,
+ "VUID-vkCmdCopyAccelerationStructureKHR-commandBuffer-cmdpool");
+ skip |= ValidateCmd(cb_state, CMD_COPYACCELERATIONSTRUCTUREKHR, "vkCmdCopyAccelerationStructureKHR()");
+ skip |= InsideRenderPass(cb_state, "vkCmdCopyAccelerationStructureKHR()", "VUID-vkCmdCopyAccelerationStructureKHR-renderpass");
+ skip |= ValidateCopyAccelerationStructureInfoKHR(pInfo, "vkCmdCopyAccelerationStructureKHR");
+ return false;
+}
+
+bool CoreChecks::PreCallValidateCopyAccelerationStructureKHR(VkDevice device,
+ const VkCopyAccelerationStructureInfoKHR *pInfo) const {
+ bool skip = false;
+ skip |= ValidateCopyAccelerationStructureInfoKHR(pInfo, "vkCopyAccelerationStructureKHR");
+ return skip;
+}
+bool CoreChecks::PreCallValidateCmdCopyAccelerationStructureToMemoryKHR(
+ VkCommandBuffer commandBuffer, const VkCopyAccelerationStructureToMemoryInfoKHR *pInfo) const {
+ const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ assert(cb_state);
+ bool skip = ValidateCmdQueueFlags(cb_state, "vkCmdCopyAccelerationStructureToMemoryKHR()", VK_QUEUE_COMPUTE_BIT,
+ "VUID-vkCmdCopyAccelerationStructureToMemoryKHR-commandBuffer-cmdpool");
+ skip |= ValidateCmd(cb_state, CMD_COPYACCELERATIONSTRUCTURETOMEMORYKHR, "vkCmdCopyAccelerationStructureToMemoryKHR()");
+ skip |= InsideRenderPass(cb_state, "vkCmdCopyAccelerationStructureToMemoryKHR()",
+ "VUID-vkCmdCopyAccelerationStructureToMemoryKHR-renderpass");
+ return skip;
+}
+
+bool CoreChecks::PreCallValidateCmdCopyMemoryToAccelerationStructureKHR(
+ VkCommandBuffer commandBuffer, const VkCopyMemoryToAccelerationStructureInfoKHR *pInfo) const {
+ const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ assert(cb_state);
+ bool skip = ValidateCmdQueueFlags(cb_state, "vkCmdCopyMemoryToAccelerationStructureKHR()", VK_QUEUE_COMPUTE_BIT,
+ "VUID-vkCmdCopyMemoryToAccelerationStructureKHR-commandBuffer-cmdpool");
+ skip |= ValidateCmd(cb_state, CMD_COPYMEMORYTOACCELERATIONSTRUCTUREKHR, "vkCmdCopyMemoryToAccelerationStructureKHR()");
+ // This command must only be called outside of a render pass instance
+ skip |= InsideRenderPass(cb_state, "vkCmdCopyMemoryToAccelerationStructureKHR()",
+ "VUID-vkCmdCopyMemoryToAccelerationStructureKHR-renderpass");
+ return skip;
+}
+
+bool CoreChecks::PreCallValidateCmdBindTransformFeedbackBuffersEXT(VkCommandBuffer commandBuffer, uint32_t firstBinding,
+ uint32_t bindingCount, const VkBuffer *pBuffers,
+ const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes) const {
+ bool skip = false;
+ char const *const cmd_name = "CmdBindTransformFeedbackBuffersEXT";
+ if (!enabled_features.transform_feedback_features.transformFeedback) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdBindTransformFeedbackBuffersEXT-transformFeedback-02355",
+ "%s: transformFeedback feature is not enabled.", cmd_name);
+ }
+
+ {
+ auto const cb_state = GetCBState(commandBuffer);
+ if (cb_state->transform_feedback_active) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdBindTransformFeedbackBuffersEXT-None-02365",
+ "%s: transform feedback is active.", cmd_name);
+ }
+ }
+
+ for (uint32_t i = 0; i < bindingCount; ++i) {
+ auto const buffer_state = GetBufferState(pBuffers[i]);
+ assert(buffer_state != nullptr);
+
+ if (pOffsets[i] >= buffer_state->createInfo.size) {
+ skip |= LogError(buffer_state->buffer, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02358",
+ "%s: pOffset[%" PRIu32 "](0x%" PRIxLEAST64
+ ") is greater than or equal to the size of pBuffers[%" PRIu32 "](0x%" PRIxLEAST64 ").",
+ cmd_name, i, pOffsets[i], i, buffer_state->createInfo.size);
+ }
+
+ if ((buffer_state->createInfo.usage & VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT) == 0) {
+ skip |= LogError(buffer_state->buffer, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02360",
+ "%s: pBuffers[%" PRIu32 "] (0x%" PRIxLEAST64
+ ") was not created with the VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT flag.",
+ cmd_name, i, pBuffers[i]);
+ }
+
+ // pSizes is optional and may be nullptr.
+ if (pSizes != nullptr) {
+ if (pSizes[i] > buffer_state->createInfo.size) {
+ skip |= LogError(buffer_state->buffer, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-02362",
+ "%s: pSizes[%" PRIu32 "](0x%" PRIxLEAST64 ") is greater than the size of pBuffers[%" PRIu32
+ "](0x%" PRIxLEAST64 ").",
+ cmd_name, i, pSizes[i], i, buffer_state->createInfo.size);
+ }
+
+ if (pSizes[i] != VK_WHOLE_SIZE && pOffsets[i] + pSizes[i] > buffer_state->createInfo.size) {
+ skip |= LogError(buffer_state->buffer, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02363",
+ "%s: The sum of pOffsets[%" PRIu32 "](Ox%" PRIxLEAST64 ") and pSizes[%" PRIu32 "](0x%" PRIxLEAST64
+ ") is greater than the size of pBuffers[%" PRIu32 "](0x%" PRIxLEAST64 ").",
+ cmd_name, i, pOffsets[i], i, pSizes[i], i, buffer_state->createInfo.size);
+ }
+ }
+
+ skip |= ValidateMemoryIsBoundToBuffer(buffer_state, cmd_name, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02364");
+ }
+
+ return skip;
+}
+
+bool CoreChecks::PreCallValidateCmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
+ uint32_t counterBufferCount, const VkBuffer *pCounterBuffers,
+ const VkDeviceSize *pCounterBufferOffsets) const {
+ bool skip = false;
+ char const *const cmd_name = "CmdBeginTransformFeedbackEXT";
+ if (!enabled_features.transform_feedback_features.transformFeedback) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdBeginTransformFeedbackEXT-transformFeedback-02366",
+ "%s: transformFeedback feature is not enabled.", cmd_name);
+ }
+
+ {
+ auto const cb_state = GetCBState(commandBuffer);
+ if (cb_state->transform_feedback_active) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdBeginTransformFeedbackEXT-None-02367", "%s: transform feedback is active.",
+ cmd_name);
+ }
+ }
+
+ // pCounterBuffers and pCounterBufferOffsets are optional and may be nullptr. Additionaly, pCounterBufferOffsets must be nullptr
+ // if pCounterBuffers is nullptr.
+ if (pCounterBuffers == nullptr) {
+ if (pCounterBufferOffsets != nullptr) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffer-02371",
+ "%s: pCounterBuffers is NULL and pCounterBufferOffsets is not NULL.", cmd_name);
+ }
+ } else {
+ for (uint32_t i = 0; i < counterBufferCount; ++i) {
+ if (pCounterBuffers[i] != VK_NULL_HANDLE) {
+ auto const buffer_state = GetBufferState(pCounterBuffers[i]);
+ assert(buffer_state != nullptr);
+
+ if (pCounterBufferOffsets != nullptr && pCounterBufferOffsets[i] + 4 > buffer_state->createInfo.size) {
+ skip |=
+ LogError(buffer_state->buffer, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-02370",
+ "%s: pCounterBuffers[%" PRIu32 "](0x%" PRIxLEAST64
+ ") is not large enough to hold 4 bytes at pCounterBufferOffsets[%" PRIu32 "](0x%" PRIxLEAST64 ").",
+ cmd_name, i, pCounterBuffers[i], i, pCounterBufferOffsets[i]);
+ }
+
+ if ((buffer_state->createInfo.usage & VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT) == 0) {
+ skip |= LogError(buffer_state->buffer, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffers-02372",
+ "%s: pCounterBuffers[%" PRIu32 "] (0x%" PRIxLEAST64
+ ") was not created with the VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT flag.",
+ cmd_name, i, pCounterBuffers[i]);
+ }
+ }
+ }
+ }
+
+ return skip;
+}
+
+bool CoreChecks::PreCallValidateCmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
+ uint32_t counterBufferCount, const VkBuffer *pCounterBuffers,
+ const VkDeviceSize *pCounterBufferOffsets) const {
+ bool skip = false;
+ char const *const cmd_name = "CmdEndTransformFeedbackEXT";
+ if (!enabled_features.transform_feedback_features.transformFeedback) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdEndTransformFeedbackEXT-transformFeedback-02374",
+ "%s: transformFeedback feature is not enabled.", cmd_name);
+ }
+
+ {
+ auto const cb_state = GetCBState(commandBuffer);
+ if (!cb_state->transform_feedback_active) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdEndTransformFeedbackEXT-None-02375", "%s: transform feedback is not active.",
+ cmd_name);
+ }
+ }
+
+ // pCounterBuffers and pCounterBufferOffsets are optional and may be nullptr. Additionaly, pCounterBufferOffsets must be nullptr
+ // if pCounterBuffers is nullptr.
+ if (pCounterBuffers == nullptr) {
+ if (pCounterBufferOffsets != nullptr) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffer-02379",
+ "%s: pCounterBuffers is NULL and pCounterBufferOffsets is not NULL.", cmd_name);
+ }
+ } else {
+ for (uint32_t i = 0; i < counterBufferCount; ++i) {
+ if (pCounterBuffers[i] != VK_NULL_HANDLE) {
+ auto const buffer_state = GetBufferState(pCounterBuffers[i]);
+ assert(buffer_state != nullptr);
+
+ if (pCounterBufferOffsets != nullptr && pCounterBufferOffsets[i] + 4 > buffer_state->createInfo.size) {
+ skip |=
+ LogError(buffer_state->buffer, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-02378",
+ "%s: pCounterBuffers[%" PRIu32 "](0x%" PRIxLEAST64
+ ") is not large enough to hold 4 bytes at pCounterBufferOffsets[%" PRIu32 "](0x%" PRIxLEAST64 ").",
+ cmd_name, i, pCounterBuffers[i], i, pCounterBufferOffsets[i]);
+ }
+
+ if ((buffer_state->createInfo.usage & VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT) == 0) {
+ skip |= LogError(buffer_state->buffer, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffers-02380",
+ "%s: pCounterBuffers[%" PRIu32 "] (0x%" PRIxLEAST64
+ ") was not created with the VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT flag.",
+ cmd_name, i, pCounterBuffers[i]);
+ }
+ }
+ }
+ }
+
+ return skip;
+}
+
+bool CoreChecks::PreCallValidateCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) const {
+ const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ bool skip = ValidateCmdQueueFlags(cb_state, "vkCmdSetCullModeEXT()", VK_QUEUE_GRAPHICS_BIT,
+ "VUID-vkCmdSetCullModeEXT-commandBuffer-cmdpool");
+ skip |= ValidateCmd(cb_state, CMD_SETCULLMODEEXT, "vkCmdSetCullModeEXT()");
+
+ if (!enabled_features.extended_dynamic_state_features.extendedDynamicState) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdSetCullModeEXT-None-03384",
+ "vkCmdSetCullModeEXT: extendedDynamicState feature is not enabled.");
+ }
+
+ return skip;
+}
+
+bool CoreChecks::PreCallValidateCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace) const {
+ const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ bool skip = ValidateCmdQueueFlags(cb_state, "vkCmdSetFrontFaceEXT()", VK_QUEUE_GRAPHICS_BIT,
+ "VUID-vkCmdSetFrontFaceEXT-commandBuffer-cmdpool");
+ skip |= ValidateCmd(cb_state, CMD_SETFRONTFACEEXT, "vkCmdSetFrontFaceEXT()");
+
+ if (!enabled_features.extended_dynamic_state_features.extendedDynamicState) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdSetFrontFaceEXT-None-03383",
+ "vkCmdSetFrontFaceEXT: extendedDynamicState feature is not enabled.");
+ }
+
+ return skip;
+}
+
+bool CoreChecks::PreCallValidateCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer,
+ VkPrimitiveTopology primitiveTopology) const {
+ const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ bool skip = ValidateCmdQueueFlags(cb_state, "vkCmdSetPrimitiveTopologyEXT()", VK_QUEUE_GRAPHICS_BIT,
+ "VUID-vkCmdSetPrimitiveTopologyEXT-commandBuffer-cmdpool");
+ skip |= ValidateCmd(cb_state, CMD_SETPRIMITIVETOPOLOGYEXT, "vkCmdSetPrimitiveTopologyEXT()");
+
+ if (!enabled_features.extended_dynamic_state_features.extendedDynamicState) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdSetPrimitiveTopologyEXT-None-03347",
+ "vkCmdSetPrimitiveTopologyEXT: extendedDynamicState feature is not enabled.");
+ }
+
+ return skip;
+}
+
+bool CoreChecks::PreCallValidateCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount,
+ const VkViewport *pViewports) const
+
+{
+ const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ bool skip = ValidateCmdQueueFlags(cb_state, "vkCmdSetViewportWithCountEXT()", VK_QUEUE_GRAPHICS_BIT,
+ "VUID-vkCmdSetViewportWithCountEXT-commandBuffer-cmdpool");
+ skip |= ValidateCmd(cb_state, CMD_SETVIEWPORTWITHCOUNTEXT, "vkCmdSetViewportWithCountEXT()");
+
+ if (!enabled_features.extended_dynamic_state_features.extendedDynamicState) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdSetViewportWithCountEXT-None-03393",
+ "vkCmdSetViewportWithCountEXT: extendedDynamicState feature is not enabled.");
+ }
+
+ return skip;
+}
+
+bool CoreChecks::PreCallValidateCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount,
+ const VkRect2D *pScissors) const {
+ const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ bool skip = ValidateCmdQueueFlags(cb_state, "vkCmdSetScissorWithCountEXT()", VK_QUEUE_GRAPHICS_BIT,
+ "VUID-vkCmdSetScissorWithCountEXT-commandBuffer-cmdpool");
+ skip |= ValidateCmd(cb_state, CMD_SETSCISSORWITHCOUNTEXT, "vkCmdSetScissorWithCountEXT()");
+
+ if (!enabled_features.extended_dynamic_state_features.extendedDynamicState) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdSetScissorWithCountEXT-None-03396",
+ "vkCmdSetScissorWithCountEXT: extendedDynamicState feature is not enabled.");
+ }
+
+ return skip;
+}
+
+bool CoreChecks::PreCallValidateCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding,
+ uint32_t bindingCount, const VkBuffer *pBuffers,
+ const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes,
+ const VkDeviceSize *pStrides) const {
+ const auto cb_state = GetCBState(commandBuffer);
+ assert(cb_state);
+
+ bool skip = ValidateCmdQueueFlags(cb_state, "vkCmdBindVertexBuffers2EXT()", VK_QUEUE_GRAPHICS_BIT,
+ "VUID-vkCmdBindVertexBuffers2EXT-commandBuffer-cmdpool");
+ skip |= ValidateCmd(cb_state, CMD_BINDVERTEXBUFFERS2EXT, "vkCmdBindVertexBuffers2EXT()");
+ for (uint32_t i = 0; i < bindingCount; ++i) {
+ const auto buffer_state = GetBufferState(pBuffers[i]);
+ if (buffer_state) {
+ skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, true,
+ "VUID-vkCmdBindVertexBuffers2EXT-pBuffers-03359", "vkCmdBindVertexBuffers2EXT()",
+ "VK_BUFFER_USAGE_VERTEX_BUFFER_BIT");
+ skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdBindVertexBuffers2EXT()",
+ "VUID-vkCmdBindVertexBuffers2EXT-pBuffers-03360");
+ if (pOffsets[i] >= buffer_state->createInfo.size) {
+ skip |= LogError(buffer_state->buffer, "VUID-vkCmdBindVertexBuffers2EXT-pOffsets-03357",
+ "vkCmdBindVertexBuffers2EXT() offset (0x%" PRIxLEAST64 ") is beyond the end of the buffer.",
+ pOffsets[i]);
+ }
+ if (pSizes && pOffsets[i] + pSizes[i] > buffer_state->createInfo.size) {
+ skip |=
+ LogError(buffer_state->buffer, "VUID-vkCmdBindVertexBuffers2EXT-pSizes-03358",
+ "vkCmdBindVertexBuffers2EXT() size (0x%" PRIxLEAST64 ") is beyond the end of the buffer.", pSizes[i]);
+ }
+ }
+ }
+
+ return skip;
+}
+
+bool CoreChecks::PreCallValidateCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) const {
+ const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ bool skip = ValidateCmdQueueFlags(cb_state, "vkCmdSetDepthTestEnableEXT()", VK_QUEUE_GRAPHICS_BIT,
+ "VUID-vkCmdSetDepthTestEnableEXT-commandBuffer-cmdpool");
+ skip |= ValidateCmd(cb_state, CMD_SETDEPTHTESTENABLEEXT, "vkCmdSetDepthTestEnableEXT()");
+
+ if (!enabled_features.extended_dynamic_state_features.extendedDynamicState) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdSetDepthTestEnableEXT-None-03352",
+ "vkCmdSetDepthTestEnableEXT: extendedDynamicState feature is not enabled.");
+ }
+
+ return skip;
+}
+
+bool CoreChecks::PreCallValidateCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) const {
+ const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ bool skip = ValidateCmdQueueFlags(cb_state, "vkCmdSetDepthWriteEnableEXT()", VK_QUEUE_GRAPHICS_BIT,
+ "VUID-vkCmdSetDepthWriteEnableEXT-commandBuffer-cmdpool");
+ skip |= ValidateCmd(cb_state, CMD_SETDEPTHWRITEENABLEEXT, "vkCmdSetDepthWriteEnableEXT()");
+
+ if (!enabled_features.extended_dynamic_state_features.extendedDynamicState) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdSetDepthWriteEnableEXT-None-03354",
+ "vkCmdSetDepthWriteEnableEXT: extendedDynamicState feature is not enabled.");
+ }
+
+ return skip;
+}
+
+bool CoreChecks::PreCallValidateCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) const {
+ const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ bool skip = ValidateCmdQueueFlags(cb_state, "vkCmdSetDepthCompareOpEXT()", VK_QUEUE_GRAPHICS_BIT,
+ "VUID-vkCmdSetDepthCompareOpEXT-commandBuffer-cmdpool");
+ skip |= ValidateCmd(cb_state, CMD_SETDEPTHCOMPAREOPEXT, "vkCmdSetDepthCompareOpEXT()");
+
+ if (!enabled_features.extended_dynamic_state_features.extendedDynamicState) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdSetDepthCompareOpEXT-None-03353",
+ "vkCmdSetDepthCompareOpEXT: extendedDynamicState feature is not enabled.");
+ }
+
+ return skip;
+}
+
+bool CoreChecks::PreCallValidateCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer,
+ VkBool32 depthBoundsTestEnable) const {
+ const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ bool skip = ValidateCmdQueueFlags(cb_state, "vkCmdSetDepthBoundsTestEnableEXT()", VK_QUEUE_GRAPHICS_BIT,
+ "VUID-vkCmdSetDepthBoundsTestEnableEXT-commandBuffer-cmdpool");
+ skip |= ValidateCmd(cb_state, CMD_SETDEPTHBOUNDSTESTENABLEEXT, "vkCmdSetDepthBoundsTestEnableEXT()");
+
+ if (!enabled_features.extended_dynamic_state_features.extendedDynamicState) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdSetDepthBoundsTestEnableEXT-None-03349",
+ "vkCmdSetDepthBoundsTestEnableEXT: extendedDynamicState feature is not enabled.");
+ }
+
+ return skip;
+}
+
+bool CoreChecks::PreCallValidateCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) const {
+ const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ bool skip = ValidateCmdQueueFlags(cb_state, "vkCmdSetStencilTestEnableEXT()", VK_QUEUE_GRAPHICS_BIT,
+ "VUID-vkCmdSetStencilTestEnableEXT-commandBuffer-cmdpool");
+ skip |= ValidateCmd(cb_state, CMD_SETSTENCILTESTENABLEEXT, "vkCmdSetStencilTestEnableEXT()");
+
+ if (!enabled_features.extended_dynamic_state_features.extendedDynamicState) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdSetStencilTestEnableEXT-None-03350",
+ "vkCmdSetStencilTestEnableEXT: extendedDynamicState feature is not enabled.");
+ }
+
+ return skip;
+}
+
+bool CoreChecks::PreCallValidateCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, VkStencilOp failOp,
+ VkStencilOp passOp, VkStencilOp depthFailOp, VkCompareOp compareOp) const {
+ const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ bool skip = ValidateCmdQueueFlags(cb_state, "vkCmdSetStencilOpEXT()", VK_QUEUE_GRAPHICS_BIT,
+ "VUID-vkCmdSetStencilOpEXT-commandBuffer-cmdpool");
+ skip |= ValidateCmd(cb_state, CMD_SETSTENCILOPEXT, "vkCmdSetStencilOpEXT()");
+
+ if (!enabled_features.extended_dynamic_state_features.extendedDynamicState) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdSetStencilOpEXT-None-03351",
+ "vkCmdSetStencilOpEXT: extendedDynamicState feature is not enabled.");
+ }
+
+ return skip;
+}
+
void PIPELINE_STATE::initGraphicsPipeline(const ValidationStateTracker *state_data, const VkGraphicsPipelineCreateInfo *pCreateInfo,
std::shared_ptr<const RENDER_PASS_STATE> &&rpstate) {
reset();
diff --git a/layers/core_validation.h b/layers/core_validation.h
index ffce9ac..e3e45cf 100644
--- a/layers/core_validation.h
+++ b/layers/core_validation.h
@@ -20,6 +20,7 @@
* Author: Chris Forbes <chrisf@ijw.co.nz>
* Author: Mark Lobodzinski <mark@lunarg.com>
* Author: Dave Houlton <daveh@lunarg.com>
+ * Author: Jeremy Kniager <jeremyk@lunarg.com>
*/
#pragma once
@@ -36,19 +37,47 @@
const char* pipeline_bound;
const char* dynamic_state;
const char* vertex_binding;
+ const char* vertex_binding_null;
const char* compatible_pipeline;
const char* render_pass_compatible;
const char* subpass_index;
+ const char* sample_location;
+ const char* linear_sampler;
+ const char* cubic_sampler;
+ const char* indirect_protected_cb;
+ const char* indirect_contiguous_memory;
+ const char* indirect_buffer_bit;
+ const char* viewport_count;
+ const char* scissor_count;
+ const char* viewport_scissor_count;
+ const char* primitive_topology;
+ const char* corner_sampled_address_mode;
};
+typedef struct {
+ const char* vuid_queue_flags;
+ const char* vuid_queue_feedback;
+ const char* vuid_queue_occlusion;
+ const char* vuid_precise;
+ const char* vuid_query_count;
+ const char* vuid_profile_lock;
+ const char* vuid_scope_not_first;
+ const char* vuid_scope_in_rp;
+ const char* vuid_dup_query_type;
+} ValidateBeginQueryVuids;
+
class CoreChecks : public ValidationStateTracker {
public:
using StateTracker = ValidationStateTracker;
- std::unordered_set<uint64_t> ahb_ext_formats_set;
GlobalQFOTransferBarrierMap<VkImageMemoryBarrier> qfo_release_image_barrier_map;
GlobalQFOTransferBarrierMap<VkBufferMemoryBarrier> qfo_release_buffer_barrier_map;
GlobalImageLayoutMap imageLayoutMap;
+ CoreChecks() { container_type = LayerObjectTypeCoreValidation; }
+
+ // Override base class, we have some extra work to do here
+ void InitDeviceValidationObject(bool add_obj, ValidationObject* inst_obj, ValidationObject* dev_obj);
+
void IncrementCommandCount(VkCommandBuffer commandBuffer);
bool VerifyQueueStateToSeq(const QUEUE_STATE* initial_queue, uint64_t initial_seq) const;
@@ -56,7 +85,7 @@
bool ValidateDeviceQueueFamily(uint32_t queue_family, const char* cmd_name, const char* parameter_name, const char* error_code,
bool optional) const;
bool ValidateBindBufferMemory(VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memoryOffset, const char* api_name) const;
- bool ValidateGetImageMemoryRequirements2(const VkImageMemoryRequirementsInfo2* pInfo) const;
+ bool ValidateGetImageMemoryRequirements2(const VkImageMemoryRequirementsInfo2* pInfo, const char* func_name) const;
bool CheckCommandBuffersInFlight(const COMMAND_POOL_STATE* pPool, const char* action, const char* error_code) const;
bool CheckCommandBufferInFlight(const CMD_BUFFER_STATE* cb_node, const char* action, const char* error_code) const;
bool VerifyQueueStateToFence(VkFence fence) const;
@@ -84,6 +113,7 @@
const char* msg, const char* caller, const char* error_code) const;
bool ValidateStageMaskGsTsEnables(VkPipelineStageFlags stageMask, const char* caller, const char* geo_error_id,
const char* tess_error_id, const char* mesh_error_id, const char* task_error_id) const;
+ bool ValidateStageMaskHost(VkPipelineStageFlags stageMask, const char* caller, const char* vuid) const;
bool ValidateMapMemRange(const DEVICE_MEMORY_STATE* mem_info, VkDeviceSize offset, VkDeviceSize size) const;
bool ValidatePushConstantRange(const uint32_t offset, const uint32_t size, const char* caller_name, uint32_t index) const;
bool ValidateRenderPassDAG(RenderPassCreateVersion rp_version, const VkRenderPassCreateInfo2KHR* pCreateInfo) const;
@@ -103,13 +133,15 @@
bool ValidatePipelineVertexDivisors(std::vector<std::shared_ptr<PIPELINE_STATE>> const& pipe_state_vec, const uint32_t count,
const VkGraphicsPipelineCreateInfo* pipe_cis) const;
+ bool ValidatePipelineCacheControlFlags(VkPipelineCreateFlags flags, uint32_t index, const char* caller_name,
+ const char* vuid) const;
void EnqueueSubmitTimeValidateImageBarrierAttachment(const char* func_name, CMD_BUFFER_STATE* cb_state,
uint32_t imageMemBarrierCount,
const VkImageMemoryBarrier* pImageMemBarriers);
- bool ValidateImageBarrierAttachment(const char* funcName, CMD_BUFFER_STATE const* cb_state, VkFramebuffer framebuffer,
- uint32_t active_subpass, const safe_VkSubpassDescription2& sub_desc,
- const VkRenderPass rp_handle, uint32_t img_index,
- const VkImageMemoryBarrier& img_barrier) const;
+ bool ValidateImageBarrierAttachment(const char* funcName, CMD_BUFFER_STATE const* cb_state,
+ const FRAMEBUFFER_STATE* framebuffer, uint32_t active_subpass,
+ const safe_VkSubpassDescription2& sub_desc, const VkRenderPass rp_handle,
+ uint32_t img_index, const VkImageMemoryBarrier& img_barrier) const;
static bool ValidateConcurrentBarrierAtSubmit(const ValidationStateTracker* state_data, const QUEUE_STATE* queue_data,
const char* func_name, const CMD_BUFFER_STATE* cb_state,
const VulkanTypedHandle& typed_handle, uint32_t src_queue_family,
@@ -127,6 +159,7 @@
const BUFFER_STATE* state_data) const;
bool ValidateCreateSwapchain(const char* func_name, VkSwapchainCreateInfoKHR const* pCreateInfo,
const SURFACE_STATE* surface_state, const SWAPCHAIN_NODE* old_swapchain_state) const;
+ bool ValidateGraphicsPipelineBindPoint(const CMD_BUFFER_STATE* cb_state, const PIPELINE_STATE* pipeline_state) const;
bool ValidatePipelineBindPoint(const CMD_BUFFER_STATE* cb_state, VkPipelineBindPoint bind_point, const char* func_name,
const std::map<VkPipelineBindPoint, std::string>& bind_errors) const;
bool ValidateMemoryIsMapped(const char* funcName, uint32_t memRangeCount, const VkMappedMemoryRange* pMemRanges) const;
@@ -169,43 +202,44 @@
bool& skip) const;
bool CheckPreserved(const VkRenderPass renderpass, const VkRenderPassCreateInfo2KHR* pCreateInfo, const int index,
const uint32_t attachment, const std::vector<DAGNode>& subpass_to_node, int depth, bool& skip) const;
- bool ValidateBindImageMemory(const VkBindImageMemoryInfo& bindInfo, const char* api_name) const;
+ bool ValidateBindImageMemory(uint32_t bindInfoCount, const VkBindImageMemoryInfo* pBindInfos, const char* api_name) const;
bool ValidateGetPhysicalDeviceDisplayPlanePropertiesKHRQuery(VkPhysicalDevice physicalDevice, uint32_t planeIndex,
const char* api_name) const;
static bool ValidateCopyQueryPoolResults(const ValidationStateTracker* state_data, VkCommandBuffer commandBuffer,
- VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
+ VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, uint32_t perfPass,
VkQueryResultFlags flags, QueryMap* localQueryToStateMap);
static bool VerifyQueryIsReset(const ValidationStateTracker* state_data, VkCommandBuffer commandBuffer, QueryObject query_obj,
- const char* func_name, QueryMap* localQueryToStateMap);
+ const char* func_name, VkQueryPool& firstPerfQueryPool, uint32_t perfPass,
+ QueryMap* localQueryToStateMap);
+ static bool ValidatePerformanceQuery(const ValidationStateTracker* state_data, VkCommandBuffer commandBuffer,
+ QueryObject query_obj, const char* func_name, VkQueryPool& firstPerfQueryPool,
+ uint32_t perfPass, QueryMap* localQueryToStateMap);
bool ValidateImportSemaphore(VkSemaphore semaphore, const char* caller_name) const;
bool ValidateBeginQuery(const CMD_BUFFER_STATE* cb_state, const QueryObject& query_obj, VkFlags flags, CMD_TYPE cmd,
- const char* cmd_name, const char* vuid_queue_flags, const char* vuid_queue_feedback,
- const char* vuid_queue_occlusion, const char* vuid_precise, const char* vuid_query_count) const;
+ const char* cmd_name, const ValidateBeginQueryVuids* vuids) const;
bool ValidateCmdEndQuery(const CMD_BUFFER_STATE* cb_state, const QueryObject& query_obj, CMD_TYPE cmd, const char* cmd_name,
const char* vuid_queue_flags, const char* vuid_active_queries) const;
+ bool ValidateCmdResetQuery(const CMD_BUFFER_STATE* cb_state, VkQueryPool queryPool, uint32_t firstQuery,
+ uint32_t queryCount) const;
const DrawDispatchVuid& GetDrawDispatchVuid(CMD_TYPE cmd_type) const;
bool ValidateCmdDrawType(VkCommandBuffer cmd_buffer, bool indexed, VkPipelineBindPoint bind_point, CMD_TYPE cmd_type,
const char* caller, VkQueueFlags queue_flags) const;
bool ValidateCmdNextSubpass(RenderPassCreateVersion rp_version, VkCommandBuffer commandBuffer) const;
bool ValidateInsertMemoryRange(const VulkanTypedHandle& typed_handle, const DEVICE_MEMORY_STATE* mem_info,
- VkDeviceSize memoryOffset, const VkMemoryRequirements& memRequirements, bool is_linear,
- const char* api_name) const;
+ VkDeviceSize memoryOffset, const char* api_name) const;
bool ValidateInsertImageMemoryRange(VkImage image, const DEVICE_MEMORY_STATE* mem_info, VkDeviceSize mem_offset,
- const VkMemoryRequirements& mem_reqs, bool is_linear, const char* api_name) const;
+ const char* api_name) const;
bool ValidateInsertBufferMemoryRange(VkBuffer buffer, const DEVICE_MEMORY_STATE* mem_info, VkDeviceSize mem_offset,
- const VkMemoryRequirements& mem_reqs, const char* api_name) const;
+ const char* api_name) const;
bool ValidateInsertAccelerationStructureMemoryRange(VkAccelerationStructureNV as, const DEVICE_MEMORY_STATE* mem_info,
- VkDeviceSize mem_offset, const VkMemoryRequirements& mem_reqs,
- const char* api_name) const;
+ VkDeviceSize mem_offset, const char* api_name) const;
bool ValidateMemoryTypes(const DEVICE_MEMORY_STATE* mem_info, const uint32_t memory_type_bits, const char* funcName,
const char* msgCode) const;
bool ValidateCommandBufferState(const CMD_BUFFER_STATE* cb_state, const char* call_source, int current_submit_count,
const char* vu_id) const;
bool ValidateCommandBufferSimultaneousUse(const CMD_BUFFER_STATE* pCB, int current_submit_count) const;
- bool ValidateGetDeviceQueue(uint32_t queueFamilyIndex, uint32_t queueIndex, VkQueue* pQueue, const char* valid_qfi_vuid,
- const char* qfi_in_range_vuid) const;
bool ValidateRenderpassAttachmentUsage(RenderPassCreateVersion rp_version, const VkRenderPassCreateInfo2KHR* pCreateInfo,
const char* function_name) const;
bool AddAttachmentUse(RenderPassCreateVersion rp_version, uint32_t subpass, std::vector<uint8_t>& attachment_uses,
@@ -232,6 +266,7 @@
const char* error_code) const;
bool ValidateCmdQueueFlags(const CMD_BUFFER_STATE* cb_node, const char* caller_name, VkQueueFlags flags,
const char* error_code) const;
+ bool ValidateSampleLocationsInfo(const VkSampleLocationsInfoEXT* pSampleLocationsInfo, const char* apiName) const;
bool InsideRenderPass(const CMD_BUFFER_STATE* pCB, const char* apiName, const char* msgCode) const;
bool OutsideRenderPass(const CMD_BUFFER_STATE* pCB, const char* apiName, const char* msgCode) const;
bool ValidateDynamicOffsetAlignment(const VkCommandBuffer command_buffer, const VkDescriptorSetLayoutBinding* binding,
@@ -242,6 +277,7 @@
const std::string& msgCode) const;
bool ValidateCmdSubpassState(const CMD_BUFFER_STATE* pCB, const CMD_TYPE cmd_type) const;
bool ValidateCmd(const CMD_BUFFER_STATE* cb_state, const CMD_TYPE cmd, const char* caller_name) const;
+ bool ValidateIndirectCmd(VkCommandBuffer command_buffer, VkBuffer buffer, CMD_TYPE cmd_type, const char* caller_name) const;
template <typename T1>
bool ValidateDeviceMaskToPhysicalDeviceCount(uint32_t deviceMask, const T1 object, const char* VUID) const;
@@ -253,9 +289,9 @@
bool ValidateDeviceMaskToRenderPass(const CMD_BUFFER_STATE* pCB, uint32_t deviceMask, const char* VUID) const;
bool ValidateDepthStencilResolve(const VkPhysicalDeviceVulkan12Properties& core12_props,
- const VkRenderPassCreateInfo2* pCreateInfo) const;
+ const VkRenderPassCreateInfo2* pCreateInfo, const char* function_name) const;
- bool ValidateBindAccelerationStructureMemoryNV(VkDevice device, const VkBindAccelerationStructureMemoryInfoNV& info) const;
+ bool ValidateBindAccelerationStructureMemory(VkDevice device, const VkBindAccelerationStructureMemoryInfoKHR& info) const;
// Prototypes for CoreChecks accessor functions
VkFormatProperties GetPDFormatProperties(const VkFormat format) const;
const VkPhysicalDeviceMemoryProperties* GetPhysicalDeviceMemoryProperties();
@@ -314,11 +350,11 @@
void* pData);
// For given bindings validate state at time of draw is correct, returning false on error and writing error details into string*
bool ValidateDrawState(const cvdescriptorset::DescriptorSet* descriptor_set, const std::map<uint32_t, descriptor_req>& bindings,
- const std::vector<uint32_t>& dynamic_offsets, const CMD_BUFFER_STATE* cb_node, const char* caller,
- std::string* error) const;
+ const std::vector<uint32_t>& dynamic_offsets, const CMD_BUFFER_STATE* cb_node, uint32_t setIndex,
+ const char* caller, const DrawDispatchVuid& vuids) const;
bool ValidateDescriptorSetBindingData(const CMD_BUFFER_STATE* cb_node, const cvdescriptorset::DescriptorSet* descriptor_set,
const std::vector<uint32_t>& dynamic_offsets, uint32_t binding, descriptor_req reqs,
- const char* caller, std::string* error) const;
+ const char* caller, const DrawDispatchVuid& vuids) const;
// Validate contents of a CopyUpdate
using DescriptorSet = cvdescriptorset::DescriptorSet;
@@ -342,6 +378,8 @@
bool ValidateSampler(VkSampler) const;
bool ValidateBufferUpdate(VkDescriptorBufferInfo const* buffer_info, VkDescriptorType type, const char* func_name,
std::string* error_code, std::string* error_msg) const;
+ bool ValidateAccelerationStructureUpdate(VkAccelerationStructureKHR acc, const char* func_name, std::string* error_code,
+ std::string* error_msg) const;
bool ValidateUpdateDescriptorSetsWithTemplateKHR(VkDescriptorSet descriptorSet, const TEMPLATE_STATE* template_state,
const void* pData) const;
bool ValidateAllocateDescriptorSets(const VkDescriptorSetAllocateInfo*,
@@ -424,6 +462,8 @@
const VkPhysicalDeviceLimits* device_limits) const;
bool ValidateBufferViewBuffer(const BUFFER_STATE* buffer_state, const VkBufferViewCreateInfo* pCreateInfo) const;
+ bool ValidateImageFormatFeatures(const VkImageCreateInfo* pCreateInfo) const;
+
bool PreCallValidateCreateImage(VkDevice device, const VkImageCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator,
VkImage* pImage) const;
@@ -434,7 +474,8 @@
bool PreCallValidateDestroyImage(VkDevice device, VkImage image, const VkAllocationCallbacks* pAllocator) const;
- bool ValidateImageAttributes(const IMAGE_STATE* image_state, const VkImageSubresourceRange& range) const;
+ bool ValidateImageAttributes(const IMAGE_STATE* image_state, const VkImageSubresourceRange& range,
+ const char* param_name) const;
bool ValidateClearAttachmentExtent(VkCommandBuffer command_buffer, uint32_t attachment_index,
const FRAMEBUFFER_STATE* framebuffer, uint32_t fb_attachment, const VkRect2D& render_area,
@@ -572,7 +613,7 @@
char const* func_name, char const* usage_string) const;
bool ValidateImageFormatFeatureFlags(IMAGE_STATE const* image_state, VkFormatFeatureFlags desired, char const* func_name,
- const char* linear_vuid, const char* optimal_vuid) const;
+ const char* vuid) const;
bool ValidateImageSubresourceLayers(const CMD_BUFFER_STATE* cb_node, const VkImageSubresourceLayers* subresource_layers,
char const* func_name, char const* member, uint32_t i) const;
@@ -601,6 +642,9 @@
bool ValidateImageBarrierSubresourceRange(const IMAGE_STATE* image_state, const VkImageSubresourceRange& subresourceRange,
const char* cmd_name, const char* param_name) const;
+ bool ValidateImageViewFormatFeatures(const IMAGE_STATE* image_state, const VkFormat view_format,
+ const VkImageUsageFlags image_usage) const;
+
bool PreCallValidateCreateImageView(VkDevice device, const VkImageViewCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator, VkImageView* pView) const;
@@ -621,6 +665,7 @@
bool ValidateImageArrayLayerRange(const CMD_BUFFER_STATE* cb_node, const IMAGE_STATE* img, const uint32_t base_layer,
const uint32_t layer_count, const uint32_t i, const char* function, const char* member,
const char* vuid) const;
+ bool ValidateWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfoKHR* pWaitInfo, uint64_t timeout) const;
void PreCallRecordCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy* pRegions);
@@ -654,14 +699,18 @@
bool ValidateCreateImageANDROID(const debug_report_data* report_data, const VkImageCreateInfo* create_info) const;
bool ValidateCreateImageViewANDROID(const VkImageViewCreateInfo* create_info) const;
bool ValidateGetImageSubresourceLayoutANDROID(const VkImage image) const;
- bool ValidateQueueFamilies(uint32_t queue_family_count, const uint32_t* queue_families, const char* cmd_name,
- const char* array_parameter_name, const char* unique_error_code, const char* valid_error_code,
- bool optional) const;
+ bool ValidatePhysicalDeviceQueueFamilies(uint32_t queue_family_count, const uint32_t* queue_families, const char* cmd_name,
+ const char* array_parameter_name, const char* vuid) const;
bool ValidateAllocateMemoryANDROID(const VkMemoryAllocateInfo* alloc_info) const;
- bool ValidateGetImageMemoryRequirements2ANDROID(const VkImage image) const;
- bool ValidateCreateSamplerYcbcrConversionANDROID(const VkSamplerYcbcrConversionCreateInfo* create_info) const;
+ bool ValidateGetImageMemoryRequirementsANDROID(const VkImage image, const char* func_name) const;
bool ValidateGetPhysicalDeviceImageFormatProperties2ANDROID(const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
const VkImageFormatProperties2* pImageFormatProperties) const;
+ bool ValidateBufferImportedHandleANDROID(const char* func_name, VkExternalMemoryHandleTypeFlags handleType,
+ VkDeviceMemory memory, VkBuffer buffer) const;
+ bool ValidateImageImportedHandleANDROID(const char* func_name, VkExternalMemoryHandleTypeFlags handleType,
+ VkDeviceMemory memory, VkImage image) const;
+ bool PreCallValidateCreatePipelineCache(VkDevice device, const VkPipelineCacheCreateInfo* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator, VkPipelineCache* pPipelineCache) const;
bool PreCallValidateCreateGraphicsPipelines(VkDevice device, VkPipelineCache pipelineCache, uint32_t count,
const VkGraphicsPipelineCreateInfo* pCreateInfos,
const VkAllocationCallbacks* pAllocator, VkPipeline* pPipelines,
@@ -741,6 +790,8 @@
bool PreCallValidateCreateSamplerYcbcrConversionKHR(VkDevice device, const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkSamplerYcbcrConversion* pYcbcrConversion) const;
+ bool PreCallValidateCreateSampler(VkDevice device, const VkSamplerCreateInfo* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator, VkSampler* pSampler) const;
bool PreCallValidateCmdDebugMarkerBeginEXT(VkCommandBuffer commandBuffer, const VkDebugMarkerMarkerInfoEXT* pMarkerInfo) const;
void PreCallRecordDestroyDevice(VkDevice device, const VkAllocationCallbacks* pAllocator);
bool PreCallValidateQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence) const;
@@ -755,6 +806,7 @@
bool PreCallValidateDeviceWaitIdle(VkDevice device) const;
bool PreCallValidateCreateSemaphore(VkDevice device, const VkSemaphoreCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator, VkSemaphore* pSemaphore) const;
+ bool PreCallValidateWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfoKHR* pWaitInfo, uint64_t timeout) const;
bool PreCallValidateWaitSemaphoresKHR(VkDevice device, const VkSemaphoreWaitInfoKHR* pWaitInfo, uint64_t timeout) const;
bool PreCallValidateDestroyFence(VkDevice device, VkFence fence, const VkAllocationCallbacks* pAllocator) const;
bool PreCallValidateDestroySemaphore(VkDevice device, VkSemaphore semaphore, const VkAllocationCallbacks* pAllocator) const;
@@ -836,10 +888,18 @@
bool PreCallValidateCreateAccelerationStructureNV(VkDevice device, const VkAccelerationStructureCreateInfoNV* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkAccelerationStructureNV* pAccelerationStructure) const;
+ bool PreCallValidateCreateAccelerationStructureKHR(VkDevice device, const VkAccelerationStructureCreateInfoKHR* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkAccelerationStructureKHR* pAccelerationStructure) const;
bool PreCallValidateBindAccelerationStructureMemoryNV(VkDevice device, uint32_t bindInfoCount,
const VkBindAccelerationStructureMemoryInfoNV* pBindInfos) const;
+ bool PreCallValidateBindAccelerationStructureMemoryKHR(VkDevice device, uint32_t bindInfoCount,
+ const VkBindAccelerationStructureMemoryInfoKHR* pBindInfos) const;
bool PreCallValidateGetAccelerationStructureHandleNV(VkDevice device, VkAccelerationStructureNV accelerationStructure,
size_t dataSize, void* pData) const;
+ bool PreCallValidateCmdBuildAccelerationStructureKHR(
+ VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
+ const VkAccelerationStructureBuildOffsetInfoKHR* const* ppOffsetInfos) const;
bool PreCallValidateCmdBuildAccelerationStructureNV(VkCommandBuffer commandBuffer, const VkAccelerationStructureInfoNV* pInfo,
VkBuffer instanceData, VkDeviceSize instanceOffset, VkBool32 update,
VkAccelerationStructureNV dst, VkAccelerationStructureNV src,
@@ -848,6 +908,8 @@
VkAccelerationStructureNV src, VkCopyAccelerationStructureModeNV mode) const;
bool PreCallValidateDestroyAccelerationStructureNV(VkDevice device, VkAccelerationStructureNV accelerationStructure,
const VkAllocationCallbacks* pAllocator) const;
+ bool PreCallValidateDestroyAccelerationStructureKHR(VkDevice device, VkAccelerationStructureKHR accelerationStructure,
+ const VkAllocationCallbacks* pAllocator) const;
bool PreCallValidateCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) const;
bool PreCallValidateCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor,
uint16_t lineStipplePattern) const;
@@ -880,7 +942,7 @@
uint32_t stride) const;
bool ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
- uint32_t stride) const;
+ uint32_t stride, const char* apiName) const;
bool PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
uint32_t stride) const;
@@ -924,6 +986,8 @@
bool PreCallValidateCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkFlags flags) const;
void PreCallRecordCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot, VkFlags flags);
bool PreCallValidateCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) const;
+ bool ValidateQueryPoolIndex(VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, const char* func_name,
+ const char* first_vuid, const char* sum_vuid) const;
bool PreCallValidateCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
uint32_t queryCount) const;
bool PreCallValidateCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
@@ -943,12 +1007,12 @@
bool PreCallValidateCreateRenderPass(VkDevice device, const VkRenderPassCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass) const;
bool PreCallValidateGetDeviceMemoryCommitment(VkDevice device, VkDeviceMemory mem, VkDeviceSize* pCommittedMem) const;
- bool ValidateCreateRenderPass2(VkDevice device, const VkRenderPassCreateInfo2KHR* pCreateInfo,
+ bool ValidateCreateRenderPass2(VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo,
const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass,
const char* function_name) const;
bool PreCallValidateCreateRenderPass2KHR(VkDevice device, const VkRenderPassCreateInfo2KHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass) const;
- bool PreCallValidateCreateRenderPass2(VkDevice device, const VkRenderPassCreateInfo2KHR* pCreateInfo,
+ bool PreCallValidateCreateRenderPass2(VkDevice device, const VkRenderPassCreateInfo2* pCreateInfo,
const VkAllocationCallbacks* pAllocator, VkRenderPass* pRenderPass) const;
bool PreCallValidateCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin,
VkSubpassContents contents) const;
@@ -960,6 +1024,8 @@
const VkSubpassBeginInfoKHR* pSubpassBeginInfo) const;
void PreCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin,
const VkSubpassBeginInfoKHR* pSubpassBeginInfo);
+ void PreCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin,
+ const VkSubpassBeginInfoKHR* pSubpassBeginInfo);
bool PreCallValidateCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) const;
void PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents);
bool PreCallValidateCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfoKHR* pSubpassBeginInfo,
@@ -1120,13 +1186,68 @@
const char* struct_name, const uint32_t struct_size, const uint32_t drawCount,
const VkDeviceSize offset, const BUFFER_STATE* buffer_state) const;
bool PreCallValidateReleaseProfilingLockKHR(VkDevice device) const;
+ bool PreCallValidateCmdSetCheckpointNV(VkCommandBuffer commandBuffer, const void* pCheckpointMarker) const;
+ bool PreCallValidateCmdBindTransformFeedbackBuffersEXT(VkCommandBuffer commandBuffer, uint32_t firstBinding,
+ uint32_t bindingCount, const VkBuffer* pBuffers,
+ const VkDeviceSize* pOffsets, const VkDeviceSize* pSizes) const;
+ bool PreCallValidateCmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
+ uint32_t counterBufferCount, const VkBuffer* pCounterBuffers,
+ const VkDeviceSize* pCounterBufferOffsets) const;
+ bool PreCallValidateCmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
+ uint32_t counterBufferCount, const VkBuffer* pCounterBuffers,
+ const VkDeviceSize* pCounterBufferOffsets) const;
+
+ bool PreCallValidateWriteAccelerationStructuresPropertiesKHR(VkDevice device, uint32_t accelerationStructureCount,
+ const VkAccelerationStructureKHR* pAccelerationStructures,
+ VkQueryType queryType, size_t dataSize, void* pData,
+ size_t stride) const;
+
+ bool PreCallValidateCmdWriteAccelerationStructuresPropertiesKHR(VkCommandBuffer commandBuffer,
+ uint32_t accelerationStructureCount,
+ const VkAccelerationStructureKHR* pAccelerationStructures,
+ VkQueryType queryType, VkQueryPool queryPool,
+ uint32_t firstQuery) const;
+
+ bool PreCallValidateGetRayTracingShaderGroupHandlesKHR(VkDevice device, VkPipeline pipeline, uint32_t firstGroup,
+ uint32_t groupCount, size_t dataSize, void* pData) const;
+
+ bool PreCallValidateGetRayTracingCaptureReplayShaderGroupHandlesKHR(VkDevice device, VkPipeline pipeline, uint32_t firstGroup,
+ uint32_t groupCount, size_t dataSize, void* pData) const;
+
+ bool PreCallValidateCmdBuildAccelerationStructureIndirectKHR(VkCommandBuffer commandBuffer,
+ const VkAccelerationStructureBuildGeometryInfoKHR* pInfo,
+ VkBuffer indirectBuffer, VkDeviceSize indirectOffset,
+ uint32_t indirectStride) const;
+ bool ValidateCopyAccelerationStructureInfoKHR(const VkCopyAccelerationStructureInfoKHR* pInfo, const char* api_name) const;
+ bool PreCallValidateCmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer,
+ const VkCopyAccelerationStructureInfoKHR* pInfo) const;
+ bool PreCallValidateCopyAccelerationStructureKHR(VkDevice device, const VkCopyAccelerationStructureInfoKHR* pInfo) const;
+ bool PreCallValidateCmdCopyAccelerationStructureToMemoryKHR(VkCommandBuffer commandBuffer,
+ const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo) const;
+ bool PreCallValidateCmdCopyMemoryToAccelerationStructureKHR(VkCommandBuffer commandBuffer,
+ const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo) const;
+
+ bool PreCallValidateCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) const;
+ bool PreCallValidateCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace) const;
+ bool PreCallValidateCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer, VkPrimitiveTopology primitiveTopology) const;
+ bool PreCallValidateCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount,
+ const VkViewport* pViewports) const;
+ bool PreCallValidateCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount,
+ const VkRect2D* pScissors) const;
+ bool PreCallValidateCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
+ const VkBuffer* pBuffers, const VkDeviceSize* pOffsets, const VkDeviceSize* pSizes,
+ const VkDeviceSize* pStrides) const;
+ bool PreCallValidateCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) const;
+ bool PreCallValidateCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) const;
+ bool PreCallValidateCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) const;
+ bool PreCallValidateCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthBoundsTestEnable) const;
+ bool PreCallValidateCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) const;
+ bool PreCallValidateCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, VkStencilOp failOp,
+ VkStencilOp passOp, VkStencilOp depthFailOp, VkCompareOp compareOp) const;
#ifdef VK_USE_PLATFORM_ANDROID_KHR
bool PreCallValidateGetAndroidHardwareBufferPropertiesANDROID(VkDevice device, const struct AHardwareBuffer* buffer,
VkAndroidHardwareBufferPropertiesANDROID* pProperties) const;
- void PostCallRecordGetAndroidHardwareBufferPropertiesANDROID(VkDevice device, const struct AHardwareBuffer* buffer,
- VkAndroidHardwareBufferPropertiesANDROID* pProperties,
- VkResult result);
bool PreCallValidateGetMemoryAndroidHardwareBufferANDROID(VkDevice device,
const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo,
struct AHardwareBuffer** pBuffer) const;
diff --git a/layers/core_validation_error_enums.h b/layers/core_validation_error_enums.h
index 568e90c..e2b0b7c 100644
--- a/layers/core_validation_error_enums.h
+++ b/layers/core_validation_error_enums.h
@@ -1,7 +1,7 @@
-/* Copyright (c) 2015-2019 The Khronos Group Inc.
- * Copyright (c) 2015-2019 Valve Corporation
- * Copyright (c) 2015-2019 LunarG, Inc.
- * Copyright (C) 2015-2019 Google Inc.
+/* Copyright (c) 2015-2020 The Khronos Group Inc.
+ * Copyright (c) 2015-2020 Valve Corporation
+ * Copyright (c) 2015-2020 LunarG, Inc.
+ * Copyright (C) 2015-2020 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -35,6 +35,7 @@
// clang-format off
+static const char DECORATE_UNUSED *kVUID_Core_Bound_Resource_FreedMemoryAccess = "UNASSIGNED-CoreValidation-BoundResourceFreedMemoryAccess";
static const char DECORATE_UNUSED *kVUID_Core_MemTrack_FenceState = "UNASSIGNED-CoreValidation-MemTrack-FenceState";
static const char DECORATE_UNUSED *kVUID_Core_MemTrack_InvalidMap = "UNASSIGNED-CoreValidation-MemTrack-InvalidMap";
static const char DECORATE_UNUSED *kVUID_Core_MemTrack_InvalidState = "UNASSIGNED-CoreValidation-MemTrack-InvalidState";
@@ -236,12 +237,14 @@
static const char DECORATE_UNUSED *kVUID_Core_Image_InvalidFormatLimitsViolation = "UNASSIGNED-CoreValidation-Image-InvalidFormatLimitsViolation";
static const char DECORATE_UNUSED *kVUID_Core_Image_ZeroAreaSubregion = "UNASSIGNED-CoreValidation-Image-ZeroAreaSubregion";
+static const char DECORATE_UNUSED *kVUID_Core_Image_FormatNotSupported = "UNASSIGNED-CoreValidation-Image-FormatNotSupported";
static const char DECORATE_UNUSED *kVUID_Core_PushDescriptorUpdate_TemplateType = "UNASSIGNED-CoreValidation-vkCmdPushDescriptorSetWithTemplateKHR-descriptorUpdateTemplate-templateType";
static const char DECORATE_UNUSED *kVUID_Core_PushDescriptorUpdate_Template_SetMismatched = "UNASSIGNED-CoreValidation-vkCmdPushDescriptorSetWithTemplateKHR-set";
static const char DECORATE_UNUSED *kVUID_Core_PushDescriptorUpdate_Template_LayoutMismatched = "UNASSIGNED-CoreValidation-vkCmdPushDescriptorSetWithTemplateKHR-layout";
-static const char DECORATE_UNUSED *kVUID_Core_BindImage_InvalidMemReqQuery = "UNASSIGNED-CoreValidation-vkBindImageMemory-invalid-requirements";
+// Previously defined but unused - uncomment as needed
+// static const char DECORATE_UNUSED *kVUID_Core_BindImage_InvalidMemReqQuery = "UNASSIGNED-CoreValidation-vkBindImageMemory-invalid-requirements";
static const char DECORATE_UNUSED *kVUID_Core_BindImage_NoMemReqQuery = "UNASSIGNED-CoreValidation-vkBindImageMemory-memory-requirements";
static const char DECORATE_UNUSED *kVUID_Core_BindBuffer_NoMemReqQuery = "UNASSIGNED-CoreValidation-vkBindBufferMemory-memory-requirements";
@@ -249,6 +252,12 @@
static const char DECORATE_UNUSED *kVUID_Core_CmdBuildAccelNV_NoScratchMemReqQuery = "UNASSIGNED-CoreValidation-vkCmdBuildAccelerationStructureNV-scratch-requirements";
static const char DECORATE_UNUSED *kVUID_Core_CmdBuildAccelNV_NoUpdateMemReqQuery = "UNASSIGNED-CoreValidation-vkCmdBuildAccelerationStructureNV-update-requirements";
+static const char DECORATE_UNUSED *kVUID_Core_CreatInstance_Status = "UNASSIGNED-khronos-validation-createinstance-status-message";
+static const char DECORATE_UNUSED *kVUID_Core_CreateInstance_Debug_Warning = "UNASSIGNED-khronos-Validation-debug-build-warning-message";
+
+static const char DECORATE_UNUSED *kVUID_Core_ImageMemoryBarrier_SharingModeExclusiveSameFamily = "UNASSIGNED-CoreValidation-vkImageMemoryBarrier-sharing-mode-exclusive-same-family";
+static const char DECORATE_UNUSED *kVUID_Core_BufferMemoryBarrier_SharingModeExclusiveSameFamily = "UNASSIGNED-CoreValidation-vkBufferMemoryBarrier-sharing-mode-exclusive-same-family";
+
// clang-format on
#undef DECORATE_UNUSED
diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h
index f03eb9e..c8252c0 100644
--- a/layers/core_validation_types.h
+++ b/layers/core_validation_types.h
@@ -102,6 +102,7 @@
struct COMMAND_POOL_STATE : public BASE_NODE {
VkCommandPoolCreateFlags createFlags;
uint32_t queueFamilyIndex;
+ bool unprotected; // can't be used for protected memory
// Cmd buffers allocated from this pool
std::unordered_set<VkCommandBuffer> commandBuffers;
};
@@ -122,7 +123,7 @@
return (assume_transfer || IsTransferOp(barrier)) && (pool->queueFamilyIndex == barrier->dstQueueFamilyIndex);
}
-static inline bool QueueFamilyIsSpecial(const uint32_t queue_family_index) {
+static inline bool QueueFamilyIsExternal(const uint32_t queue_family_index) {
return (queue_family_index == VK_QUEUE_FAMILY_EXTERNAL_KHR) || (queue_family_index == VK_QUEUE_FAMILY_FOREIGN_EXT);
}
@@ -206,7 +207,11 @@
VkBuffer dedicated_buffer;
VkImage dedicated_image;
bool is_export;
+ bool is_import;
+ bool is_import_ahb; // The VUID check depends on if the imported memory is for AHB
+ bool unprotected; // can't be used for protected memory
VkExternalMemoryHandleTypeFlags export_handle_type_flags;
+ VkExternalMemoryHandleTypeFlags import_handle_type_flags;
std::unordered_set<VulkanTypedHandle> obj_bindings; // objects bound to this memory
// Convenience vectors of handles to speed up iterating over objects independently
std::unordered_set<VkImage> bound_images;
@@ -214,13 +219,15 @@
std::unordered_set<VkAccelerationStructureNV> bound_acceleration_structures;
MemRange mapped_range;
- void *shadow_copy_base; // Base of layer's allocation for guard band, data, and alignment space
- void *shadow_copy; // Pointer to start of guard-band data before mapped region
- uint64_t shadow_pad_size; // Size of the guard-band data before and after actual data. It MUST be a
- // multiple of limits.minMemoryMapAlignment
- void *p_driver_data; // Pointer to application's actual memory
+ void *shadow_copy_base; // Base of layer's allocation for guard band, data, and alignment space
+ void *shadow_copy; // Pointer to start of guard-band data before mapped region
+ uint64_t shadow_pad_size; // Size of the guard-band data before and after actual data. It MUST be a
+ // multiple of limits.minMemoryMapAlignment
+ void *p_driver_data; // Pointer to application's actual memory
+ VkDeviceSize fake_base_address; // To allow a unified view of allocations, useful to Synchronization Validation
- DEVICE_MEMORY_STATE(void *disp_object, const VkDeviceMemory in_mem, const VkMemoryAllocateInfo *p_alloc_info)
+ DEVICE_MEMORY_STATE(void *disp_object, const VkDeviceMemory in_mem, const VkMemoryAllocateInfo *p_alloc_info,
+ uint64_t fake_address)
: object(disp_object),
mem(in_mem),
alloc_info(p_alloc_info),
@@ -228,12 +235,17 @@
dedicated_buffer(VK_NULL_HANDLE),
dedicated_image(VK_NULL_HANDLE),
is_export(false),
+ is_import(false),
+ is_import_ahb(false),
+ unprotected(true),
export_handle_type_flags(0),
+ import_handle_type_flags(0),
mapped_range{},
shadow_copy_base(0),
shadow_copy(0),
shadow_pad_size(0),
- p_driver_data(0){};
+ p_driver_data(0),
+ fake_base_address(fake_address){};
};
// Generic memory binding struct to track objects bound to objects
@@ -247,6 +259,7 @@
VkBuffer buffer;
VkDeviceSize size;
VkDeviceSize offset;
+ VkDeviceSize stride;
};
struct IndexBufferBinding : BufferBinding {
@@ -283,6 +296,9 @@
// There's more data for sparse bindings so need better long-term solution
// TODO : Need to update solution to track all sparse binding data
std::unordered_set<MEM_BINDING> sparse_bindings;
+ // True if memory will be imported/exported from/to an Android Hardware Buffer
+ bool external_ahb;
+ bool unprotected; // can't be used for protected memory
small_unordered_set<DEVICE_MEMORY_STATE *, 1> bound_memory_set_;
@@ -293,6 +309,8 @@
memory_requirements_checked(false),
external_memory_handle(0),
sparse_bindings{},
+ external_ahb(false),
+ unprotected(true),
bound_memory_set_{} {};
// Update the cached set of memory bindings.
@@ -361,10 +379,13 @@
VkSampler sampler;
VkSamplerCreateInfo createInfo;
VkSamplerYcbcrConversion samplerConversion = VK_NULL_HANDLE;
+ VkSamplerCustomBorderColorCreateInfoEXT customCreateInfo = {};
SAMPLER_STATE(const VkSampler *ps, const VkSamplerCreateInfo *pci) : sampler(*ps), createInfo(*pci) {
auto *conversionInfo = lvl_find_in_chain<VkSamplerYcbcrConversionInfo>(pci->pNext);
if (conversionInfo) samplerConversion = conversionInfo->conversion;
+ auto cbci = lvl_find_in_chain<VkSamplerCustomBorderColorCreateInfoEXT>(pci->pNext);
+ if (cbci) customCreateInfo = *cbci;
}
};
@@ -380,7 +401,6 @@
bool get_sparse_reqs_called; // Track if GetImageSparseMemoryRequirements() has been called for this image
bool sparse_metadata_required; // Track if sparse metadata aspect is required for this image
bool sparse_metadata_bound; // Track if sparse metadata aspect is bound to this image
- bool imported_ahb; // True if image was imported from an Android Hardware Buffer
bool has_ahb_format; // True if image was created with an external Android format
bool is_swapchain_image; // True if image is a swapchain image
uint64_t ahb_format; // External Android format, if provided
@@ -389,13 +409,22 @@
VkSwapchainKHR bind_swapchain;
uint32_t bind_swapchain_imageIndex;
image_layout_map::Encoder range_encoder;
+ VkFormatFeatureFlags format_features = 0;
+ // Need to memory requirments for each plane if image is disjoint
+ bool disjoint; // True if image was created with VK_IMAGE_CREATE_DISJOINT_BIT
+ VkMemoryRequirements plane0_requirements;
+ bool plane0_memory_requirements_checked;
+ VkMemoryRequirements plane1_requirements;
+ bool plane1_memory_requirements_checked;
+ VkMemoryRequirements plane2_requirements;
+ bool plane2_memory_requirements_checked;
-#ifdef VK_USE_PLATFORM_ANDROID_KHR
- uint64_t external_format_android;
-#endif // VK_USE_PLATFORM_ANDROID_KHR
+ const image_layout_map::Encoder subresource_encoder; // Subresource resolution encoder
+ std::unique_ptr<const subresource_adapter::ImageRangeEncoder> fragment_encoder; // Fragment resolution encoder
+ const VkDevice store_device_as_workaround; // TODO REMOVE WHEN encoder can be const
std::vector<VkSparseImageMemoryRequirements> sparse_requirements;
- IMAGE_STATE(VkImage img, const VkImageCreateInfo *pCreateInfo);
+ IMAGE_STATE(VkDevice dev, VkImage img, const VkImageCreateInfo *pCreateInfo);
IMAGE_STATE(IMAGE_STATE const &rh_obj) = delete;
std::unordered_set<VkImage> aliasing_images;
@@ -458,6 +487,7 @@
VkSampleCountFlagBits samples;
unsigned descriptor_format_bits;
VkSamplerYcbcrConversion samplerConversion; // Handle of the ycbcr sampler conversion the image was created with, if any
+ VkFormatFeatureFlags format_features;
std::shared_ptr<IMAGE_STATE> image_state;
IMAGE_VIEW_STATE(const std::shared_ptr<IMAGE_STATE> &image_state, VkImageView iv, const VkImageViewCreateInfo *ci);
IMAGE_VIEW_STATE(const IMAGE_VIEW_STATE &rh_obj) = delete;
@@ -466,7 +496,9 @@
class ACCELERATION_STRUCTURE_STATE : public BINDABLE {
public:
VkAccelerationStructureNV acceleration_structure;
- safe_VkAccelerationStructureCreateInfoNV create_info;
+ bool is_khr;
+ safe_VkAccelerationStructureCreateInfoNV create_infoNV = {};
+ safe_VkAccelerationStructureCreateInfoKHR create_infoKHR = {};
bool memory_requirements_checked = false;
VkMemoryRequirements2KHR memory_requirements;
bool build_scratch_memory_requirements_checked = false;
@@ -475,13 +507,27 @@
VkMemoryRequirements2KHR update_scratch_memory_requirements;
bool built = false;
safe_VkAccelerationStructureInfoNV build_info;
+ safe_VkAccelerationStructureBuildGeometryInfoKHR build_info_khr;
uint64_t opaque_handle = 0;
+ const VkAllocationCallbacks *allocator = NULL;
ACCELERATION_STRUCTURE_STATE(VkAccelerationStructureNV as, const VkAccelerationStructureCreateInfoNV *ci)
: acceleration_structure(as),
- create_info(ci),
+ is_khr(false),
+ create_infoNV(ci),
memory_requirements{},
build_scratch_memory_requirements_checked{},
- update_scratch_memory_requirements_checked{} {}
+ build_scratch_memory_requirements{},
+ update_scratch_memory_requirements_checked{},
+ update_scratch_memory_requirements{} {}
+ ACCELERATION_STRUCTURE_STATE(VkAccelerationStructureKHR as, const VkAccelerationStructureCreateInfoKHR *ci)
+ : acceleration_structure(as),
+ is_khr(true),
+ create_infoKHR(ci),
+ memory_requirements{},
+ build_scratch_memory_requirements_checked{},
+ build_scratch_memory_requirements{},
+ update_scratch_memory_requirements_checked{},
+ update_scratch_memory_requirements{} {}
ACCELERATION_STRUCTURE_STATE(const ACCELERATION_STRUCTURE_STATE &rh_obj) = delete;
};
@@ -503,8 +549,6 @@
: createInfo(pCreateInfo), swapchain(swapchain) {}
};
-std::string FormatDebugLabel(const char *prefix, const LoggingLabel &label);
-
extern bool ImageLayoutMatches(const VkImageAspectFlags aspect_mask, VkImageLayout a, VkImageLayout b);
// Store the DAG.
@@ -514,12 +558,45 @@
std::vector<uint32_t> next;
};
+struct SubpassDependencyGraphNode {
+ uint32_t pass;
+ struct Dependency {
+ const VkSubpassDependency2 *dependency;
+ const SubpassDependencyGraphNode *node;
+ Dependency() = default;
+ Dependency(const VkSubpassDependency2 *dependency_, const SubpassDependencyGraphNode *node_)
+ : dependency(dependency_), node(node_) {}
+ };
+ std::vector<Dependency> prev;
+ std::vector<Dependency> next;
+ std::vector<uint32_t> async; // asynchronous subpasses with a lower subpass index
+
+ const VkSubpassDependency2 *barrier_from_external;
+ const VkSubpassDependency2 *barrier_to_external;
+ std::unique_ptr<VkSubpassDependency2> implicit_barrier_from_external;
+ std::unique_ptr<VkSubpassDependency2> implicit_barrier_to_external;
+};
+
struct RENDER_PASS_STATE : public BASE_NODE {
+ struct AttachmentTransition {
+ uint32_t prev_pass;
+ uint32_t attachment;
+ VkImageLayout old_layout;
+ VkImageLayout new_layout;
+ AttachmentTransition(uint32_t prev_pass_, uint32_t attachment_, VkImageLayout old_layout_, VkImageLayout new_layout_)
+ : prev_pass(prev_pass_), attachment(attachment_), old_layout(old_layout_), new_layout(new_layout_) {}
+ };
+
VkRenderPass renderPass;
safe_VkRenderPassCreateInfo2 createInfo;
std::vector<std::vector<uint32_t>> self_dependencies;
std::vector<DAGNode> subpassToNode;
std::unordered_map<uint32_t, bool> attachment_first_read;
+ std::vector<uint32_t> attachment_first_subpass;
+ std::vector<uint32_t> attachment_last_subpass;
+ std::vector<bool> attachment_first_is_transition;
+ std::vector<SubpassDependencyGraphNode> subpass_dependencies;
+ std::vector<std::vector<AttachmentTransition>> subpass_transitions;
RENDER_PASS_STATE(VkRenderPassCreateInfo2KHR const *pCreateInfo) : createInfo(pCreateInfo) {}
RENDER_PASS_STATE(VkRenderPassCreateInfo const *pCreateInfo) {
@@ -529,6 +606,7 @@
// Autogenerated as part of the vk_validation_error_message.h codegen
enum CMD_TYPE { VUID_CMD_ENUM_LIST(CMD_) };
+const char *CommandTypeString(CMD_TYPE type);
enum CB_STATE {
CB_NEW, // Newly created CB w/o any cmds
@@ -542,22 +620,34 @@
typedef VkFlags CBStatusFlags;
enum CBStatusFlagBits {
// clang-format off
- CBSTATUS_NONE = 0x00000000, // No status is set
- CBSTATUS_LINE_WIDTH_SET = 0x00000001, // Line width has been set
- CBSTATUS_DEPTH_BIAS_SET = 0x00000002, // Depth bias has been set
- CBSTATUS_BLEND_CONSTANTS_SET = 0x00000004, // Blend constants state has been set
- CBSTATUS_DEPTH_BOUNDS_SET = 0x00000008, // Depth bounds state object has been set
- CBSTATUS_STENCIL_READ_MASK_SET = 0x00000010, // Stencil read mask has been set
- CBSTATUS_STENCIL_WRITE_MASK_SET = 0x00000020, // Stencil write mask has been set
- CBSTATUS_STENCIL_REFERENCE_SET = 0x00000040, // Stencil reference has been set
- CBSTATUS_VIEWPORT_SET = 0x00000080,
- CBSTATUS_SCISSOR_SET = 0x00000100,
- CBSTATUS_INDEX_BUFFER_BOUND = 0x00000200, // Index buffer has been set
- CBSTATUS_EXCLUSIVE_SCISSOR_SET = 0x00000400,
- CBSTATUS_SHADING_RATE_PALETTE_SET = 0x00000800,
- CBSTATUS_LINE_STIPPLE_SET = 0x00001000,
- CBSTATUS_VIEWPORT_W_SCALING_SET = 0x00002000,
- CBSTATUS_ALL_STATE_SET = 0x00003DFF, // All state set (intentionally exclude index buffer)
+ CBSTATUS_NONE = 0x00000000, // No status is set
+ CBSTATUS_LINE_WIDTH_SET = 0x00000001, // Line width has been set
+ CBSTATUS_DEPTH_BIAS_SET = 0x00000002, // Depth bias has been set
+ CBSTATUS_BLEND_CONSTANTS_SET = 0x00000004, // Blend constants state has been set
+ CBSTATUS_DEPTH_BOUNDS_SET = 0x00000008, // Depth bounds state object has been set
+ CBSTATUS_STENCIL_READ_MASK_SET = 0x00000010, // Stencil read mask has been set
+ CBSTATUS_STENCIL_WRITE_MASK_SET = 0x00000020, // Stencil write mask has been set
+ CBSTATUS_STENCIL_REFERENCE_SET = 0x00000040, // Stencil reference has been set
+ CBSTATUS_VIEWPORT_SET = 0x00000080,
+ CBSTATUS_SCISSOR_SET = 0x00000100,
+ CBSTATUS_INDEX_BUFFER_BOUND = 0x00000200, // Index buffer has been set
+ CBSTATUS_EXCLUSIVE_SCISSOR_SET = 0x00000400,
+ CBSTATUS_SHADING_RATE_PALETTE_SET = 0x00000800,
+ CBSTATUS_LINE_STIPPLE_SET = 0x00001000,
+ CBSTATUS_VIEWPORT_W_SCALING_SET = 0x00002000,
+ CBSTATUS_CULL_MODE_SET = 0x00004000,
+ CBSTATUS_FRONT_FACE_SET = 0x00008000,
+ CBSTATUS_PRIMITIVE_TOPOLOGY_SET = 0x00010000,
+ CBSTATUS_VIEWPORT_WITH_COUNT_SET = 0x00020000,
+ CBSTATUS_SCISSOR_WITH_COUNT_SET = 0x00040000,
+ CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET = 0x00080000,
+ CBSTATUS_DEPTH_TEST_ENABLE_SET = 0x00100000,
+ CBSTATUS_DEPTH_WRITE_ENABLE_SET = 0x00200000,
+ CBSTATUS_DEPTH_COMPARE_OP_SET = 0x00400000,
+ CBSTATUS_DEPTH_BOUNDS_TEST_ENABLE_SET = 0x00800000,
+ CBSTATUS_STENCIL_TEST_ENABLE_SET = 0x01000000,
+ CBSTATUS_STENCIL_OP_SET = 0x02000000,
+ CBSTATUS_ALL_STATE_SET = 0x03FFFDFF, // All state set (intentionally exclude index buffer)
// clang-format on
};
@@ -566,35 +656,38 @@
uint32_t query;
// These next two fields are *not* used in hash or comparison, they are effectively a data payload
uint32_t index; // must be zero if !indexed
+ uint32_t perf_pass;
bool indexed;
// Command index in the command buffer where the end of the query was
// recorded (equal to the number of commands in the command buffer before
// the end of the query).
uint64_t endCommandIndex;
- QueryObject(VkQueryPool pool_, uint32_t query_) : pool(pool_), query(query_), index(0), indexed(false), endCommandIndex(0) {}
+ QueryObject(VkQueryPool pool_, uint32_t query_)
+ : pool(pool_), query(query_), index(0), perf_pass(0), indexed(false), endCommandIndex(0) {}
QueryObject(VkQueryPool pool_, uint32_t query_, uint32_t index_)
- : pool(pool_), query(query_), index(index_), indexed(true), endCommandIndex(0) {}
+ : pool(pool_), query(query_), index(index_), perf_pass(0), indexed(true), endCommandIndex(0) {}
QueryObject(const QueryObject &obj)
- : pool(obj.pool), query(obj.query), index(obj.index), indexed(obj.indexed), endCommandIndex(obj.endCommandIndex) {}
- bool operator<(const QueryObject &rhs) const { return (pool == rhs.pool) ? query < rhs.query : pool < rhs.pool; }
+ : pool(obj.pool),
+ query(obj.query),
+ index(obj.index),
+ perf_pass(obj.perf_pass),
+ indexed(obj.indexed),
+ endCommandIndex(obj.endCommandIndex) {}
+ QueryObject(const QueryObject &obj, uint32_t perf_pass_)
+ : pool(obj.pool),
+ query(obj.query),
+ index(obj.index),
+ perf_pass(perf_pass_),
+ indexed(obj.indexed),
+ endCommandIndex(obj.endCommandIndex) {}
+ bool operator<(const QueryObject &rhs) const {
+ return (pool == rhs.pool) ? ((query == rhs.query) ? (perf_pass < rhs.perf_pass) : (query < rhs.query)) : pool < rhs.pool;
+ }
};
inline bool operator==(const QueryObject &query1, const QueryObject &query2) {
- return ((query1.pool == query2.pool) && (query1.query == query2.query));
-}
-
-struct QueryObjectPass {
- QueryObject obj;
- uint32_t perf_pass;
-
- QueryObjectPass(const QueryObject &obj_, uint32_t perf_pass_) : obj(obj_), perf_pass(perf_pass_) {}
- QueryObjectPass(const QueryObjectPass &obj_) : obj(obj_.obj), perf_pass(obj_.perf_pass) {}
- bool operator<(const QueryObjectPass &rhs) const { return (obj == rhs.obj) ? perf_pass < rhs.perf_pass : obj < rhs.obj; }
-};
-
-inline bool operator==(const QueryObjectPass &query1, const QueryObjectPass &query2) {
- return ((query1.obj == query2.obj) && (query1.perf_pass == query2.perf_pass));
+ return ((query1.pool == query2.pool) && (query1.query == query2.query) && (query1.perf_pass == query2.perf_pass));
}
enum QueryState {
@@ -634,16 +727,11 @@
template <>
struct hash<QueryObject> {
size_t operator()(QueryObject query) const throw() {
- return hash<uint64_t>()((uint64_t)(query.pool)) ^ hash<uint32_t>()(query.query);
+ return hash<uint64_t>()((uint64_t)(query.pool)) ^
+ hash<uint64_t>()(static_cast<uint64_t>(query.query) | (static_cast<uint64_t>(query.perf_pass) << 32));
}
};
-template <>
-struct hash<QueryObjectPass> {
- size_t operator()(QueryObjectPass query) const throw() {
- return hash<QueryObject>()(query.obj) ^ hash<uint32_t>()(query.perf_pass);
- }
-};
} // namespace std
struct CBVertexBufferBindingInfo {
@@ -709,6 +797,7 @@
bool is_patch;
bool is_block_member;
bool is_relaxed_precision;
+ bool is_writable;
// TODO: collect the name, too? Isn't required to be present.
};
typedef std::pair<unsigned, unsigned> descriptor_slot_t;
@@ -772,6 +861,7 @@
std::unordered_set<uint32_t> accessible_ids;
std::vector<std::pair<descriptor_slot_t, interface_var>> descriptor_uses;
bool has_writable_descriptor;
+ VkShaderStageFlagBits stage_flag;
};
VkPipeline pipeline;
@@ -788,6 +878,7 @@
uint32_t max_active_slot; // the highest set number in active_slots for pipeline layout compatibility checks
// Additional metadata needed by pipeline_state initialization and validation
std::vector<StageState> stage_state;
+ std::unordered_set<uint32_t> fragmentShader_writable_output_location_list;
// Vtx input info (if any)
std::vector<VkVertexInputBindingDescription> vertex_binding_descriptions_;
std::vector<VkVertexInputAttributeDescription> vertex_attribute_descriptions_;
@@ -797,6 +888,7 @@
bool blendConstantsEnabled; // Blend constants enabled for any attachments
std::shared_ptr<const PIPELINE_LAYOUT_STATE> pipeline_layout;
VkPrimitiveTopology topology_at_rasterizer;
+ VkBool32 sample_location_enabled;
// Default constructor
PIPELINE_STATE()
@@ -815,7 +907,8 @@
attachments(),
blendConstantsEnabled(false),
pipeline_layout(),
- topology_at_rasterizer{} {}
+ topology_at_rasterizer{},
+ sample_location_enabled(VK_FALSE) {}
void reset() {
VkGraphicsPipelineCreateInfo emptyGraphicsCI = {};
@@ -825,6 +918,7 @@
VkRayTracingPipelineCreateInfoKHR emptyRayTracingCI = {};
raytracingPipelineCI.initialize(&emptyRayTracingCI);
stage_state.clear();
+ fragmentShader_writable_output_location_list.clear();
}
void initGraphicsPipeline(const ValidationStateTracker *state_data, const VkGraphicsPipelineCreateInfo *pCreateInfo,
@@ -1050,24 +1144,24 @@
};
typedef std::map<QueryObject, QueryState> QueryMap;
-typedef std::map<QueryObjectPass, QueryState> QueryPassMap;
typedef std::unordered_map<VkEvent, VkPipelineStageFlags> EventToStageMap;
typedef ImageSubresourceLayoutMap::LayoutMap GlobalImageLayoutRangeMap;
typedef std::unordered_map<VkImage, std::unique_ptr<GlobalImageLayoutRangeMap>> GlobalImageLayoutMap;
typedef std::unordered_map<VkImage, std::unique_ptr<ImageSubresourceLayoutMap>> CommandBufferImageLayoutMap;
+class FRAMEBUFFER_STATE;
// Cmd Buffer Wrapper Struct - TODO : This desperately needs its own class
struct CMD_BUFFER_STATE : public BASE_NODE {
VkCommandBuffer commandBuffer;
VkCommandBufferAllocateInfo createInfo = {};
VkCommandBufferBeginInfo beginInfo;
VkCommandBufferInheritanceInfo inheritanceInfo;
- VkDevice device; // device this CB belongs to
std::shared_ptr<const COMMAND_POOL_STATE> command_pool;
bool hasDrawCmd;
bool hasTraceRaysCmd;
bool hasBuildAccelerationStructureCmd;
bool hasDispatchCmd;
+ bool unprotected; // can't be used for protected memory
CB_STATE state; // Track cmd buffer update state
uint64_t commandCount; // Number of commands recorded
@@ -1083,21 +1177,28 @@
// Store last bound state for Gfx & Compute pipeline bind points
std::map<uint32_t, LAST_BOUND_STATE> lastBound;
- using Bindings = std::map<uint32_t, descriptor_req>;
+ struct BindingInfo {
+ descriptor_req requirements;
+ CMD_TYPE cmd_type;
+ };
+ using Bindings = std::map<uint32_t, BindingInfo>;
using Pipelines_Bindings = std::map<VkPipeline, Bindings>;
std::unordered_map<VkDescriptorSet, Pipelines_Bindings> validate_descriptorsets_in_queuesubmit;
uint32_t viewportMask;
+ uint32_t viewportWithCountMask;
uint32_t scissorMask;
+ uint32_t scissorWithCountMask;
uint32_t initial_device_mask;
+ VkPrimitiveTopology primitiveTopology;
safe_VkRenderPassBeginInfo activeRenderPassBeginInfo;
- RENDER_PASS_STATE *activeRenderPass;
+ std::shared_ptr<RENDER_PASS_STATE> activeRenderPass;
VkSubpassContents activeSubpassContents;
uint32_t active_render_pass_device_mask;
uint32_t activeSubpass;
- VkFramebuffer activeFramebuffer;
- std::unordered_set<VkFramebuffer> framebuffers;
+ std::shared_ptr<FRAMEBUFFER_STATE> activeFramebuffer;
+ std::unordered_set<std::shared_ptr<FRAMEBUFFER_STATE>> framebuffers;
// Unified data structs to track objects bound to this command buffer as well as object
// dependencies that have been broken : either destroyed objects, or updated descriptor sets
std::vector<VulkanTypedHandle> object_bindings;
@@ -1111,6 +1212,7 @@
std::vector<VkEvent> events;
std::unordered_set<QueryObject> activeQueries;
std::unordered_set<QueryObject> startedQueries;
+ std::unordered_set<QueryObject> resetQueries;
CommandBufferImageLayoutMap image_layout_map;
CBVertexBufferBindingInfo current_vertex_buffer_binding_info;
bool vertex_buffer_used; // Track for perf warning to make sure any bound vtx buffer used
@@ -1122,11 +1224,12 @@
std::vector<std::function<bool(const ValidationStateTracker *device_data, const class QUEUE_STATE *queue_state)>>
queue_submit_functions;
// Validation functions run when secondary CB is executed in primary
- std::vector<std::function<bool(const CMD_BUFFER_STATE *, VkFramebuffer)>> cmd_execute_commands_functions;
+ std::vector<std::function<bool(const CMD_BUFFER_STATE *, const FRAMEBUFFER_STATE *)>> cmd_execute_commands_functions;
std::vector<
std::function<bool(const ValidationStateTracker *device_data, bool do_validate, EventToStageMap *localEventToStageMap)>>
eventUpdates;
- std::vector<std::function<bool(const ValidationStateTracker *device_data, bool do_validate, QueryMap *localQueryToStateMap)>>
+ std::vector<std::function<bool(const ValidationStateTracker *device_data, bool do_validate, VkQueryPool &firstPerfQueryPool,
+ uint32_t perfQueryPass, QueryMap *localQueryToStateMap)>>
queryUpdates;
std::unordered_set<cvdescriptorset::DescriptorSet *> validated_descriptor_sets;
// Contents valid only after an index buffer is bound (CBSTATUS_INDEX_BUFFER_BOUND set)
@@ -1142,6 +1245,10 @@
// Used for Best Practices tracking
uint32_t small_indexed_draw_call_count;
+
+ std::vector<IMAGE_VIEW_STATE *> imagelessFramebufferAttachments;
+
+ bool transform_feedback_active{false};
};
static inline const QFOTransferBarrierSets<VkImageMemoryBarrier> &GetQFOBarrierSets(
@@ -1221,6 +1328,7 @@
VkPhysicalDeviceInlineUniformBlockFeaturesEXT inline_uniform_block;
VkPhysicalDeviceTransformFeedbackFeaturesEXT transform_feedback_features;
VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT vtx_attrib_divisor_features;
+ VkPhysicalDeviceBufferDeviceAddressFeaturesEXT buffer_device_address_ext;
VkPhysicalDeviceCooperativeMatrixFeaturesNV cooperative_matrix_features;
VkPhysicalDeviceComputeShaderDerivativesFeaturesNV compute_shader_derivatives_features;
VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV fragment_shader_barycentric_features;
@@ -1234,6 +1342,13 @@
VkPhysicalDeviceCoherentMemoryFeaturesAMD device_coherent_memory_features;
VkPhysicalDeviceYcbcrImageArraysFeaturesEXT ycbcr_image_array_features;
VkPhysicalDeviceRayTracingFeaturesKHR ray_tracing_features;
+ VkPhysicalDeviceRobustness2FeaturesEXT robustness2_features;
+ VkPhysicalDeviceFragmentDensityMapFeaturesEXT fragment_density_map_features;
+ VkPhysicalDeviceFragmentDensityMap2FeaturesEXT fragment_density_map2_features;
+ VkPhysicalDeviceASTCDecodeFeaturesEXT astc_decode_features;
+ VkPhysicalDeviceCustomBorderColorFeaturesEXT custom_border_color_features;
+ VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT pipeline_creation_cache_control_features;
+ VkPhysicalDeviceExtendedDynamicStateFeaturesEXT extended_dynamic_state_features;
};
enum RenderPassCreateVersion { RENDER_PASS_VERSION_1 = 0, RENDER_PASS_VERSION_2 = 1 };
diff --git a/layers/debug_printf.cpp b/layers/debug_printf.cpp
index 4f4e4a6..c872652 100644
--- a/layers/debug_printf.cpp
+++ b/layers/debug_printf.cpp
@@ -77,7 +77,7 @@
return;
}
- if (enabled.gpu_validation) {
+ if (enabled[gpu_validation]) {
ReportSetupProblem(device,
"Debug Printf cannot be enabled when gpu assisted validation is enabled. "
"Debug Printf disabled.");
@@ -87,7 +87,9 @@
std::vector<VkDescriptorSetLayoutBinding> bindings;
VkDescriptorSetLayoutBinding binding = {3, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1,
- VK_SHADER_STAGE_ALL_GRAPHICS | VK_SHADER_STAGE_COMPUTE_BIT | kShaderStageAllRayTracing,
+ VK_SHADER_STAGE_ALL_GRAPHICS | VK_SHADER_STAGE_MESH_BIT_NV |
+ VK_SHADER_STAGE_TASK_BIT_NV | VK_SHADER_STAGE_COMPUTE_BIT |
+ kShaderStageAllRayTracing,
NULL};
bindings.push_back(binding);
UtilPostCallRecordCreateDevice(pCreateInfo, bindings, device_debug_printf, device_debug_printf->phys_dev_props);
@@ -262,8 +264,22 @@
// Use the unique_shader_module_id as a shader ID so we can look up its handle later in the shader_map.
// If descriptor indexing is enabled, enable length checks and updated descriptor checks
using namespace spvtools;
- spv_target_env target_env = SPV_ENV_VULKAN_1_1;
+ spv_target_env target_env = PickSpirvEnv(api_version, (device_extensions.vk_khr_spirv_1_4 != kNotEnabled));
Optimizer optimizer(target_env);
+ const spvtools::MessageConsumer DebugPrintfConsoleMessageConsumer =
+ [this](spv_message_level_t level, const char *, const spv_position_t &position, const char *message) -> void {
+ switch (level) {
+ case SPV_MSG_FATAL:
+ case SPV_MSG_INTERNAL_ERROR:
+ case SPV_MSG_ERROR:
+ this->LogError(this->device, "UNASSIGNED-Debug-Printf", "Error during shader instrumentation: line %zu: %s",
+ position.index, message);
+ break;
+ default:
+ break;
+ }
+ };
+ optimizer.SetMessageConsumer(DebugPrintfConsoleMessageConsumer);
optimizer.RegisterPass(CreateInstDebugPrintfPass(desc_set_bind_index, unique_shader_module_id));
bool pass = optimizer.Run(new_pgm.data(), new_pgm.size(), &new_pgm);
if (!pass) {
@@ -558,7 +574,7 @@
VkResult result) {
ValidationStateTracker::PostCallRecordQueueSubmit(queue, submitCount, pSubmits, fence, result);
- if (aborted) return;
+ if (aborted || (result != VK_SUCCESS)) return;
bool buffers_present = false;
// Don't QueueWaitIdle if there's nothing to process
for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
@@ -617,6 +633,57 @@
AllocateDebugPrintfResources(commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE);
}
+void DebugPrintf::PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride) {
+ ValidationStateTracker::PreCallRecordCmdDrawIndirectCountKHR(commandBuffer, buffer, offset, countBuffer, countBufferOffset,
+ maxDrawCount, stride);
+ AllocateDebugPrintfResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
+}
+
+void DebugPrintf::PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride) {
+ ValidationStateTracker::PreCallRecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset,
+ maxDrawCount, stride);
+ AllocateDebugPrintfResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
+}
+
+void DebugPrintf::PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset,
+ uint32_t maxDrawCount, uint32_t stride) {
+ ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCountKHR(commandBuffer, buffer, offset, countBuffer,
+ countBufferOffset, maxDrawCount, stride);
+ AllocateDebugPrintfResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
+}
+
+void DebugPrintf::PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset,
+ uint32_t maxDrawCount, uint32_t stride) {
+ ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset,
+ maxDrawCount, stride);
+ AllocateDebugPrintfResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
+}
+
+void DebugPrintf::PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) {
+ ValidationStateTracker::PreCallRecordCmdDrawMeshTasksNV(commandBuffer, taskCount, firstTask);
+ AllocateDebugPrintfResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
+}
+
+void DebugPrintf::PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ uint32_t drawCount, uint32_t stride) {
+ ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectNV(commandBuffer, buffer, offset, drawCount, stride);
+ AllocateDebugPrintfResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
+}
+
+void DebugPrintf::PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset,
+ uint32_t maxDrawCount, uint32_t stride) {
+ ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectCountNV(commandBuffer, buffer, offset, countBuffer,
+ countBufferOffset, maxDrawCount, stride);
+ AllocateDebugPrintfResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
+}
+
void DebugPrintf::PreCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
diff --git a/layers/debug_printf.h b/layers/debug_printf.h
index ea3621d..7f3accb 100644
--- a/layers/debug_printf.h
+++ b/layers/debug_printf.h
@@ -75,6 +75,8 @@
uint32_t output_buffer_size;
public:
+ DebugPrintf() { container_type = LayerObjectTypeDebugPrintf; }
+
bool aborted = false;
bool verbose = false;
bool use_stdout = false;
@@ -82,8 +84,8 @@
VkPhysicalDevice physicalDevice;
uint32_t adjusted_max_desc_sets;
uint32_t desc_set_bind_index;
- VkDescriptorSetLayout debug_desc_layout;
- VkDescriptorSetLayout dummy_desc_layout;
+ VkDescriptorSetLayout debug_desc_layout = VK_NULL_HANDLE;
+ VkDescriptorSetLayout dummy_desc_layout = VK_NULL_HANDLE;
std::unique_ptr<UtilDescriptorSetManager> desc_set_manager;
std::unordered_map<uint32_t, DPFShaderTracker> shader_map;
PFN_vkSetDeviceLoaderData vkSetDeviceLoaderData;
@@ -165,6 +167,24 @@
uint32_t stride);
void PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
uint32_t stride);
+ void PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride);
+ void PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride);
+ void PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride);
+ void PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride);
+ void PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask);
+ void PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ uint32_t drawCount, uint32_t stride);
+ void PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride);
void PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z);
void PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset);
void PreCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp
index 0d9f71f..1dce81a 100644
--- a/layers/descriptor_sets.cpp
+++ b/layers/descriptor_sets.cpp
@@ -17,6 +17,7 @@
*
* Author: Tobin Ehlis <tobine@google.com>
* John Zulauf <jzulauf@lunarg.com>
+ * Jeremy Kniager <jeremyk@lunarg.com>
*/
#include "chassis.h"
@@ -415,6 +416,21 @@
}
}
+ if ((binding_info.descriptorType == VK_DESCRIPTOR_TYPE_SAMPLER ||
+ binding_info.descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) &&
+ binding_info.pImmutableSamplers && device_extensions->vk_ext_custom_border_color) {
+ const CoreChecks *core_checks = reinterpret_cast<const CoreChecks *>(val_obj);
+ for (uint32_t j = 0; j < binding_info.descriptorCount; j++) {
+ const SAMPLER_STATE *sampler_state = core_checks->GetSamplerState(binding_info.pImmutableSamplers[j]);
+ if (sampler_state && (sampler_state->createInfo.borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
+ sampler_state->createInfo.borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT)) {
+ skip |= val_obj->LogError(val_obj->device, "VUID-VkDescriptorSetLayoutBinding-pImmutableSamplers-04009",
+ "Sampler %" PRIu64 " presented as immutable has a custom border color",
+ binding_info.pImmutableSamplers[j]);
+ }
+ }
+ }
+
total_descriptors += binding_info.descriptorCount;
}
@@ -561,8 +577,12 @@
return skip;
}
-cvdescriptorset::AllocateDescriptorSetsData::AllocateDescriptorSetsData(uint32_t count)
- : required_descriptors_by_type{}, layout_nodes(count, nullptr) {}
+void cvdescriptorset::AllocateDescriptorSetsData::Init(uint32_t count) {
+ layout_nodes.resize(count);
+ for (auto node : layout_nodes) {
+ node = nullptr;
+ }
+}
cvdescriptorset::DescriptorSet::DescriptorSet(const VkDescriptorSet set, DESCRIPTOR_POOL_STATE *pool_state,
const std::shared_ptr<DescriptorSetLayout const> &layout, uint32_t variable_count,
@@ -678,17 +698,19 @@
// that any update buffers are valid, and that any dynamic offsets are within the bounds of their buffers.
// Return true if state is acceptable, or false and write an error message into error string
bool CoreChecks::ValidateDrawState(const DescriptorSet *descriptor_set, const std::map<uint32_t, descriptor_req> &bindings,
- const std::vector<uint32_t> &dynamic_offsets, const CMD_BUFFER_STATE *cb_node,
- const char *caller, std::string *error) const {
+ const std::vector<uint32_t> &dynamic_offsets, const CMD_BUFFER_STATE *cb_node, uint32_t setIndex,
+ const char *caller, const DrawDispatchVuid &vuids) const {
+ bool result = false;
for (auto binding_pair : bindings) {
auto binding = binding_pair.first;
DescriptorSetLayout::ConstBindingIterator binding_it(descriptor_set->GetLayout().get(), binding);
if (binding_it.AtEnd()) { // End at construction is the condition for an invalid binding.
- std::stringstream error_str;
- error_str << "Attempting to validate DrawState for binding #" << binding
- << " which is an invalid binding for this descriptor set.";
- *error = error_str.str();
- return false;
+ auto set = descriptor_set->GetSet();
+ result |= LogError(set, kVUID_Core_DrawState_DescriptorSetNotUpdated,
+ "%s encountered the following validation error at %s time: Attempting to "
+ "validate DrawState for binding #%u which is an invalid binding for this descriptor set.",
+ report_data->FormatHandle(set).c_str(), caller, binding);
+ return result;
}
if (binding_it.GetDescriptorBindingFlags() &
@@ -697,22 +719,22 @@
// or the view could have been destroyed
continue;
}
- if (!ValidateDescriptorSetBindingData(cb_node, descriptor_set, dynamic_offsets, binding, binding_pair.second, caller,
- error))
- return false;
+ result |=
+ ValidateDescriptorSetBindingData(cb_node, descriptor_set, dynamic_offsets, binding, binding_pair.second, caller, vuids);
}
- return true;
+ return result;
}
bool CoreChecks::ValidateDescriptorSetBindingData(const CMD_BUFFER_STATE *cb_node, const DescriptorSet *descriptor_set,
const std::vector<uint32_t> &dynamic_offsets, uint32_t binding,
- descriptor_req reqs, const char *caller, std::string *error) const {
+ descriptor_req reqs, const char *caller, const DrawDispatchVuid &vuids) const {
using DescriptorClass = cvdescriptorset::DescriptorClass;
using BufferDescriptor = cvdescriptorset::BufferDescriptor;
using ImageDescriptor = cvdescriptorset::ImageDescriptor;
using ImageSamplerDescriptor = cvdescriptorset::ImageSamplerDescriptor;
using SamplerDescriptor = cvdescriptorset::SamplerDescriptor;
using TexelDescriptor = cvdescriptorset::TexelDescriptor;
+ using AccelerationStructureDescriptor = cvdescriptorset::AccelerationStructureDescriptor;
DescriptorSetLayout::ConstBindingIterator binding_it(descriptor_set->GetLayout().get(), binding);
{
// Copy the range, the end range is subject to update based on variable length descriptor arrays.
@@ -732,59 +754,72 @@
// Can't validate the descriptor because it may not have been updated.
continue;
} else if (!descriptor->updated) {
- std::stringstream error_str;
- error_str << "Descriptor in binding #" << binding << " index " << index
- << " is being used in draw but has never been updated via vkUpdateDescriptorSets() or a similar call.";
- *error = error_str.str();
- return false;
+ auto set = descriptor_set->GetSet();
+ return LogError(set, kVUID_Core_DrawState_DescriptorSetNotUpdated,
+ "%s encountered the following validation error at %s time: Descriptor in binding #%" PRIu32
+ " index %" PRIu32
+ " is being used in draw but has never been updated via vkUpdateDescriptorSets() or a similar call.",
+ report_data->FormatHandle(set).c_str(), caller, binding, index);
} else {
auto descriptor_class = descriptor->GetClass();
if (descriptor_class == DescriptorClass::GeneralBuffer) {
// Verify that buffers are valid
auto buffer = static_cast<const BufferDescriptor *>(descriptor)->GetBuffer();
auto buffer_node = static_cast<const BufferDescriptor *>(descriptor)->GetBufferState();
- if (!buffer_node || buffer_node->destroyed) {
- std::stringstream error_str;
- error_str << "Descriptor in binding #" << binding << " index " << index << " is using buffer "
- << report_data->FormatHandle(buffer).c_str() << " that is invalid or has been destroyed.";
- *error = error_str.str();
- return false;
- } else if (!buffer_node->sparse) {
- for (auto mem_binding : buffer_node->GetBoundMemory()) {
- if (mem_binding->destroyed) {
- std::stringstream error_str;
- error_str << "Descriptor in binding #" << binding << " index " << index << " uses buffer " << buffer
- << " that references invalid memory " << mem_binding->mem << ".";
- *error = error_str.str();
- return false;
+ if (buffer) {
+ if (!buffer_node || buffer_node->destroyed) {
+ auto set = descriptor_set->GetSet();
+ return LogError(set, kVUID_Core_DrawState_DescriptorSetNotUpdated,
+ "%s encountered the following validation error at %s time: Descriptor in "
+ "binding #%" PRIu32 " index %" PRIu32
+ " is using buffer %s that is invalid or has been destroyed.",
+ report_data->FormatHandle(set).c_str(), caller, binding, index,
+ report_data->FormatHandle(buffer).c_str());
+ } else if (!buffer_node->sparse) {
+ for (auto mem_binding : buffer_node->GetBoundMemory()) {
+ if (mem_binding->destroyed) {
+ auto set = descriptor_set->GetSet();
+ return LogError(set, kVUID_Core_DrawState_DescriptorSetNotUpdated,
+ "%s encountered the following validation error at %s time: Descriptor in "
+ "binding #%" PRIu32 " index %" PRIu32
+ " is uses buffer %s that references invalid memory %s.",
+ report_data->FormatHandle(set).c_str(), caller, binding, index,
+ report_data->FormatHandle(buffer).c_str(),
+ report_data->FormatHandle(mem_binding->mem).c_str());
+ }
}
}
- }
- if (descriptor->IsDynamic()) {
- // Validate that dynamic offsets are within the buffer
- auto buffer_size = buffer_node->createInfo.size;
- auto range = static_cast<const BufferDescriptor *>(descriptor)->GetRange();
- auto desc_offset = static_cast<const BufferDescriptor *>(descriptor)->GetOffset();
- auto dyn_offset = dynamic_offsets[binding_it.GetDynamicOffsetIndex() + array_idx];
- if (VK_WHOLE_SIZE == range) {
- if ((dyn_offset + desc_offset) > buffer_size) {
- std::stringstream error_str;
- error_str << "Dynamic descriptor in binding #" << binding << " index " << index << " uses buffer "
- << buffer << " with update range of VK_WHOLE_SIZE has dynamic offset " << dyn_offset
- << " combined with offset " << desc_offset << " that oversteps the buffer size of "
- << buffer_size << ".";
- *error = error_str.str();
- return false;
- }
- } else {
- if ((dyn_offset + desc_offset + range) > buffer_size) {
- std::stringstream error_str;
- error_str << "Dynamic descriptor in binding #" << binding << " index " << index << " uses buffer "
- << buffer << " with dynamic offset " << dyn_offset << " combined with offset "
- << desc_offset << " and range " << range << " that oversteps the buffer size of "
- << buffer_size << ".";
- *error = error_str.str();
- return false;
+ if (descriptor->IsDynamic()) {
+ // Validate that dynamic offsets are within the buffer
+ auto buffer_size = buffer_node->createInfo.size;
+ auto range = static_cast<const BufferDescriptor *>(descriptor)->GetRange();
+ auto desc_offset = static_cast<const BufferDescriptor *>(descriptor)->GetOffset();
+ auto dyn_offset = dynamic_offsets[binding_it.GetDynamicOffsetIndex() + array_idx];
+ if (VK_WHOLE_SIZE == range) {
+ if ((dyn_offset + desc_offset) > buffer_size) {
+ auto set = descriptor_set->GetSet();
+ return LogError(set, kVUID_Core_DrawState_DescriptorSetNotUpdated,
+ "%s encountered the following validation error at %s time: Descriptor in "
+ "binding #%" PRIu32 " index %" PRIu32
+ " is using buffer %s with update range of VK_WHOLE_SIZE has dynamic offset "
+ "%" PRIu32 " combined with offset %" PRIu64
+ " that oversteps the buffer size of %" PRIu64 ".",
+ report_data->FormatHandle(set).c_str(), caller, binding, index,
+ report_data->FormatHandle(buffer).c_str(), dyn_offset, desc_offset,
+ buffer_size);
+ }
+ } else {
+ if ((dyn_offset + desc_offset + range) > buffer_size) {
+ auto set = descriptor_set->GetSet();
+ return LogError(
+ set, kVUID_Core_DrawState_DescriptorSetNotUpdated,
+ "%s encountered the following validation error at %s time: "
+ "Descriptor in binding #%" PRIu32 " index %" PRIu32
+ " is uses buffer %s with dynamic offset %" PRIu32 " combined with offset %" PRIu64
+ " and range %" PRIu64 " that oversteps the buffer size of %" PRIu64 ".",
+ report_data->FormatHandle(set).c_str(), caller, binding, index,
+ report_data->FormatHandle(buffer).c_str(), dyn_offset, desc_offset, range, buffer_size);
+ }
}
}
}
@@ -802,105 +837,148 @@
image_layout = static_cast<const ImageDescriptor *>(descriptor)->GetImageLayout();
}
- if (!image_view_state || image_view_state->destroyed) {
- // Image view must have been destroyed since initial update. Could potentially flag the descriptor
- // as "invalid" (updated = false) at DestroyImageView() time and detect this error at bind time
- std::stringstream error_str;
- error_str << "Descriptor in binding #" << binding << " index " << index << " is using imageView "
- << report_data->FormatHandle(image_view).c_str() << " that is invalid or has been destroyed.";
- *error = error_str.str();
- return false;
- }
- const auto &image_view_ci = image_view_state->create_info;
+ if (image_view) {
+ if (!image_view_state || image_view_state->destroyed) {
+ // Image view must have been destroyed since initial update. Could potentially flag the descriptor
+ // as "invalid" (updated = false) at DestroyImageView() time and detect this error at bind time
- if (reqs & DESCRIPTOR_REQ_ALL_VIEW_TYPE_BITS) {
- if (~reqs & (1 << image_view_ci.viewType)) {
- // bad view type
- std::stringstream error_str;
- error_str << "Descriptor in binding #" << binding << " index " << index
- << " requires an image view of type " << StringDescriptorReqViewType(reqs) << " but got "
- << string_VkImageViewType(image_view_ci.viewType) << ".";
- *error = error_str.str();
- return false;
+ auto set = descriptor_set->GetSet();
+ return LogError(set, kVUID_Core_DrawState_DescriptorSetNotUpdated,
+ "%s encountered the following validation error at %s time: Descriptor in "
+ "binding #%" PRIu32 " index %" PRIu32
+ " is using imageView %s that is invalid or has been destroyed.",
+ report_data->FormatHandle(set).c_str(), caller, binding, index,
+ report_data->FormatHandle(image_view).c_str());
+ }
+ const auto &image_view_ci = image_view_state->create_info;
+
+ if (reqs & DESCRIPTOR_REQ_ALL_VIEW_TYPE_BITS) {
+ if (~reqs & (1 << image_view_ci.viewType)) {
+ auto set = descriptor_set->GetSet();
+ return LogError(
+ set, kVUID_Core_DrawState_DescriptorSetNotUpdated,
+ "%s encountered the following validation error at %s time: Descriptor "
+ "in binding #%" PRIu32 " index %" PRIu32 " requires an image view of type %s but got %s.",
+ report_data->FormatHandle(set).c_str(), caller, binding, index,
+ StringDescriptorReqViewType(reqs).c_str(), string_VkImageViewType(image_view_ci.viewType));
+ }
+
+ if (!(reqs & image_view_state->descriptor_format_bits)) {
+ // bad component type
+ auto set = descriptor_set->GetSet();
+ return LogError(set, kVUID_Core_DrawState_DescriptorSetNotUpdated,
+ "%s encountered the following validation error at %s time: Descriptor in binding "
+ "#%" PRIu32 " index %" PRIu32
+ " requires %s component type, but bound descriptor format is %s.",
+ report_data->FormatHandle(set).c_str(), caller, binding, index,
+ StringDescriptorReqComponentType(reqs), string_VkFormat(image_view_ci.format));
+ }
}
- if (!(reqs & image_view_state->descriptor_format_bits)) {
- // bad component type
- std::stringstream error_str;
- error_str << "Descriptor in binding #" << binding << " index " << index << " requires "
- << StringDescriptorReqComponentType(reqs)
- << " component type, but bound descriptor format is " << string_VkFormat(image_view_ci.format)
- << ".";
- *error = error_str.str();
- return false;
+ if (!disabled[image_layout_validation]) {
+ auto image_node = image_view_state->image_state.get();
+ assert(image_node);
+ // Verify Image Layout
+ // No "invalid layout" VUID required for this call, since the optimal_layout parameter is UNDEFINED.
+ bool hit_error = false;
+ VerifyImageLayout(cb_node, image_node, image_view_state->normalized_subresource_range,
+ image_view_ci.subresourceRange.aspectMask, image_layout, VK_IMAGE_LAYOUT_UNDEFINED,
+ caller, kVUIDUndefined, "VUID-VkDescriptorImageInfo-imageLayout-00344", &hit_error);
+ if (hit_error) {
+ auto set = descriptor_set->GetSet();
+ return LogError(
+ set, kVUID_Core_DrawState_DescriptorSetNotUpdated,
+ "%s encountered the following validation error at %s time: Image layout specified "
+ "at vkUpdateDescriptorSet* or vkCmdPushDescriptorSet* time "
+ "doesn't match actual image layout at time descriptor is used. See previous error callback for "
+ "specific details.",
+ report_data->FormatHandle(set).c_str(), caller);
+ }
}
- }
- if (!disabled.image_layout_validation) {
- auto image_node = image_view_state->image_state.get();
- assert(image_node);
- // Verify Image Layout
- // No "invalid layout" VUID required for this call, since the optimal_layout parameter is UNDEFINED.
- bool hit_error = false;
- VerifyImageLayout(cb_node, image_node, image_view_state->normalized_subresource_range,
- image_view_ci.subresourceRange.aspectMask, image_layout, VK_IMAGE_LAYOUT_UNDEFINED,
- caller, kVUIDUndefined, "VUID-VkDescriptorImageInfo-imageLayout-00344", &hit_error);
- if (hit_error) {
- *error =
- "Image layout specified at vkUpdateDescriptorSet* or vkCmdPushDescriptorSet* time "
- "doesn't match actual image layout at time descriptor is used. See previous error callback for "
- "specific details.";
- return false;
+ // Verify Sample counts
+ if ((reqs & DESCRIPTOR_REQ_SINGLE_SAMPLE) && image_view_state->samples != VK_SAMPLE_COUNT_1_BIT) {
+ auto set = descriptor_set->GetSet();
+ return LogError(set, kVUID_Core_DrawState_DescriptorSetNotUpdated,
+ "%s encountered the following validation error at %s time: Descriptor in "
+ "binding #%" PRIu32 " index %" PRIu32
+ " requires bound image to have VK_SAMPLE_COUNT_1_BIT but got %s.",
+ report_data->FormatHandle(set).c_str(), caller, binding, index,
+ string_VkSampleCountFlagBits(image_view_state->samples));
}
- }
-
- // Verify Sample counts
- if ((reqs & DESCRIPTOR_REQ_SINGLE_SAMPLE) && image_view_state->samples != VK_SAMPLE_COUNT_1_BIT) {
- std::stringstream error_str;
- error_str << "Descriptor in binding #" << binding << " index " << index
- << " requires bound image to have VK_SAMPLE_COUNT_1_BIT but got "
- << string_VkSampleCountFlagBits(image_view_state->samples) << ".";
- *error = error_str.str();
- return false;
- }
- if ((reqs & DESCRIPTOR_REQ_MULTI_SAMPLE) && image_view_state->samples == VK_SAMPLE_COUNT_1_BIT) {
- std::stringstream error_str;
- error_str << "Descriptor in binding #" << binding << " index " << index
- << " requires bound image to have multiple samples, but got VK_SAMPLE_COUNT_1_BIT.";
- *error = error_str.str();
- return false;
+ if ((reqs & DESCRIPTOR_REQ_MULTI_SAMPLE) && image_view_state->samples == VK_SAMPLE_COUNT_1_BIT) {
+ auto set = descriptor_set->GetSet();
+ return LogError(
+ set, kVUID_Core_DrawState_DescriptorSetNotUpdated,
+ "%s encountered the following validation error at %s time: Descriptor in binding #%" PRIu32
+ " index %" PRIu32 " requires bound image to have multiple samples, but got VK_SAMPLE_COUNT_1_BIT.",
+ report_data->FormatHandle(set).c_str(), caller, binding, index);
+ }
}
} else if (descriptor_class == DescriptorClass::TexelBuffer) {
auto texel_buffer = static_cast<const TexelDescriptor *>(descriptor);
auto buffer_view = texel_buffer->GetBufferView();
auto buffer_view_state = texel_buffer->GetBufferViewState();
- if (!buffer_view_state || buffer_view_state->destroyed) {
- std::stringstream error_str;
- error_str << "Descriptor in binding #" << binding << " index " << index << " is using bufferView "
- << report_data->FormatHandle(buffer_view).c_str() << " that is invalid or has been destroyed.";
- *error = error_str.str();
- return false;
- }
- auto buffer = buffer_view_state->create_info.buffer;
- auto buffer_state = buffer_view_state->buffer_state.get();
- if (buffer_state->destroyed) {
- std::stringstream error_str;
- error_str << "Descriptor in binding #" << binding << " index " << index << " is using buffer "
- << report_data->FormatHandle(buffer).c_str() << " that has been destroyed.";
- *error = error_str.str();
- return false;
- }
- auto format_bits = DescriptorRequirementsBitsFromFormat(buffer_view_state->create_info.format);
+ if (buffer_view) {
+ if (!buffer_view_state || buffer_view_state->destroyed) {
+ auto set = descriptor_set->GetSet();
+ return LogError(set, kVUID_Core_DrawState_DescriptorSetNotUpdated,
+ "%s encountered the following validation error at %s time: Descriptor in "
+ "binding #%" PRIu32 " index %" PRIu32
+ " is using bufferView %s that is invalid or has been destroyed.",
+ report_data->FormatHandle(set).c_str(), caller, binding, index,
+ report_data->FormatHandle(buffer_view).c_str());
+ }
+ auto buffer = buffer_view_state->create_info.buffer;
+ auto buffer_state = buffer_view_state->buffer_state.get();
+ if (buffer_state->destroyed) {
+ auto set = descriptor_set->GetSet();
+ return LogError(set, kVUID_Core_DrawState_DescriptorSetNotUpdated,
+ "%s encountered the following validation error at %s time: Descriptor in "
+ "binding #%" PRIu32 " index %" PRIu32 " is using buffer %s that has been destroyed.",
+ report_data->FormatHandle(set).c_str(), caller, binding, index,
+ report_data->FormatHandle(buffer).c_str());
+ }
+ auto format_bits = DescriptorRequirementsBitsFromFormat(buffer_view_state->create_info.format);
- if (!(reqs & format_bits)) {
- // bad component type
- std::stringstream error_str;
- error_str << "Descriptor in binding #" << binding << " index " << index << " requires "
- << StringDescriptorReqComponentType(reqs) << " component type, but bound descriptor format is "
- << string_VkFormat(buffer_view_state->create_info.format) << ".";
- *error = error_str.str();
- return false;
+ if (!(reqs & format_bits)) {
+ // bad component type
+ auto set = descriptor_set->GetSet();
+ return LogError(set, kVUID_Core_DrawState_DescriptorSetNotUpdated,
+ "%s encountered the following validation error at %s time: Descriptor in "
+ "binding #%" PRIu32 " index %" PRIu32
+ " requires %s component type, but bound descriptor format is %s.",
+ report_data->FormatHandle(set).c_str(), caller, binding, index,
+ StringDescriptorReqComponentType(reqs),
+ string_VkFormat(buffer_view_state->create_info.format));
+ }
+ }
+ } else if (descriptor_class == DescriptorClass::AccelerationStructure) {
+ // Verify that acceleration structures are valid
+ auto acc = static_cast<const AccelerationStructureDescriptor *>(descriptor)->GetAccelerationStructure();
+ auto acc_node =
+ static_cast<const AccelerationStructureDescriptor *>(descriptor)->GetAccelerationStructureState();
+ if (!acc_node || acc_node->destroyed) {
+ auto set = descriptor_set->GetSet();
+ return LogError(
+ set, kVUID_Core_DrawState_DescriptorSetNotUpdated,
+ "%s encountered the following validation error at %s time: Descriptor in binding #%" PRIu32
+ " index %" PRIu32 " is using acceleration structure %s that is invalid or has been destroyed.",
+ report_data->FormatHandle(set).c_str(), caller, binding, index, report_data->FormatHandle(acc).c_str());
+ } else {
+ for (auto mem_binding : acc_node->GetBoundMemory()) {
+ if (mem_binding->destroyed) {
+ auto set = descriptor_set->GetSet();
+ return LogError(set, kVUID_Core_DrawState_DescriptorSetNotUpdated,
+ "%s encountered the following validation error at %s time: Descriptor in "
+ "binding #%" PRIu32 " index %" PRIu32
+ " is using acceleration structure %s that references invalid memory %s.",
+ report_data->FormatHandle(set).c_str(), caller, binding, index,
+ report_data->FormatHandle(acc).c_str(),
+ report_data->FormatHandle(mem_binding->mem).c_str());
+ }
+ }
}
}
if (descriptor_class == DescriptorClass::ImageSampler || descriptor_class == DescriptorClass::PlainSampler) {
@@ -915,25 +993,121 @@
sampler_state = static_cast<const SamplerDescriptor *>(descriptor)->GetSamplerState();
}
if (!sampler_state || sampler_state->destroyed) {
- std::stringstream error_str;
- error_str << "Descriptor in binding #" << binding << " index " << index << " is using sampler "
- << report_data->FormatHandle(sampler).c_str() << " that is invalid or has been destroyed.";
- *error = error_str.str();
- return false;
+ auto set = descriptor_set->GetSet();
+ return LogError(set, kVUID_Core_DrawState_DescriptorSetNotUpdated,
+ "%s encountered the following validation error at %s time: Descriptor in "
+ "binding #%" PRIu32 " index %" PRIu32
+ " is using sampler %s that is invalid or has been destroyed.",
+ report_data->FormatHandle(set).c_str(), caller, binding, index,
+ report_data->FormatHandle(sampler).c_str());
} else {
if (sampler_state->samplerConversion && !descriptor->IsImmutableSampler()) {
- std::stringstream error_str;
- error_str << "sampler (" << sampler << ") in the descriptor set (" << descriptor_set->GetSet()
- << ") contains a YCBCR conversion (" << sampler_state->samplerConversion
- << ") , then the sampler MUST also exists as an immutable sampler.";
- *error = error_str.str();
+ auto set = descriptor_set->GetSet();
+ return LogError(set, kVUID_Core_DrawState_DescriptorSetNotUpdated,
+ "%s encountered the following validation error at %s time: sampler (%s) "
+ "in the descriptor set (%s) caontains a YCBCR conversion (%s), then the sampler MUST "
+ "also exist as an immutable sampler.",
+ report_data->FormatHandle(set).c_str(), caller,
+ report_data->FormatHandle(sampler).c_str(),
+ report_data->FormatHandle(descriptor_set->GetSet()).c_str(),
+ report_data->FormatHandle(sampler_state->samplerConversion).c_str());
+ }
+ }
+ // TODO: Validate 04015 for DescriptorClass::PlainSampler
+ if (descriptor_class == DescriptorClass::ImageSampler) {
+ const IMAGE_VIEW_STATE *image_view_state;
+ image_view_state = static_cast<const ImageSamplerDescriptor *>(descriptor)->GetImageViewState();
+ if ((sampler_state->createInfo.borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
+ sampler_state->createInfo.borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) &&
+ (sampler_state->customCreateInfo.format == VK_FORMAT_UNDEFINED)) {
+ if (image_view_state->create_info.format == VK_FORMAT_B4G4R4A4_UNORM_PACK16 ||
+ image_view_state->create_info.format == VK_FORMAT_B5G6R5_UNORM_PACK16 ||
+ image_view_state->create_info.format == VK_FORMAT_B5G5R5A1_UNORM_PACK16) {
+ auto set = descriptor_set->GetSet();
+ LogObjectList objlist(set);
+ objlist.add(sampler);
+ objlist.add(image_view_state->image_view);
+ return LogError(objlist, "VUID-VkSamplerCustomBorderColorCreateInfoEXT-format-04015",
+ "%s encountered the following validation error at %s time: Sampler %s in "
+ "binding #%" PRIu32 " index %" PRIu32
+ " has a custom border color with format = VK_FORMAT_UNDEFINED and is used to "
+ "sample an image view %s with format %s",
+ report_data->FormatHandle(set).c_str(), caller,
+ report_data->FormatHandle(sampler).c_str(), binding, index,
+ report_data->FormatHandle(image_view_state->image_view).c_str(),
+ string_VkFormat(image_view_state->create_info.format));
+ }
+ }
+ VkFilter sampler_mag_filter = sampler_state->createInfo.magFilter;
+ VkFilter sampler_min_filter = sampler_state->createInfo.minFilter;
+ if ((sampler_mag_filter == VK_FILTER_LINEAR || sampler_min_filter == VK_FILTER_LINEAR) &&
+ !(image_view_state->format_features & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT)) {
+ auto set = descriptor_set->GetSet();
+ LogObjectList objlist(set);
+ objlist.add(sampler);
+ objlist.add(image_view_state->image_view);
+ return LogError(objlist, vuids.linear_sampler,
+ "sampler (%s) in descriptor set (%s) "
+ "is set to use VK_FILTER_LINEAR, then image view's (%s"
+ ") format (%s) MUST "
+ "contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT in its format features.",
+ report_data->FormatHandle(sampler).c_str(), report_data->FormatHandle(set).c_str(),
+ report_data->FormatHandle(image_view_state->image_view).c_str(),
+ string_VkFormat(image_view_state->create_info.format));
+ }
+ if ((sampler_mag_filter == VK_FILTER_CUBIC_EXT || sampler_min_filter == VK_FILTER_CUBIC_EXT) &&
+ !(image_view_state->format_features & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT)) {
+ auto set = descriptor_set->GetSet();
+ LogObjectList objlist(set);
+ objlist.add(sampler);
+ objlist.add(image_view_state->image_view);
+ return LogError(objlist, vuids.cubic_sampler,
+ "sampler (%s) in descriptor set (%s) "
+ "is set to use VK_FILTER_CUBIC_EXT, then image view's (%s"
+ ") format (%s) MUST "
+ "contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT in its format features.",
+ report_data->FormatHandle(sampler).c_str(), report_data->FormatHandle(set).c_str(),
+ report_data->FormatHandle(image_view_state->image_view).c_str(),
+ string_VkFormat(image_view_state->create_info.format));
+ }
+
+ const IMAGE_STATE *image_state;
+ image_state = GetImageState(image_view_state->create_info.image);
+ if ((image_state->createInfo.flags & VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV) &&
+ (sampler_state->createInfo.addressModeU != VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE ||
+ sampler_state->createInfo.addressModeV != VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE ||
+ sampler_state->createInfo.addressModeW != VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE)) {
+ std::string address_mode_letter =
+ (sampler_state->createInfo.addressModeU != VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE)
+ ? "U"
+ : (sampler_state->createInfo.addressModeV != VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE) ? "V" : "W";
+ VkSamplerAddressMode address_mode =
+ (sampler_state->createInfo.addressModeU != VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE)
+ ? sampler_state->createInfo.addressModeU
+ : (sampler_state->createInfo.addressModeV != VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE)
+ ? sampler_state->createInfo.addressModeV
+ : sampler_state->createInfo.addressModeW;
+ auto set = descriptor_set->GetSet();
+ LogObjectList objlist(set);
+ objlist.add(sampler);
+ objlist.add(image_state->image);
+ objlist.add(image_view_state->image_view);
+ return LogError(
+ objlist, vuids.corner_sampled_address_mode,
+ "image (%s) in image view (%s) in descriptor set (%s) is created with flag "
+ "VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV and can only be sampled using "
+ "VK_SAMPLER_ADDRESS_MODE_CLAMP_EDGE, but sampler (%s) has createInfo.addressMode%s set to %s.",
+ report_data->FormatHandle(image_state->image).c_str(),
+ report_data->FormatHandle(image_view_state->image_view).c_str(),
+ report_data->FormatHandle(set).c_str(), report_data->FormatHandle(sampler).c_str(),
+ address_mode_letter.c_str(), string_VkSamplerAddressMode(address_mode));
}
}
}
}
}
}
- return true;
+ return false;
}
// Set is being deleted or updates so invalidate all bound cmd buffers
@@ -1011,38 +1185,37 @@
// Verify dst layout still valid
if (dst_layout->destroyed) {
*error_code = "VUID-VkCopyDescriptorSet-dstSet-parameter";
- string_sprintf(error_msg,
- "Cannot call %s to perform copy update on dstSet %s"
- " created with destroyed %s.",
- func_name, report_data->FormatHandle(dst_set->GetSet()).c_str(),
- report_data->FormatHandle(dst_layout->GetDescriptorSetLayout()).c_str());
+ std::ostringstream str;
+ str << "Cannot call " << func_name << " to perform copy update on dstSet " << report_data->FormatHandle(dst_set->GetSet())
+ << " created with destroyed " << report_data->FormatHandle(dst_layout->GetDescriptorSetLayout()) << ".";
+ *error_msg = str.str();
return false;
}
// Verify src layout still valid
if (src_layout->destroyed) {
*error_code = "VUID-VkCopyDescriptorSet-srcSet-parameter";
- string_sprintf(error_msg,
- "Cannot call %s to perform copy update of dstSet %s"
- " from srcSet %s"
- " created with destroyed %s.",
- func_name, report_data->FormatHandle(dst_set->GetSet()).c_str(),
- report_data->FormatHandle(src_set->GetSet()).c_str(),
- report_data->FormatHandle(src_layout->GetDescriptorSetLayout()).c_str());
+ std::ostringstream str;
+ str << "Cannot call " << func_name << " to perform copy update on dstSet " << report_data->FormatHandle(dst_set->GetSet())
+ << " from srcSet " << report_data->FormatHandle(src_set->GetSet()) << " created with destroyed "
+ << report_data->FormatHandle(src_layout->GetDescriptorSetLayout()) << ".";
+ *error_msg = str.str();
return false;
}
if (!dst_layout->HasBinding(update->dstBinding)) {
*error_code = "VUID-VkCopyDescriptorSet-dstBinding-00347";
std::stringstream error_str;
- error_str << "DescriptorSet " << dst_set->GetSet() << " does not have copy update dest binding of " << update->dstBinding;
+ error_str << "DescriptorSet " << report_data->FormatHandle(dst_set->GetSet())
+ << " does not have copy update dest binding of " << update->dstBinding;
*error_msg = error_str.str();
return false;
}
if (!src_set->HasBinding(update->srcBinding)) {
*error_code = "VUID-VkCopyDescriptorSet-srcBinding-00345";
std::stringstream error_str;
- error_str << "DescriptorSet " << dst_set->GetSet() << " does not have copy update src binding of " << update->srcBinding;
+ error_str << "DescriptorSet " << report_data->FormatHandle(src_set->GetSet())
+ << " does not have copy update src binding of " << update->srcBinding;
*error_msg = error_str.str();
return false;
}
@@ -1053,8 +1226,8 @@
// TODO : Re-using Free Idle error code, need copy update idle error code
*error_code = "VUID-vkFreeDescriptorSets-pDescriptorSets-00309";
std::stringstream error_str;
- error_str << "Cannot call " << func_name << " to perform copy update on descriptor set " << dst_set->GetSet()
- << " that is in use by a command buffer";
+ error_str << "Cannot call " << func_name << " to perform copy update on descriptor set "
+ << report_data->FormatHandle(dst_set->GetSet()) << " that is in use by a command buffer";
*error_msg = error_str.str();
return false;
}
@@ -1065,9 +1238,10 @@
// SRC update out of bounds
*error_code = "VUID-VkCopyDescriptorSet-srcArrayElement-00346";
std::stringstream error_str;
- error_str << "Attempting copy update from descriptorSet " << update->srcSet << " binding#" << update->srcBinding
- << " with offset index of " << src_set->GetGlobalIndexRangeFromBinding(update->srcBinding).start
- << " plus update array offset of " << update->srcArrayElement << " and update of " << update->descriptorCount
+ error_str << "Attempting copy update from descriptorSet " << report_data->FormatHandle(update->srcSet) << " binding#"
+ << update->srcBinding << " with offset index of "
+ << src_set->GetGlobalIndexRangeFromBinding(update->srcBinding).start << " plus update array offset of "
+ << update->srcArrayElement << " and update of " << update->descriptorCount
<< " descriptors oversteps total number of descriptors in set: " << src_set->GetTotalDescriptorCount();
*error_msg = error_str.str();
return false;
@@ -1077,33 +1251,35 @@
// DST update out of bounds
*error_code = "VUID-VkCopyDescriptorSet-dstArrayElement-00348";
std::stringstream error_str;
- error_str << "Attempting copy update to descriptorSet " << dst_set->GetSet() << " binding#" << update->dstBinding
- << " with offset index of " << dst_layout->GetGlobalIndexRangeFromBinding(update->dstBinding).start
- << " plus update array offset of " << update->dstArrayElement << " and update of " << update->descriptorCount
+ error_str << "Attempting copy update to descriptorSet " << report_data->FormatHandle(dst_set->GetSet()) << " binding#"
+ << update->dstBinding << " with offset index of "
+ << dst_layout->GetGlobalIndexRangeFromBinding(update->dstBinding).start << " plus update array offset of "
+ << update->dstArrayElement << " and update of " << update->descriptorCount
<< " descriptors oversteps total number of descriptors in set: " << dst_layout->GetTotalDescriptorCount();
*error_msg = error_str.str();
return false;
}
// Check that types match
- // TODO : Base default error case going from here is "VUID-VkAcquireNextImageInfoKHR-semaphore-parameter"2ba which covers all
+ // TODO : Base default error case going from here is "VUID-VkAcquireNextImageInfoKHR-semaphore-parameter" 2ba which covers all
// consistency issues, need more fine-grained error codes
*error_code = "VUID-VkCopyDescriptorSet-srcSet-00349";
auto src_type = src_set->GetTypeFromBinding(update->srcBinding);
auto dst_type = dst_layout->GetTypeFromBinding(update->dstBinding);
if (src_type != dst_type) {
+ *error_code = "VUID-VkCopyDescriptorSet-dstBinding-02632";
std::stringstream error_str;
- error_str << "Attempting copy update to descriptorSet " << dst_set->GetSet() << " binding #" << update->dstBinding
- << " with type " << string_VkDescriptorType(dst_type) << " from descriptorSet " << src_set->GetSet()
- << " binding #" << update->srcBinding << " with type " << string_VkDescriptorType(src_type)
- << ". Types do not match";
+ error_str << "Attempting copy update to descriptorSet " << report_data->FormatHandle(dst_set->GetSet()) << " binding #"
+ << update->dstBinding << " with type " << string_VkDescriptorType(dst_type) << " from descriptorSet "
+ << report_data->FormatHandle(src_set->GetSet()) << " binding #" << update->srcBinding << " with type "
+ << string_VkDescriptorType(src_type) << ". Types do not match";
*error_msg = error_str.str();
return false;
}
// Verify consistency of src & dst bindings if update crosses binding boundaries
- if ((!VerifyUpdateConsistency(DescriptorSetLayout::ConstBindingIterator(src_layout, update->srcBinding),
+ if ((!VerifyUpdateConsistency(report_data, DescriptorSetLayout::ConstBindingIterator(src_layout, update->srcBinding),
update->srcArrayElement, update->descriptorCount, "copy update from", src_set->GetSet(),
error_msg)) ||
- (!VerifyUpdateConsistency(DescriptorSetLayout::ConstBindingIterator(dst_layout, update->dstBinding),
+ (!VerifyUpdateConsistency(report_data, DescriptorSetLayout::ConstBindingIterator(dst_layout, update->dstBinding),
update->dstArrayElement, update->descriptorCount, "copy update to", dst_set->GetSet(),
error_msg))) {
return false;
@@ -1113,11 +1289,11 @@
!(dst_layout->GetCreateFlags() & VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT)) {
*error_code = "VUID-VkCopyDescriptorSet-srcSet-01918";
std::stringstream error_str;
- error_str << "If pname:srcSet's (" << update->srcSet
+ error_str << "If pname:srcSet's (" << report_data->FormatHandle(update->srcSet)
<< ") layout was created with the "
"ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT flag "
"set, then pname:dstSet's ("
- << update->dstSet
+ << report_data->FormatHandle(update->dstSet)
<< ") layout must: also have been created with the "
"ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT flag set";
*error_msg = error_str.str();
@@ -1128,11 +1304,11 @@
(dst_layout->GetCreateFlags() & VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT)) {
*error_code = "VUID-VkCopyDescriptorSet-srcSet-01919";
std::stringstream error_str;
- error_str << "If pname:srcSet's (" << update->srcSet
+ error_str << "If pname:srcSet's (" << report_data->FormatHandle(update->srcSet)
<< ") layout was created without the "
"ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT flag "
"set, then pname:dstSet's ("
- << update->dstSet
+ << report_data->FormatHandle(update->dstSet)
<< ") layout must: also have been created without the "
"ename:VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT flag set";
*error_msg = error_str.str();
@@ -1143,11 +1319,11 @@
!(dst_set->GetPoolState()->createInfo.flags & VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT)) {
*error_code = "VUID-VkCopyDescriptorSet-srcSet-01920";
std::stringstream error_str;
- error_str << "If the descriptor pool from which pname:srcSet (" << update->srcSet
+ error_str << "If the descriptor pool from which pname:srcSet (" << report_data->FormatHandle(update->srcSet)
<< ") was allocated was created "
"with the ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT flag "
"set, then the descriptor pool from which pname:dstSet ("
- << update->dstSet
+ << report_data->FormatHandle(update->dstSet)
<< ") was allocated must: "
"also have been created with the ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT flag set";
*error_msg = error_str.str();
@@ -1158,11 +1334,11 @@
(dst_set->GetPoolState()->createInfo.flags & VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT)) {
*error_code = "VUID-VkCopyDescriptorSet-srcSet-01921";
std::stringstream error_str;
- error_str << "If the descriptor pool from which pname:srcSet (" << update->srcSet
+ error_str << "If the descriptor pool from which pname:srcSet (" << report_data->FormatHandle(update->srcSet)
<< ") was allocated was created "
"without the ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT flag "
"set, then the descriptor pool from which pname:dstSet ("
- << update->dstSet
+ << report_data->FormatHandle(update->dstSet)
<< ") was allocated must: "
"also have been created without the ename:VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT flag set";
*error_msg = error_str.str();
@@ -1236,9 +1412,9 @@
// Prereq: This should be called for a set that has been confirmed to be active for the given cb_node, meaning it's going
// to be used in a draw by the given cb_node
void cvdescriptorset::DescriptorSet::UpdateDrawState(ValidationStateTracker *device_data, CMD_BUFFER_STATE *cb_node,
- const PIPELINE_STATE *pipe,
+ CMD_TYPE cmd_type, const PIPELINE_STATE *pipe,
const std::map<uint32_t, descriptor_req> &binding_req_map) {
- if (!device_data->disabled.command_buffer_state) {
+ if (!device_data->disabled[command_buffer_state] && !IsPushDescriptor()) {
// bind cb to this descriptor set
// Add bindings for descriptor set, the set's pool, and individual objects in the set
if (device_data->AddCommandBufferBinding(cb_bindings, VulkanTypedHandle(set_, kVulkanObjectTypeDescriptorSet, this),
@@ -1251,7 +1427,7 @@
// Descriptor UpdateDrawState functions do two things - associate resources to the command buffer,
// and call image layout validation callbacks. If both are disabled, skip the entire loop.
- if (device_data->disabled.command_buffer_state && device_data->disabled.image_layout_validation) {
+ if (device_data->disabled[command_buffer_state] && device_data->disabled[image_layout_validation]) {
return;
}
@@ -1265,7 +1441,8 @@
auto flags = p_layout_->GetDescriptorBindingFlagsFromIndex(index);
if (flags & (VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT | VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT)) {
if (!(flags & VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT)) {
- cb_node->validate_descriptorsets_in_queuesubmit[set_][pipe->pipeline][binding] = binding_req_pair.second;
+ cb_node->validate_descriptorsets_in_queuesubmit[set_][pipe->pipeline].insert(
+ {binding, {binding_req_pair.second, cmd_type}});
}
continue;
}
@@ -1395,11 +1572,14 @@
format = image_node->createInfo.format;
usage = image_node->createInfo.usage;
+ const auto stencil_usage_info = lvl_find_in_chain<VkImageStencilUsageCreateInfo>(image_node->createInfo.pNext);
+ if (stencil_usage_info) {
+ usage |= stencil_usage_info->stencilUsage;
+ }
+
// Validate that memory is bound to image
- // TODO: This should have its own valid usage id apart from 2524 which is from CreateImageView case. The only
- // the error here occurs is if memory bound to a created imageView has been freed.
- if (ValidateMemoryIsBoundToImage(image_node, func_name, "VUID-VkImageViewCreateInfo-image-01020")) {
- *error_code = "VUID-VkImageViewCreateInfo-image-01020";
+ if (ValidateMemoryIsBoundToImage(image_node, func_name, "UNASSIGNED-CoreValidation-BoundResourceFreedMemoryAccess")) {
+ *error_code = "UNASSIGNED-CoreValidation-BoundResourceFreedMemoryAccess";
*error_msg = "No memory bound to image.";
return false;
}
@@ -1423,7 +1603,7 @@
if ((aspect_mask & VK_IMAGE_ASPECT_COLOR_BIT) != VK_IMAGE_ASPECT_COLOR_BIT) {
std::stringstream error_str;
error_str
- << "ImageView (" << report_data->FormatHandle(image_view).c_str()
+ << "ImageView (" << report_data->FormatHandle(image_view)
<< ") uses layout VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL but does not have VK_IMAGE_ASPECT_COLOR_BIT set.";
*error_msg = error_str.str();
return false;
@@ -1431,7 +1611,7 @@
// format must NOT be DS
if (ds) {
std::stringstream error_str;
- error_str << "ImageView (" << report_data->FormatHandle(image_view).c_str()
+ error_str << "ImageView (" << report_data->FormatHandle(image_view)
<< ") uses layout VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL but the image format is "
<< string_VkFormat(format) << " which is not a color format.";
*error_msg = error_str.str();
@@ -1445,7 +1625,7 @@
if (aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT) {
// both must NOT be set
std::stringstream error_str;
- error_str << "ImageView (" << report_data->FormatHandle(image_view).c_str()
+ error_str << "ImageView (" << report_data->FormatHandle(image_view)
<< ") has both STENCIL and DEPTH aspects set";
*error_msg = error_str.str();
return false;
@@ -1453,7 +1633,7 @@
} else if (!(aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT)) {
// Neither were set
std::stringstream error_str;
- error_str << "ImageView (" << report_data->FormatHandle(image_view).c_str() << ") has layout "
+ error_str << "ImageView (" << report_data->FormatHandle(image_view) << ") has layout "
<< string_VkImageLayout(image_layout) << " but does not have STENCIL or DEPTH aspects set";
*error_msg = error_str.str();
return false;
@@ -1461,7 +1641,7 @@
// format must be DS
if (!ds) {
std::stringstream error_str;
- error_str << "ImageView (" << report_data->FormatHandle(image_view).c_str() << ") has layout "
+ error_str << "ImageView (" << report_data->FormatHandle(image_view) << ") has layout "
<< string_VkImageLayout(image_layout) << " but the image format is " << string_VkFormat(format)
<< " which is not a depth/stencil format.";
*error_msg = error_str.str();
@@ -1475,7 +1655,7 @@
if (aspect_mask & VK_IMAGE_ASPECT_STENCIL_BIT) {
// both must NOT be set
std::stringstream error_str;
- error_str << "ImageView (" << report_data->FormatHandle(image_view).c_str() << ") has layout "
+ error_str << "ImageView (" << report_data->FormatHandle(image_view) << ") has layout "
<< string_VkImageLayout(image_layout) << " and is using depth/stencil image of format "
<< string_VkFormat(format)
<< " but it has both STENCIL and DEPTH aspects set, which is illegal. When using a depth/stencil "
@@ -1494,11 +1674,18 @@
// As we're switching per-type, if any type has specific layout requirements, check those here as well
// TODO : The various image usage bit requirements are in general spec language for VkImageUsageFlags bit block in 11.3 Images
// under vkCreateImage()
- // TODO : Need to also validate case "VUID-VkWriteDescriptorSet-descriptorType-00336" where STORAGE_IMAGE & INPUT_ATTACH types
- // must have been created with identify swizzle
const char *error_usage_bit = nullptr;
switch (type) {
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
+ if (iv_state->samplerConversion != VK_NULL_HANDLE) {
+ *error_code = "VUID-VkWriteDescriptorSet-descriptorType-01946";
+ std::stringstream error_str;
+ error_str << "ImageView (" << report_data->FormatHandle(image_view) << ")"
+ << "used as a VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE can't be created with VkSamplerYcbcrConversion";
+ *error_msg = error_str.str();
+ return false;
+ }
+ // drop through
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: {
if (!(usage & VK_IMAGE_USAGE_SAMPLED_BIT)) {
error_usage_bit = "VK_IMAGE_USAGE_SAMPLED_BIT";
@@ -1515,7 +1702,7 @@
// TODO : Need to create custom enum error codes for these cases
if (image_node->shared_presentable) {
if (VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR != image_layout) {
- error_str << "ImageView (" << report_data->FormatHandle(image_view).c_str()
+ error_str << "ImageView (" << report_data->FormatHandle(image_view)
<< ") of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type with a front-buffered image is being updated with "
"layout "
<< string_VkImageLayout(image_layout)
@@ -1526,7 +1713,7 @@
return false;
}
} else if (VK_IMAGE_LAYOUT_GENERAL != image_layout) {
- error_str << "ImageView (" << report_data->FormatHandle(image_view).c_str()
+ error_str << "ImageView (" << report_data->FormatHandle(image_view)
<< ") of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
<< string_VkImageLayout(image_layout)
<< " but according to spec section 13.1 Descriptor Types, 'Load and store operations on storage "
@@ -1549,9 +1736,9 @@
}
if (error_usage_bit) {
std::stringstream error_str;
- error_str << "ImageView (" << report_data->FormatHandle(image_view).c_str() << ") with usage mask " << std::hex
- << std::showbase << usage << " being used for a descriptor update of type " << string_VkDescriptorType(type)
- << " does not have " << error_usage_bit << " set.";
+ error_str << "ImageView (" << report_data->FormatHandle(image_view) << ") with usage mask " << std::hex << std::showbase
+ << usage << " being used for a descriptor update of type " << string_VkDescriptorType(type) << " does not have "
+ << error_usage_bit << " set.";
*error_msg = error_str.str();
return false;
}
@@ -1583,8 +1770,7 @@
std::stringstream error_str;
error_str << "Descriptor update with descriptorType " << string_VkDescriptorType(type)
<< " is being updated with invalid imageLayout " << string_VkImageLayout(image_layout) << " for image "
- << report_data->FormatHandle(image).c_str() << " in imageView "
- << report_data->FormatHandle(image_view).c_str()
+ << report_data->FormatHandle(image) << " in imageView " << report_data->FormatHandle(image_view)
<< ". Allowed layouts are: VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, "
<< "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL";
for (auto &ext_layout : extended_layouts) {
@@ -1597,6 +1783,21 @@
}
}
+ if ((type == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) || (type == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
+ const VkComponentMapping components = iv_state->create_info.components;
+ if (IsIdentitySwizzle(components) == false) {
+ *error_code = "VUID-VkWriteDescriptorSet-descriptorType-00336";
+ std::stringstream error_str;
+ error_str << "ImageView (" << report_data->FormatHandle(image_view) << ") has a non-identiy swizzle component, "
+ << " r swizzle = " << string_VkComponentSwizzle(components.r) << ","
+ << " g swizzle = " << string_VkComponentSwizzle(components.g) << ","
+ << " b swizzle = " << string_VkComponentSwizzle(components.b) << ","
+ << " a swizzle = " << string_VkComponentSwizzle(components.a) << ".";
+ *error_msg = error_str.str();
+ return false;
+ }
+ }
+
return true;
}
@@ -1774,6 +1975,33 @@
}
}
+cvdescriptorset::AccelerationStructureDescriptor::AccelerationStructureDescriptor(const VkDescriptorType type)
+ : acc_(VK_NULL_HANDLE) {
+ updated = false;
+ descriptor_class = AccelerationStructure;
+}
+void cvdescriptorset::AccelerationStructureDescriptor::WriteUpdate(const ValidationStateTracker *dev_data,
+ const VkWriteDescriptorSet *update, const uint32_t index) {
+ const auto *accInfo = lvl_find_in_chain<VkWriteDescriptorSetAccelerationStructureKHR>(update->pNext);
+
+ updated = true;
+ acc_ = accInfo->pAccelerationStructures[index];
+ acc_state_ = dev_data->GetConstCastShared<ACCELERATION_STRUCTURE_STATE>(acc_);
+}
+
+void cvdescriptorset::AccelerationStructureDescriptor::CopyUpdate(const ValidationStateTracker *dev_data, const Descriptor *src) {
+ auto acc_desc = static_cast<const AccelerationStructureDescriptor *>(src);
+ updated = true;
+ acc_ = acc_desc->acc_;
+ acc_state_ = dev_data->GetConstCastShared<ACCELERATION_STRUCTURE_STATE>(acc_);
+}
+
+void cvdescriptorset::AccelerationStructureDescriptor::UpdateDrawState(ValidationStateTracker *dev_data,
+ CMD_BUFFER_STATE *cb_node) {
+ auto acc_node = GetAccelerationStructureState();
+ if (acc_node) dev_data->AddCommandBufferBindingAccelerationStructure(cb_node, acc_node);
+}
+
// This is a helper function that iterates over a set of Write and Copy updates, pulls the DescriptorSet* for updated
// sets, and then calls their respective Validate[Write|Copy]Update functions.
// If the update hits an issue for which the callback returns "true", meaning that the call down the chain should
@@ -1798,6 +2026,24 @@
report_data->FormatHandle(dest_set).c_str(), error_str.c_str());
}
}
+ if (p_wds[i].pNext) {
+ const auto *pnext_struct = lvl_find_in_chain<VkWriteDescriptorSetAccelerationStructureKHR>(p_wds[i].pNext);
+ if (pnext_struct) {
+ for (uint32_t j = 0; j < pnext_struct->accelerationStructureCount; ++j) {
+ const ACCELERATION_STRUCTURE_STATE *as_state =
+ GetAccelerationStructureState(pnext_struct->pAccelerationStructures[j]);
+ if (as_state && as_state->is_khr &&
+ (as_state->create_infoKHR.sType == VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR &&
+ as_state->create_infoKHR.type != VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR)) {
+ skip |=
+ LogError(dest_set, "VUID-VkWriteDescriptorSetAccelerationStructureKHR-pAccelerationStructures-02764",
+ "%s: Each acceleration structure in pAccelerationStructures must have been"
+ "created with VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR.",
+ func_name);
+ }
+ }
+ }
+ }
}
// Now validate copy updates
for (uint32_t i = 0; i < copy_count; ++i) {
@@ -1943,12 +2189,14 @@
std::string out;
auto layout_handle = p_layout_->GetDescriptorSetLayout();
if (IsPushDescriptor()) {
- string_sprintf(&out, "Push Descriptors defined with VkDescriptorSetLayout %s",
- state_data_->report_data->FormatHandle(layout_handle).c_str());
+ std::ostringstream str;
+ str << "Push Descriptors defined with VkDescriptorSetLayout " << state_data_->report_data->FormatHandle(layout_handle);
+ out = str.str();
} else {
- string_sprintf(&out, "VkDescriptorSet %s allocated with VkDescriptorSetLayout %s",
- state_data_->report_data->FormatHandle(set_).c_str(),
- state_data_->report_data->FormatHandle(layout_handle).c_str());
+ std::ostringstream str;
+ str << "VkDescriptorSet " << state_data_->report_data->FormatHandle(set_) << " allocated with VkDescriptorSetLayout "
+ << state_data_->report_data->FormatHandle(layout_handle);
+ out = str.str();
}
return out;
};
@@ -1971,8 +2219,8 @@
// For the given buffer, verify that its creation parameters are appropriate for the given type
// If there's an error, update the error_msg string with details and return false, else return true
-bool cvdescriptorset::ValidateBufferUsage(BUFFER_STATE const *buffer_node, VkDescriptorType type, std::string *error_code,
- std::string *error_msg) {
+bool cvdescriptorset::ValidateBufferUsage(debug_report_data *report_data, BUFFER_STATE const *buffer_node, VkDescriptorType type,
+ std::string *error_code, std::string *error_msg) {
// Verify that usage bits set correctly for given type
auto usage = buffer_node->createInfo.usage;
const char *error_usage_bit = nullptr;
@@ -2008,9 +2256,9 @@
}
if (error_usage_bit) {
std::stringstream error_str;
- error_str << "Buffer (" << buffer_node->buffer << ") with usage mask " << std::hex << std::showbase << usage
- << " being used for a descriptor update of type " << string_VkDescriptorType(type) << " does not have "
- << error_usage_bit << " set.";
+ error_str << "Buffer (" << report_data->FormatHandle(buffer_node->buffer) << ") with usage mask " << std::hex
+ << std::showbase << usage << " being used for a descriptor update of type " << string_VkDescriptorType(type)
+ << " does not have " << error_usage_bit << " set.";
*error_msg = error_str.str();
return false;
}
@@ -2035,7 +2283,7 @@
return false;
}
// Verify usage bits
- if (!cvdescriptorset::ValidateBufferUsage(buffer_node, type, error_code, error_msg)) {
+ if (!cvdescriptorset::ValidateBufferUsage(report_data, buffer_node, type, error_code, error_msg)) {
// error_msg will have been updated by ValidateBufferUsage()
return false;
}
@@ -2044,7 +2292,7 @@
*error_code = "VUID-VkDescriptorBufferInfo-offset-00340";
std::stringstream error_str;
error_str << "VkDescriptorBufferInfo offset of " << buffer_info->offset << " is greater than or equal to buffer "
- << buffer_node->buffer << " size of " << buffer_node->createInfo.size;
+ << report_data->FormatHandle(buffer_node->buffer) << " size of " << buffer_node->createInfo.size;
*error_msg = error_str.str();
return false;
}
@@ -2053,7 +2301,8 @@
if (!buffer_info->range) {
*error_code = "VUID-VkDescriptorBufferInfo-range-00341";
std::stringstream error_str;
- error_str << "VkDescriptorBufferInfo range is not VK_WHOLE_SIZE and is zero, which is not allowed.";
+ error_str << "For buffer " << report_data->FormatHandle(buffer_node->buffer)
+ << " VkDescriptorBufferInfo range is not VK_WHOLE_SIZE and is zero, which is not allowed.";
*error_msg = error_str.str();
return false;
}
@@ -2061,8 +2310,9 @@
if (buffer_info->range > (buffer_node->createInfo.size - buffer_info->offset)) {
*error_code = "VUID-VkDescriptorBufferInfo-range-00342";
std::stringstream error_str;
- error_str << "VkDescriptorBufferInfo range is " << buffer_info->range << " which is greater than buffer size ("
- << buffer_node->createInfo.size << ") minus requested offset of " << buffer_info->offset;
+ error_str << "For buffer " << report_data->FormatHandle(buffer_node->buffer) << " VkDescriptorBufferInfo range is "
+ << buffer_info->range << " which is greater than buffer size (" << buffer_node->createInfo.size
+ << ") minus requested offset of " << buffer_info->offset;
*error_msg = error_str.str();
return false;
}
@@ -2074,14 +2324,16 @@
if (buffer_info->range != VK_WHOLE_SIZE && buffer_info->range > max_ub_range) {
*error_code = "VUID-VkWriteDescriptorSet-descriptorType-00332";
std::stringstream error_str;
- error_str << "VkDescriptorBufferInfo range is " << buffer_info->range
- << " which is greater than this device's maxUniformBufferRange (" << max_ub_range << ")";
+ error_str << "For buffer " << report_data->FormatHandle(buffer_node->buffer) << " VkDescriptorBufferInfo range is "
+ << buffer_info->range << " which is greater than this device's maxUniformBufferRange (" << max_ub_range
+ << ")";
*error_msg = error_str.str();
return false;
} else if (buffer_info->range == VK_WHOLE_SIZE && (buffer_node->createInfo.size - buffer_info->offset) > max_ub_range) {
*error_code = "VUID-VkWriteDescriptorSet-descriptorType-00332";
std::stringstream error_str;
- error_str << "VkDescriptorBufferInfo range is VK_WHOLE_SIZE but effective range "
+ error_str << "For buffer " << report_data->FormatHandle(buffer_node->buffer)
+ << " VkDescriptorBufferInfo range is VK_WHOLE_SIZE but effective range "
<< "(" << (buffer_node->createInfo.size - buffer_info->offset) << ") is greater than this device's "
<< "maxUniformBufferRange (" << max_ub_range << ")";
*error_msg = error_str.str();
@@ -2092,14 +2344,16 @@
if (buffer_info->range != VK_WHOLE_SIZE && buffer_info->range > max_sb_range) {
*error_code = "VUID-VkWriteDescriptorSet-descriptorType-00333";
std::stringstream error_str;
- error_str << "VkDescriptorBufferInfo range is " << buffer_info->range
- << " which is greater than this device's maxStorageBufferRange (" << max_sb_range << ")";
+ error_str << "For buffer " << report_data->FormatHandle(buffer_node->buffer) << " VkDescriptorBufferInfo range is "
+ << buffer_info->range << " which is greater than this device's maxStorageBufferRange (" << max_sb_range
+ << ")";
*error_msg = error_str.str();
return false;
} else if (buffer_info->range == VK_WHOLE_SIZE && (buffer_node->createInfo.size - buffer_info->offset) > max_sb_range) {
*error_code = "VUID-VkWriteDescriptorSet-descriptorType-00333";
std::stringstream error_str;
- error_str << "VkDescriptorBufferInfo range is VK_WHOLE_SIZE but effective range "
+ error_str << "For buffer " << report_data->FormatHandle(buffer_node->buffer)
+ << " VkDescriptorBufferInfo range is VK_WHOLE_SIZE but effective range "
<< "(" << (buffer_node->createInfo.size - buffer_info->offset) << ") is greater than this device's "
<< "maxStorageBufferRange (" << max_sb_range << ")";
*error_msg = error_str.str();
@@ -2108,6 +2362,21 @@
}
return true;
}
+
+bool CoreChecks::ValidateAccelerationStructureUpdate(VkAccelerationStructureKHR acc, const char *func_name, std::string *error_code,
+ std::string *error_msg) const {
+ // First make sure that acceleration structure is valid
+ auto acc_node = GetAccelerationStructureState(acc);
+ // Any invalid acc struct should already be caught by object_tracker
+ assert(acc_node);
+ if (ValidateMemoryIsBoundToAccelerationStructure(acc_node, func_name, kVUIDUndefined)) {
+ *error_code = kVUIDUndefined;
+ *error_msg = "No memory bound to acceleration structure.";
+ return false;
+ }
+ return true;
+}
+
// Verify that the contents of the update are ok, but don't perform actual update
bool CoreChecks::VerifyCopyUpdateContents(const VkCopyDescriptorSet *update, const DescriptorSet *src_set,
VkDescriptorType src_type, uint32_t src_index, const DescriptorSet *dst_set,
@@ -2148,7 +2417,8 @@
if (!ValidateSampler(update_sampler)) {
*error_code = "VUID-VkWriteDescriptorSet-descriptorType-00325";
std::stringstream error_str;
- error_str << "Attempted copy update to sampler descriptor with invalid sampler: " << update_sampler << ".";
+ error_str << "Attempted copy update to sampler descriptor with invalid sampler: "
+ << report_data->FormatHandle(update_sampler) << ".";
*error_msg = error_str.str();
return false;
}
@@ -2169,7 +2439,8 @@
if (!ValidateSampler(update_sampler)) {
*error_code = "VUID-VkWriteDescriptorSet-descriptorType-00325";
std::stringstream error_str;
- error_str << "Attempted copy update to sampler descriptor with invalid sampler: " << update_sampler << ".";
+ error_str << "Attempted copy update to sampler descriptor with invalid sampler: "
+ << report_data->FormatHandle(update_sampler) << ".";
*error_msg = error_str.str();
return false;
}
@@ -2179,11 +2450,14 @@
// Validate image
auto image_view = img_samp_desc->GetImageView();
auto image_layout = img_samp_desc->GetImageLayout();
- if (!ValidateImageUpdate(image_view, image_layout, src_type, func_name, error_code, error_msg)) {
- std::stringstream error_str;
- error_str << "Attempted copy update to combined image sampler descriptor failed due to: " << error_msg->c_str();
- *error_msg = error_str.str();
- return false;
+ if (image_view) {
+ if (!ValidateImageUpdate(image_view, image_layout, src_type, func_name, error_code, error_msg)) {
+ std::stringstream error_str;
+ error_str << "Attempted copy update to combined image sampler descriptor failed due to: "
+ << error_msg->c_str();
+ *error_msg = error_str.str();
+ return false;
+ }
}
}
break;
@@ -2195,11 +2469,13 @@
auto img_desc = static_cast<const ImageDescriptor *>(src_desc);
auto image_view = img_desc->GetImageView();
auto image_layout = img_desc->GetImageLayout();
- if (!ValidateImageUpdate(image_view, image_layout, src_type, func_name, error_code, error_msg)) {
- std::stringstream error_str;
- error_str << "Attempted copy update to image descriptor failed due to: " << error_msg->c_str();
- *error_msg = error_str.str();
- return false;
+ if (image_view) {
+ if (!ValidateImageUpdate(image_view, image_layout, src_type, func_name, error_code, error_msg)) {
+ std::stringstream error_str;
+ error_str << "Attempted copy update to image descriptor failed due to: " << error_msg->c_str();
+ *error_msg = error_str.str();
+ return false;
+ }
}
}
break;
@@ -2209,20 +2485,24 @@
const auto src_desc = src_set->GetDescriptorFromGlobalIndex(src_index + di);
if (!src_desc->updated) continue;
auto buffer_view = static_cast<const TexelDescriptor *>(src_desc)->GetBufferView();
- auto bv_state = device_data->GetBufferViewState(buffer_view);
- if (!bv_state) {
- *error_code = "VUID-VkWriteDescriptorSet-descriptorType-00323";
- std::stringstream error_str;
- error_str << "Attempted copy update to texel buffer descriptor with invalid buffer view: " << buffer_view;
- *error_msg = error_str.str();
- return false;
- }
- auto buffer = bv_state->create_info.buffer;
- if (!cvdescriptorset::ValidateBufferUsage(GetBufferState(buffer), src_type, error_code, error_msg)) {
- std::stringstream error_str;
- error_str << "Attempted copy update to texel buffer descriptor failed due to: " << error_msg->c_str();
- *error_msg = error_str.str();
- return false;
+ if (buffer_view) {
+ auto bv_state = device_data->GetBufferViewState(buffer_view);
+ if (!bv_state) {
+ *error_code = "VUID-VkWriteDescriptorSet-descriptorType-02994";
+ std::stringstream error_str;
+ error_str << "Attempted copy update to texel buffer descriptor with invalid buffer view: "
+ << report_data->FormatHandle(buffer_view);
+ *error_msg = error_str.str();
+ return false;
+ }
+ auto buffer = bv_state->create_info.buffer;
+ if (!cvdescriptorset::ValidateBufferUsage(report_data, GetBufferState(buffer), src_type, error_code,
+ error_msg)) {
+ std::stringstream error_str;
+ error_str << "Attempted copy update to texel buffer descriptor failed due to: " << error_msg->c_str();
+ *error_msg = error_str.str();
+ return false;
+ }
}
}
break;
@@ -2232,11 +2512,14 @@
const auto src_desc = src_set->GetDescriptorFromGlobalIndex(src_index + di);
if (!src_desc->updated) continue;
auto buffer = static_cast<const BufferDescriptor *>(src_desc)->GetBuffer();
- if (!cvdescriptorset::ValidateBufferUsage(GetBufferState(buffer), src_type, error_code, error_msg)) {
- std::stringstream error_str;
- error_str << "Attempted copy update to buffer descriptor failed due to: " << error_msg->c_str();
- *error_msg = error_str.str();
- return false;
+ if (buffer) {
+ if (!cvdescriptorset::ValidateBufferUsage(report_data, GetBufferState(buffer), src_type, error_code,
+ error_msg)) {
+ std::stringstream error_str;
+ error_str << "Attempted copy update to buffer descriptor failed due to: " << error_msg->c_str();
+ *error_msg = error_str.str();
+ return false;
+ }
}
}
break;
@@ -2339,7 +2622,8 @@
// descriptor updates and verify that for any binding boundaries that are crossed, the next binding(s) are all consistent
// Consistency means that their type, stage flags, and whether or not they use immutable samplers matches
// If so, return true. If not, fill in error_msg and return false
-bool cvdescriptorset::VerifyUpdateConsistency(DescriptorSetLayout::ConstBindingIterator current_binding, uint32_t offset,
+bool cvdescriptorset::VerifyUpdateConsistency(debug_report_data *report_data,
+ DescriptorSetLayout::ConstBindingIterator current_binding, uint32_t offset,
uint32_t update_count, const char *type, const VkDescriptorSet set,
std::string *error_msg) {
bool pass = true;
@@ -2384,7 +2668,7 @@
if (current_binding.Layout()->IsPushDescriptor()) {
error_str << " push descriptors";
} else {
- error_str << " descriptor set " << set;
+ error_str << " descriptor set " << report_data->FormatHandle(set);
}
error_str << " binding #" << orig_binding.Binding() << " with #" << update_count
<< " descriptors being updated but this update oversteps the bounds of this binding and the next binding is "
@@ -2403,8 +2687,10 @@
// Verify dst layout still valid
if (dest_layout->destroyed) {
*error_code = "VUID-VkWriteDescriptorSet-dstSet-00320";
- string_sprintf(error_msg, "Cannot call %s to perform write update on %s which has been destroyed", func_name,
- dest_set->StringifySetAndLayout().c_str());
+ std::ostringstream str;
+ str << "Cannot call " << func_name << " to perform write update on " << dest_set->StringifySetAndLayout()
+ << " which has been destroyed";
+ *error_msg = str.str();
return false;
}
// Verify dst binding exists
@@ -2544,7 +2830,7 @@
}
// Verify consecutive bindings match (if needed)
- if (!VerifyUpdateConsistency(DescriptorSetLayout::ConstBindingIterator(dest_layout, update->dstBinding),
+ if (!VerifyUpdateConsistency(report_data, DescriptorSetLayout::ConstBindingIterator(dest_layout, update->dstBinding),
update->dstArrayElement, update->descriptorCount, "write update to", dest_set->GetSet(),
error_msg)) {
// TODO : Should break out "consecutive binding updates" language into valid usage statements
@@ -2577,63 +2863,70 @@
auto image_layout = update->pImageInfo[di].imageLayout;
auto sampler = update->pImageInfo[di].sampler;
auto iv_state = GetImageViewState(image_view);
- auto image_state = iv_state->image_state.get();
ImageSamplerDescriptor *desc = (ImageSamplerDescriptor *)dest_set->GetDescriptorFromGlobalIndex(index + di);
- if (!ValidateImageUpdate(image_view, image_layout, update->descriptorType, func_name, error_code, error_msg)) {
- std::stringstream error_str;
- error_str << "Attempted write update to combined image sampler descriptor failed due to: "
- << error_msg->c_str();
- *error_msg = error_str.str();
- return false;
- }
- if (device_extensions.vk_khr_sampler_ycbcr_conversion) {
- if (desc->IsImmutableSampler()) {
- auto sampler_state = GetSamplerState(desc->GetSampler());
- if (iv_state && sampler_state) {
- if (iv_state->samplerConversion != sampler_state->samplerConversion) {
- *error_code = "VUID-VkWriteDescriptorSet-descriptorType-01948";
+ if (image_view) {
+ auto image_state = iv_state->image_state.get();
+ if (!ValidateImageUpdate(image_view, image_layout, update->descriptorType, func_name, error_code, error_msg)) {
+ std::stringstream error_str;
+ error_str << "Attempted write update to combined image sampler descriptor failed due to: "
+ << error_msg->c_str();
+ *error_msg = error_str.str();
+ return false;
+ }
+ if (device_extensions.vk_khr_sampler_ycbcr_conversion) {
+ if (desc->IsImmutableSampler()) {
+ auto sampler_state = GetSamplerState(desc->GetSampler());
+ if (iv_state && sampler_state) {
+ if (iv_state->samplerConversion != sampler_state->samplerConversion) {
+ *error_code = "VUID-VkWriteDescriptorSet-descriptorType-01948";
+ std::stringstream error_str;
+ error_str
+ << "Attempted write update to combined image sampler and image view and sampler ycbcr "
+ "conversions are not identical, sampler: "
+ << report_data->FormatHandle(desc->GetSampler())
+ << " image view: " << report_data->FormatHandle(iv_state->image_view) << ".";
+ *error_msg = error_str.str();
+ return false;
+ }
+ }
+ } else {
+ if (iv_state && (iv_state->samplerConversion != VK_NULL_HANDLE)) {
+ *error_code = "VUID-VkWriteDescriptorSet-descriptorType-02738";
std::stringstream error_str;
- error_str << "Attempted write update to combined image sampler and image view and sampler ycbcr "
- "conversions are not identical, sampler: "
- << desc->GetSampler() << " image view: " << iv_state->image_view << ".";
+ error_str << "Because dstSet (" << report_data->FormatHandle(update->dstSet)
+ << ") is bound to image view (" << report_data->FormatHandle(iv_state->image_view)
+ << ") that includes a YCBCR conversion, it must have been allocated with a layout that "
+ "includes an immutable sampler.";
*error_msg = error_str.str();
return false;
}
}
- } else {
- if (iv_state && (iv_state->samplerConversion != VK_NULL_HANDLE)) {
- *error_code = "VUID-VkWriteDescriptorSet-descriptorType-02738";
+ }
+ if (sampler && !desc->IsImmutableSampler() && FormatIsMultiplane(image_state->createInfo.format)) {
+ // multiplane formats must be created with mutable format bit
+ if (0 == (image_state->createInfo.flags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT)) {
+ *error_code = "VUID-VkDescriptorImageInfo-sampler-01564";
std::stringstream error_str;
- error_str << "Because dstSet (" << update->dstSet << ") is bound to image view ("
- << iv_state->image_view
- << ") that includes a YCBCR conversion, it must have been allocated with a layout that "
- "includes an immutable sampler.";
+ error_str << "image " << report_data->FormatHandle(image_state->image)
+ << " combined image sampler is a multi-planar "
+ << "format and was not was not created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT";
*error_msg = error_str.str();
return false;
}
- }
- }
- if (sampler && !desc->IsImmutableSampler() && FormatIsMultiplane(image_state->createInfo.format)) {
- // multiplane formats must be created with mutable format bit
- if (0 == (image_state->createInfo.flags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT)) {
- *error_code = "VUID-VkDescriptorImageInfo-sampler-01564";
- std::stringstream error_str;
- error_str << "image " << HandleToUint64(image_state->image) << " combined image sampler is a multi-planar "
- << "format and was not was not created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT";
- *error_msg = error_str.str();
- return false;
- }
- // image view need aspect mask for only the planes supported of format
- VkImageAspectFlags legal_aspect_flags = (VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT);
- legal_aspect_flags |= (FormatPlaneCount(image_state->createInfo.format) == 3) ? VK_IMAGE_ASPECT_PLANE_2_BIT : 0;
- if (0 != (iv_state->create_info.subresourceRange.aspectMask & (~legal_aspect_flags))) {
- *error_code = "VUID-VkDescriptorImageInfo-sampler-01564";
- std::stringstream error_str;
- error_str << "image " << HandleToUint64(image_state->image) << " combined image sampler is a multi-planar "
- << "format and " << HandleToUint64(iv_state->image_view) << " aspectMask must only include "
- << string_VkImageAspectFlags(legal_aspect_flags).c_str();
- *error_msg = error_str.str();
- return false;
+ // image view need aspect mask for only the planes supported of format
+ VkImageAspectFlags legal_aspect_flags = (VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT);
+ legal_aspect_flags |=
+ (FormatPlaneCount(image_state->createInfo.format) == 3) ? VK_IMAGE_ASPECT_PLANE_2_BIT : 0;
+ if (0 != (iv_state->create_info.subresourceRange.aspectMask & (~legal_aspect_flags))) {
+ *error_code = "VUID-VkDescriptorImageInfo-sampler-01564";
+ std::stringstream error_str;
+ error_str << "image " << report_data->FormatHandle(image_state->image)
+ << " combined image sampler is a multi-planar "
+ << "format and " << report_data->FormatHandle(iv_state->image_view)
+ << " aspectMask must only include " << string_VkImageAspectFlags(legal_aspect_flags);
+ *error_msg = error_str.str();
+ return false;
+ }
}
}
}
@@ -2647,7 +2940,7 @@
*error_code = "VUID-VkWriteDescriptorSet-descriptorType-00325";
std::stringstream error_str;
error_str << "Attempted write update to sampler descriptor with invalid sampler: "
- << update->pImageInfo[di].sampler << ".";
+ << report_data->FormatHandle(update->pImageInfo[di].sampler) << ".";
*error_msg = error_str.str();
return false;
}
@@ -2667,11 +2960,13 @@
for (uint32_t di = 0; di < update->descriptorCount; ++di) {
auto image_view = update->pImageInfo[di].imageView;
auto image_layout = update->pImageInfo[di].imageLayout;
- if (!ValidateImageUpdate(image_view, image_layout, update->descriptorType, func_name, error_code, error_msg)) {
- std::stringstream error_str;
- error_str << "Attempted write update to image descriptor failed due to: " << error_msg->c_str();
- *error_msg = error_str.str();
- return false;
+ if (image_view) {
+ if (!ValidateImageUpdate(image_view, image_layout, update->descriptorType, func_name, error_code, error_msg)) {
+ std::stringstream error_str;
+ error_str << "Attempted write update to image descriptor failed due to: " << error_msg->c_str();
+ *error_msg = error_str.str();
+ return false;
+ }
}
}
break;
@@ -2680,29 +2975,33 @@
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: {
for (uint32_t di = 0; di < update->descriptorCount; ++di) {
auto buffer_view = update->pTexelBufferView[di];
- auto bv_state = GetBufferViewState(buffer_view);
- if (!bv_state) {
- *error_code = "VUID-VkWriteDescriptorSet-descriptorType-00323";
- std::stringstream error_str;
- error_str << "Attempted write update to texel buffer descriptor with invalid buffer view: " << buffer_view;
- *error_msg = error_str.str();
- return false;
- }
- auto buffer = bv_state->create_info.buffer;
- auto buffer_state = GetBufferState(buffer);
- // Verify that buffer underlying the view hasn't been destroyed prematurely
- if (!buffer_state) {
- *error_code = "VUID-VkWriteDescriptorSet-descriptorType-00323";
- std::stringstream error_str;
- error_str << "Attempted write update to texel buffer descriptor failed because underlying buffer (" << buffer
- << ") has been destroyed: " << error_msg->c_str();
- *error_msg = error_str.str();
- return false;
- } else if (!cvdescriptorset::ValidateBufferUsage(buffer_state, update->descriptorType, error_code, error_msg)) {
- std::stringstream error_str;
- error_str << "Attempted write update to texel buffer descriptor failed due to: " << error_msg->c_str();
- *error_msg = error_str.str();
- return false;
+ if (buffer_view) {
+ auto bv_state = GetBufferViewState(buffer_view);
+ if (!bv_state) {
+ *error_code = "VUID-VkWriteDescriptorSet-descriptorType-02994";
+ std::stringstream error_str;
+ error_str << "Attempted write update to texel buffer descriptor with invalid buffer view: "
+ << report_data->FormatHandle(buffer_view);
+ *error_msg = error_str.str();
+ return false;
+ }
+ auto buffer = bv_state->create_info.buffer;
+ auto buffer_state = GetBufferState(buffer);
+ // Verify that buffer underlying the view hasn't been destroyed prematurely
+ if (!buffer_state) {
+ *error_code = "VUID-VkWriteDescriptorSet-descriptorType-02994";
+ std::stringstream error_str;
+ error_str << "Attempted write update to texel buffer descriptor failed because underlying buffer ("
+ << report_data->FormatHandle(buffer) << ") has been destroyed: " << error_msg->c_str();
+ *error_msg = error_str.str();
+ return false;
+ } else if (!cvdescriptorset::ValidateBufferUsage(report_data, buffer_state, update->descriptorType, error_code,
+ error_msg)) {
+ std::stringstream error_str;
+ error_str << "Attempted write update to texel buffer descriptor failed due to: " << error_msg->c_str();
+ *error_msg = error_str.str();
+ return false;
+ }
}
}
break;
@@ -2712,20 +3011,32 @@
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: {
for (uint32_t di = 0; di < update->descriptorCount; ++di) {
- if (!ValidateBufferUpdate(update->pBufferInfo + di, update->descriptorType, func_name, error_code, error_msg)) {
- std::stringstream error_str;
- error_str << "Attempted write update to buffer descriptor failed due to: " << error_msg->c_str();
- *error_msg = error_str.str();
- return false;
+ if (update->pBufferInfo[di].buffer) {
+ if (!ValidateBufferUpdate(update->pBufferInfo + di, update->descriptorType, func_name, error_code, error_msg)) {
+ std::stringstream error_str;
+ error_str << "Attempted write update to buffer descriptor failed due to: " << error_msg->c_str();
+ *error_msg = error_str.str();
+ return false;
+ }
}
}
break;
}
case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT:
break;
- case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV:
- // XXX TODO
- break;
+ case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV: {
+ const auto *accInfo = lvl_find_in_chain<VkWriteDescriptorSetAccelerationStructureKHR>(update->pNext);
+ for (uint32_t di = 0; di < update->descriptorCount; ++di) {
+ if (!ValidateAccelerationStructureUpdate(accInfo->pAccelerationStructures[di], func_name, error_code, error_msg)) {
+ std::stringstream error_str;
+ error_str << "Attempted write update to acceleration structure descriptor failed due to: "
+ << error_msg->c_str();
+ *error_msg = error_str.str();
+ return false;
+ }
+ }
+
+ } break;
default:
assert(0); // We've already verified update type so should never get here
break;
diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h
index 729d012..8496e4a 100644
--- a/layers/descriptor_sets.h
+++ b/layers/descriptor_sets.h
@@ -499,15 +499,17 @@
class AccelerationStructureDescriptor : public Descriptor {
public:
- AccelerationStructureDescriptor(const VkDescriptorType) {
- updated = false;
- descriptor_class = AccelerationStructure;
- }
- void WriteUpdate(const ValidationStateTracker *dev_data, const VkWriteDescriptorSet *, const uint32_t) override {
- updated = true;
- }
- void CopyUpdate(const ValidationStateTracker *dev_data, const Descriptor *) override { updated = true; }
- void UpdateDrawState(ValidationStateTracker *, CMD_BUFFER_STATE *) override {}
+ AccelerationStructureDescriptor(const VkDescriptorType);
+ void WriteUpdate(const ValidationStateTracker *dev_data, const VkWriteDescriptorSet *, const uint32_t) override;
+ VkAccelerationStructureKHR GetAccelerationStructure() const { return acc_; }
+ const ACCELERATION_STRUCTURE_STATE *GetAccelerationStructureState() const { return acc_state_.get(); }
+ ACCELERATION_STRUCTURE_STATE *GetAccelerationStructureState() { return acc_state_.get(); }
+ void CopyUpdate(const ValidationStateTracker *dev_data, const Descriptor *) override;
+ void UpdateDrawState(ValidationStateTracker *, CMD_BUFFER_STATE *) override;
+
+ private:
+ VkAccelerationStructureKHR acc_;
+ std::shared_ptr<ACCELERATION_STRUCTURE_STATE> acc_state_;
};
union AnyDescriptor {
@@ -539,7 +541,8 @@
struct AllocateDescriptorSetsData {
std::map<uint32_t, uint32_t> required_descriptors_by_type;
std::vector<std::shared_ptr<DescriptorSetLayout const>> layout_nodes;
- AllocateDescriptorSetsData(uint32_t);
+ void Init(uint32_t);
+ AllocateDescriptorSetsData(){};
};
// Helper functions for descriptor set functions that cross multiple sets
// "Validate" will make sure an update is ok without actually performing it
@@ -553,11 +556,13 @@
// TODO: migrate out of descriptor_set.cpp/h
// For a particular binding starting at offset and having update_count descriptors
// updated, verify that for any binding boundaries crossed, the update is consistent
-bool VerifyUpdateConsistency(DescriptorSetLayout::ConstBindingIterator current_binding, uint32_t offset, uint32_t update_count,
- const char *type, const VkDescriptorSet set, std::string *error_msg);
+bool VerifyUpdateConsistency(debug_report_data *report_data, DescriptorSetLayout::ConstBindingIterator current_binding,
+ uint32_t offset, uint32_t update_count, const char *type, const VkDescriptorSet set,
+ std::string *error_msg);
// Validate buffer descriptor update info
-bool ValidateBufferUsage(BUFFER_STATE const *buffer_node, VkDescriptorType type, std::string *error_code, std::string *error_msg);
+bool ValidateBufferUsage(debug_report_data *report_data, BUFFER_STATE const *buffer_node, VkDescriptorType type,
+ std::string *error_code, std::string *error_msg);
// Helper class to encapsulate the descriptor update template decoding logic
struct DecodedTemplateUpdate {
@@ -623,7 +628,7 @@
VkDescriptorSet GetSet() const { return set_; };
// Bind given cmd_buffer to this descriptor set and
// update CB image layout map with image/imagesampler descriptor image layouts
- void UpdateDrawState(ValidationStateTracker *, CMD_BUFFER_STATE *, const PIPELINE_STATE *,
+ void UpdateDrawState(ValidationStateTracker *, CMD_BUFFER_STATE *, CMD_TYPE cmd_type, const PIPELINE_STATE *,
const std::map<uint32_t, descriptor_req> &);
// Track work that has been bound or validated to avoid duplicate work, important when large descriptor arrays
diff --git a/layers/drawdispatch.cpp b/layers/drawdispatch.cpp
index 7c232aa..3d5e866 100644
--- a/layers/drawdispatch.cpp
+++ b/layers/drawdispatch.cpp
@@ -33,6 +33,7 @@
* Author: Tony Barbour <tony@LunarG.com>
* Author: John Zulauf <jzulauf@lunarg.com>
* Author: Shannon McPherson <shannon@lunarg.com>
+ * Author: Jeremy Kniager <jeremyk@lunarg.com>
*/
#include "chassis.h"
@@ -46,40 +47,88 @@
"VUID-vkCmdDraw-renderpass",
"VUID-vkCmdDraw-None-02700",
"VUID-vkCmdDraw-commandBuffer-02701",
- "VUID-vkCmdDraw-None-02720",
+ "VUID-vkCmdDraw-None-04007",
+ "VUID-vkCmdDraw-None-04008",
"VUID-vkCmdDraw-None-02697",
"VUID-vkCmdDraw-renderPass-02684",
- "VUID-vkCmdDraw-subpass-02685"
+ "VUID-vkCmdDraw-subpass-02685",
+ "VUID-vkCmdDraw-sampleLocationsEnable-02689",
+ "VUID-vkCmdDraw-None-02690",
+ "VUID-vkCmdDraw-None-02692",
+ kVUIDUndefined, // indirect_protected_cb
+ kVUIDUndefined, // indirect_contiguous_memory;
+ kVUIDUndefined, // indirect_buffer_bit
+ "VUID-vkCmdDraw-viewportCount-03417",
+ "VUID-vkCmdDraw-scissorCount-03418",
+ "VUID-vkCmdDraw-viewportCount-03419",
+ "VUID-vkCmdDraw-primitiveTopology-03420",
+ "VUID-vkCmdDraw-flags-02696",
}},
{CMD_DRAWINDEXED, {
"VUID-vkCmdDrawIndexed-commandBuffer-cmdpool",
"VUID-vkCmdDrawIndexed-renderpass",
"VUID-vkCmdDrawIndexed-None-02700",
"VUID-vkCmdDrawIndexed-commandBuffer-02701",
- "VUID-vkCmdDrawIndexed-None-02720",
+ "VUID-vkCmdDrawIndexed-None-04007",
+ "VUID-vkCmdDrawIndexed-None-04008",
"VUID-vkCmdDrawIndexed-None-02697",
"VUID-vkCmdDrawIndexed-renderPass-02684",
- "VUID-vkCmdDrawIndexed-subpass-02685"
+ "VUID-vkCmdDrawIndexed-subpass-02685",
+ "VUID-vkCmdDrawIndexed-sampleLocationsEnable-02689",
+ "VUID-vkCmdDrawIndexed-None-02690",
+ "VUID-vkCmdDrawIndexed-None-02692",
+ kVUIDUndefined, // indirect_protected_cb
+ kVUIDUndefined, // indirect_contiguous_memory;
+ kVUIDUndefined, // indirect_buffer_bit
+ "VUID-vkCmdDrawIndexed-viewportCount-03417",
+ "VUID-vkCmdDrawIndexed-scissorCount-03418",
+ "VUID-vkCmdDrawIndexed-viewportCount-03419",
+ "VUID-vkCmdDrawIndexed-primitiveTopology-03420",
+ "VUID-vkCmdDrawIndexed-flags-02696",
}},
{CMD_DRAWINDIRECT, {
"VUID-vkCmdDrawIndirect-commandBuffer-cmdpool",
"VUID-vkCmdDrawIndirect-renderpass",
"VUID-vkCmdDrawIndirect-None-02700",
"VUID-vkCmdDrawIndirect-commandBuffer-02701",
- "VUID-vkCmdDrawIndirect-None-02720",
+ "VUID-vkCmdDrawIndirect-None-04007",
+ "VUID-vkCmdDrawIndirect-None-04008",
"VUID-vkCmdDrawIndirect-None-02697",
"VUID-vkCmdDrawIndirect-renderPass-02684",
- "VUID-vkCmdDrawIndirect-subpass-02685"
+ "VUID-vkCmdDrawIndirect-subpass-02685",
+ "VUID-vkCmdDrawIndirect-sampleLocationsEnable-02689",
+ "VUID-vkCmdDrawIndirect-None-02690",
+ "VUID-vkCmdDrawIndirect-None-02692",
+ "VUID-vkCmdDrawIndirect-commandBuffer-02711",
+ "VUID-vkCmdDrawIndirect-buffer-02708",
+ "VUID-vkCmdDrawIndirect-buffer-02709",
+ "VUID-vkCmdDrawIndirect-viewportCount-03417",
+ "VUID-vkCmdDrawIndirect-scissorCount-03418",
+ "VUID-vkCmdDrawIndirect-viewportCount-03419",
+ "VUID-vkCmdDrawIndirect-primitiveTopology-03420",
+ "VUID-vkCmdDrawIndirect-flags-02696",
}},
{CMD_DRAWINDEXEDINDIRECT, {
"VUID-vkCmdDrawIndexedIndirect-commandBuffer-cmdpool",
"VUID-vkCmdDrawIndexedIndirect-renderpass",
"VUID-vkCmdDrawIndexedIndirect-None-02700",
"VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701",
- "VUID-vkCmdDrawIndexedIndirect-None-02720",
+ "VUID-vkCmdDrawIndexedIndirect-None-04007",
+ "VUID-vkCmdDrawIndexedIndirect-None-04008",
"VUID-vkCmdDrawIndexedIndirect-None-02697",
"VUID-vkCmdDrawIndexedIndirect-renderPass-02684",
- "VUID-vkCmdDrawIndexedIndirect-subpass-02685"
+ "VUID-vkCmdDrawIndexedIndirect-subpass-02685",
+ "VUID-vkCmdDrawIndexedIndirect-sampleLocationsEnable-02689",
+ "VUID-vkCmdDrawIndexedIndirect-None-02690",
+ "VUID-vkCmdDrawIndexedIndirect-None-02692",
+ "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711",
+ "VUID-vkCmdDrawIndexedIndirect-buffer-02708",
+ "VUID-vkCmdDrawIndexedIndirect-buffer-02709",
+ "VUID-vkCmdDrawIndexedIndirect-viewportCount-03417",
+ "VUID-vkCmdDrawIndexedIndirect-scissorCount-03418",
+ "VUID-vkCmdDrawIndexedIndirect-viewportCount-03419",
+ "VUID-vkCmdDrawIndexedIndirect-primitiveTopology-03420",
+ "VUID-vkCmdDrawIndexedIndirect-flags-02696",
}},
{CMD_DISPATCH, {
"VUID-vkCmdDispatch-commandBuffer-cmdpool",
@@ -87,9 +136,21 @@
"VUID-vkCmdDispatch-None-02700",
kVUIDUndefined, // dynamic_state
kVUIDUndefined, // vertex_binding
+ kVUIDUndefined, // vertex_binding_null
"VUID-vkCmdDispatch-None-02697",
kVUIDUndefined, // render_pass_compatible
kVUIDUndefined, // subpass_index
+ kVUIDUndefined, // sample_location
+ "VUID-vkCmdDispatch-None-02690",
+ "VUID-vkCmdDispatch-None-02692",
+ kVUIDUndefined, // indirect_protected_cb
+ kVUIDUndefined, // indirect_contiguous_memory;
+ kVUIDUndefined, // indirect_buffer_bit
+ kVUIDUndefined, // viewport_count
+ kVUIDUndefined, // scissor_count
+ kVUIDUndefined, // viewport_scissor_count
+ kVUIDUndefined, // primitive_topology
+ "VUID-vkCmdDispatch-flags-02696",
}},
{CMD_DISPATCHINDIRECT, {
"VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool",
@@ -97,29 +158,65 @@
"VUID-vkCmdDispatchIndirect-None-02700",
kVUIDUndefined, // dynamic_state
kVUIDUndefined, // vertex_binding
+ kVUIDUndefined, // vertex_binding_null
"VUID-vkCmdDispatchIndirect-None-02697",
kVUIDUndefined, // render_pass_compatible
kVUIDUndefined, // subpass_index
+ kVUIDUndefined, // sample_location
+ "VUID-vkCmdDispatchIndirect-None-02690",
+ "VUID-vkCmdDispatchIndirect-None-02692",
+ "VUID-vkCmdDispatchIndirect-commandBuffer-02711",
+ "VUID-vkCmdDispatchIndirect-buffer-02708",
+ "VUID-vkCmdDispatchIndirect-buffer-02709",
+ kVUIDUndefined, // viewport_count
+ kVUIDUndefined, // scissor_count
+ kVUIDUndefined, // viewport_scissor_count
+ kVUIDUndefined, // primitive_topology
+ "VUID-vkCmdDispatchIndirect-flags-02696",
}},
{CMD_DRAWINDIRECTCOUNT, {
"VUID-vkCmdDrawIndirectCount-commandBuffer-cmdpool",
"VUID-vkCmdDrawIndirectCount-renderpass",
"VUID-vkCmdDrawIndirectCount-None-02700",
"VUID-vkCmdDrawIndirectCount-commandBuffer-02701",
- "VUID-vkCmdDrawIndirectCount-None-02720",
+ "VUID-vkCmdDrawIndirectCount-None-04007",
+ "VUID-vkCmdDrawIndirectCount-None-04008",
"VUID-vkCmdDrawIndirectCount-None-02697",
"VUID-vkCmdDrawIndirectCount-renderPass-02684",
- "VUID-vkCmdDrawIndirectCount-subpass-02685"
+ "VUID-vkCmdDrawIndirectCount-subpass-02685",
+ "VUID-vkCmdDrawIndirectCount-sampleLocationsEnable-02689",
+ "VUID-vkCmdDrawIndirectCount-None-02690",
+ "VUID-vkCmdDrawIndirectCount-None-02692",
+ "VUID-vkCmdDrawIndirectCount-commandBuffer-02711",
+ "VUID-vkCmdDrawIndirectCount-buffer-02708",
+ "VUID-vkCmdDrawIndirectCount-buffer-02709",
+ "VUID-vkCmdDrawIndirectCount-viewportCount-03417",
+ "VUID-vkCmdDrawIndirectCount-scissorCount-03418",
+ "VUID-vkCmdDrawIndirectCount-viewportCount-03419",
+ "VUID-vkCmdDrawIndirectCount-primitiveTopology-03420",
+ "VUID-vkCmdDrawIndirectCount-flags-02696",
}},
{CMD_DRAWINDEXEDINDIRECTCOUNT,{
"VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-cmdpool",
"VUID-vkCmdDrawIndexedIndirectCount-renderpass",
"VUID-vkCmdDrawIndexedIndirectCount-None-02700",
"VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701",
- "VUID-vkCmdDrawIndexedIndirectCount-None-02720",
+ "VUID-vkCmdDrawIndexedIndirectCount-None-04007",
+ "VUID-vkCmdDrawIndexedIndirectCount-None-04008",
"VUID-vkCmdDrawIndexedIndirectCount-None-02697",
"VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684",
- "VUID-vkCmdDrawIndexedIndirectCount-subpass-02685"
+ "VUID-vkCmdDrawIndexedIndirectCount-subpass-02685",
+ "VUID-vkCmdDrawIndexedIndirectCount-sampleLocationsEnable-02689",
+ "VUID-vkCmdDrawIndexedIndirectCount-None-02690",
+ "VUID-vkCmdDrawIndexedIndirectCount-None-02692",
+ "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02711",
+ "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708",
+ "VUID-vkCmdDrawIndexedIndirectCount-buffer-02709",
+ "VUID-vkCmdDrawIndexedIndirectCount-viewportCount-03417",
+ "VUID-vkCmdDrawIndexedIndirectCount-scissorCount-03418",
+ "VUID-vkCmdDrawIndexedIndirectCount-viewportCount-03419",
+ "VUID-vkCmdDrawIndexedIndirectCount-primitiveTopology-03420",
+ "VUID-vkCmdDrawIndexedIndirectCount-flags-02696",
}},
{CMD_TRACERAYSNV, {
"VUID-vkCmdTraceRaysNV-commandBuffer-cmdpool",
@@ -127,9 +224,21 @@
"VUID-vkCmdTraceRaysNV-None-02700",
"VUID-vkCmdTraceRaysNV-commandBuffer-02701",
kVUIDUndefined, // vertex_binding
+ kVUIDUndefined, // vertex_binding_null
"VUID-vkCmdTraceRaysNV-None-02697",
kVUIDUndefined, // render_pass_compatible
kVUIDUndefined, // subpass_index
+ kVUIDUndefined, // sample_location
+ "VUID-vkCmdTraceRaysNV-None-02690",
+ "VUID-vkCmdTraceRaysNV-None-02692",
+ kVUIDUndefined, // indirect_protected_cb
+ kVUIDUndefined, // indirect_contiguous_memory;
+ kVUIDUndefined, // indirect_buffer_bit
+ kVUIDUndefined, // viewport_count
+ kVUIDUndefined, // scissor_count
+ kVUIDUndefined, // viewport_scissor_count
+ kVUIDUndefined, // primitive_topology
+ "VUID-vkCmdTraceRaysNV-flags-02696",
}},
{CMD_TRACERAYSKHR, {
"VUID-vkCmdTraceRaysKHR-commandBuffer-cmdpool",
@@ -137,9 +246,21 @@
"VUID-vkCmdTraceRaysKHR-None-02700",
"VUID-vkCmdTraceRaysKHR-commandBuffer-02701",
kVUIDUndefined, // vertex_binding
+ kVUIDUndefined, // vertex_binding_null
"VUID-vkCmdTraceRaysKHR-None-02697",
kVUIDUndefined, // render_pass_compatible
kVUIDUndefined, // subpass_index
+ kVUIDUndefined, // sample_location
+ "VUID-vkCmdTraceRaysKHR-None-02690",
+ "VUID-vkCmdTraceRaysKHR-None-02692",
+ kVUIDUndefined, // indirect_protected_cb
+ kVUIDUndefined, // indirect_contiguous_memory;
+ kVUIDUndefined, // indirect_buffer_bit
+ kVUIDUndefined, // viewport_count
+ kVUIDUndefined, // scissor_count
+ kVUIDUndefined, // viewport_scissor_count
+ kVUIDUndefined, // primitive_topology
+ "VUID-vkCmdTraceRaysKHR-flags-02696",
}},
{CMD_TRACERAYSINDIRECTKHR, {
"VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-cmdpool",
@@ -147,9 +268,21 @@
"VUID-vkCmdTraceRaysIndirectKHR-None-02700",
"VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02701",
kVUIDUndefined, // vertex_binding
+ kVUIDUndefined, // vertex_binding_null
"VUID-vkCmdTraceRaysIndirectKHR-None-02697",
kVUIDUndefined, // render_pass_compatible
kVUIDUndefined, // subpass_index
+ kVUIDUndefined, // sample_location
+ "VUID-vkCmdTraceRaysIndirectKHR-None-02690",
+ "VUID-vkCmdTraceRaysIndirectKHR-None-02692",
+ "VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02711",
+ "VUID-vkCmdTraceRaysIndirectKHR-buffer-02708",
+ "VUID-vkCmdTraceRaysIndirectKHR-buffer-02709",
+ kVUIDUndefined, // viewport_count
+ kVUIDUndefined, // scissor_count
+ kVUIDUndefined, // viewport_scissor_count
+ kVUIDUndefined, // primitive_topology
+ "VUID-vkCmdTraceRaysIndirectKHR-flags-02696",
}},
{CMD_DRAWMESHTASKSNV, {
"VUID-vkCmdDrawMeshTasksNV-commandBuffer-cmdpool",
@@ -157,9 +290,21 @@
"VUID-vkCmdDrawMeshTasksNV-None-02700",
"VUID-vkCmdDrawMeshTasksNV-commandBuffer-02701",
kVUIDUndefined, // vertex_binding
+ kVUIDUndefined, // vertex_binding_null
"VUID-vkCmdDrawMeshTasksNV-None-02697",
"VUID-vkCmdDrawMeshTasksNV-renderPass-02684",
- "VUID-vkCmdDrawMeshTasksNV-subpass-02685"
+ "VUID-vkCmdDrawMeshTasksNV-subpass-02685",
+ "VUID-vkCmdDrawMeshTasksNV-sampleLocationsEnable-02689",
+ "VUID-vkCmdDrawMeshTasksNV-None-02690",
+ "VUID-vkCmdDrawMeshTasksNV-None-02692",
+ kVUIDUndefined, // indirect_protected_cb
+ kVUIDUndefined, // indirect_contiguous_memory;
+ kVUIDUndefined, // indirect_buffer_bit
+ "VUID-vkCmdDrawMeshTasksNV-viewportCount-03417",
+ "VUID-vkCmdDrawMeshTasksNV-scissorCount-03418",
+ "VUID-vkCmdDrawMeshTasksNV-viewportCount-03419",
+ "VUID-vkCmdDrawMeshTasksNV-primitiveTopology-03420",
+ "VUID-vkCmdDrawMeshTasksNV-flags-02696",
}},
{CMD_DRAWMESHTASKSINDIRECTNV, {
"VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-cmdpool",
@@ -167,9 +312,21 @@
"VUID-vkCmdDrawMeshTasksIndirectNV-None-02700",
"VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02701",
kVUIDUndefined, // vertex_binding
+ kVUIDUndefined, // vertex_binding_null
"VUID-vkCmdDrawMeshTasksIndirectNV-None-02697",
"VUID-vkCmdDrawMeshTasksIndirectNV-renderPass-02684",
- "VUID-vkCmdDrawMeshTasksIndirectNV-subpass-02685"
+ "VUID-vkCmdDrawMeshTasksIndirectNV-subpass-02685",
+ "VUID-vkCmdDrawMeshTasksIndirectNV-sampleLocationsEnable-02689",
+ "VUID-vkCmdDrawMeshTasksIndirectNV-None-02690",
+ "VUID-vkCmdDrawMeshTasksIndirectNV-None-02692",
+ "VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02711",
+ "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02708",
+ "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02709",
+ "VUID-vkCmdDrawMeshTasksIndirectNV-viewportCount-03417",
+ "VUID-vkCmdDrawMeshTasksIndirectNV-scissorCount-03418",
+ "VUID-vkCmdDrawMeshTasksIndirectNV-viewportCount-03419",
+ "VUID-vkCmdDrawMeshTasksIndirectNV-primitiveTopology-03420",
+ "VUID-vkCmdDrawMeshTasksIndirectNV-flags-02696",
}},
{CMD_DRAWMESHTASKSINDIRECTCOUNTNV, {
"VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-cmdpool",
@@ -177,12 +334,45 @@
"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02700",
"VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02701",
kVUIDUndefined, // vertex_binding
+ kVUIDUndefined, // vertex_binding_null
"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02697",
"VUID-vkCmdDrawMeshTasksIndirectCountNV-renderPass-02684",
- "VUID-vkCmdDrawMeshTasksIndirectCountNV-subpass-02685"
+ "VUID-vkCmdDrawMeshTasksIndirectCountNV-subpass-02685",
+ "VUID-vkCmdDrawMeshTasksIndirectCountNV-sampleLocationsEnable-02689",
+ "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02690",
+ "VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02692",
+ "VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02711",
+ "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02708",
+ "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02709",
+ "VUID-vkCmdDrawMeshTasksIndirectCountNV-viewportCount-03417",
+ "VUID-vkCmdDrawMeshTasksIndirectCountNV-scissorCount-03418",
+ "VUID-vkCmdDrawMeshTasksIndirectCountNV-viewportCount-03419",
+ "VUID-vkCmdDrawMeshTasksIndirectCountNV-primitiveTopology-03420",
+ "VUID-vkCmdDrawMeshTasksIndirectCountNV-flags-02696",
}},
// Used if invalid cmd_type is used
- {CMD_NONE, {kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined, kVUIDUndefined}}
+ {CMD_NONE, {
+ kVUIDUndefined,
+ kVUIDUndefined,
+ kVUIDUndefined,
+ kVUIDUndefined,
+ kVUIDUndefined,
+ kVUIDUndefined,
+ kVUIDUndefined,
+ kVUIDUndefined,
+ kVUIDUndefined,
+ kVUIDUndefined,
+ kVUIDUndefined,
+ kVUIDUndefined,
+ kVUIDUndefined,
+ kVUIDUndefined,
+ kVUIDUndefined,
+ kVUIDUndefined,
+ kVUIDUndefined,
+ kVUIDUndefined,
+ kVUIDUndefined,
+ kVUIDUndefined,
+ }}
};
// clang-format on
@@ -250,9 +440,7 @@
bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECT, "vkCmdDrawIndirect()",
VK_QUEUE_GRAPHICS_BIT);
const BUFFER_STATE *buffer_state = GetBufferState(buffer);
- skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndirect()", "VUID-vkCmdDrawIndirect-buffer-02708");
- skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true, "VUID-vkCmdDrawIndirect-buffer-02709",
- "vkCmdDrawIndirect()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
+ skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDIRECT, "vkCmdDrawIndirect()");
if (count > 1) {
skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirect-drawCount-00476", stride,
"VkDrawIndirectCommand", sizeof(VkDrawIndirectCommand));
@@ -270,10 +458,7 @@
bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECT,
"vkCmdDrawIndexedIndirect()", VK_QUEUE_GRAPHICS_BIT);
const BUFFER_STATE *buffer_state = GetBufferState(buffer);
- skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndexedIndirect()", "VUID-vkCmdDrawIndexedIndirect-buffer-02708");
- skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
- "VUID-vkCmdDrawIndexedIndirect-buffer-02709", "vkCmdDrawIndexedIndirect()",
- "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
+ skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDEXEDINDIRECT, "vkCmdDrawIndexedIndirect()");
if (count > 1) {
skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-drawCount-00528", stride,
"VkDrawIndexedIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
@@ -297,26 +482,18 @@
bool CoreChecks::PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const {
bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_COMPUTE, CMD_DISPATCHINDIRECT,
"vkCmdDispatchIndirect()", VK_QUEUE_COMPUTE_BIT);
- const BUFFER_STATE *buffer_state = GetBufferState(buffer);
- skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDispatchIndirect()", "VUID-vkCmdDispatchIndirect-buffer-02708");
- skip |=
- ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true, "VUID-vkCmdDispatchIndirect-buffer-02709",
- "vkCmdDispatchIndirect()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
+ skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DISPATCHINDIRECT, "vkCmdDispatchIndirect()");
return skip;
}
bool CoreChecks::ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
uint32_t stride, const char *apiName) const {
bool skip = false;
- if (offset & 3) {
- skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndirectCount-offset-02710",
- "%s() parameter, VkDeviceSize offset (0x%" PRIxLEAST64 "), is not a multiple of 4.", apiName, offset);
- }
-
- if (countBufferOffset & 3) {
- skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndirectCount-countBufferOffset-02716",
- "%s() parameter, VkDeviceSize countBufferOffset (0x%" PRIxLEAST64 "), is not a multiple of 4.", apiName,
- countBufferOffset);
+ if ((api_version >= VK_API_VERSION_1_2) && (enabled_features.core12.drawIndirectCount == VK_FALSE)) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndirectCount-None-02836",
+ "%s(): Starting in Vulkan 1.2 the VkPhysicalDeviceVulkan12Features::drawIndirectCount must be enabled to "
+ "call this command.",
+ apiName);
}
skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndirectCount-stride-03110", stride, apiName,
sizeof(VkDrawIndirectCommand));
@@ -328,12 +505,9 @@
skip |= ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDIRECTCOUNT, apiName,
VK_QUEUE_GRAPHICS_BIT);
- const BUFFER_STATE *buffer_state = GetBufferState(buffer);
const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
- skip |= ValidateMemoryIsBoundToBuffer(buffer_state, apiName, "VUID-vkCmdDrawIndirectCount-buffer-02708");
+ skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDIRECTCOUNT, apiName);
skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
- skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
- "VUID-vkCmdDrawIndirectCount-buffer-02709", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
skip |=
ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
"VUID-vkCmdDrawIndirectCount-countBuffer-02715", apiName, "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
@@ -344,55 +518,41 @@
VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
uint32_t stride) const {
return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
- "VkCmdDrawIndirectCountKHR");
+ "vkCmdDrawIndirectCountKHR");
}
bool CoreChecks::PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
uint32_t stride) const {
return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
- "VkCmdDrawIndirectCount");
+ "vkCmdDrawIndirectCount");
}
bool CoreChecks::ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
- uint32_t stride) const {
+ uint32_t stride, const char *apiName) const {
bool skip = false;
- if (offset & 3) {
- skip |= LogError(
- commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-offset-02710",
- "vkCmdDrawIndexedIndirectCount() parameter, VkDeviceSize offset (0x%" PRIxLEAST64 "), is not a multiple of 4.", offset);
+ if ((api_version >= VK_API_VERSION_1_2) && (enabled_features.core12.drawIndirectCount == VK_FALSE)) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndexedIndirect-None-02837",
+ "%s(): Starting in Vulkan 1.2 the VkPhysicalDeviceVulkan12Features::drawIndirectCount must be enabled to "
+ "call this command.",
+ apiName);
}
-
- if (countBufferOffset & 3) {
- skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716",
- "vkCmdDrawIndexedIndirectCount() parameter, VkDeviceSize countBufferOffset (0x%" PRIxLEAST64
- "), is not a multiple of 4.",
- countBufferOffset);
- }
-
- skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142", stride,
- "VkDrawIndirectCommand", sizeof(VkDrawIndexedIndirectCommand));
+ skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142", stride, apiName,
+ sizeof(VkDrawIndexedIndirectCommand));
if (maxDrawCount > 1) {
const BUFFER_STATE *buffer_state = GetBufferState(buffer);
skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-maxDrawCount-03143", stride,
- "VkDrawIndirectCommand", sizeof(VkDrawIndexedIndirectCommand), maxDrawCount, offset,
- buffer_state);
+ apiName, sizeof(VkDrawIndexedIndirectCommand), maxDrawCount, offset, buffer_state);
}
- skip |= ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECTCOUNT,
- "vkCmdDrawIndexedIndirectCount()", VK_QUEUE_GRAPHICS_BIT);
- const BUFFER_STATE *buffer_state = GetBufferState(buffer);
+ skip |= ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWINDEXEDINDIRECTCOUNT, apiName,
+ VK_QUEUE_GRAPHICS_BIT);
const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
- skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawIndexedIndirectCount()",
- "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
- skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawIndexedIndirectCount()",
- "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
- skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
- "VUID-vkCmdDrawIndexedIndirectCount-buffer-02709", "vkCmdDrawIndexedIndirectCount()",
- "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
+ skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWINDEXEDINDIRECTCOUNT, apiName);
+ skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, apiName, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
- "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715", "vkCmdDrawIndexedIndirectCount()",
+ "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715", apiName,
"VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
return skip;
}
@@ -400,13 +560,15 @@
bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
VkBuffer countBuffer, VkDeviceSize countBufferOffset,
uint32_t maxDrawCount, uint32_t stride) const {
- return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+ return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
+ "vkCmdDrawIndexedIndirectCountKHR");
}
bool CoreChecks::PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
VkBuffer countBuffer, VkDeviceSize countBufferOffset,
uint32_t maxDrawCount, uint32_t stride) const {
- return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+ return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
+ "vkCmdDrawIndexedIndirectCount");
}
bool CoreChecks::PreCallValidateCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
@@ -418,6 +580,36 @@
uint32_t width, uint32_t height, uint32_t depth) const {
bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, CMD_TRACERAYSNV,
"vkCmdTraceRaysNV()", VK_QUEUE_COMPUTE_BIT);
+ const CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ skip |= InsideRenderPass(cb_state, "vkCmdTraceRaysNV()", "VUID-vkCmdTraceRaysNV-renderpass");
+ auto callable_shader_buffer_state = (BUFFER_STATE *)GetBufferState(callableShaderBindingTableBuffer);
+ if (callable_shader_buffer_state && callableShaderBindingOffset >= callable_shader_buffer_state->createInfo.size) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-callableShaderBindingOffset-02461",
+ "vkCmdTraceRaysNV: callableShaderBindingOffset %" PRIu64
+ " must be less than the size of callableShaderBindingTableBuffer %" PRIu64 " .",
+ callableShaderBindingOffset, callable_shader_buffer_state->createInfo.size);
+ }
+ auto hit_shader_buffer_state = (BUFFER_STATE *)GetBufferState(hitShaderBindingTableBuffer);
+ if (hit_shader_buffer_state && hitShaderBindingOffset >= hit_shader_buffer_state->createInfo.size) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-hitShaderBindingOffset-02459",
+ "vkCmdTraceRaysNV: hitShaderBindingOffset %" PRIu64
+ " must be less than the size of hitShaderBindingTableBuffer %" PRIu64 " .",
+ hitShaderBindingOffset, hit_shader_buffer_state->createInfo.size);
+ }
+ auto miss_shader_buffer_state = (BUFFER_STATE *)GetBufferState(missShaderBindingTableBuffer);
+ if (miss_shader_buffer_state && missShaderBindingOffset >= miss_shader_buffer_state->createInfo.size) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-missShaderBindingOffset-02457",
+ "vkCmdTraceRaysNV: missShaderBindingOffset %" PRIu64
+ " must be less than the size of missShaderBindingTableBuffer" PRIu64 " .",
+ missShaderBindingOffset, miss_shader_buffer_state->createInfo.size);
+ }
+ auto raygen_shader_buffer_state = (BUFFER_STATE *)GetBufferState(raygenShaderBindingTableBuffer);
+ if (raygenShaderBindingOffset >= raygen_shader_buffer_state->createInfo.size) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdTraceRaysNV-raygenShaderBindingOffset-02455",
+ "vkCmdTraceRaysNV: raygenShaderBindingOffset %" PRIu64
+ " must be less than the size of raygenShaderBindingTableBuffer" PRIu64 " .",
+ raygenShaderBindingOffset, raygen_shader_buffer_state->createInfo.size);
+ }
return skip;
}
@@ -429,7 +621,7 @@
VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
uint32_t width, uint32_t height, uint32_t depth) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
- UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
+ UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSNV, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV);
cb_state->hasTraceRaysCmd = true;
}
@@ -451,7 +643,7 @@
const VkStridedBufferRegionKHR *pCallableShaderBindingTable, uint32_t width,
uint32_t height, uint32_t depth) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
- UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
+ UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
cb_state->hasTraceRaysCmd = true;
}
@@ -461,8 +653,9 @@
const VkStridedBufferRegionKHR *pHitShaderBindingTable,
const VkStridedBufferRegionKHR *pCallableShaderBindingTable,
VkBuffer buffer, VkDeviceSize offset) const {
- bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSKHR,
+ bool skip = ValidateCmdDrawType(commandBuffer, true, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, CMD_TRACERAYSINDIRECTKHR,
"vkCmdTraceRaysIndirectKHR()", VK_QUEUE_COMPUTE_BIT);
+ skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_TRACERAYSINDIRECTKHR, "vkCmdTraceRaysIndirectKHR()");
return skip;
}
@@ -474,7 +667,7 @@
VkDeviceSize offset) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
BUFFER_STATE *buffer_state = GetBufferState(buffer);
- UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
+ UpdateStateCmdDrawDispatchType(cb_state, CMD_TRACERAYSINDIRECTKHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR);
cb_state->hasTraceRaysCmd = true;
AddCommandBufferBindingBuffer(cb_state, buffer_state);
}
@@ -490,11 +683,7 @@
bool skip = ValidateCmdDrawType(commandBuffer, false, VK_PIPELINE_BIND_POINT_GRAPHICS, CMD_DRAWMESHTASKSINDIRECTNV,
"vkCmdDrawMeshTasksIndirectNV()", VK_QUEUE_GRAPHICS_BIT);
const BUFFER_STATE *buffer_state = GetBufferState(buffer);
- skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawMeshTasksIndirectNV()",
- "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02708");
- skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
- "VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02709", "vkCmdDrawMeshTasksIndirectNV()",
- "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
+ skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWMESHTASKSINDIRECTNV, "vkCmdDrawMeshTasksIndirectNV()");
if (drawCount > 1) {
skip |= ValidateCmdDrawStrideWithBuffer(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02157", stride,
"VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV),
@@ -510,16 +699,12 @@
"vkCmdDrawMeshTasksIndirectCountNV()", VK_QUEUE_GRAPHICS_BIT);
const BUFFER_STATE *buffer_state = GetBufferState(buffer);
const BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
- skip |= ValidateMemoryIsBoundToBuffer(buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
- "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02708");
+ skip |= ValidateIndirectCmd(commandBuffer, buffer, CMD_DRAWMESHTASKSINDIRECTCOUNTNV, "vkCmdDrawMeshTasksIndirectCountNV()");
skip |= ValidateMemoryIsBoundToBuffer(count_buffer_state, "vkCmdDrawMeshTasksIndirectCountNV()",
"VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02714");
- skip |= ValidateBufferUsageFlags(buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
- "VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02709", "vkCmdDrawIndexedIndirectCount()",
- "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
skip |= ValidateBufferUsageFlags(count_buffer_state, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT, true,
- "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715", "vkCmdDrawIndexedIndirectCount()",
- "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
+ "VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715",
+ "vkCmdDrawMeshTasksIndirectCountNV()", "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT");
skip |= ValidateCmdDrawStrideWithStruct(commandBuffer, "VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182", stride,
"VkDrawMeshTasksIndirectCommandNV", sizeof(VkDrawMeshTasksIndirectCommandNV));
if (maxDrawCount > 1) {
diff --git a/layers/generated/best_practices.cpp b/layers/generated/best_practices.cpp
index 3ce6d99..800a93d 100644
--- a/layers/generated/best_practices.cpp
+++ b/layers/generated/best_practices.cpp
@@ -27,7 +27,7 @@
#include "chassis.h"
#include "best_practices_validation.h"
-void BestPractices::PostCallRecordvkCreateInstance(
+void BestPractices::PostCallRecordCreateInstance(
const VkInstanceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkInstance* pInstance,
@@ -40,7 +40,7 @@
}
}
-void BestPractices::PostCallRecordvkEnumeratePhysicalDevices(
+void BestPractices::PostCallRecordEnumeratePhysicalDevices(
VkInstance instance,
uint32_t* pPhysicalDeviceCount,
VkPhysicalDevice* pPhysicalDevices,
@@ -53,7 +53,7 @@
}
}
-void BestPractices::PostCallRecordvkGetPhysicalDeviceImageFormatProperties(
+void BestPractices::PostCallRecordGetPhysicalDeviceImageFormatProperties(
VkPhysicalDevice physicalDevice,
VkFormat format,
VkImageType type,
@@ -70,7 +70,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateDevice(
+void BestPractices::PostCallRecordCreateDevice(
VkPhysicalDevice physicalDevice,
const VkDeviceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -84,7 +84,7 @@
}
}
-void BestPractices::PostCallRecordvkEnumerateInstanceExtensionProperties(
+void BestPractices::PostCallRecordEnumerateInstanceExtensionProperties(
const char* pLayerName,
uint32_t* pPropertyCount,
VkExtensionProperties* pProperties,
@@ -97,7 +97,7 @@
}
}
-void BestPractices::PostCallRecordvkEnumerateDeviceExtensionProperties(
+void BestPractices::PostCallRecordEnumerateDeviceExtensionProperties(
VkPhysicalDevice physicalDevice,
const char* pLayerName,
uint32_t* pPropertyCount,
@@ -111,7 +111,7 @@
}
}
-void BestPractices::PostCallRecordvkEnumerateInstanceLayerProperties(
+void BestPractices::PostCallRecordEnumerateInstanceLayerProperties(
uint32_t* pPropertyCount,
VkLayerProperties* pProperties,
VkResult result) {
@@ -123,7 +123,7 @@
}
}
-void BestPractices::PostCallRecordvkEnumerateDeviceLayerProperties(
+void BestPractices::PostCallRecordEnumerateDeviceLayerProperties(
VkPhysicalDevice physicalDevice,
uint32_t* pPropertyCount,
VkLayerProperties* pProperties,
@@ -136,7 +136,7 @@
}
}
-void BestPractices::PostCallRecordvkQueueSubmit(
+void BestPractices::PostCallRecordQueueSubmit(
VkQueue queue,
uint32_t submitCount,
const VkSubmitInfo* pSubmits,
@@ -150,7 +150,7 @@
}
}
-void BestPractices::PostCallRecordvkQueueWaitIdle(
+void BestPractices::PostCallRecordQueueWaitIdle(
VkQueue queue,
VkResult result) {
ValidationStateTracker::PostCallRecordQueueWaitIdle(queue, result);
@@ -161,7 +161,7 @@
}
}
-void BestPractices::PostCallRecordvkDeviceWaitIdle(
+void BestPractices::PostCallRecordDeviceWaitIdle(
VkDevice device,
VkResult result) {
ValidationStateTracker::PostCallRecordDeviceWaitIdle(device, result);
@@ -172,9 +172,22 @@
}
}
-// Skipping vkAllocateMemory for autogen as it has a manually created custom function or ignored.
+void BestPractices::PostCallRecordAllocateMemory(
+ VkDevice device,
+ const VkMemoryAllocateInfo* pAllocateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkDeviceMemory* pMemory,
+ VkResult result) {
+ ValidationStateTracker::PostCallRecordAllocateMemory(device, pAllocateInfo, pAllocator, pMemory, result);
+ ManualPostCallRecordAllocateMemory(device, pAllocateInfo, pAllocator, pMemory, result);
+ if (result != VK_SUCCESS) {
+ static const std::vector<VkResult> error_codes = {VK_ERROR_OUT_OF_HOST_MEMORY,VK_ERROR_OUT_OF_DEVICE_MEMORY,VK_ERROR_TOO_MANY_OBJECTS,VK_ERROR_INVALID_EXTERNAL_HANDLE,VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR};
+ static const std::vector<VkResult> success_codes = {};
+ ValidateReturnCodes("vkAllocateMemory", result, error_codes, success_codes);
+ }
+}
-void BestPractices::PostCallRecordvkMapMemory(
+void BestPractices::PostCallRecordMapMemory(
VkDevice device,
VkDeviceMemory memory,
VkDeviceSize offset,
@@ -190,7 +203,7 @@
}
}
-void BestPractices::PostCallRecordvkFlushMappedMemoryRanges(
+void BestPractices::PostCallRecordFlushMappedMemoryRanges(
VkDevice device,
uint32_t memoryRangeCount,
const VkMappedMemoryRange* pMemoryRanges,
@@ -203,7 +216,7 @@
}
}
-void BestPractices::PostCallRecordvkInvalidateMappedMemoryRanges(
+void BestPractices::PostCallRecordInvalidateMappedMemoryRanges(
VkDevice device,
uint32_t memoryRangeCount,
const VkMappedMemoryRange* pMemoryRanges,
@@ -216,7 +229,7 @@
}
}
-void BestPractices::PostCallRecordvkBindBufferMemory(
+void BestPractices::PostCallRecordBindBufferMemory(
VkDevice device,
VkBuffer buffer,
VkDeviceMemory memory,
@@ -230,7 +243,7 @@
}
}
-void BestPractices::PostCallRecordvkBindImageMemory(
+void BestPractices::PostCallRecordBindImageMemory(
VkDevice device,
VkImage image,
VkDeviceMemory memory,
@@ -244,9 +257,22 @@
}
}
-// Skipping vkQueueBindSparse for autogen as it has a manually created custom function or ignored.
+void BestPractices::PostCallRecordQueueBindSparse(
+ VkQueue queue,
+ uint32_t bindInfoCount,
+ const VkBindSparseInfo* pBindInfo,
+ VkFence fence,
+ VkResult result) {
+ ValidationStateTracker::PostCallRecordQueueBindSparse(queue, bindInfoCount, pBindInfo, fence, result);
+ ManualPostCallRecordQueueBindSparse(queue, bindInfoCount, pBindInfo, fence, result);
+ if (result != VK_SUCCESS) {
+ static const std::vector<VkResult> error_codes = {VK_ERROR_OUT_OF_HOST_MEMORY,VK_ERROR_OUT_OF_DEVICE_MEMORY,VK_ERROR_DEVICE_LOST};
+ static const std::vector<VkResult> success_codes = {};
+ ValidateReturnCodes("vkQueueBindSparse", result, error_codes, success_codes);
+ }
+}
-void BestPractices::PostCallRecordvkCreateFence(
+void BestPractices::PostCallRecordCreateFence(
VkDevice device,
const VkFenceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -260,7 +286,7 @@
}
}
-void BestPractices::PostCallRecordvkResetFences(
+void BestPractices::PostCallRecordResetFences(
VkDevice device,
uint32_t fenceCount,
const VkFence* pFences,
@@ -273,7 +299,7 @@
}
}
-void BestPractices::PostCallRecordvkGetFenceStatus(
+void BestPractices::PostCallRecordGetFenceStatus(
VkDevice device,
VkFence fence,
VkResult result) {
@@ -285,7 +311,7 @@
}
}
-void BestPractices::PostCallRecordvkWaitForFences(
+void BestPractices::PostCallRecordWaitForFences(
VkDevice device,
uint32_t fenceCount,
const VkFence* pFences,
@@ -300,7 +326,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateSemaphore(
+void BestPractices::PostCallRecordCreateSemaphore(
VkDevice device,
const VkSemaphoreCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -314,7 +340,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateEvent(
+void BestPractices::PostCallRecordCreateEvent(
VkDevice device,
const VkEventCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -328,7 +354,7 @@
}
}
-void BestPractices::PostCallRecordvkGetEventStatus(
+void BestPractices::PostCallRecordGetEventStatus(
VkDevice device,
VkEvent event,
VkResult result) {
@@ -340,7 +366,7 @@
}
}
-void BestPractices::PostCallRecordvkSetEvent(
+void BestPractices::PostCallRecordSetEvent(
VkDevice device,
VkEvent event,
VkResult result) {
@@ -352,7 +378,7 @@
}
}
-void BestPractices::PostCallRecordvkResetEvent(
+void BestPractices::PostCallRecordResetEvent(
VkDevice device,
VkEvent event,
VkResult result) {
@@ -364,7 +390,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateQueryPool(
+void BestPractices::PostCallRecordCreateQueryPool(
VkDevice device,
const VkQueryPoolCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -378,7 +404,7 @@
}
}
-void BestPractices::PostCallRecordvkGetQueryPoolResults(
+void BestPractices::PostCallRecordGetQueryPoolResults(
VkDevice device,
VkQueryPool queryPool,
uint32_t firstQuery,
@@ -396,7 +422,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateBuffer(
+void BestPractices::PostCallRecordCreateBuffer(
VkDevice device,
const VkBufferCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -410,7 +436,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateBufferView(
+void BestPractices::PostCallRecordCreateBufferView(
VkDevice device,
const VkBufferViewCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -424,7 +450,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateImage(
+void BestPractices::PostCallRecordCreateImage(
VkDevice device,
const VkImageCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -438,7 +464,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateImageView(
+void BestPractices::PostCallRecordCreateImageView(
VkDevice device,
const VkImageViewCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -452,7 +478,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateShaderModule(
+void BestPractices::PostCallRecordCreateShaderModule(
VkDevice device,
const VkShaderModuleCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -467,7 +493,7 @@
}
}
-void BestPractices::PostCallRecordvkCreatePipelineCache(
+void BestPractices::PostCallRecordCreatePipelineCache(
VkDevice device,
const VkPipelineCacheCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -481,7 +507,7 @@
}
}
-void BestPractices::PostCallRecordvkGetPipelineCacheData(
+void BestPractices::PostCallRecordGetPipelineCacheData(
VkDevice device,
VkPipelineCache pipelineCache,
size_t* pDataSize,
@@ -495,7 +521,7 @@
}
}
-void BestPractices::PostCallRecordvkMergePipelineCaches(
+void BestPractices::PostCallRecordMergePipelineCaches(
VkDevice device,
VkPipelineCache dstCache,
uint32_t srcCacheCount,
@@ -509,7 +535,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateGraphicsPipelines(
+void BestPractices::PostCallRecordCreateGraphicsPipelines(
VkDevice device,
VkPipelineCache pipelineCache,
uint32_t createInfoCount,
@@ -519,14 +545,15 @@
VkResult result,
void* state_data) {
ValidationStateTracker::PostCallRecordCreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines, result, state_data);
+ ManualPostCallRecordCreateGraphicsPipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines, result, state_data);
if (result != VK_SUCCESS) {
static const std::vector<VkResult> error_codes = {VK_ERROR_OUT_OF_HOST_MEMORY,VK_ERROR_OUT_OF_DEVICE_MEMORY,VK_ERROR_INVALID_SHADER_NV};
- static const std::vector<VkResult> success_codes = {};
+ static const std::vector<VkResult> success_codes = {VK_PIPELINE_COMPILE_REQUIRED_EXT};
ValidateReturnCodes("vkCreateGraphicsPipelines", result, error_codes, success_codes);
}
}
-void BestPractices::PostCallRecordvkCreateComputePipelines(
+void BestPractices::PostCallRecordCreateComputePipelines(
VkDevice device,
VkPipelineCache pipelineCache,
uint32_t createInfoCount,
@@ -538,12 +565,12 @@
ValidationStateTracker::PostCallRecordCreateComputePipelines(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines, result, state_data);
if (result != VK_SUCCESS) {
static const std::vector<VkResult> error_codes = {VK_ERROR_OUT_OF_HOST_MEMORY,VK_ERROR_OUT_OF_DEVICE_MEMORY,VK_ERROR_INVALID_SHADER_NV};
- static const std::vector<VkResult> success_codes = {};
+ static const std::vector<VkResult> success_codes = {VK_PIPELINE_COMPILE_REQUIRED_EXT};
ValidateReturnCodes("vkCreateComputePipelines", result, error_codes, success_codes);
}
}
-void BestPractices::PostCallRecordvkCreatePipelineLayout(
+void BestPractices::PostCallRecordCreatePipelineLayout(
VkDevice device,
const VkPipelineLayoutCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -557,7 +584,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateSampler(
+void BestPractices::PostCallRecordCreateSampler(
VkDevice device,
const VkSamplerCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -571,7 +598,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateDescriptorSetLayout(
+void BestPractices::PostCallRecordCreateDescriptorSetLayout(
VkDevice device,
const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -585,7 +612,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateDescriptorPool(
+void BestPractices::PostCallRecordCreateDescriptorPool(
VkDevice device,
const VkDescriptorPoolCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -599,13 +626,14 @@
}
}
-void BestPractices::PostCallRecordvkAllocateDescriptorSets(
+void BestPractices::PostCallRecordAllocateDescriptorSets(
VkDevice device,
const VkDescriptorSetAllocateInfo* pAllocateInfo,
VkDescriptorSet* pDescriptorSets,
VkResult result,
void* state_data) {
ValidationStateTracker::PostCallRecordAllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets, result, state_data);
+ ManualPostCallRecordAllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets, result, state_data);
if (result != VK_SUCCESS) {
static const std::vector<VkResult> error_codes = {VK_ERROR_OUT_OF_HOST_MEMORY,VK_ERROR_OUT_OF_DEVICE_MEMORY,VK_ERROR_FRAGMENTED_POOL,VK_ERROR_OUT_OF_POOL_MEMORY};
static const std::vector<VkResult> success_codes = {};
@@ -613,7 +641,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateFramebuffer(
+void BestPractices::PostCallRecordCreateFramebuffer(
VkDevice device,
const VkFramebufferCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -627,7 +655,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateRenderPass(
+void BestPractices::PostCallRecordCreateRenderPass(
VkDevice device,
const VkRenderPassCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -641,7 +669,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateCommandPool(
+void BestPractices::PostCallRecordCreateCommandPool(
VkDevice device,
const VkCommandPoolCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -655,7 +683,7 @@
}
}
-void BestPractices::PostCallRecordvkResetCommandPool(
+void BestPractices::PostCallRecordResetCommandPool(
VkDevice device,
VkCommandPool commandPool,
VkCommandPoolResetFlags flags,
@@ -668,7 +696,7 @@
}
}
-void BestPractices::PostCallRecordvkAllocateCommandBuffers(
+void BestPractices::PostCallRecordAllocateCommandBuffers(
VkDevice device,
const VkCommandBufferAllocateInfo* pAllocateInfo,
VkCommandBuffer* pCommandBuffers,
@@ -681,7 +709,7 @@
}
}
-void BestPractices::PostCallRecordvkBeginCommandBuffer(
+void BestPractices::PostCallRecordBeginCommandBuffer(
VkCommandBuffer commandBuffer,
const VkCommandBufferBeginInfo* pBeginInfo,
VkResult result) {
@@ -693,7 +721,7 @@
}
}
-void BestPractices::PostCallRecordvkEndCommandBuffer(
+void BestPractices::PostCallRecordEndCommandBuffer(
VkCommandBuffer commandBuffer,
VkResult result) {
ValidationStateTracker::PostCallRecordEndCommandBuffer(commandBuffer, result);
@@ -704,7 +732,7 @@
}
}
-void BestPractices::PostCallRecordvkResetCommandBuffer(
+void BestPractices::PostCallRecordResetCommandBuffer(
VkCommandBuffer commandBuffer,
VkCommandBufferResetFlags flags,
VkResult result) {
@@ -716,7 +744,9 @@
}
}
-void BestPractices::PostCallRecordvkBindBufferMemory2(
+// Skipping vkEnumerateInstanceVersion for autogen as it has a manually created custom function or ignored.
+
+void BestPractices::PostCallRecordBindBufferMemory2(
VkDevice device,
uint32_t bindInfoCount,
const VkBindBufferMemoryInfo* pBindInfos,
@@ -729,7 +759,7 @@
}
}
-void BestPractices::PostCallRecordvkBindImageMemory2(
+void BestPractices::PostCallRecordBindImageMemory2(
VkDevice device,
uint32_t bindInfoCount,
const VkBindImageMemoryInfo* pBindInfos,
@@ -742,7 +772,7 @@
}
}
-void BestPractices::PostCallRecordvkEnumeratePhysicalDeviceGroups(
+void BestPractices::PostCallRecordEnumeratePhysicalDeviceGroups(
VkInstance instance,
uint32_t* pPhysicalDeviceGroupCount,
VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties,
@@ -755,7 +785,7 @@
}
}
-void BestPractices::PostCallRecordvkGetPhysicalDeviceImageFormatProperties2(
+void BestPractices::PostCallRecordGetPhysicalDeviceImageFormatProperties2(
VkPhysicalDevice physicalDevice,
const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
VkImageFormatProperties2* pImageFormatProperties,
@@ -768,7 +798,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateSamplerYcbcrConversion(
+void BestPractices::PostCallRecordCreateSamplerYcbcrConversion(
VkDevice device,
const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -782,7 +812,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateDescriptorUpdateTemplate(
+void BestPractices::PostCallRecordCreateDescriptorUpdateTemplate(
VkDevice device,
const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -796,7 +826,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateRenderPass2(
+void BestPractices::PostCallRecordCreateRenderPass2(
VkDevice device,
const VkRenderPassCreateInfo2* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -810,7 +840,7 @@
}
}
-void BestPractices::PostCallRecordvkGetSemaphoreCounterValue(
+void BestPractices::PostCallRecordGetSemaphoreCounterValue(
VkDevice device,
VkSemaphore semaphore,
uint64_t* pValue,
@@ -823,7 +853,7 @@
}
}
-void BestPractices::PostCallRecordvkWaitSemaphores(
+void BestPractices::PostCallRecordWaitSemaphores(
VkDevice device,
const VkSemaphoreWaitInfo* pWaitInfo,
uint64_t timeout,
@@ -836,7 +866,7 @@
}
}
-void BestPractices::PostCallRecordvkSignalSemaphore(
+void BestPractices::PostCallRecordSignalSemaphore(
VkDevice device,
const VkSemaphoreSignalInfo* pSignalInfo,
VkResult result) {
@@ -848,7 +878,7 @@
}
}
-void BestPractices::PostCallRecordvkGetPhysicalDeviceSurfaceSupportKHR(
+void BestPractices::PostCallRecordGetPhysicalDeviceSurfaceSupportKHR(
VkPhysicalDevice physicalDevice,
uint32_t queueFamilyIndex,
VkSurfaceKHR surface,
@@ -862,7 +892,7 @@
}
}
-void BestPractices::PostCallRecordvkGetPhysicalDeviceSurfaceCapabilitiesKHR(
+void BestPractices::PostCallRecordGetPhysicalDeviceSurfaceCapabilitiesKHR(
VkPhysicalDevice physicalDevice,
VkSurfaceKHR surface,
VkSurfaceCapabilitiesKHR* pSurfaceCapabilities,
@@ -875,7 +905,7 @@
}
}
-void BestPractices::PostCallRecordvkGetPhysicalDeviceSurfaceFormatsKHR(
+void BestPractices::PostCallRecordGetPhysicalDeviceSurfaceFormatsKHR(
VkPhysicalDevice physicalDevice,
VkSurfaceKHR surface,
uint32_t* pSurfaceFormatCount,
@@ -889,7 +919,7 @@
}
}
-void BestPractices::PostCallRecordvkGetPhysicalDeviceSurfacePresentModesKHR(
+void BestPractices::PostCallRecordGetPhysicalDeviceSurfacePresentModesKHR(
VkPhysicalDevice physicalDevice,
VkSurfaceKHR surface,
uint32_t* pPresentModeCount,
@@ -903,7 +933,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateSwapchainKHR(
+void BestPractices::PostCallRecordCreateSwapchainKHR(
VkDevice device,
const VkSwapchainCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -917,7 +947,7 @@
}
}
-void BestPractices::PostCallRecordvkGetSwapchainImagesKHR(
+void BestPractices::PostCallRecordGetSwapchainImagesKHR(
VkDevice device,
VkSwapchainKHR swapchain,
uint32_t* pSwapchainImageCount,
@@ -931,7 +961,7 @@
}
}
-void BestPractices::PostCallRecordvkAcquireNextImageKHR(
+void BestPractices::PostCallRecordAcquireNextImageKHR(
VkDevice device,
VkSwapchainKHR swapchain,
uint64_t timeout,
@@ -947,11 +977,12 @@
}
}
-void BestPractices::PostCallRecordvkQueuePresentKHR(
+void BestPractices::PostCallRecordQueuePresentKHR(
VkQueue queue,
const VkPresentInfoKHR* pPresentInfo,
VkResult result) {
ValidationStateTracker::PostCallRecordQueuePresentKHR(queue, pPresentInfo, result);
+ ManualPostCallRecordQueuePresentKHR(queue, pPresentInfo, result);
if (result != VK_SUCCESS) {
static const std::vector<VkResult> error_codes = {VK_ERROR_OUT_OF_HOST_MEMORY,VK_ERROR_OUT_OF_DEVICE_MEMORY,VK_ERROR_DEVICE_LOST,VK_ERROR_OUT_OF_DATE_KHR,VK_ERROR_SURFACE_LOST_KHR,VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT};
static const std::vector<VkResult> success_codes = {VK_SUBOPTIMAL_KHR};
@@ -959,7 +990,7 @@
}
}
-void BestPractices::PostCallRecordvkGetDeviceGroupPresentCapabilitiesKHR(
+void BestPractices::PostCallRecordGetDeviceGroupPresentCapabilitiesKHR(
VkDevice device,
VkDeviceGroupPresentCapabilitiesKHR* pDeviceGroupPresentCapabilities,
VkResult result) {
@@ -971,7 +1002,7 @@
}
}
-void BestPractices::PostCallRecordvkGetDeviceGroupSurfacePresentModesKHR(
+void BestPractices::PostCallRecordGetDeviceGroupSurfacePresentModesKHR(
VkDevice device,
VkSurfaceKHR surface,
VkDeviceGroupPresentModeFlagsKHR* pModes,
@@ -984,7 +1015,7 @@
}
}
-void BestPractices::PostCallRecordvkGetPhysicalDevicePresentRectanglesKHR(
+void BestPractices::PostCallRecordGetPhysicalDevicePresentRectanglesKHR(
VkPhysicalDevice physicalDevice,
VkSurfaceKHR surface,
uint32_t* pRectCount,
@@ -998,7 +1029,7 @@
}
}
-void BestPractices::PostCallRecordvkAcquireNextImage2KHR(
+void BestPractices::PostCallRecordAcquireNextImage2KHR(
VkDevice device,
const VkAcquireNextImageInfoKHR* pAcquireInfo,
uint32_t* pImageIndex,
@@ -1011,7 +1042,7 @@
}
}
-void BestPractices::PostCallRecordvkGetPhysicalDeviceDisplayPropertiesKHR(
+void BestPractices::PostCallRecordGetPhysicalDeviceDisplayPropertiesKHR(
VkPhysicalDevice physicalDevice,
uint32_t* pPropertyCount,
VkDisplayPropertiesKHR* pProperties,
@@ -1024,7 +1055,7 @@
}
}
-void BestPractices::PostCallRecordvkGetPhysicalDeviceDisplayPlanePropertiesKHR(
+void BestPractices::PostCallRecordGetPhysicalDeviceDisplayPlanePropertiesKHR(
VkPhysicalDevice physicalDevice,
uint32_t* pPropertyCount,
VkDisplayPlanePropertiesKHR* pProperties,
@@ -1037,7 +1068,7 @@
}
}
-void BestPractices::PostCallRecordvkGetDisplayPlaneSupportedDisplaysKHR(
+void BestPractices::PostCallRecordGetDisplayPlaneSupportedDisplaysKHR(
VkPhysicalDevice physicalDevice,
uint32_t planeIndex,
uint32_t* pDisplayCount,
@@ -1051,7 +1082,7 @@
}
}
-void BestPractices::PostCallRecordvkGetDisplayModePropertiesKHR(
+void BestPractices::PostCallRecordGetDisplayModePropertiesKHR(
VkPhysicalDevice physicalDevice,
VkDisplayKHR display,
uint32_t* pPropertyCount,
@@ -1065,7 +1096,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateDisplayModeKHR(
+void BestPractices::PostCallRecordCreateDisplayModeKHR(
VkPhysicalDevice physicalDevice,
VkDisplayKHR display,
const VkDisplayModeCreateInfoKHR* pCreateInfo,
@@ -1080,7 +1111,7 @@
}
}
-void BestPractices::PostCallRecordvkGetDisplayPlaneCapabilitiesKHR(
+void BestPractices::PostCallRecordGetDisplayPlaneCapabilitiesKHR(
VkPhysicalDevice physicalDevice,
VkDisplayModeKHR mode,
uint32_t planeIndex,
@@ -1094,7 +1125,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateDisplayPlaneSurfaceKHR(
+void BestPractices::PostCallRecordCreateDisplayPlaneSurfaceKHR(
VkInstance instance,
const VkDisplaySurfaceCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1108,7 +1139,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateSharedSwapchainsKHR(
+void BestPractices::PostCallRecordCreateSharedSwapchainsKHR(
VkDevice device,
uint32_t swapchainCount,
const VkSwapchainCreateInfoKHR* pCreateInfos,
@@ -1125,7 +1156,7 @@
#ifdef VK_USE_PLATFORM_XLIB_KHR
-void BestPractices::PostCallRecordvkCreateXlibSurfaceKHR(
+void BestPractices::PostCallRecordCreateXlibSurfaceKHR(
VkInstance instance,
const VkXlibSurfaceCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1143,7 +1174,7 @@
#ifdef VK_USE_PLATFORM_XCB_KHR
-void BestPractices::PostCallRecordvkCreateXcbSurfaceKHR(
+void BestPractices::PostCallRecordCreateXcbSurfaceKHR(
VkInstance instance,
const VkXcbSurfaceCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1161,7 +1192,7 @@
#ifdef VK_USE_PLATFORM_WAYLAND_KHR
-void BestPractices::PostCallRecordvkCreateWaylandSurfaceKHR(
+void BestPractices::PostCallRecordCreateWaylandSurfaceKHR(
VkInstance instance,
const VkWaylandSurfaceCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1179,7 +1210,7 @@
#ifdef VK_USE_PLATFORM_ANDROID_KHR
-void BestPractices::PostCallRecordvkCreateAndroidSurfaceKHR(
+void BestPractices::PostCallRecordCreateAndroidSurfaceKHR(
VkInstance instance,
const VkAndroidSurfaceCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1197,7 +1228,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void BestPractices::PostCallRecordvkCreateWin32SurfaceKHR(
+void BestPractices::PostCallRecordCreateWin32SurfaceKHR(
VkInstance instance,
const VkWin32SurfaceCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1213,7 +1244,7 @@
#endif // VK_USE_PLATFORM_WIN32_KHR
-void BestPractices::PostCallRecordvkGetPhysicalDeviceImageFormatProperties2KHR(
+void BestPractices::PostCallRecordGetPhysicalDeviceImageFormatProperties2KHR(
VkPhysicalDevice physicalDevice,
const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
VkImageFormatProperties2* pImageFormatProperties,
@@ -1226,7 +1257,7 @@
}
}
-void BestPractices::PostCallRecordvkEnumeratePhysicalDeviceGroupsKHR(
+void BestPractices::PostCallRecordEnumeratePhysicalDeviceGroupsKHR(
VkInstance instance,
uint32_t* pPhysicalDeviceGroupCount,
VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties,
@@ -1241,7 +1272,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void BestPractices::PostCallRecordvkGetMemoryWin32HandleKHR(
+void BestPractices::PostCallRecordGetMemoryWin32HandleKHR(
VkDevice device,
const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo,
HANDLE* pHandle,
@@ -1258,7 +1289,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void BestPractices::PostCallRecordvkGetMemoryWin32HandlePropertiesKHR(
+void BestPractices::PostCallRecordGetMemoryWin32HandlePropertiesKHR(
VkDevice device,
VkExternalMemoryHandleTypeFlagBits handleType,
HANDLE handle,
@@ -1274,7 +1305,7 @@
#endif // VK_USE_PLATFORM_WIN32_KHR
-void BestPractices::PostCallRecordvkGetMemoryFdKHR(
+void BestPractices::PostCallRecordGetMemoryFdKHR(
VkDevice device,
const VkMemoryGetFdInfoKHR* pGetFdInfo,
int* pFd,
@@ -1287,7 +1318,7 @@
}
}
-void BestPractices::PostCallRecordvkGetMemoryFdPropertiesKHR(
+void BestPractices::PostCallRecordGetMemoryFdPropertiesKHR(
VkDevice device,
VkExternalMemoryHandleTypeFlagBits handleType,
int fd,
@@ -1303,7 +1334,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void BestPractices::PostCallRecordvkImportSemaphoreWin32HandleKHR(
+void BestPractices::PostCallRecordImportSemaphoreWin32HandleKHR(
VkDevice device,
const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo,
VkResult result) {
@@ -1319,7 +1350,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void BestPractices::PostCallRecordvkGetSemaphoreWin32HandleKHR(
+void BestPractices::PostCallRecordGetSemaphoreWin32HandleKHR(
VkDevice device,
const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo,
HANDLE* pHandle,
@@ -1334,7 +1365,7 @@
#endif // VK_USE_PLATFORM_WIN32_KHR
-void BestPractices::PostCallRecordvkImportSemaphoreFdKHR(
+void BestPractices::PostCallRecordImportSemaphoreFdKHR(
VkDevice device,
const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo,
VkResult result) {
@@ -1346,7 +1377,7 @@
}
}
-void BestPractices::PostCallRecordvkGetSemaphoreFdKHR(
+void BestPractices::PostCallRecordGetSemaphoreFdKHR(
VkDevice device,
const VkSemaphoreGetFdInfoKHR* pGetFdInfo,
int* pFd,
@@ -1359,7 +1390,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateDescriptorUpdateTemplateKHR(
+void BestPractices::PostCallRecordCreateDescriptorUpdateTemplateKHR(
VkDevice device,
const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1373,7 +1404,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateRenderPass2KHR(
+void BestPractices::PostCallRecordCreateRenderPass2KHR(
VkDevice device,
const VkRenderPassCreateInfo2* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1387,7 +1418,7 @@
}
}
-void BestPractices::PostCallRecordvkGetSwapchainStatusKHR(
+void BestPractices::PostCallRecordGetSwapchainStatusKHR(
VkDevice device,
VkSwapchainKHR swapchain,
VkResult result) {
@@ -1401,7 +1432,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void BestPractices::PostCallRecordvkImportFenceWin32HandleKHR(
+void BestPractices::PostCallRecordImportFenceWin32HandleKHR(
VkDevice device,
const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo,
VkResult result) {
@@ -1417,7 +1448,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void BestPractices::PostCallRecordvkGetFenceWin32HandleKHR(
+void BestPractices::PostCallRecordGetFenceWin32HandleKHR(
VkDevice device,
const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo,
HANDLE* pHandle,
@@ -1432,7 +1463,7 @@
#endif // VK_USE_PLATFORM_WIN32_KHR
-void BestPractices::PostCallRecordvkImportFenceFdKHR(
+void BestPractices::PostCallRecordImportFenceFdKHR(
VkDevice device,
const VkImportFenceFdInfoKHR* pImportFenceFdInfo,
VkResult result) {
@@ -1444,7 +1475,7 @@
}
}
-void BestPractices::PostCallRecordvkGetFenceFdKHR(
+void BestPractices::PostCallRecordGetFenceFdKHR(
VkDevice device,
const VkFenceGetFdInfoKHR* pGetFdInfo,
int* pFd,
@@ -1457,7 +1488,7 @@
}
}
-void BestPractices::PostCallRecordvkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
+void BestPractices::PostCallRecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
VkPhysicalDevice physicalDevice,
uint32_t queueFamilyIndex,
uint32_t* pCounterCount,
@@ -1472,7 +1503,7 @@
}
}
-void BestPractices::PostCallRecordvkAcquireProfilingLockKHR(
+void BestPractices::PostCallRecordAcquireProfilingLockKHR(
VkDevice device,
const VkAcquireProfilingLockInfoKHR* pInfo,
VkResult result) {
@@ -1484,7 +1515,7 @@
}
}
-void BestPractices::PostCallRecordvkGetPhysicalDeviceSurfaceCapabilities2KHR(
+void BestPractices::PostCallRecordGetPhysicalDeviceSurfaceCapabilities2KHR(
VkPhysicalDevice physicalDevice,
const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
VkSurfaceCapabilities2KHR* pSurfaceCapabilities,
@@ -1497,7 +1528,7 @@
}
}
-void BestPractices::PostCallRecordvkGetPhysicalDeviceSurfaceFormats2KHR(
+void BestPractices::PostCallRecordGetPhysicalDeviceSurfaceFormats2KHR(
VkPhysicalDevice physicalDevice,
const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
uint32_t* pSurfaceFormatCount,
@@ -1511,7 +1542,7 @@
}
}
-void BestPractices::PostCallRecordvkGetPhysicalDeviceDisplayProperties2KHR(
+void BestPractices::PostCallRecordGetPhysicalDeviceDisplayProperties2KHR(
VkPhysicalDevice physicalDevice,
uint32_t* pPropertyCount,
VkDisplayProperties2KHR* pProperties,
@@ -1524,7 +1555,7 @@
}
}
-void BestPractices::PostCallRecordvkGetPhysicalDeviceDisplayPlaneProperties2KHR(
+void BestPractices::PostCallRecordGetPhysicalDeviceDisplayPlaneProperties2KHR(
VkPhysicalDevice physicalDevice,
uint32_t* pPropertyCount,
VkDisplayPlaneProperties2KHR* pProperties,
@@ -1537,7 +1568,7 @@
}
}
-void BestPractices::PostCallRecordvkGetDisplayModeProperties2KHR(
+void BestPractices::PostCallRecordGetDisplayModeProperties2KHR(
VkPhysicalDevice physicalDevice,
VkDisplayKHR display,
uint32_t* pPropertyCount,
@@ -1551,7 +1582,7 @@
}
}
-void BestPractices::PostCallRecordvkGetDisplayPlaneCapabilities2KHR(
+void BestPractices::PostCallRecordGetDisplayPlaneCapabilities2KHR(
VkPhysicalDevice physicalDevice,
const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo,
VkDisplayPlaneCapabilities2KHR* pCapabilities,
@@ -1564,7 +1595,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateSamplerYcbcrConversionKHR(
+void BestPractices::PostCallRecordCreateSamplerYcbcrConversionKHR(
VkDevice device,
const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1578,7 +1609,7 @@
}
}
-void BestPractices::PostCallRecordvkBindBufferMemory2KHR(
+void BestPractices::PostCallRecordBindBufferMemory2KHR(
VkDevice device,
uint32_t bindInfoCount,
const VkBindBufferMemoryInfo* pBindInfos,
@@ -1591,7 +1622,7 @@
}
}
-void BestPractices::PostCallRecordvkBindImageMemory2KHR(
+void BestPractices::PostCallRecordBindImageMemory2KHR(
VkDevice device,
uint32_t bindInfoCount,
const VkBindImageMemoryInfo* pBindInfos,
@@ -1604,7 +1635,7 @@
}
}
-void BestPractices::PostCallRecordvkGetSemaphoreCounterValueKHR(
+void BestPractices::PostCallRecordGetSemaphoreCounterValueKHR(
VkDevice device,
VkSemaphore semaphore,
uint64_t* pValue,
@@ -1617,7 +1648,7 @@
}
}
-void BestPractices::PostCallRecordvkWaitSemaphoresKHR(
+void BestPractices::PostCallRecordWaitSemaphoresKHR(
VkDevice device,
const VkSemaphoreWaitInfo* pWaitInfo,
uint64_t timeout,
@@ -1630,7 +1661,7 @@
}
}
-void BestPractices::PostCallRecordvkSignalSemaphoreKHR(
+void BestPractices::PostCallRecordSignalSemaphoreKHR(
VkDevice device,
const VkSemaphoreSignalInfo* pSignalInfo,
VkResult result) {
@@ -1644,7 +1675,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void BestPractices::PostCallRecordvkCreateDeferredOperationKHR(
+void BestPractices::PostCallRecordCreateDeferredOperationKHR(
VkDevice device,
const VkAllocationCallbacks* pAllocator,
VkDeferredOperationKHR* pDeferredOperation,
@@ -1661,7 +1692,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void BestPractices::PostCallRecordvkGetDeferredOperationResultKHR(
+void BestPractices::PostCallRecordGetDeferredOperationResultKHR(
VkDevice device,
VkDeferredOperationKHR operation,
VkResult result) {
@@ -1677,7 +1708,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void BestPractices::PostCallRecordvkDeferredOperationJoinKHR(
+void BestPractices::PostCallRecordDeferredOperationJoinKHR(
VkDevice device,
VkDeferredOperationKHR operation,
VkResult result) {
@@ -1691,7 +1722,7 @@
#endif // VK_ENABLE_BETA_EXTENSIONS
-void BestPractices::PostCallRecordvkGetPipelineExecutablePropertiesKHR(
+void BestPractices::PostCallRecordGetPipelineExecutablePropertiesKHR(
VkDevice device,
const VkPipelineInfoKHR* pPipelineInfo,
uint32_t* pExecutableCount,
@@ -1705,7 +1736,7 @@
}
}
-void BestPractices::PostCallRecordvkGetPipelineExecutableStatisticsKHR(
+void BestPractices::PostCallRecordGetPipelineExecutableStatisticsKHR(
VkDevice device,
const VkPipelineExecutableInfoKHR* pExecutableInfo,
uint32_t* pStatisticCount,
@@ -1719,7 +1750,7 @@
}
}
-void BestPractices::PostCallRecordvkGetPipelineExecutableInternalRepresentationsKHR(
+void BestPractices::PostCallRecordGetPipelineExecutableInternalRepresentationsKHR(
VkDevice device,
const VkPipelineExecutableInfoKHR* pExecutableInfo,
uint32_t* pInternalRepresentationCount,
@@ -1733,7 +1764,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateDebugReportCallbackEXT(
+void BestPractices::PostCallRecordCreateDebugReportCallbackEXT(
VkInstance instance,
const VkDebugReportCallbackCreateInfoEXT* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1747,7 +1778,7 @@
}
}
-void BestPractices::PostCallRecordvkDebugMarkerSetObjectTagEXT(
+void BestPractices::PostCallRecordDebugMarkerSetObjectTagEXT(
VkDevice device,
const VkDebugMarkerObjectTagInfoEXT* pTagInfo,
VkResult result) {
@@ -1759,7 +1790,7 @@
}
}
-void BestPractices::PostCallRecordvkDebugMarkerSetObjectNameEXT(
+void BestPractices::PostCallRecordDebugMarkerSetObjectNameEXT(
VkDevice device,
const VkDebugMarkerObjectNameInfoEXT* pNameInfo,
VkResult result) {
@@ -1771,7 +1802,20 @@
}
}
-void BestPractices::PostCallRecordvkGetShaderInfoAMD(
+void BestPractices::PostCallRecordGetImageViewAddressNVX(
+ VkDevice device,
+ VkImageView imageView,
+ VkImageViewAddressPropertiesNVX* pProperties,
+ VkResult result) {
+ ValidationStateTracker::PostCallRecordGetImageViewAddressNVX(device, imageView, pProperties, result);
+ if (result != VK_SUCCESS) {
+ static const std::vector<VkResult> error_codes = {VK_ERROR_UNKNOWN};
+ static const std::vector<VkResult> success_codes = {};
+ ValidateReturnCodes("vkGetImageViewAddressNVX", result, error_codes, success_codes);
+ }
+}
+
+void BestPractices::PostCallRecordGetShaderInfoAMD(
VkDevice device,
VkPipeline pipeline,
VkShaderStageFlagBits shaderStage,
@@ -1789,7 +1833,7 @@
#ifdef VK_USE_PLATFORM_GGP
-void BestPractices::PostCallRecordvkCreateStreamDescriptorSurfaceGGP(
+void BestPractices::PostCallRecordCreateStreamDescriptorSurfaceGGP(
VkInstance instance,
const VkStreamDescriptorSurfaceCreateInfoGGP* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1805,7 +1849,7 @@
#endif // VK_USE_PLATFORM_GGP
-void BestPractices::PostCallRecordvkGetPhysicalDeviceExternalImageFormatPropertiesNV(
+void BestPractices::PostCallRecordGetPhysicalDeviceExternalImageFormatPropertiesNV(
VkPhysicalDevice physicalDevice,
VkFormat format,
VkImageType type,
@@ -1825,7 +1869,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void BestPractices::PostCallRecordvkGetMemoryWin32HandleNV(
+void BestPractices::PostCallRecordGetMemoryWin32HandleNV(
VkDevice device,
VkDeviceMemory memory,
VkExternalMemoryHandleTypeFlagsNV handleType,
@@ -1843,7 +1887,7 @@
#ifdef VK_USE_PLATFORM_VI_NN
-void BestPractices::PostCallRecordvkCreateViSurfaceNN(
+void BestPractices::PostCallRecordCreateViSurfaceNN(
VkInstance instance,
const VkViSurfaceCreateInfoNN* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1861,7 +1905,7 @@
#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
-void BestPractices::PostCallRecordvkAcquireXlibDisplayEXT(
+void BestPractices::PostCallRecordAcquireXlibDisplayEXT(
VkPhysicalDevice physicalDevice,
Display* dpy,
VkDisplayKHR display,
@@ -1876,7 +1920,25 @@
#endif // VK_USE_PLATFORM_XLIB_XRANDR_EXT
-void BestPractices::PostCallRecordvkGetPhysicalDeviceSurfaceCapabilities2EXT(
+#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
+
+void BestPractices::PostCallRecordGetRandROutputDisplayEXT(
+ VkPhysicalDevice physicalDevice,
+ Display* dpy,
+ RROutput rrOutput,
+ VkDisplayKHR* pDisplay,
+ VkResult result) {
+ ValidationStateTracker::PostCallRecordGetRandROutputDisplayEXT(physicalDevice, dpy, rrOutput, pDisplay, result);
+ if (result != VK_SUCCESS) {
+ static const std::vector<VkResult> error_codes = {VK_ERROR_OUT_OF_HOST_MEMORY};
+ static const std::vector<VkResult> success_codes = {};
+ ValidateReturnCodes("vkGetRandROutputDisplayEXT", result, error_codes, success_codes);
+ }
+}
+
+#endif // VK_USE_PLATFORM_XLIB_XRANDR_EXT
+
+void BestPractices::PostCallRecordGetPhysicalDeviceSurfaceCapabilities2EXT(
VkPhysicalDevice physicalDevice,
VkSurfaceKHR surface,
VkSurfaceCapabilities2EXT* pSurfaceCapabilities,
@@ -1889,7 +1951,49 @@
}
}
-void BestPractices::PostCallRecordvkGetSwapchainCounterEXT(
+void BestPractices::PostCallRecordDisplayPowerControlEXT(
+ VkDevice device,
+ VkDisplayKHR display,
+ const VkDisplayPowerInfoEXT* pDisplayPowerInfo,
+ VkResult result) {
+ ValidationStateTracker::PostCallRecordDisplayPowerControlEXT(device, display, pDisplayPowerInfo, result);
+ if (result != VK_SUCCESS) {
+ static const std::vector<VkResult> error_codes = {VK_ERROR_OUT_OF_HOST_MEMORY};
+ static const std::vector<VkResult> success_codes = {};
+ ValidateReturnCodes("vkDisplayPowerControlEXT", result, error_codes, success_codes);
+ }
+}
+
+void BestPractices::PostCallRecordRegisterDeviceEventEXT(
+ VkDevice device,
+ const VkDeviceEventInfoEXT* pDeviceEventInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkFence* pFence,
+ VkResult result) {
+ ValidationStateTracker::PostCallRecordRegisterDeviceEventEXT(device, pDeviceEventInfo, pAllocator, pFence, result);
+ if (result != VK_SUCCESS) {
+ static const std::vector<VkResult> error_codes = {VK_ERROR_OUT_OF_HOST_MEMORY};
+ static const std::vector<VkResult> success_codes = {};
+ ValidateReturnCodes("vkRegisterDeviceEventEXT", result, error_codes, success_codes);
+ }
+}
+
+void BestPractices::PostCallRecordRegisterDisplayEventEXT(
+ VkDevice device,
+ VkDisplayKHR display,
+ const VkDisplayEventInfoEXT* pDisplayEventInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkFence* pFence,
+ VkResult result) {
+ ValidationStateTracker::PostCallRecordRegisterDisplayEventEXT(device, display, pDisplayEventInfo, pAllocator, pFence, result);
+ if (result != VK_SUCCESS) {
+ static const std::vector<VkResult> error_codes = {VK_ERROR_OUT_OF_HOST_MEMORY};
+ static const std::vector<VkResult> success_codes = {};
+ ValidateReturnCodes("vkRegisterDisplayEventEXT", result, error_codes, success_codes);
+ }
+}
+
+void BestPractices::PostCallRecordGetSwapchainCounterEXT(
VkDevice device,
VkSwapchainKHR swapchain,
VkSurfaceCounterFlagBitsEXT counter,
@@ -1903,7 +2007,7 @@
}
}
-void BestPractices::PostCallRecordvkGetRefreshCycleDurationGOOGLE(
+void BestPractices::PostCallRecordGetRefreshCycleDurationGOOGLE(
VkDevice device,
VkSwapchainKHR swapchain,
VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties,
@@ -1916,7 +2020,7 @@
}
}
-void BestPractices::PostCallRecordvkGetPastPresentationTimingGOOGLE(
+void BestPractices::PostCallRecordGetPastPresentationTimingGOOGLE(
VkDevice device,
VkSwapchainKHR swapchain,
uint32_t* pPresentationTimingCount,
@@ -1932,7 +2036,7 @@
#ifdef VK_USE_PLATFORM_IOS_MVK
-void BestPractices::PostCallRecordvkCreateIOSSurfaceMVK(
+void BestPractices::PostCallRecordCreateIOSSurfaceMVK(
VkInstance instance,
const VkIOSSurfaceCreateInfoMVK* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1950,7 +2054,7 @@
#ifdef VK_USE_PLATFORM_MACOS_MVK
-void BestPractices::PostCallRecordvkCreateMacOSSurfaceMVK(
+void BestPractices::PostCallRecordCreateMacOSSurfaceMVK(
VkInstance instance,
const VkMacOSSurfaceCreateInfoMVK* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1966,7 +2070,7 @@
#endif // VK_USE_PLATFORM_MACOS_MVK
-void BestPractices::PostCallRecordvkSetDebugUtilsObjectNameEXT(
+void BestPractices::PostCallRecordSetDebugUtilsObjectNameEXT(
VkDevice device,
const VkDebugUtilsObjectNameInfoEXT* pNameInfo,
VkResult result) {
@@ -1978,7 +2082,7 @@
}
}
-void BestPractices::PostCallRecordvkSetDebugUtilsObjectTagEXT(
+void BestPractices::PostCallRecordSetDebugUtilsObjectTagEXT(
VkDevice device,
const VkDebugUtilsObjectTagInfoEXT* pTagInfo,
VkResult result) {
@@ -1990,7 +2094,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateDebugUtilsMessengerEXT(
+void BestPractices::PostCallRecordCreateDebugUtilsMessengerEXT(
VkInstance instance,
const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -2006,7 +2110,7 @@
#ifdef VK_USE_PLATFORM_ANDROID_KHR
-void BestPractices::PostCallRecordvkGetAndroidHardwareBufferPropertiesANDROID(
+void BestPractices::PostCallRecordGetAndroidHardwareBufferPropertiesANDROID(
VkDevice device,
const struct AHardwareBuffer* buffer,
VkAndroidHardwareBufferPropertiesANDROID* pProperties,
@@ -2023,7 +2127,7 @@
#ifdef VK_USE_PLATFORM_ANDROID_KHR
-void BestPractices::PostCallRecordvkGetMemoryAndroidHardwareBufferANDROID(
+void BestPractices::PostCallRecordGetMemoryAndroidHardwareBufferANDROID(
VkDevice device,
const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo,
struct AHardwareBuffer** pBuffer,
@@ -2046,7 +2150,7 @@
// Skipping vkGetValidationCacheDataEXT for autogen as it has a manually created custom function or ignored.
-void BestPractices::PostCallRecordvkCreateAccelerationStructureNV(
+void BestPractices::PostCallRecordCreateAccelerationStructureNV(
VkDevice device,
const VkAccelerationStructureCreateInfoNV* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -2060,7 +2164,7 @@
}
}
-void BestPractices::PostCallRecordvkBindAccelerationStructureMemoryKHR(
+void BestPractices::PostCallRecordBindAccelerationStructureMemoryKHR(
VkDevice device,
uint32_t bindInfoCount,
const VkBindAccelerationStructureMemoryInfoKHR* pBindInfos,
@@ -2073,7 +2177,7 @@
}
}
-void BestPractices::PostCallRecordvkBindAccelerationStructureMemoryNV(
+void BestPractices::PostCallRecordBindAccelerationStructureMemoryNV(
VkDevice device,
uint32_t bindInfoCount,
const VkBindAccelerationStructureMemoryInfoKHR* pBindInfos,
@@ -2086,7 +2190,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateRayTracingPipelinesNV(
+void BestPractices::PostCallRecordCreateRayTracingPipelinesNV(
VkDevice device,
VkPipelineCache pipelineCache,
uint32_t createInfoCount,
@@ -2098,12 +2202,12 @@
ValidationStateTracker::PostCallRecordCreateRayTracingPipelinesNV(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines, result, state_data);
if (result != VK_SUCCESS) {
static const std::vector<VkResult> error_codes = {VK_ERROR_OUT_OF_HOST_MEMORY,VK_ERROR_OUT_OF_DEVICE_MEMORY,VK_ERROR_INVALID_SHADER_NV};
- static const std::vector<VkResult> success_codes = {};
+ static const std::vector<VkResult> success_codes = {VK_PIPELINE_COMPILE_REQUIRED_EXT};
ValidateReturnCodes("vkCreateRayTracingPipelinesNV", result, error_codes, success_codes);
}
}
-void BestPractices::PostCallRecordvkGetRayTracingShaderGroupHandlesKHR(
+void BestPractices::PostCallRecordGetRayTracingShaderGroupHandlesKHR(
VkDevice device,
VkPipeline pipeline,
uint32_t firstGroup,
@@ -2119,7 +2223,7 @@
}
}
-void BestPractices::PostCallRecordvkGetRayTracingShaderGroupHandlesNV(
+void BestPractices::PostCallRecordGetRayTracingShaderGroupHandlesNV(
VkDevice device,
VkPipeline pipeline,
uint32_t firstGroup,
@@ -2135,7 +2239,7 @@
}
}
-void BestPractices::PostCallRecordvkGetAccelerationStructureHandleNV(
+void BestPractices::PostCallRecordGetAccelerationStructureHandleNV(
VkDevice device,
VkAccelerationStructureKHR accelerationStructure,
size_t dataSize,
@@ -2149,7 +2253,7 @@
}
}
-void BestPractices::PostCallRecordvkCompileDeferredNV(
+void BestPractices::PostCallRecordCompileDeferredNV(
VkDevice device,
VkPipeline pipeline,
uint32_t shader,
@@ -2162,7 +2266,7 @@
}
}
-void BestPractices::PostCallRecordvkGetMemoryHostPointerPropertiesEXT(
+void BestPractices::PostCallRecordGetMemoryHostPointerPropertiesEXT(
VkDevice device,
VkExternalMemoryHandleTypeFlagBits handleType,
const void* pHostPointer,
@@ -2176,7 +2280,7 @@
}
}
-void BestPractices::PostCallRecordvkGetPhysicalDeviceCalibrateableTimeDomainsEXT(
+void BestPractices::PostCallRecordGetPhysicalDeviceCalibrateableTimeDomainsEXT(
VkPhysicalDevice physicalDevice,
uint32_t* pTimeDomainCount,
VkTimeDomainEXT* pTimeDomains,
@@ -2189,7 +2293,7 @@
}
}
-void BestPractices::PostCallRecordvkGetCalibratedTimestampsEXT(
+void BestPractices::PostCallRecordGetCalibratedTimestampsEXT(
VkDevice device,
uint32_t timestampCount,
const VkCalibratedTimestampInfoEXT* pTimestampInfos,
@@ -2204,7 +2308,7 @@
}
}
-void BestPractices::PostCallRecordvkInitializePerformanceApiINTEL(
+void BestPractices::PostCallRecordInitializePerformanceApiINTEL(
VkDevice device,
const VkInitializePerformanceApiInfoINTEL* pInitializeInfo,
VkResult result) {
@@ -2216,7 +2320,7 @@
}
}
-void BestPractices::PostCallRecordvkCmdSetPerformanceMarkerINTEL(
+void BestPractices::PostCallRecordCmdSetPerformanceMarkerINTEL(
VkCommandBuffer commandBuffer,
const VkPerformanceMarkerInfoINTEL* pMarkerInfo,
VkResult result) {
@@ -2228,7 +2332,7 @@
}
}
-void BestPractices::PostCallRecordvkCmdSetPerformanceStreamMarkerINTEL(
+void BestPractices::PostCallRecordCmdSetPerformanceStreamMarkerINTEL(
VkCommandBuffer commandBuffer,
const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo,
VkResult result) {
@@ -2240,7 +2344,7 @@
}
}
-void BestPractices::PostCallRecordvkCmdSetPerformanceOverrideINTEL(
+void BestPractices::PostCallRecordCmdSetPerformanceOverrideINTEL(
VkCommandBuffer commandBuffer,
const VkPerformanceOverrideInfoINTEL* pOverrideInfo,
VkResult result) {
@@ -2252,7 +2356,7 @@
}
}
-void BestPractices::PostCallRecordvkAcquirePerformanceConfigurationINTEL(
+void BestPractices::PostCallRecordAcquirePerformanceConfigurationINTEL(
VkDevice device,
const VkPerformanceConfigurationAcquireInfoINTEL* pAcquireInfo,
VkPerformanceConfigurationINTEL* pConfiguration,
@@ -2265,7 +2369,7 @@
}
}
-void BestPractices::PostCallRecordvkReleasePerformanceConfigurationINTEL(
+void BestPractices::PostCallRecordReleasePerformanceConfigurationINTEL(
VkDevice device,
VkPerformanceConfigurationINTEL configuration,
VkResult result) {
@@ -2277,7 +2381,7 @@
}
}
-void BestPractices::PostCallRecordvkQueueSetPerformanceConfigurationINTEL(
+void BestPractices::PostCallRecordQueueSetPerformanceConfigurationINTEL(
VkQueue queue,
VkPerformanceConfigurationINTEL configuration,
VkResult result) {
@@ -2289,7 +2393,7 @@
}
}
-void BestPractices::PostCallRecordvkGetPerformanceParameterINTEL(
+void BestPractices::PostCallRecordGetPerformanceParameterINTEL(
VkDevice device,
VkPerformanceParameterTypeINTEL parameter,
VkPerformanceValueINTEL* pValue,
@@ -2304,7 +2408,7 @@
#ifdef VK_USE_PLATFORM_FUCHSIA
-void BestPractices::PostCallRecordvkCreateImagePipeSurfaceFUCHSIA(
+void BestPractices::PostCallRecordCreateImagePipeSurfaceFUCHSIA(
VkInstance instance,
const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -2322,7 +2426,7 @@
#ifdef VK_USE_PLATFORM_METAL_EXT
-void BestPractices::PostCallRecordvkCreateMetalSurfaceEXT(
+void BestPractices::PostCallRecordCreateMetalSurfaceEXT(
VkInstance instance,
const VkMetalSurfaceCreateInfoEXT* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -2338,7 +2442,7 @@
#endif // VK_USE_PLATFORM_METAL_EXT
-void BestPractices::PostCallRecordvkGetPhysicalDeviceToolPropertiesEXT(
+void BestPractices::PostCallRecordGetPhysicalDeviceToolPropertiesEXT(
VkPhysicalDevice physicalDevice,
uint32_t* pToolCount,
VkPhysicalDeviceToolPropertiesEXT* pToolProperties,
@@ -2351,7 +2455,7 @@
}
}
-void BestPractices::PostCallRecordvkGetPhysicalDeviceCooperativeMatrixPropertiesNV(
+void BestPractices::PostCallRecordGetPhysicalDeviceCooperativeMatrixPropertiesNV(
VkPhysicalDevice physicalDevice,
uint32_t* pPropertyCount,
VkCooperativeMatrixPropertiesNV* pProperties,
@@ -2364,7 +2468,7 @@
}
}
-void BestPractices::PostCallRecordvkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(
+void BestPractices::PostCallRecordGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(
VkPhysicalDevice physicalDevice,
uint32_t* pCombinationCount,
VkFramebufferMixedSamplesCombinationNV* pCombinations,
@@ -2379,7 +2483,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void BestPractices::PostCallRecordvkGetPhysicalDeviceSurfacePresentModes2EXT(
+void BestPractices::PostCallRecordGetPhysicalDeviceSurfacePresentModes2EXT(
VkPhysicalDevice physicalDevice,
const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
uint32_t* pPresentModeCount,
@@ -2397,7 +2501,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void BestPractices::PostCallRecordvkAcquireFullScreenExclusiveModeEXT(
+void BestPractices::PostCallRecordAcquireFullScreenExclusiveModeEXT(
VkDevice device,
VkSwapchainKHR swapchain,
VkResult result) {
@@ -2413,7 +2517,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void BestPractices::PostCallRecordvkReleaseFullScreenExclusiveModeEXT(
+void BestPractices::PostCallRecordReleaseFullScreenExclusiveModeEXT(
VkDevice device,
VkSwapchainKHR swapchain,
VkResult result) {
@@ -2429,7 +2533,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void BestPractices::PostCallRecordvkGetDeviceGroupSurfacePresentModes2EXT(
+void BestPractices::PostCallRecordGetDeviceGroupSurfacePresentModes2EXT(
VkDevice device,
const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
VkDeviceGroupPresentModeFlagsKHR* pModes,
@@ -2444,7 +2548,7 @@
#endif // VK_USE_PLATFORM_WIN32_KHR
-void BestPractices::PostCallRecordvkCreateHeadlessSurfaceEXT(
+void BestPractices::PostCallRecordCreateHeadlessSurfaceEXT(
VkInstance instance,
const VkHeadlessSurfaceCreateInfoEXT* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -2458,7 +2562,7 @@
}
}
-void BestPractices::PostCallRecordvkCreateIndirectCommandsLayoutNV(
+void BestPractices::PostCallRecordCreateIndirectCommandsLayoutNV(
VkDevice device,
const VkIndirectCommandsLayoutCreateInfoNV* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -2472,9 +2576,56 @@
}
}
+void BestPractices::PostCallRecordCreatePrivateDataSlotEXT(
+ VkDevice device,
+ const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkPrivateDataSlotEXT* pPrivateDataSlot,
+ VkResult result) {
+ ValidationStateTracker::PostCallRecordCreatePrivateDataSlotEXT(device, pCreateInfo, pAllocator, pPrivateDataSlot, result);
+ if (result != VK_SUCCESS) {
+ static const std::vector<VkResult> error_codes = {VK_ERROR_OUT_OF_HOST_MEMORY};
+ static const std::vector<VkResult> success_codes = {};
+ ValidateReturnCodes("vkCreatePrivateDataSlotEXT", result, error_codes, success_codes);
+ }
+}
+
+void BestPractices::PostCallRecordSetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t data,
+ VkResult result) {
+ ValidationStateTracker::PostCallRecordSetPrivateDataEXT(device, objectType, objectHandle, privateDataSlot, data, result);
+ if (result != VK_SUCCESS) {
+ static const std::vector<VkResult> error_codes = {VK_ERROR_OUT_OF_HOST_MEMORY};
+ static const std::vector<VkResult> success_codes = {};
+ ValidateReturnCodes("vkSetPrivateDataEXT", result, error_codes, success_codes);
+ }
+}
+
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+
+void BestPractices::PostCallRecordCreateDirectFBSurfaceEXT(
+ VkInstance instance,
+ const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkSurfaceKHR* pSurface,
+ VkResult result) {
+ ValidationStateTracker::PostCallRecordCreateDirectFBSurfaceEXT(instance, pCreateInfo, pAllocator, pSurface, result);
+ if (result != VK_SUCCESS) {
+ static const std::vector<VkResult> error_codes = {VK_ERROR_OUT_OF_HOST_MEMORY,VK_ERROR_OUT_OF_DEVICE_MEMORY};
+ static const std::vector<VkResult> success_codes = {};
+ ValidateReturnCodes("vkCreateDirectFBSurfaceEXT", result, error_codes, success_codes);
+ }
+}
+
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
+
#ifdef VK_USE_PLATFORM_FUCHSIA
-void BestPractices::PostCallRecordvkCreateBufferCollectionFUCHSIA(
+void BestPractices::PostCallRecordCreateBufferCollectionFUCHSIA(
VkDevice device,
const VkBufferCollectionCreateInfoFUCHSIA* pImportInfo,
const VkAllocationCallbacks* pAllocator,
@@ -2492,7 +2643,7 @@
#ifdef VK_USE_PLATFORM_FUCHSIA
-void BestPractices::PostCallRecordvkSetBufferCollectionConstraintsFUCHSIA(
+void BestPractices::PostCallRecordSetBufferCollectionConstraintsFUCHSIA(
VkDevice device,
VkBufferCollectionFUCHSIA collection,
const VkImageCreateInfo* pImageInfo,
@@ -2509,7 +2660,7 @@
#ifdef VK_USE_PLATFORM_FUCHSIA
-void BestPractices::PostCallRecordvkSetBufferCollectionBufferConstraintsFUCHSIA(
+void BestPractices::PostCallRecordSetBufferCollectionBufferConstraintsFUCHSIA(
VkDevice device,
VkBufferCollectionFUCHSIA collection,
const VkBufferConstraintsInfoFUCHSIA* pBufferConstraintsInfo,
@@ -2526,7 +2677,7 @@
#ifdef VK_USE_PLATFORM_FUCHSIA
-void BestPractices::PostCallRecordvkGetBufferCollectionPropertiesFUCHSIA(
+void BestPractices::PostCallRecordGetBufferCollectionPropertiesFUCHSIA(
VkDevice device,
VkBufferCollectionFUCHSIA collection,
VkBufferCollectionPropertiesFUCHSIA* pProperties,
@@ -2543,7 +2694,7 @@
#ifdef VK_USE_PLATFORM_FUCHSIA
-void BestPractices::PostCallRecordvkGetMemoryZirconHandleFUCHSIA(
+void BestPractices::PostCallRecordGetMemoryZirconHandleFUCHSIA(
VkDevice device,
const VkMemoryGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo,
zx_handle_t* pZirconHandle,
@@ -2560,7 +2711,7 @@
#ifdef VK_USE_PLATFORM_FUCHSIA
-void BestPractices::PostCallRecordvkGetMemoryZirconHandlePropertiesFUCHSIA(
+void BestPractices::PostCallRecordGetMemoryZirconHandlePropertiesFUCHSIA(
VkDevice device,
VkExternalMemoryHandleTypeFlagBits handleType,
zx_handle_t ZirconHandle,
@@ -2578,7 +2729,7 @@
#ifdef VK_USE_PLATFORM_FUCHSIA
-void BestPractices::PostCallRecordvkImportSemaphoreZirconHandleFUCHSIA(
+void BestPractices::PostCallRecordImportSemaphoreZirconHandleFUCHSIA(
VkDevice device,
const VkImportSemaphoreZirconHandleInfoFUCHSIA* pImportSemaphoreZirconHandleInfo,
VkResult result) {
@@ -2594,7 +2745,7 @@
#ifdef VK_USE_PLATFORM_FUCHSIA
-void BestPractices::PostCallRecordvkGetSemaphoreZirconHandleFUCHSIA(
+void BestPractices::PostCallRecordGetSemaphoreZirconHandleFUCHSIA(
VkDevice device,
const VkSemaphoreGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo,
zx_handle_t* pZirconHandle,
@@ -2611,7 +2762,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void BestPractices::PostCallRecordvkCreateAccelerationStructureKHR(
+void BestPractices::PostCallRecordCreateAccelerationStructureKHR(
VkDevice device,
const VkAccelerationStructureCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -2629,7 +2780,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void BestPractices::PostCallRecordvkBuildAccelerationStructureKHR(
+void BestPractices::PostCallRecordBuildAccelerationStructureKHR(
VkDevice device,
uint32_t infoCount,
const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
@@ -2647,7 +2798,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void BestPractices::PostCallRecordvkCopyAccelerationStructureKHR(
+void BestPractices::PostCallRecordCopyAccelerationStructureKHR(
VkDevice device,
const VkCopyAccelerationStructureInfoKHR* pInfo,
VkResult result) {
@@ -2663,7 +2814,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void BestPractices::PostCallRecordvkCopyAccelerationStructureToMemoryKHR(
+void BestPractices::PostCallRecordCopyAccelerationStructureToMemoryKHR(
VkDevice device,
const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo,
VkResult result) {
@@ -2679,7 +2830,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void BestPractices::PostCallRecordvkCopyMemoryToAccelerationStructureKHR(
+void BestPractices::PostCallRecordCopyMemoryToAccelerationStructureKHR(
VkDevice device,
const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo,
VkResult result) {
@@ -2695,7 +2846,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void BestPractices::PostCallRecordvkWriteAccelerationStructuresPropertiesKHR(
+void BestPractices::PostCallRecordWriteAccelerationStructuresPropertiesKHR(
VkDevice device,
uint32_t accelerationStructureCount,
const VkAccelerationStructureKHR* pAccelerationStructures,
@@ -2716,7 +2867,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void BestPractices::PostCallRecordvkCreateRayTracingPipelinesKHR(
+void BestPractices::PostCallRecordCreateRayTracingPipelinesKHR(
VkDevice device,
VkPipelineCache pipelineCache,
uint32_t createInfoCount,
@@ -2728,7 +2879,7 @@
ValidationStateTracker::PostCallRecordCreateRayTracingPipelinesKHR(device, pipelineCache, createInfoCount, pCreateInfos, pAllocator, pPipelines, result, state_data);
if (result != VK_SUCCESS) {
static const std::vector<VkResult> error_codes = {VK_ERROR_OUT_OF_HOST_MEMORY,VK_ERROR_OUT_OF_DEVICE_MEMORY,VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS};
- static const std::vector<VkResult> success_codes = {VK_OPERATION_DEFERRED_KHR,VK_OPERATION_NOT_DEFERRED_KHR};
+ static const std::vector<VkResult> success_codes = {VK_OPERATION_DEFERRED_KHR,VK_OPERATION_NOT_DEFERRED_KHR,VK_PIPELINE_COMPILE_REQUIRED_EXT};
ValidateReturnCodes("vkCreateRayTracingPipelinesKHR", result, error_codes, success_codes);
}
}
@@ -2737,7 +2888,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void BestPractices::PostCallRecordvkGetRayTracingCaptureReplayShaderGroupHandlesKHR(
+void BestPractices::PostCallRecordGetRayTracingCaptureReplayShaderGroupHandlesKHR(
VkDevice device,
VkPipeline pipeline,
uint32_t firstGroup,
@@ -2757,7 +2908,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void BestPractices::PostCallRecordvkGetDeviceAccelerationStructureCompatibilityKHR(
+void BestPractices::PostCallRecordGetDeviceAccelerationStructureCompatibilityKHR(
VkDevice device,
const VkAccelerationStructureVersionKHR* version,
VkResult result) {
diff --git a/layers/generated/best_practices.h b/layers/generated/best_practices.h
index e8daae1..e5ddf84 100644
--- a/layers/generated/best_practices.h
+++ b/layers/generated/best_practices.h
@@ -25,21 +25,21 @@
****************************************************************************/
-void PostCallRecordvkCreateInstance(
+void PostCallRecordCreateInstance(
const VkInstanceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkInstance* pInstance,
VkResult result);
-void PostCallRecordvkEnumeratePhysicalDevices(
+void PostCallRecordEnumeratePhysicalDevices(
VkInstance instance,
uint32_t* pPhysicalDeviceCount,
VkPhysicalDevice* pPhysicalDevices,
VkResult result);
-void PostCallRecordvkGetPhysicalDeviceImageFormatProperties(
+void PostCallRecordGetPhysicalDeviceImageFormatProperties(
VkPhysicalDevice physicalDevice,
VkFormat format,
VkImageType type,
@@ -50,7 +50,7 @@
VkResult result);
-void PostCallRecordvkCreateDevice(
+void PostCallRecordCreateDevice(
VkPhysicalDevice physicalDevice,
const VkDeviceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -58,14 +58,14 @@
VkResult result);
-void PostCallRecordvkEnumerateInstanceExtensionProperties(
+void PostCallRecordEnumerateInstanceExtensionProperties(
const char* pLayerName,
uint32_t* pPropertyCount,
VkExtensionProperties* pProperties,
VkResult result);
-void PostCallRecordvkEnumerateDeviceExtensionProperties(
+void PostCallRecordEnumerateDeviceExtensionProperties(
VkPhysicalDevice physicalDevice,
const char* pLayerName,
uint32_t* pPropertyCount,
@@ -73,20 +73,20 @@
VkResult result);
-void PostCallRecordvkEnumerateInstanceLayerProperties(
+void PostCallRecordEnumerateInstanceLayerProperties(
uint32_t* pPropertyCount,
VkLayerProperties* pProperties,
VkResult result);
-void PostCallRecordvkEnumerateDeviceLayerProperties(
+void PostCallRecordEnumerateDeviceLayerProperties(
VkPhysicalDevice physicalDevice,
uint32_t* pPropertyCount,
VkLayerProperties* pProperties,
VkResult result);
-void PostCallRecordvkQueueSubmit(
+void PostCallRecordQueueSubmit(
VkQueue queue,
uint32_t submitCount,
const VkSubmitInfo* pSubmits,
@@ -94,17 +94,25 @@
VkResult result);
-void PostCallRecordvkQueueWaitIdle(
+void PostCallRecordQueueWaitIdle(
VkQueue queue,
VkResult result);
-void PostCallRecordvkDeviceWaitIdle(
+void PostCallRecordDeviceWaitIdle(
VkDevice device,
VkResult result);
-void PostCallRecordvkMapMemory(
+void PostCallRecordAllocateMemory(
+ VkDevice device,
+ const VkMemoryAllocateInfo* pAllocateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkDeviceMemory* pMemory,
+ VkResult result);
+
+
+void PostCallRecordMapMemory(
VkDevice device,
VkDeviceMemory memory,
VkDeviceSize offset,
@@ -114,21 +122,21 @@
VkResult result);
-void PostCallRecordvkFlushMappedMemoryRanges(
+void PostCallRecordFlushMappedMemoryRanges(
VkDevice device,
uint32_t memoryRangeCount,
const VkMappedMemoryRange* pMemoryRanges,
VkResult result);
-void PostCallRecordvkInvalidateMappedMemoryRanges(
+void PostCallRecordInvalidateMappedMemoryRanges(
VkDevice device,
uint32_t memoryRangeCount,
const VkMappedMemoryRange* pMemoryRanges,
VkResult result);
-void PostCallRecordvkBindBufferMemory(
+void PostCallRecordBindBufferMemory(
VkDevice device,
VkBuffer buffer,
VkDeviceMemory memory,
@@ -136,7 +144,7 @@
VkResult result);
-void PostCallRecordvkBindImageMemory(
+void PostCallRecordBindImageMemory(
VkDevice device,
VkImage image,
VkDeviceMemory memory,
@@ -144,7 +152,15 @@
VkResult result);
-void PostCallRecordvkCreateFence(
+void PostCallRecordQueueBindSparse(
+ VkQueue queue,
+ uint32_t bindInfoCount,
+ const VkBindSparseInfo* pBindInfo,
+ VkFence fence,
+ VkResult result);
+
+
+void PostCallRecordCreateFence(
VkDevice device,
const VkFenceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -152,20 +168,20 @@
VkResult result);
-void PostCallRecordvkResetFences(
+void PostCallRecordResetFences(
VkDevice device,
uint32_t fenceCount,
const VkFence* pFences,
VkResult result);
-void PostCallRecordvkGetFenceStatus(
+void PostCallRecordGetFenceStatus(
VkDevice device,
VkFence fence,
VkResult result);
-void PostCallRecordvkWaitForFences(
+void PostCallRecordWaitForFences(
VkDevice device,
uint32_t fenceCount,
const VkFence* pFences,
@@ -174,7 +190,7 @@
VkResult result);
-void PostCallRecordvkCreateSemaphore(
+void PostCallRecordCreateSemaphore(
VkDevice device,
const VkSemaphoreCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -182,7 +198,7 @@
VkResult result);
-void PostCallRecordvkCreateEvent(
+void PostCallRecordCreateEvent(
VkDevice device,
const VkEventCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -190,25 +206,25 @@
VkResult result);
-void PostCallRecordvkGetEventStatus(
+void PostCallRecordGetEventStatus(
VkDevice device,
VkEvent event,
VkResult result);
-void PostCallRecordvkSetEvent(
+void PostCallRecordSetEvent(
VkDevice device,
VkEvent event,
VkResult result);
-void PostCallRecordvkResetEvent(
+void PostCallRecordResetEvent(
VkDevice device,
VkEvent event,
VkResult result);
-void PostCallRecordvkCreateQueryPool(
+void PostCallRecordCreateQueryPool(
VkDevice device,
const VkQueryPoolCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -216,7 +232,7 @@
VkResult result);
-void PostCallRecordvkGetQueryPoolResults(
+void PostCallRecordGetQueryPoolResults(
VkDevice device,
VkQueryPool queryPool,
uint32_t firstQuery,
@@ -228,7 +244,7 @@
VkResult result);
-void PostCallRecordvkCreateBuffer(
+void PostCallRecordCreateBuffer(
VkDevice device,
const VkBufferCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -236,7 +252,7 @@
VkResult result);
-void PostCallRecordvkCreateBufferView(
+void PostCallRecordCreateBufferView(
VkDevice device,
const VkBufferViewCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -244,7 +260,7 @@
VkResult result);
-void PostCallRecordvkCreateImage(
+void PostCallRecordCreateImage(
VkDevice device,
const VkImageCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -252,7 +268,7 @@
VkResult result);
-void PostCallRecordvkCreateImageView(
+void PostCallRecordCreateImageView(
VkDevice device,
const VkImageViewCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -260,7 +276,7 @@
VkResult result);
-void PostCallRecordvkCreateShaderModule(
+void PostCallRecordCreateShaderModule(
VkDevice device,
const VkShaderModuleCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -269,7 +285,7 @@
void* state_data);
-void PostCallRecordvkCreatePipelineCache(
+void PostCallRecordCreatePipelineCache(
VkDevice device,
const VkPipelineCacheCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -277,7 +293,7 @@
VkResult result);
-void PostCallRecordvkGetPipelineCacheData(
+void PostCallRecordGetPipelineCacheData(
VkDevice device,
VkPipelineCache pipelineCache,
size_t* pDataSize,
@@ -285,7 +301,7 @@
VkResult result);
-void PostCallRecordvkMergePipelineCaches(
+void PostCallRecordMergePipelineCaches(
VkDevice device,
VkPipelineCache dstCache,
uint32_t srcCacheCount,
@@ -293,7 +309,7 @@
VkResult result);
-void PostCallRecordvkCreateGraphicsPipelines(
+void PostCallRecordCreateGraphicsPipelines(
VkDevice device,
VkPipelineCache pipelineCache,
uint32_t createInfoCount,
@@ -304,7 +320,7 @@
void* state_data);
-void PostCallRecordvkCreateComputePipelines(
+void PostCallRecordCreateComputePipelines(
VkDevice device,
VkPipelineCache pipelineCache,
uint32_t createInfoCount,
@@ -315,7 +331,7 @@
void* state_data);
-void PostCallRecordvkCreatePipelineLayout(
+void PostCallRecordCreatePipelineLayout(
VkDevice device,
const VkPipelineLayoutCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -323,7 +339,7 @@
VkResult result);
-void PostCallRecordvkCreateSampler(
+void PostCallRecordCreateSampler(
VkDevice device,
const VkSamplerCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -331,7 +347,7 @@
VkResult result);
-void PostCallRecordvkCreateDescriptorSetLayout(
+void PostCallRecordCreateDescriptorSetLayout(
VkDevice device,
const VkDescriptorSetLayoutCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -339,7 +355,7 @@
VkResult result);
-void PostCallRecordvkCreateDescriptorPool(
+void PostCallRecordCreateDescriptorPool(
VkDevice device,
const VkDescriptorPoolCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -347,7 +363,7 @@
VkResult result);
-void PostCallRecordvkAllocateDescriptorSets(
+void PostCallRecordAllocateDescriptorSets(
VkDevice device,
const VkDescriptorSetAllocateInfo* pAllocateInfo,
VkDescriptorSet* pDescriptorSets,
@@ -355,7 +371,7 @@
void* state_data);
-void PostCallRecordvkCreateFramebuffer(
+void PostCallRecordCreateFramebuffer(
VkDevice device,
const VkFramebufferCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -363,7 +379,7 @@
VkResult result);
-void PostCallRecordvkCreateRenderPass(
+void PostCallRecordCreateRenderPass(
VkDevice device,
const VkRenderPassCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -371,7 +387,7 @@
VkResult result);
-void PostCallRecordvkCreateCommandPool(
+void PostCallRecordCreateCommandPool(
VkDevice device,
const VkCommandPoolCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -379,66 +395,66 @@
VkResult result);
-void PostCallRecordvkResetCommandPool(
+void PostCallRecordResetCommandPool(
VkDevice device,
VkCommandPool commandPool,
VkCommandPoolResetFlags flags,
VkResult result);
-void PostCallRecordvkAllocateCommandBuffers(
+void PostCallRecordAllocateCommandBuffers(
VkDevice device,
const VkCommandBufferAllocateInfo* pAllocateInfo,
VkCommandBuffer* pCommandBuffers,
VkResult result);
-void PostCallRecordvkBeginCommandBuffer(
+void PostCallRecordBeginCommandBuffer(
VkCommandBuffer commandBuffer,
const VkCommandBufferBeginInfo* pBeginInfo,
VkResult result);
-void PostCallRecordvkEndCommandBuffer(
+void PostCallRecordEndCommandBuffer(
VkCommandBuffer commandBuffer,
VkResult result);
-void PostCallRecordvkResetCommandBuffer(
+void PostCallRecordResetCommandBuffer(
VkCommandBuffer commandBuffer,
VkCommandBufferResetFlags flags,
VkResult result);
-void PostCallRecordvkBindBufferMemory2(
+void PostCallRecordBindBufferMemory2(
VkDevice device,
uint32_t bindInfoCount,
const VkBindBufferMemoryInfo* pBindInfos,
VkResult result);
-void PostCallRecordvkBindImageMemory2(
+void PostCallRecordBindImageMemory2(
VkDevice device,
uint32_t bindInfoCount,
const VkBindImageMemoryInfo* pBindInfos,
VkResult result);
-void PostCallRecordvkEnumeratePhysicalDeviceGroups(
+void PostCallRecordEnumeratePhysicalDeviceGroups(
VkInstance instance,
uint32_t* pPhysicalDeviceGroupCount,
VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties,
VkResult result);
-void PostCallRecordvkGetPhysicalDeviceImageFormatProperties2(
+void PostCallRecordGetPhysicalDeviceImageFormatProperties2(
VkPhysicalDevice physicalDevice,
const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
VkImageFormatProperties2* pImageFormatProperties,
VkResult result);
-void PostCallRecordvkCreateSamplerYcbcrConversion(
+void PostCallRecordCreateSamplerYcbcrConversion(
VkDevice device,
const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -446,7 +462,7 @@
VkResult result);
-void PostCallRecordvkCreateDescriptorUpdateTemplate(
+void PostCallRecordCreateDescriptorUpdateTemplate(
VkDevice device,
const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -454,7 +470,7 @@
VkResult result);
-void PostCallRecordvkCreateRenderPass2(
+void PostCallRecordCreateRenderPass2(
VkDevice device,
const VkRenderPassCreateInfo2* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -462,27 +478,27 @@
VkResult result);
-void PostCallRecordvkGetSemaphoreCounterValue(
+void PostCallRecordGetSemaphoreCounterValue(
VkDevice device,
VkSemaphore semaphore,
uint64_t* pValue,
VkResult result);
-void PostCallRecordvkWaitSemaphores(
+void PostCallRecordWaitSemaphores(
VkDevice device,
const VkSemaphoreWaitInfo* pWaitInfo,
uint64_t timeout,
VkResult result);
-void PostCallRecordvkSignalSemaphore(
+void PostCallRecordSignalSemaphore(
VkDevice device,
const VkSemaphoreSignalInfo* pSignalInfo,
VkResult result);
-void PostCallRecordvkGetPhysicalDeviceSurfaceSupportKHR(
+void PostCallRecordGetPhysicalDeviceSurfaceSupportKHR(
VkPhysicalDevice physicalDevice,
uint32_t queueFamilyIndex,
VkSurfaceKHR surface,
@@ -490,14 +506,14 @@
VkResult result);
-void PostCallRecordvkGetPhysicalDeviceSurfaceCapabilitiesKHR(
+void PostCallRecordGetPhysicalDeviceSurfaceCapabilitiesKHR(
VkPhysicalDevice physicalDevice,
VkSurfaceKHR surface,
VkSurfaceCapabilitiesKHR* pSurfaceCapabilities,
VkResult result);
-void PostCallRecordvkGetPhysicalDeviceSurfaceFormatsKHR(
+void PostCallRecordGetPhysicalDeviceSurfaceFormatsKHR(
VkPhysicalDevice physicalDevice,
VkSurfaceKHR surface,
uint32_t* pSurfaceFormatCount,
@@ -505,7 +521,7 @@
VkResult result);
-void PostCallRecordvkGetPhysicalDeviceSurfacePresentModesKHR(
+void PostCallRecordGetPhysicalDeviceSurfacePresentModesKHR(
VkPhysicalDevice physicalDevice,
VkSurfaceKHR surface,
uint32_t* pPresentModeCount,
@@ -513,7 +529,7 @@
VkResult result);
-void PostCallRecordvkCreateSwapchainKHR(
+void PostCallRecordCreateSwapchainKHR(
VkDevice device,
const VkSwapchainCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -521,7 +537,7 @@
VkResult result);
-void PostCallRecordvkGetSwapchainImagesKHR(
+void PostCallRecordGetSwapchainImagesKHR(
VkDevice device,
VkSwapchainKHR swapchain,
uint32_t* pSwapchainImageCount,
@@ -529,7 +545,7 @@
VkResult result);
-void PostCallRecordvkAcquireNextImageKHR(
+void PostCallRecordAcquireNextImageKHR(
VkDevice device,
VkSwapchainKHR swapchain,
uint64_t timeout,
@@ -539,26 +555,26 @@
VkResult result);
-void PostCallRecordvkQueuePresentKHR(
+void PostCallRecordQueuePresentKHR(
VkQueue queue,
const VkPresentInfoKHR* pPresentInfo,
VkResult result);
-void PostCallRecordvkGetDeviceGroupPresentCapabilitiesKHR(
+void PostCallRecordGetDeviceGroupPresentCapabilitiesKHR(
VkDevice device,
VkDeviceGroupPresentCapabilitiesKHR* pDeviceGroupPresentCapabilities,
VkResult result);
-void PostCallRecordvkGetDeviceGroupSurfacePresentModesKHR(
+void PostCallRecordGetDeviceGroupSurfacePresentModesKHR(
VkDevice device,
VkSurfaceKHR surface,
VkDeviceGroupPresentModeFlagsKHR* pModes,
VkResult result);
-void PostCallRecordvkGetPhysicalDevicePresentRectanglesKHR(
+void PostCallRecordGetPhysicalDevicePresentRectanglesKHR(
VkPhysicalDevice physicalDevice,
VkSurfaceKHR surface,
uint32_t* pRectCount,
@@ -566,28 +582,28 @@
VkResult result);
-void PostCallRecordvkAcquireNextImage2KHR(
+void PostCallRecordAcquireNextImage2KHR(
VkDevice device,
const VkAcquireNextImageInfoKHR* pAcquireInfo,
uint32_t* pImageIndex,
VkResult result);
-void PostCallRecordvkGetPhysicalDeviceDisplayPropertiesKHR(
+void PostCallRecordGetPhysicalDeviceDisplayPropertiesKHR(
VkPhysicalDevice physicalDevice,
uint32_t* pPropertyCount,
VkDisplayPropertiesKHR* pProperties,
VkResult result);
-void PostCallRecordvkGetPhysicalDeviceDisplayPlanePropertiesKHR(
+void PostCallRecordGetPhysicalDeviceDisplayPlanePropertiesKHR(
VkPhysicalDevice physicalDevice,
uint32_t* pPropertyCount,
VkDisplayPlanePropertiesKHR* pProperties,
VkResult result);
-void PostCallRecordvkGetDisplayPlaneSupportedDisplaysKHR(
+void PostCallRecordGetDisplayPlaneSupportedDisplaysKHR(
VkPhysicalDevice physicalDevice,
uint32_t planeIndex,
uint32_t* pDisplayCount,
@@ -595,7 +611,7 @@
VkResult result);
-void PostCallRecordvkGetDisplayModePropertiesKHR(
+void PostCallRecordGetDisplayModePropertiesKHR(
VkPhysicalDevice physicalDevice,
VkDisplayKHR display,
uint32_t* pPropertyCount,
@@ -603,7 +619,7 @@
VkResult result);
-void PostCallRecordvkCreateDisplayModeKHR(
+void PostCallRecordCreateDisplayModeKHR(
VkPhysicalDevice physicalDevice,
VkDisplayKHR display,
const VkDisplayModeCreateInfoKHR* pCreateInfo,
@@ -612,7 +628,7 @@
VkResult result);
-void PostCallRecordvkGetDisplayPlaneCapabilitiesKHR(
+void PostCallRecordGetDisplayPlaneCapabilitiesKHR(
VkPhysicalDevice physicalDevice,
VkDisplayModeKHR mode,
uint32_t planeIndex,
@@ -620,7 +636,7 @@
VkResult result);
-void PostCallRecordvkCreateDisplayPlaneSurfaceKHR(
+void PostCallRecordCreateDisplayPlaneSurfaceKHR(
VkInstance instance,
const VkDisplaySurfaceCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -628,7 +644,7 @@
VkResult result);
-void PostCallRecordvkCreateSharedSwapchainsKHR(
+void PostCallRecordCreateSharedSwapchainsKHR(
VkDevice device,
uint32_t swapchainCount,
const VkSwapchainCreateInfoKHR* pCreateInfos,
@@ -639,7 +655,7 @@
#ifdef VK_USE_PLATFORM_XLIB_KHR
-void PostCallRecordvkCreateXlibSurfaceKHR(
+void PostCallRecordCreateXlibSurfaceKHR(
VkInstance instance,
const VkXlibSurfaceCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -651,7 +667,7 @@
#ifdef VK_USE_PLATFORM_XCB_KHR
-void PostCallRecordvkCreateXcbSurfaceKHR(
+void PostCallRecordCreateXcbSurfaceKHR(
VkInstance instance,
const VkXcbSurfaceCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -663,7 +679,7 @@
#ifdef VK_USE_PLATFORM_WAYLAND_KHR
-void PostCallRecordvkCreateWaylandSurfaceKHR(
+void PostCallRecordCreateWaylandSurfaceKHR(
VkInstance instance,
const VkWaylandSurfaceCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -675,7 +691,7 @@
#ifdef VK_USE_PLATFORM_ANDROID_KHR
-void PostCallRecordvkCreateAndroidSurfaceKHR(
+void PostCallRecordCreateAndroidSurfaceKHR(
VkInstance instance,
const VkAndroidSurfaceCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -687,7 +703,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void PostCallRecordvkCreateWin32SurfaceKHR(
+void PostCallRecordCreateWin32SurfaceKHR(
VkInstance instance,
const VkWin32SurfaceCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -697,14 +713,14 @@
#endif // VK_USE_PLATFORM_WIN32_KHR
-void PostCallRecordvkGetPhysicalDeviceImageFormatProperties2KHR(
+void PostCallRecordGetPhysicalDeviceImageFormatProperties2KHR(
VkPhysicalDevice physicalDevice,
const VkPhysicalDeviceImageFormatInfo2* pImageFormatInfo,
VkImageFormatProperties2* pImageFormatProperties,
VkResult result);
-void PostCallRecordvkEnumeratePhysicalDeviceGroupsKHR(
+void PostCallRecordEnumeratePhysicalDeviceGroupsKHR(
VkInstance instance,
uint32_t* pPhysicalDeviceGroupCount,
VkPhysicalDeviceGroupProperties* pPhysicalDeviceGroupProperties,
@@ -713,7 +729,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void PostCallRecordvkGetMemoryWin32HandleKHR(
+void PostCallRecordGetMemoryWin32HandleKHR(
VkDevice device,
const VkMemoryGetWin32HandleInfoKHR* pGetWin32HandleInfo,
HANDLE* pHandle,
@@ -724,7 +740,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void PostCallRecordvkGetMemoryWin32HandlePropertiesKHR(
+void PostCallRecordGetMemoryWin32HandlePropertiesKHR(
VkDevice device,
VkExternalMemoryHandleTypeFlagBits handleType,
HANDLE handle,
@@ -734,14 +750,14 @@
#endif // VK_USE_PLATFORM_WIN32_KHR
-void PostCallRecordvkGetMemoryFdKHR(
+void PostCallRecordGetMemoryFdKHR(
VkDevice device,
const VkMemoryGetFdInfoKHR* pGetFdInfo,
int* pFd,
VkResult result);
-void PostCallRecordvkGetMemoryFdPropertiesKHR(
+void PostCallRecordGetMemoryFdPropertiesKHR(
VkDevice device,
VkExternalMemoryHandleTypeFlagBits handleType,
int fd,
@@ -751,7 +767,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void PostCallRecordvkImportSemaphoreWin32HandleKHR(
+void PostCallRecordImportSemaphoreWin32HandleKHR(
VkDevice device,
const VkImportSemaphoreWin32HandleInfoKHR* pImportSemaphoreWin32HandleInfo,
VkResult result);
@@ -761,7 +777,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void PostCallRecordvkGetSemaphoreWin32HandleKHR(
+void PostCallRecordGetSemaphoreWin32HandleKHR(
VkDevice device,
const VkSemaphoreGetWin32HandleInfoKHR* pGetWin32HandleInfo,
HANDLE* pHandle,
@@ -770,20 +786,20 @@
#endif // VK_USE_PLATFORM_WIN32_KHR
-void PostCallRecordvkImportSemaphoreFdKHR(
+void PostCallRecordImportSemaphoreFdKHR(
VkDevice device,
const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo,
VkResult result);
-void PostCallRecordvkGetSemaphoreFdKHR(
+void PostCallRecordGetSemaphoreFdKHR(
VkDevice device,
const VkSemaphoreGetFdInfoKHR* pGetFdInfo,
int* pFd,
VkResult result);
-void PostCallRecordvkCreateDescriptorUpdateTemplateKHR(
+void PostCallRecordCreateDescriptorUpdateTemplateKHR(
VkDevice device,
const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -791,7 +807,7 @@
VkResult result);
-void PostCallRecordvkCreateRenderPass2KHR(
+void PostCallRecordCreateRenderPass2KHR(
VkDevice device,
const VkRenderPassCreateInfo2* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -799,7 +815,7 @@
VkResult result);
-void PostCallRecordvkGetSwapchainStatusKHR(
+void PostCallRecordGetSwapchainStatusKHR(
VkDevice device,
VkSwapchainKHR swapchain,
VkResult result);
@@ -807,7 +823,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void PostCallRecordvkImportFenceWin32HandleKHR(
+void PostCallRecordImportFenceWin32HandleKHR(
VkDevice device,
const VkImportFenceWin32HandleInfoKHR* pImportFenceWin32HandleInfo,
VkResult result);
@@ -817,7 +833,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void PostCallRecordvkGetFenceWin32HandleKHR(
+void PostCallRecordGetFenceWin32HandleKHR(
VkDevice device,
const VkFenceGetWin32HandleInfoKHR* pGetWin32HandleInfo,
HANDLE* pHandle,
@@ -826,20 +842,20 @@
#endif // VK_USE_PLATFORM_WIN32_KHR
-void PostCallRecordvkImportFenceFdKHR(
+void PostCallRecordImportFenceFdKHR(
VkDevice device,
const VkImportFenceFdInfoKHR* pImportFenceFdInfo,
VkResult result);
-void PostCallRecordvkGetFenceFdKHR(
+void PostCallRecordGetFenceFdKHR(
VkDevice device,
const VkFenceGetFdInfoKHR* pGetFdInfo,
int* pFd,
VkResult result);
-void PostCallRecordvkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
+void PostCallRecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(
VkPhysicalDevice physicalDevice,
uint32_t queueFamilyIndex,
uint32_t* pCounterCount,
@@ -848,20 +864,20 @@
VkResult result);
-void PostCallRecordvkAcquireProfilingLockKHR(
+void PostCallRecordAcquireProfilingLockKHR(
VkDevice device,
const VkAcquireProfilingLockInfoKHR* pInfo,
VkResult result);
-void PostCallRecordvkGetPhysicalDeviceSurfaceCapabilities2KHR(
+void PostCallRecordGetPhysicalDeviceSurfaceCapabilities2KHR(
VkPhysicalDevice physicalDevice,
const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
VkSurfaceCapabilities2KHR* pSurfaceCapabilities,
VkResult result);
-void PostCallRecordvkGetPhysicalDeviceSurfaceFormats2KHR(
+void PostCallRecordGetPhysicalDeviceSurfaceFormats2KHR(
VkPhysicalDevice physicalDevice,
const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
uint32_t* pSurfaceFormatCount,
@@ -869,21 +885,21 @@
VkResult result);
-void PostCallRecordvkGetPhysicalDeviceDisplayProperties2KHR(
+void PostCallRecordGetPhysicalDeviceDisplayProperties2KHR(
VkPhysicalDevice physicalDevice,
uint32_t* pPropertyCount,
VkDisplayProperties2KHR* pProperties,
VkResult result);
-void PostCallRecordvkGetPhysicalDeviceDisplayPlaneProperties2KHR(
+void PostCallRecordGetPhysicalDeviceDisplayPlaneProperties2KHR(
VkPhysicalDevice physicalDevice,
uint32_t* pPropertyCount,
VkDisplayPlaneProperties2KHR* pProperties,
VkResult result);
-void PostCallRecordvkGetDisplayModeProperties2KHR(
+void PostCallRecordGetDisplayModeProperties2KHR(
VkPhysicalDevice physicalDevice,
VkDisplayKHR display,
uint32_t* pPropertyCount,
@@ -891,14 +907,14 @@
VkResult result);
-void PostCallRecordvkGetDisplayPlaneCapabilities2KHR(
+void PostCallRecordGetDisplayPlaneCapabilities2KHR(
VkPhysicalDevice physicalDevice,
const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo,
VkDisplayPlaneCapabilities2KHR* pCapabilities,
VkResult result);
-void PostCallRecordvkCreateSamplerYcbcrConversionKHR(
+void PostCallRecordCreateSamplerYcbcrConversionKHR(
VkDevice device,
const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -906,35 +922,35 @@
VkResult result);
-void PostCallRecordvkBindBufferMemory2KHR(
+void PostCallRecordBindBufferMemory2KHR(
VkDevice device,
uint32_t bindInfoCount,
const VkBindBufferMemoryInfo* pBindInfos,
VkResult result);
-void PostCallRecordvkBindImageMemory2KHR(
+void PostCallRecordBindImageMemory2KHR(
VkDevice device,
uint32_t bindInfoCount,
const VkBindImageMemoryInfo* pBindInfos,
VkResult result);
-void PostCallRecordvkGetSemaphoreCounterValueKHR(
+void PostCallRecordGetSemaphoreCounterValueKHR(
VkDevice device,
VkSemaphore semaphore,
uint64_t* pValue,
VkResult result);
-void PostCallRecordvkWaitSemaphoresKHR(
+void PostCallRecordWaitSemaphoresKHR(
VkDevice device,
const VkSemaphoreWaitInfo* pWaitInfo,
uint64_t timeout,
VkResult result);
-void PostCallRecordvkSignalSemaphoreKHR(
+void PostCallRecordSignalSemaphoreKHR(
VkDevice device,
const VkSemaphoreSignalInfo* pSignalInfo,
VkResult result);
@@ -942,7 +958,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void PostCallRecordvkCreateDeferredOperationKHR(
+void PostCallRecordCreateDeferredOperationKHR(
VkDevice device,
const VkAllocationCallbacks* pAllocator,
VkDeferredOperationKHR* pDeferredOperation,
@@ -953,7 +969,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void PostCallRecordvkGetDeferredOperationResultKHR(
+void PostCallRecordGetDeferredOperationResultKHR(
VkDevice device,
VkDeferredOperationKHR operation,
VkResult result);
@@ -963,7 +979,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void PostCallRecordvkDeferredOperationJoinKHR(
+void PostCallRecordDeferredOperationJoinKHR(
VkDevice device,
VkDeferredOperationKHR operation,
VkResult result);
@@ -971,7 +987,7 @@
#endif // VK_ENABLE_BETA_EXTENSIONS
-void PostCallRecordvkGetPipelineExecutablePropertiesKHR(
+void PostCallRecordGetPipelineExecutablePropertiesKHR(
VkDevice device,
const VkPipelineInfoKHR* pPipelineInfo,
uint32_t* pExecutableCount,
@@ -979,7 +995,7 @@
VkResult result);
-void PostCallRecordvkGetPipelineExecutableStatisticsKHR(
+void PostCallRecordGetPipelineExecutableStatisticsKHR(
VkDevice device,
const VkPipelineExecutableInfoKHR* pExecutableInfo,
uint32_t* pStatisticCount,
@@ -987,7 +1003,7 @@
VkResult result);
-void PostCallRecordvkGetPipelineExecutableInternalRepresentationsKHR(
+void PostCallRecordGetPipelineExecutableInternalRepresentationsKHR(
VkDevice device,
const VkPipelineExecutableInfoKHR* pExecutableInfo,
uint32_t* pInternalRepresentationCount,
@@ -995,7 +1011,7 @@
VkResult result);
-void PostCallRecordvkCreateDebugReportCallbackEXT(
+void PostCallRecordCreateDebugReportCallbackEXT(
VkInstance instance,
const VkDebugReportCallbackCreateInfoEXT* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1003,19 +1019,26 @@
VkResult result);
-void PostCallRecordvkDebugMarkerSetObjectTagEXT(
+void PostCallRecordDebugMarkerSetObjectTagEXT(
VkDevice device,
const VkDebugMarkerObjectTagInfoEXT* pTagInfo,
VkResult result);
-void PostCallRecordvkDebugMarkerSetObjectNameEXT(
+void PostCallRecordDebugMarkerSetObjectNameEXT(
VkDevice device,
const VkDebugMarkerObjectNameInfoEXT* pNameInfo,
VkResult result);
-void PostCallRecordvkGetShaderInfoAMD(
+void PostCallRecordGetImageViewAddressNVX(
+ VkDevice device,
+ VkImageView imageView,
+ VkImageViewAddressPropertiesNVX* pProperties,
+ VkResult result);
+
+
+void PostCallRecordGetShaderInfoAMD(
VkDevice device,
VkPipeline pipeline,
VkShaderStageFlagBits shaderStage,
@@ -1027,7 +1050,7 @@
#ifdef VK_USE_PLATFORM_GGP
-void PostCallRecordvkCreateStreamDescriptorSurfaceGGP(
+void PostCallRecordCreateStreamDescriptorSurfaceGGP(
VkInstance instance,
const VkStreamDescriptorSurfaceCreateInfoGGP* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1037,7 +1060,7 @@
#endif // VK_USE_PLATFORM_GGP
-void PostCallRecordvkGetPhysicalDeviceExternalImageFormatPropertiesNV(
+void PostCallRecordGetPhysicalDeviceExternalImageFormatPropertiesNV(
VkPhysicalDevice physicalDevice,
VkFormat format,
VkImageType type,
@@ -1051,7 +1074,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void PostCallRecordvkGetMemoryWin32HandleNV(
+void PostCallRecordGetMemoryWin32HandleNV(
VkDevice device,
VkDeviceMemory memory,
VkExternalMemoryHandleTypeFlagsNV handleType,
@@ -1063,7 +1086,7 @@
#ifdef VK_USE_PLATFORM_VI_NN
-void PostCallRecordvkCreateViSurfaceNN(
+void PostCallRecordCreateViSurfaceNN(
VkInstance instance,
const VkViSurfaceCreateInfoNN* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1075,7 +1098,7 @@
#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
-void PostCallRecordvkAcquireXlibDisplayEXT(
+void PostCallRecordAcquireXlibDisplayEXT(
VkPhysicalDevice physicalDevice,
Display* dpy,
VkDisplayKHR display,
@@ -1084,14 +1107,50 @@
#endif // VK_USE_PLATFORM_XLIB_XRANDR_EXT
-void PostCallRecordvkGetPhysicalDeviceSurfaceCapabilities2EXT(
+#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
+
+void PostCallRecordGetRandROutputDisplayEXT(
+ VkPhysicalDevice physicalDevice,
+ Display* dpy,
+ RROutput rrOutput,
+ VkDisplayKHR* pDisplay,
+ VkResult result);
+
+
+#endif // VK_USE_PLATFORM_XLIB_XRANDR_EXT
+
+void PostCallRecordGetPhysicalDeviceSurfaceCapabilities2EXT(
VkPhysicalDevice physicalDevice,
VkSurfaceKHR surface,
VkSurfaceCapabilities2EXT* pSurfaceCapabilities,
VkResult result);
-void PostCallRecordvkGetSwapchainCounterEXT(
+void PostCallRecordDisplayPowerControlEXT(
+ VkDevice device,
+ VkDisplayKHR display,
+ const VkDisplayPowerInfoEXT* pDisplayPowerInfo,
+ VkResult result);
+
+
+void PostCallRecordRegisterDeviceEventEXT(
+ VkDevice device,
+ const VkDeviceEventInfoEXT* pDeviceEventInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkFence* pFence,
+ VkResult result);
+
+
+void PostCallRecordRegisterDisplayEventEXT(
+ VkDevice device,
+ VkDisplayKHR display,
+ const VkDisplayEventInfoEXT* pDisplayEventInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkFence* pFence,
+ VkResult result);
+
+
+void PostCallRecordGetSwapchainCounterEXT(
VkDevice device,
VkSwapchainKHR swapchain,
VkSurfaceCounterFlagBitsEXT counter,
@@ -1099,14 +1158,14 @@
VkResult result);
-void PostCallRecordvkGetRefreshCycleDurationGOOGLE(
+void PostCallRecordGetRefreshCycleDurationGOOGLE(
VkDevice device,
VkSwapchainKHR swapchain,
VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties,
VkResult result);
-void PostCallRecordvkGetPastPresentationTimingGOOGLE(
+void PostCallRecordGetPastPresentationTimingGOOGLE(
VkDevice device,
VkSwapchainKHR swapchain,
uint32_t* pPresentationTimingCount,
@@ -1116,7 +1175,7 @@
#ifdef VK_USE_PLATFORM_IOS_MVK
-void PostCallRecordvkCreateIOSSurfaceMVK(
+void PostCallRecordCreateIOSSurfaceMVK(
VkInstance instance,
const VkIOSSurfaceCreateInfoMVK* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1128,7 +1187,7 @@
#ifdef VK_USE_PLATFORM_MACOS_MVK
-void PostCallRecordvkCreateMacOSSurfaceMVK(
+void PostCallRecordCreateMacOSSurfaceMVK(
VkInstance instance,
const VkMacOSSurfaceCreateInfoMVK* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1138,19 +1197,19 @@
#endif // VK_USE_PLATFORM_MACOS_MVK
-void PostCallRecordvkSetDebugUtilsObjectNameEXT(
+void PostCallRecordSetDebugUtilsObjectNameEXT(
VkDevice device,
const VkDebugUtilsObjectNameInfoEXT* pNameInfo,
VkResult result);
-void PostCallRecordvkSetDebugUtilsObjectTagEXT(
+void PostCallRecordSetDebugUtilsObjectTagEXT(
VkDevice device,
const VkDebugUtilsObjectTagInfoEXT* pTagInfo,
VkResult result);
-void PostCallRecordvkCreateDebugUtilsMessengerEXT(
+void PostCallRecordCreateDebugUtilsMessengerEXT(
VkInstance instance,
const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1160,7 +1219,7 @@
#ifdef VK_USE_PLATFORM_ANDROID_KHR
-void PostCallRecordvkGetAndroidHardwareBufferPropertiesANDROID(
+void PostCallRecordGetAndroidHardwareBufferPropertiesANDROID(
VkDevice device,
const struct AHardwareBuffer* buffer,
VkAndroidHardwareBufferPropertiesANDROID* pProperties,
@@ -1171,7 +1230,7 @@
#ifdef VK_USE_PLATFORM_ANDROID_KHR
-void PostCallRecordvkGetMemoryAndroidHardwareBufferANDROID(
+void PostCallRecordGetMemoryAndroidHardwareBufferANDROID(
VkDevice device,
const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo,
struct AHardwareBuffer** pBuffer,
@@ -1180,7 +1239,7 @@
#endif // VK_USE_PLATFORM_ANDROID_KHR
-void PostCallRecordvkCreateAccelerationStructureNV(
+void PostCallRecordCreateAccelerationStructureNV(
VkDevice device,
const VkAccelerationStructureCreateInfoNV* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1188,21 +1247,21 @@
VkResult result);
-void PostCallRecordvkBindAccelerationStructureMemoryKHR(
+void PostCallRecordBindAccelerationStructureMemoryKHR(
VkDevice device,
uint32_t bindInfoCount,
const VkBindAccelerationStructureMemoryInfoKHR* pBindInfos,
VkResult result);
-void PostCallRecordvkBindAccelerationStructureMemoryNV(
+void PostCallRecordBindAccelerationStructureMemoryNV(
VkDevice device,
uint32_t bindInfoCount,
const VkBindAccelerationStructureMemoryInfoKHR* pBindInfos,
VkResult result);
-void PostCallRecordvkCreateRayTracingPipelinesNV(
+void PostCallRecordCreateRayTracingPipelinesNV(
VkDevice device,
VkPipelineCache pipelineCache,
uint32_t createInfoCount,
@@ -1213,7 +1272,7 @@
void* state_data);
-void PostCallRecordvkGetRayTracingShaderGroupHandlesKHR(
+void PostCallRecordGetRayTracingShaderGroupHandlesKHR(
VkDevice device,
VkPipeline pipeline,
uint32_t firstGroup,
@@ -1223,7 +1282,7 @@
VkResult result);
-void PostCallRecordvkGetRayTracingShaderGroupHandlesNV(
+void PostCallRecordGetRayTracingShaderGroupHandlesNV(
VkDevice device,
VkPipeline pipeline,
uint32_t firstGroup,
@@ -1233,7 +1292,7 @@
VkResult result);
-void PostCallRecordvkGetAccelerationStructureHandleNV(
+void PostCallRecordGetAccelerationStructureHandleNV(
VkDevice device,
VkAccelerationStructureKHR accelerationStructure,
size_t dataSize,
@@ -1241,14 +1300,14 @@
VkResult result);
-void PostCallRecordvkCompileDeferredNV(
+void PostCallRecordCompileDeferredNV(
VkDevice device,
VkPipeline pipeline,
uint32_t shader,
VkResult result);
-void PostCallRecordvkGetMemoryHostPointerPropertiesEXT(
+void PostCallRecordGetMemoryHostPointerPropertiesEXT(
VkDevice device,
VkExternalMemoryHandleTypeFlagBits handleType,
const void* pHostPointer,
@@ -1256,14 +1315,14 @@
VkResult result);
-void PostCallRecordvkGetPhysicalDeviceCalibrateableTimeDomainsEXT(
+void PostCallRecordGetPhysicalDeviceCalibrateableTimeDomainsEXT(
VkPhysicalDevice physicalDevice,
uint32_t* pTimeDomainCount,
VkTimeDomainEXT* pTimeDomains,
VkResult result);
-void PostCallRecordvkGetCalibratedTimestampsEXT(
+void PostCallRecordGetCalibratedTimestampsEXT(
VkDevice device,
uint32_t timestampCount,
const VkCalibratedTimestampInfoEXT* pTimestampInfos,
@@ -1272,50 +1331,50 @@
VkResult result);
-void PostCallRecordvkInitializePerformanceApiINTEL(
+void PostCallRecordInitializePerformanceApiINTEL(
VkDevice device,
const VkInitializePerformanceApiInfoINTEL* pInitializeInfo,
VkResult result);
-void PostCallRecordvkCmdSetPerformanceMarkerINTEL(
+void PostCallRecordCmdSetPerformanceMarkerINTEL(
VkCommandBuffer commandBuffer,
const VkPerformanceMarkerInfoINTEL* pMarkerInfo,
VkResult result);
-void PostCallRecordvkCmdSetPerformanceStreamMarkerINTEL(
+void PostCallRecordCmdSetPerformanceStreamMarkerINTEL(
VkCommandBuffer commandBuffer,
const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo,
VkResult result);
-void PostCallRecordvkCmdSetPerformanceOverrideINTEL(
+void PostCallRecordCmdSetPerformanceOverrideINTEL(
VkCommandBuffer commandBuffer,
const VkPerformanceOverrideInfoINTEL* pOverrideInfo,
VkResult result);
-void PostCallRecordvkAcquirePerformanceConfigurationINTEL(
+void PostCallRecordAcquirePerformanceConfigurationINTEL(
VkDevice device,
const VkPerformanceConfigurationAcquireInfoINTEL* pAcquireInfo,
VkPerformanceConfigurationINTEL* pConfiguration,
VkResult result);
-void PostCallRecordvkReleasePerformanceConfigurationINTEL(
+void PostCallRecordReleasePerformanceConfigurationINTEL(
VkDevice device,
VkPerformanceConfigurationINTEL configuration,
VkResult result);
-void PostCallRecordvkQueueSetPerformanceConfigurationINTEL(
+void PostCallRecordQueueSetPerformanceConfigurationINTEL(
VkQueue queue,
VkPerformanceConfigurationINTEL configuration,
VkResult result);
-void PostCallRecordvkGetPerformanceParameterINTEL(
+void PostCallRecordGetPerformanceParameterINTEL(
VkDevice device,
VkPerformanceParameterTypeINTEL parameter,
VkPerformanceValueINTEL* pValue,
@@ -1324,7 +1383,7 @@
#ifdef VK_USE_PLATFORM_FUCHSIA
-void PostCallRecordvkCreateImagePipeSurfaceFUCHSIA(
+void PostCallRecordCreateImagePipeSurfaceFUCHSIA(
VkInstance instance,
const VkImagePipeSurfaceCreateInfoFUCHSIA* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1336,7 +1395,7 @@
#ifdef VK_USE_PLATFORM_METAL_EXT
-void PostCallRecordvkCreateMetalSurfaceEXT(
+void PostCallRecordCreateMetalSurfaceEXT(
VkInstance instance,
const VkMetalSurfaceCreateInfoEXT* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1346,21 +1405,21 @@
#endif // VK_USE_PLATFORM_METAL_EXT
-void PostCallRecordvkGetPhysicalDeviceToolPropertiesEXT(
+void PostCallRecordGetPhysicalDeviceToolPropertiesEXT(
VkPhysicalDevice physicalDevice,
uint32_t* pToolCount,
VkPhysicalDeviceToolPropertiesEXT* pToolProperties,
VkResult result);
-void PostCallRecordvkGetPhysicalDeviceCooperativeMatrixPropertiesNV(
+void PostCallRecordGetPhysicalDeviceCooperativeMatrixPropertiesNV(
VkPhysicalDevice physicalDevice,
uint32_t* pPropertyCount,
VkCooperativeMatrixPropertiesNV* pProperties,
VkResult result);
-void PostCallRecordvkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(
+void PostCallRecordGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(
VkPhysicalDevice physicalDevice,
uint32_t* pCombinationCount,
VkFramebufferMixedSamplesCombinationNV* pCombinations,
@@ -1369,7 +1428,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void PostCallRecordvkGetPhysicalDeviceSurfacePresentModes2EXT(
+void PostCallRecordGetPhysicalDeviceSurfacePresentModes2EXT(
VkPhysicalDevice physicalDevice,
const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
uint32_t* pPresentModeCount,
@@ -1381,7 +1440,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void PostCallRecordvkAcquireFullScreenExclusiveModeEXT(
+void PostCallRecordAcquireFullScreenExclusiveModeEXT(
VkDevice device,
VkSwapchainKHR swapchain,
VkResult result);
@@ -1391,7 +1450,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void PostCallRecordvkReleaseFullScreenExclusiveModeEXT(
+void PostCallRecordReleaseFullScreenExclusiveModeEXT(
VkDevice device,
VkSwapchainKHR swapchain,
VkResult result);
@@ -1401,7 +1460,7 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
-void PostCallRecordvkGetDeviceGroupSurfacePresentModes2EXT(
+void PostCallRecordGetDeviceGroupSurfacePresentModes2EXT(
VkDevice device,
const VkPhysicalDeviceSurfaceInfo2KHR* pSurfaceInfo,
VkDeviceGroupPresentModeFlagsKHR* pModes,
@@ -1410,7 +1469,7 @@
#endif // VK_USE_PLATFORM_WIN32_KHR
-void PostCallRecordvkCreateHeadlessSurfaceEXT(
+void PostCallRecordCreateHeadlessSurfaceEXT(
VkInstance instance,
const VkHeadlessSurfaceCreateInfoEXT* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1418,7 +1477,7 @@
VkResult result);
-void PostCallRecordvkCreateIndirectCommandsLayoutNV(
+void PostCallRecordCreateIndirectCommandsLayoutNV(
VkDevice device,
const VkIndirectCommandsLayoutCreateInfoNV* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1426,9 +1485,38 @@
VkResult result);
+void PostCallRecordCreatePrivateDataSlotEXT(
+ VkDevice device,
+ const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkPrivateDataSlotEXT* pPrivateDataSlot,
+ VkResult result);
+
+
+void PostCallRecordSetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t data,
+ VkResult result);
+
+
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+
+void PostCallRecordCreateDirectFBSurfaceEXT(
+ VkInstance instance,
+ const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkSurfaceKHR* pSurface,
+ VkResult result);
+
+
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
+
#ifdef VK_USE_PLATFORM_FUCHSIA
-void PostCallRecordvkCreateBufferCollectionFUCHSIA(
+void PostCallRecordCreateBufferCollectionFUCHSIA(
VkDevice device,
const VkBufferCollectionCreateInfoFUCHSIA* pImportInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1440,7 +1528,7 @@
#ifdef VK_USE_PLATFORM_FUCHSIA
-void PostCallRecordvkSetBufferCollectionConstraintsFUCHSIA(
+void PostCallRecordSetBufferCollectionConstraintsFUCHSIA(
VkDevice device,
VkBufferCollectionFUCHSIA collection,
const VkImageCreateInfo* pImageInfo,
@@ -1451,7 +1539,7 @@
#ifdef VK_USE_PLATFORM_FUCHSIA
-void PostCallRecordvkSetBufferCollectionBufferConstraintsFUCHSIA(
+void PostCallRecordSetBufferCollectionBufferConstraintsFUCHSIA(
VkDevice device,
VkBufferCollectionFUCHSIA collection,
const VkBufferConstraintsInfoFUCHSIA* pBufferConstraintsInfo,
@@ -1462,7 +1550,7 @@
#ifdef VK_USE_PLATFORM_FUCHSIA
-void PostCallRecordvkGetBufferCollectionPropertiesFUCHSIA(
+void PostCallRecordGetBufferCollectionPropertiesFUCHSIA(
VkDevice device,
VkBufferCollectionFUCHSIA collection,
VkBufferCollectionPropertiesFUCHSIA* pProperties,
@@ -1473,7 +1561,7 @@
#ifdef VK_USE_PLATFORM_FUCHSIA
-void PostCallRecordvkGetMemoryZirconHandleFUCHSIA(
+void PostCallRecordGetMemoryZirconHandleFUCHSIA(
VkDevice device,
const VkMemoryGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo,
zx_handle_t* pZirconHandle,
@@ -1484,7 +1572,7 @@
#ifdef VK_USE_PLATFORM_FUCHSIA
-void PostCallRecordvkGetMemoryZirconHandlePropertiesFUCHSIA(
+void PostCallRecordGetMemoryZirconHandlePropertiesFUCHSIA(
VkDevice device,
VkExternalMemoryHandleTypeFlagBits handleType,
zx_handle_t ZirconHandle,
@@ -1496,7 +1584,7 @@
#ifdef VK_USE_PLATFORM_FUCHSIA
-void PostCallRecordvkImportSemaphoreZirconHandleFUCHSIA(
+void PostCallRecordImportSemaphoreZirconHandleFUCHSIA(
VkDevice device,
const VkImportSemaphoreZirconHandleInfoFUCHSIA* pImportSemaphoreZirconHandleInfo,
VkResult result);
@@ -1506,7 +1594,7 @@
#ifdef VK_USE_PLATFORM_FUCHSIA
-void PostCallRecordvkGetSemaphoreZirconHandleFUCHSIA(
+void PostCallRecordGetSemaphoreZirconHandleFUCHSIA(
VkDevice device,
const VkSemaphoreGetZirconHandleInfoFUCHSIA* pGetZirconHandleInfo,
zx_handle_t* pZirconHandle,
@@ -1517,7 +1605,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void PostCallRecordvkCreateAccelerationStructureKHR(
+void PostCallRecordCreateAccelerationStructureKHR(
VkDevice device,
const VkAccelerationStructureCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -1529,7 +1617,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void PostCallRecordvkBuildAccelerationStructureKHR(
+void PostCallRecordBuildAccelerationStructureKHR(
VkDevice device,
uint32_t infoCount,
const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
@@ -1541,7 +1629,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void PostCallRecordvkCopyAccelerationStructureKHR(
+void PostCallRecordCopyAccelerationStructureKHR(
VkDevice device,
const VkCopyAccelerationStructureInfoKHR* pInfo,
VkResult result);
@@ -1551,7 +1639,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void PostCallRecordvkCopyAccelerationStructureToMemoryKHR(
+void PostCallRecordCopyAccelerationStructureToMemoryKHR(
VkDevice device,
const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo,
VkResult result);
@@ -1561,7 +1649,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void PostCallRecordvkCopyMemoryToAccelerationStructureKHR(
+void PostCallRecordCopyMemoryToAccelerationStructureKHR(
VkDevice device,
const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo,
VkResult result);
@@ -1571,7 +1659,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void PostCallRecordvkWriteAccelerationStructuresPropertiesKHR(
+void PostCallRecordWriteAccelerationStructuresPropertiesKHR(
VkDevice device,
uint32_t accelerationStructureCount,
const VkAccelerationStructureKHR* pAccelerationStructures,
@@ -1586,7 +1674,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void PostCallRecordvkCreateRayTracingPipelinesKHR(
+void PostCallRecordCreateRayTracingPipelinesKHR(
VkDevice device,
VkPipelineCache pipelineCache,
uint32_t createInfoCount,
@@ -1601,7 +1689,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void PostCallRecordvkGetRayTracingCaptureReplayShaderGroupHandlesKHR(
+void PostCallRecordGetRayTracingCaptureReplayShaderGroupHandlesKHR(
VkDevice device,
VkPipeline pipeline,
uint32_t firstGroup,
@@ -1615,7 +1703,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void PostCallRecordvkGetDeviceAccelerationStructureCompatibilityKHR(
+void PostCallRecordGetDeviceAccelerationStructureCompatibilityKHR(
VkDevice device,
const VkAccelerationStructureVersionKHR* version,
VkResult result);
@@ -1634,7 +1722,7 @@
{"VK_AMD_negative_viewport_height", {kExtObsoleted, "VK_KHR_maintenance1"}},
{"VK_EXT_buffer_device_address", {kExtDeprecated, "VK_KHR_buffer_device_address"}},
{"VK_EXT_debug_marker", {kExtPromoted, "VK_EXT_debug_utils"}},
-// ADD BACK AFTER LAYER TESTS SWITCH TO DEBUG_UTILS! {"VK_EXT_debug_report", {kExtDeprecated, "VK_EXT_debug_utils"}},
+ {"VK_EXT_debug_report", {kExtDeprecated, "VK_EXT_debug_utils"}},
{"VK_EXT_descriptor_indexing", {kExtPromoted, "VK_VERSION_1_2"}},
{"VK_EXT_host_query_reset", {kExtPromoted, "VK_VERSION_1_2"}},
{"VK_EXT_sampler_filter_minmax", {kExtPromoted, "VK_VERSION_1_2"}},
diff --git a/layers/generated/chassis.cpp b/layers/generated/chassis.cpp
index 6489ddc..3e368b5 100644
--- a/layers/generated/chassis.cpp
+++ b/layers/generated/chassis.cpp
@@ -29,6 +29,7 @@
#define VALIDATION_ERROR_MAP_IMPL
#include "chassis.h"
+#include "layer_options.h"
#include "layer_chassis_dispatch.h"
small_unordered_map<void*, ValidationObject*, 2> layer_data_map;
@@ -47,13 +48,16 @@
// Include layer validation object definitions
#include "best_practices_validation.h"
#include "core_validation.h"
-#include "command_counter.h"
#include "gpu_validation.h"
#include "object_lifetime_validation.h"
#include "debug_printf.h"
#include "stateless_validation.h"
+#include "synchronization_validation.h"
#include "thread_safety.h"
+// Global list of sType,size identifiers
+std::vector<std::pair<uint32_t, uint32_t>> custom_stype_info{};
+
namespace vulkan_layer_chassis {
using std::unordered_map;
@@ -111,234 +115,64 @@
}
}
-
-// Process validation features, flags and settings specified through extensions, a layer settings file, or environment variables
-
-static const std::unordered_map<std::string, VkValidationFeatureDisableEXT> VkValFeatureDisableLookup = {
- {"VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT", VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT},
- {"VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT", VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT},
- {"VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT", VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT},
- {"VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT", VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT},
- {"VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT", VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT},
- {"VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT", VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT},
- {"VK_VALIDATION_FEATURE_DISABLE_ALL_EXT", VK_VALIDATION_FEATURE_DISABLE_ALL_EXT},
-};
-
-static const std::unordered_map<std::string, VkValidationFeatureEnableEXT> VkValFeatureEnableLookup = {
- {"VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT", VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT},
- {"VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT", VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT},
- {"VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT", VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT},
- {"VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT", VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT},
-};
-
-static const std::unordered_map<std::string, ValidationCheckDisables> ValidationDisableLookup = {
- {"VALIDATION_CHECK_DISABLE_COMMAND_BUFFER_STATE", VALIDATION_CHECK_DISABLE_COMMAND_BUFFER_STATE},
- {"VALIDATION_CHECK_DISABLE_OBJECT_IN_USE", VALIDATION_CHECK_DISABLE_OBJECT_IN_USE},
- {"VALIDATION_CHECK_DISABLE_IDLE_DESCRIPTOR_SET", VALIDATION_CHECK_DISABLE_IDLE_DESCRIPTOR_SET},
- {"VALIDATION_CHECK_DISABLE_PUSH_CONSTANT_RANGE", VALIDATION_CHECK_DISABLE_PUSH_CONSTANT_RANGE},
- {"VALIDATION_CHECK_DISABLE_QUERY_VALIDATION", VALIDATION_CHECK_DISABLE_QUERY_VALIDATION},
- {"VALIDATION_CHECK_DISABLE_IMAGE_LAYOUT_VALIDATION", VALIDATION_CHECK_DISABLE_IMAGE_LAYOUT_VALIDATION},
-};
-
-static const std::unordered_map<std::string, ValidationCheckEnables> ValidationEnableLookup = {
- {"VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ARM", VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ARM},
- {"VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ALL", VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ALL},
-};
-
-// Set the local disable flag for the appropriate VALIDATION_CHECK_DISABLE enum
-void SetValidationDisable(CHECK_DISABLED* disable_data, const ValidationCheckDisables disable_id) {
- switch (disable_id) {
- case VALIDATION_CHECK_DISABLE_COMMAND_BUFFER_STATE:
- disable_data->command_buffer_state = true;
- break;
- case VALIDATION_CHECK_DISABLE_OBJECT_IN_USE:
- disable_data->object_in_use = true;
- break;
- case VALIDATION_CHECK_DISABLE_IDLE_DESCRIPTOR_SET:
- disable_data->idle_descriptor_set = true;
- break;
- case VALIDATION_CHECK_DISABLE_PUSH_CONSTANT_RANGE:
- disable_data->push_constant_range = true;
- break;
- case VALIDATION_CHECK_DISABLE_QUERY_VALIDATION:
- disable_data->query_validation = true;
- break;
- case VALIDATION_CHECK_DISABLE_IMAGE_LAYOUT_VALIDATION:
- disable_data->image_layout_validation = true;
- break;
- default:
- assert(true);
+void OutputLayerStatusInfo(ValidationObject *context) {
+ std::string list_of_enables;
+ std::string list_of_disables;
+ for (uint32_t i = 0; i < kMaxEnableFlags; i++) {
+ if (context->enabled[i]) {
+ if (list_of_enables.size()) list_of_enables.append(", ");
+ list_of_enables.append(EnableFlagNameHelper[i]);
+ }
}
-}
-
-// Set the local disable flag for a single VK_VALIDATION_FEATURE_DISABLE_* flag
-void SetValidationFeatureDisable(CHECK_DISABLED* disable_data, const VkValidationFeatureDisableEXT feature_disable) {
- switch (feature_disable) {
- case VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT:
- disable_data->shader_validation = true;
- break;
- case VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT:
- disable_data->thread_safety = true;
- break;
- case VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT:
- disable_data->stateless_checks = true;
- break;
- case VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT:
- disable_data->object_tracking = true;
- break;
- case VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT:
- disable_data->core_checks = true;
- break;
- case VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT:
- disable_data->handle_wrapping = true;
- break;
- case VK_VALIDATION_FEATURE_DISABLE_ALL_EXT:
- // Set all disabled flags to true
- disable_data->SetAll(true);
- break;
- default:
- break;
+ if (list_of_enables.size() == 0) {
+ list_of_enables.append("None");
}
-}
-
-// Set the local enable flag for the appropriate VALIDATION_CHECK_ENABLE enum
-void SetValidationEnable(CHECK_ENABLED* enable_data, const ValidationCheckEnables enable_id) {
- switch (enable_id) {
- case VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ARM:
- enable_data->vendor_specific_arm = true;
- break;
- case VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ALL:
- enable_data->SetAllVendorSpecific(true);
- break;
- default:
- assert(true);
+ for (uint32_t i = 0; i < kMaxDisableFlags; i++) {
+ if (context->disabled[i]) {
+ if (list_of_disables.size()) list_of_disables.append(", ");
+ list_of_disables.append(DisableFlagNameHelper[i]);
+ }
}
-}
-// Set the local enable flag for a single VK_VALIDATION_FEATURE_ENABLE_* flag
-void SetValidationFeatureEnable(CHECK_ENABLED *enable_data, const VkValidationFeatureEnableEXT feature_enable) {
- switch (feature_enable) {
- case VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT:
- enable_data->gpu_validation = true;
- break;
- case VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT:
- enable_data->gpu_validation_reserve_binding_slot = true;
- break;
- case VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT:
- enable_data->best_practices = true;
- break;
- case VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT:
- enable_data->debug_printf = true;
- default:
- break;
+ if (list_of_disables.size() == 0) {
+ list_of_disables.append("None");
}
-}
-// Set the local disable flag for settings specified through the VK_EXT_validation_flags extension
-void SetValidationFlags(CHECK_DISABLED* disables, const VkValidationFlagsEXT* val_flags_struct) {
- for (uint32_t i = 0; i < val_flags_struct->disabledValidationCheckCount; ++i) {
- switch (val_flags_struct->pDisabledValidationChecks[i]) {
- case VK_VALIDATION_CHECK_SHADERS_EXT:
- disables->shader_validation = true;
+ auto settings_info = GetLayerSettingsFileInfo();
+ std::string settings_status;
+ if (!settings_info->file_found) {
+ settings_status = "None. Default location is ";
+ settings_status.append(settings_info->location);
+ settings_status.append(".");
+ } else {
+ settings_status = "Found at ";
+ settings_status.append(settings_info->location);
+ settings_status.append(" specified by ");
+ switch (settings_info->source) {
+ case kEnvVar:
+ settings_status.append("environment variable (VK_LAYER_SETTINGS_PATH).");
break;
- case VK_VALIDATION_CHECK_ALL_EXT:
- // Set all disabled flags to true
- disables->SetAll(true);
+ case kVkConfig:
+ settings_status.append("VkConfig application override.");
break;
+ case kLocal: // Intentionally fall through
default:
+ settings_status.append("default location (current working directory).");
break;
}
}
-}
-// Process Validation Features flags specified through the ValidationFeature extension
-void SetValidationFeatures(CHECK_DISABLED *disable_data, CHECK_ENABLED *enable_data,
- const VkValidationFeaturesEXT *val_features_struct) {
- for (uint32_t i = 0; i < val_features_struct->disabledValidationFeatureCount; ++i) {
- SetValidationFeatureDisable(disable_data, val_features_struct->pDisabledValidationFeatures[i]);
- }
- for (uint32_t i = 0; i < val_features_struct->enabledValidationFeatureCount; ++i) {
- SetValidationFeatureEnable(enable_data, val_features_struct->pEnabledValidationFeatures[i]);
- }
-}
+ // Output layer status information message
+ context->LogInfo(context->instance, kVUID_Core_CreatInstance_Status,
+ "Khronos Validation Layer Active:\n Settings File: %s\n Current Enables: %s.\n Current Disables: %s.\n",
+ settings_status.c_str(), list_of_enables.c_str(), list_of_disables.c_str());
-// Given a string representation of a list of enable enum values, call the appropriate setter function
-void SetLocalEnableSetting(std::string list_of_enables, std::string delimiter, CHECK_ENABLED* enables) {
- size_t pos = 0;
- std::string token;
- while (list_of_enables.length() != 0) {
- pos = list_of_enables.find(delimiter);
- if (pos != std::string::npos) {
- token = list_of_enables.substr(0, pos);
- } else {
- pos = list_of_enables.length() - delimiter.length();
- token = list_of_enables;
- }
- if (token.find("VK_VALIDATION_FEATURE_ENABLE_") != std::string::npos) {
- auto result = VkValFeatureEnableLookup.find(token);
- if (result != VkValFeatureEnableLookup.end()) {
- SetValidationFeatureEnable(enables, result->second);
- }
- }
- else if (token.find("VALIDATION_CHECK_ENABLE_") != std::string::npos) {
- auto result = ValidationEnableLookup.find(token);
- if (result != ValidationEnableLookup.end()) {
- SetValidationEnable(enables, result->second);
- }
- }
- list_of_enables.erase(0, pos + delimiter.length());
- }
-}
-
-// Given a string representation of a list of disable enum values, call the appropriate setter function
-void SetLocalDisableSetting(std::string list_of_disables, std::string delimiter, CHECK_DISABLED* disables) {
- size_t pos = 0;
- std::string token;
- while (list_of_disables.length() != 0) {
- pos = list_of_disables.find(delimiter);
- if (pos != std::string::npos) {
- token = list_of_disables.substr(0, pos);
- } else {
- pos = list_of_disables.length() - delimiter.length();
- token = list_of_disables;
- }
- if (token.find("VK_VALIDATION_FEATURE_DISABLE_") != std::string::npos) {
- auto result = VkValFeatureDisableLookup.find(token);
- if (result != VkValFeatureDisableLookup.end()) {
- SetValidationFeatureDisable(disables, result->second);
- }
- }
- if (token.find("VALIDATION_CHECK_DISABLE_") != std::string::npos) {
- auto result = ValidationDisableLookup.find(token);
- if (result != ValidationDisableLookup.end()) {
- SetValidationDisable(disables, result->second);
- }
- }
- list_of_disables.erase(0, pos + delimiter.length());
- }
-}
-
-// Process enables and disables set though the vk_layer_settings.txt config file or through an environment variable
-void ProcessConfigAndEnvSettings(const char* layer_description, CHECK_ENABLED* enables, CHECK_DISABLED* disables) {
- std::string enable_key = layer_description;
- std::string disable_key = layer_description;
- enable_key.append(".enables");
- disable_key.append(".disables");
- std::string list_of_config_enables = getLayerOption(enable_key.c_str());
- std::string list_of_env_enables = GetLayerEnvVar("VK_LAYER_ENABLES");
- std::string list_of_config_disables = getLayerOption(disable_key.c_str());
- std::string list_of_env_disables = GetLayerEnvVar("VK_LAYER_DISABLES");
-#if defined(_WIN32)
- std::string env_delimiter = ";";
-#else
- std::string env_delimiter = ":";
+ // Create warning message if user is running debug layers.
+#ifndef NDEBUG
+ context->LogPerformanceWarning(context->instance, kVUID_Core_CreateInstance_Debug_Warning,
+ "VALIDATION LAYERS WARNING: Using debug builds of the validation layers *will* adversely affect performance.");
#endif
- SetLocalEnableSetting(list_of_config_enables, ",", enables);
- SetLocalEnableSetting(list_of_env_enables, env_delimiter, enables);
- SetLocalDisableSetting(list_of_config_disables, ",", disables);
- SetLocalDisableSetting(list_of_env_disables, env_delimiter, disables);
}
-
// Non-code-generated chassis API functions
VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
@@ -431,81 +265,56 @@
report_data->instance_pnext_chain = SafePnextCopy(pCreateInfo->pNext);
ActivateInstanceDebugCallbacks(report_data);
+ // Set up enable and disable features flags
CHECK_ENABLED local_enables {};
CHECK_DISABLED local_disables {};
- const auto *validation_features_ext = lvl_find_in_chain<VkValidationFeaturesEXT>(pCreateInfo->pNext);
- if (validation_features_ext) {
- SetValidationFeatures(&local_disables, &local_enables, validation_features_ext);
- }
- const auto *validation_flags_ext = lvl_find_in_chain<VkValidationFlagsEXT>(pCreateInfo->pNext);
- if (validation_flags_ext) {
- SetValidationFlags(&local_disables, validation_flags_ext);
- }
- ProcessConfigAndEnvSettings(OBJECT_LAYER_DESCRIPTION, &local_enables, &local_disables);
+ ConfigAndEnvSettings config_and_env_settings_data {OBJECT_LAYER_DESCRIPTION, pCreateInfo->pNext, local_enables, local_disables,
+ report_data->filter_message_ids, &report_data->duplicate_message_limit};
+ ProcessConfigAndEnvSettings(&config_and_env_settings_data);
+ layer_debug_messenger_actions(report_data, pAllocator, OBJECT_LAYER_DESCRIPTION);
// Create temporary dispatch vector for pre-calls until instance is created
std::vector<ValidationObject*> local_object_dispatch;
+
// Add VOs to dispatch vector. Order here will be the validation dispatch order!
- auto thread_checker = new ThreadSafety(nullptr);
- if (!local_disables.thread_safety) {
- local_object_dispatch.emplace_back(thread_checker);
- }
- thread_checker->container_type = LayerObjectTypeThreading;
- thread_checker->api_version = api_version;
- thread_checker->report_data = report_data;
- auto parameter_validation = new StatelessValidation;
- if (!local_disables.stateless_checks) {
- local_object_dispatch.emplace_back(parameter_validation);
- }
- parameter_validation->container_type = LayerObjectTypeParameterValidation;
- parameter_validation->api_version = api_version;
- parameter_validation->report_data = report_data;
- auto object_tracker = new ObjectLifetimes;
- if (!local_disables.object_tracking) {
- local_object_dispatch.emplace_back(object_tracker);
- }
- object_tracker->container_type = LayerObjectTypeObjectTracker;
- object_tracker->api_version = api_version;
- object_tracker->report_data = report_data;
- auto core_checks = new CoreChecks;
- if (!local_disables.core_checks) {
- local_object_dispatch.emplace_back(core_checks);
- }
- core_checks->container_type = LayerObjectTypeCoreValidation;
- core_checks->api_version = api_version;
- core_checks->report_data = report_data;
- auto best_practices = new BestPractices;
- if (local_enables.best_practices) {
- local_object_dispatch.emplace_back(best_practices);
- }
- best_practices->container_type = LayerObjectTypeBestPractices;
- best_practices->api_version = api_version;
- best_practices->report_data = report_data;
- auto gpu_assisted = new GpuAssisted;
- if (local_enables.gpu_validation) {
- local_object_dispatch.emplace_back(gpu_assisted);
- }
- gpu_assisted->container_type = LayerObjectTypeGpuAssisted;
- gpu_assisted->api_version = api_version;
- gpu_assisted->report_data = report_data;
- auto debug_printf = new DebugPrintf;
- if (local_enables.debug_printf) {
- local_object_dispatch.emplace_back(debug_printf);
- }
- debug_printf->container_type = LayerObjectTypeDebugPrintf;
- debug_printf->api_version = api_version;
- debug_printf->report_data = report_data;
+ auto thread_checker_obj = new ThreadSafety(nullptr);
+ thread_checker_obj->RegisterValidationObject(!local_disables[thread_safety], api_version, report_data, local_object_dispatch);
+
+ auto parameter_validation_obj = new StatelessValidation;
+ parameter_validation_obj->RegisterValidationObject(!local_disables[stateless_checks], api_version, report_data, local_object_dispatch);
+
+ auto object_tracker_obj = new ObjectLifetimes;
+ object_tracker_obj->RegisterValidationObject(!local_disables[object_tracking], api_version, report_data, local_object_dispatch);
+
+ auto core_checks_obj = new CoreChecks;
+ core_checks_obj->RegisterValidationObject(!local_disables[core_checks], api_version, report_data, local_object_dispatch);
+
+ auto best_practices_obj = new BestPractices;
+ best_practices_obj->RegisterValidationObject(local_enables[best_practices], api_version, report_data, local_object_dispatch);
+
+ auto gpu_assisted_obj = new GpuAssisted;
+ gpu_assisted_obj->RegisterValidationObject(local_enables[gpu_validation], api_version, report_data, local_object_dispatch);
+
+ auto debug_printf_obj = new DebugPrintf;
+ debug_printf_obj->RegisterValidationObject(local_enables[debug_printf], api_version, report_data, local_object_dispatch);
+
+ auto sync_validation_obj = new SyncValidator;
+ sync_validation_obj->RegisterValidationObject(local_enables[sync_validation], api_version, report_data, local_object_dispatch);
// If handle wrapping is disabled via the ValidationFeatures extension, override build flag
- if (local_disables.handle_wrapping) {
+ if (local_disables[handle_wrapping]) {
wrap_handles = false;
}
// Init dispatch array and call registration functions
+ bool skip = false;
for (auto intercept : local_object_dispatch) {
- (const_cast<const ValidationObject*>(intercept))->PreCallValidateCreateInstance(pCreateInfo, pAllocator, pInstance);
+ auto lock = intercept->read_lock();
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateCreateInstance(pCreateInfo, pAllocator, pInstance);
+ if (skip) return VK_ERROR_VALIDATION_FAILED_EXT;
}
for (auto intercept : local_object_dispatch) {
+ auto lock = intercept->write_lock();
intercept->PreCallRecordCreateInstance(pCreateInfo, pAllocator, pInstance);
}
@@ -525,40 +334,28 @@
framework->api_version = api_version;
framework->instance_extensions.InitFromInstanceCreateInfo(specified_version, pCreateInfo);
- layer_debug_messenger_actions(framework->report_data, pAllocator, OBJECT_LAYER_DESCRIPTION);
+ OutputLayerStatusInfo(framework);
- object_tracker->instance_dispatch_table = framework->instance_dispatch_table;
- object_tracker->enabled = framework->enabled;
- object_tracker->disabled = framework->disabled;
- thread_checker->instance_dispatch_table = framework->instance_dispatch_table;
- thread_checker->enabled = framework->enabled;
- thread_checker->disabled = framework->disabled;
- parameter_validation->instance_dispatch_table = framework->instance_dispatch_table;
- parameter_validation->enabled = framework->enabled;
- parameter_validation->disabled = framework->disabled;
- core_checks->instance_dispatch_table = framework->instance_dispatch_table;
- core_checks->instance = *pInstance;
- core_checks->enabled = framework->enabled;
- core_checks->disabled = framework->disabled;
- core_checks->instance_state = core_checks;
- best_practices->instance_dispatch_table = framework->instance_dispatch_table;
- best_practices->enabled = framework->enabled;
- best_practices->disabled = framework->disabled;
- gpu_assisted->instance_dispatch_table = framework->instance_dispatch_table;
- gpu_assisted->enabled = framework->enabled;
- gpu_assisted->disabled = framework->disabled;
- debug_printf->instance_dispatch_table = framework->instance_dispatch_table;
- debug_printf->enabled = framework->enabled;
- debug_printf->disabled = framework->disabled;
+ thread_checker_obj->FinalizeInstanceValidationObject(framework);
+ object_tracker_obj->FinalizeInstanceValidationObject(framework);
+ parameter_validation_obj->FinalizeInstanceValidationObject(framework);
+ core_checks_obj->FinalizeInstanceValidationObject(framework);
+ core_checks_obj->instance = *pInstance;
+ core_checks_obj->instance_state = core_checks_obj;
+ best_practices_obj->FinalizeInstanceValidationObject(framework);
+ gpu_assisted_obj->FinalizeInstanceValidationObject(framework);
+ debug_printf_obj->FinalizeInstanceValidationObject(framework);
+ sync_validation_obj->FinalizeInstanceValidationObject(framework);
for (auto intercept : framework->object_dispatch) {
+ auto lock = intercept->write_lock();
intercept->PostCallRecordCreateInstance(pCreateInfo, pAllocator, pInstance, result);
}
// Delete unused validation objects to avoid memory leak.
std::vector<ValidationObject*> local_objs = {
- thread_checker, object_tracker, parameter_validation,
- core_checks, best_practices, gpu_assisted, debug_printf,
+ thread_checker_obj, object_tracker_obj, parameter_validation_obj,
+ core_checks_obj, best_practices_obj, gpu_assisted_obj, debug_printf_obj,
};
for (auto obj : local_objs) {
if (std::find(local_object_dispatch.begin(), local_object_dispatch.end(), obj) == local_object_dispatch.end()) {
@@ -576,9 +373,11 @@
auto layer_data = GetLayerDataPtr(key, layer_data_map);
ActivateInstanceDebugCallbacks(layer_data->report_data);
+ bool skip = false;
for (auto intercept : layer_data->object_dispatch) {
auto lock = intercept->read_lock();
- (const_cast<const ValidationObject*>(intercept))->PreCallValidateDestroyInstance(instance, pAllocator);
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateDestroyInstance(instance, pAllocator);
+ //if (skip) return; // WORKAROUD: does not currently work properly
}
for (auto intercept : layer_data->object_dispatch) {
auto lock = intercept->write_lock();
@@ -664,76 +463,38 @@
device_interceptor->instance = instance_interceptor->instance;
device_interceptor->report_data = instance_interceptor->report_data;
- // Note that this defines the order in which the layer validation objects are called
- auto thread_safety = new ThreadSafety(reinterpret_cast<ThreadSafety *>(instance_interceptor->GetValidationObject(instance_interceptor->object_dispatch, LayerObjectTypeThreading)));
- thread_safety->container_type = LayerObjectTypeThreading;
- if (!instance_interceptor->disabled.thread_safety) {
- device_interceptor->object_dispatch.emplace_back(thread_safety);
- }
- auto stateless_validation = new StatelessValidation;
- stateless_validation->container_type = LayerObjectTypeParameterValidation;
- if (!instance_interceptor->disabled.stateless_checks) {
- device_interceptor->object_dispatch.emplace_back(stateless_validation);
- }
- auto object_tracker = new ObjectLifetimes;
- object_tracker->container_type = LayerObjectTypeObjectTracker;
- if (!instance_interceptor->disabled.object_tracking) {
- device_interceptor->object_dispatch.emplace_back(object_tracker);
- }
- auto core_checks = new CoreChecks;
- core_checks->container_type = LayerObjectTypeCoreValidation;
- core_checks->instance_state = reinterpret_cast<CoreChecks *>(
- core_checks->GetValidationObject(instance_interceptor->object_dispatch, LayerObjectTypeCoreValidation));
- if (!instance_interceptor->disabled.core_checks) {
- // Only enable the command counters when needed.
- if (device_extensions.vk_khr_performance_query) {
- auto command_counter = new CommandCounter(core_checks);
- command_counter->container_type = LayerObjectTypeDevice;
- device_interceptor->object_dispatch.emplace_back(command_counter);
- }
- device_interceptor->object_dispatch.emplace_back(core_checks);
- }
- auto best_practices = new BestPractices;
- best_practices->container_type = LayerObjectTypeBestPractices;
- best_practices->instance_state = reinterpret_cast<BestPractices *>(
- best_practices->GetValidationObject(instance_interceptor->object_dispatch, LayerObjectTypeBestPractices));
- if (instance_interceptor->enabled.best_practices) {
- device_interceptor->object_dispatch.emplace_back(best_practices);
- }
- auto gpu_assisted = new GpuAssisted;
- gpu_assisted->container_type = LayerObjectTypeGpuAssisted;
- gpu_assisted->instance_state = reinterpret_cast<GpuAssisted *>(
- gpu_assisted->GetValidationObject(instance_interceptor->object_dispatch, LayerObjectTypeGpuAssisted));
- if (instance_interceptor->enabled.gpu_validation) {
- device_interceptor->object_dispatch.emplace_back(gpu_assisted);
- }
- auto debug_printf = new DebugPrintf;
- debug_printf->container_type = LayerObjectTypeDebugPrintf;
- debug_printf->instance_state = reinterpret_cast<DebugPrintf *>(
- debug_printf->GetValidationObject(instance_interceptor->object_dispatch, LayerObjectTypeDebugPrintf));
- if (instance_interceptor->enabled.debug_printf) {
- device_interceptor->object_dispatch.emplace_back(debug_printf);
- }
+ // Note that this DEFINES THE ORDER IN WHICH THE LAYER VALIDATION OBJECTS ARE CALLED
+ auto disables = instance_interceptor->disabled;
+ auto enables = instance_interceptor->enabled;
- // Set per-intercept common data items
- for (auto dev_intercept : device_interceptor->object_dispatch) {
- dev_intercept->device = *pDevice;
- dev_intercept->physical_device = gpu;
- dev_intercept->instance = instance_interceptor->instance;
- dev_intercept->report_data = device_interceptor->report_data;
- dev_intercept->device_dispatch_table = device_interceptor->device_dispatch_table;
- dev_intercept->api_version = device_interceptor->api_version;
- dev_intercept->disabled = instance_interceptor->disabled;
- dev_intercept->enabled = instance_interceptor->enabled;
- dev_intercept->instance_dispatch_table = instance_interceptor->instance_dispatch_table;
- dev_intercept->instance_extensions = instance_interceptor->instance_extensions;
- dev_intercept->device_extensions = device_interceptor->device_extensions;
- }
+ auto thread_safety_obj = new ThreadSafety(reinterpret_cast<ThreadSafety *>(instance_interceptor->GetValidationObject(instance_interceptor->object_dispatch, LayerObjectTypeThreading)));
+ thread_safety_obj->InitDeviceValidationObject(!disables[thread_safety], instance_interceptor, device_interceptor);
+
+ auto stateless_validation_obj = new StatelessValidation;
+ stateless_validation_obj->InitDeviceValidationObject(!disables[stateless_checks], instance_interceptor, device_interceptor);
+
+ auto object_tracker_obj = new ObjectLifetimes;
+ object_tracker_obj->InitDeviceValidationObject(!disables[object_tracking], instance_interceptor, device_interceptor);
+
+ auto core_checks_obj = new CoreChecks;
+ core_checks_obj->InitDeviceValidationObject(!disables[core_checks], instance_interceptor, device_interceptor);
+
+ auto best_practices_obj = new BestPractices;
+ best_practices_obj->InitDeviceValidationObject(enables[best_practices], instance_interceptor, device_interceptor);
+
+ auto gpu_assisted_obj = new GpuAssisted;
+ gpu_assisted_obj->InitDeviceValidationObject(enables[gpu_validation], instance_interceptor, device_interceptor);
+
+ auto debug_printf_obj = new DebugPrintf;
+ debug_printf_obj->InitDeviceValidationObject(enables[debug_printf], instance_interceptor, device_interceptor);
+
+ auto sync_validation_obj = new SyncValidator;
+ sync_validation_obj->InitDeviceValidationObject(enables[sync_validation], instance_interceptor, device_interceptor);
// Delete unused validation objects to avoid memory leak.
std::vector<ValidationObject *> local_objs = {
- thread_safety, stateless_validation, object_tracker,
- core_checks, best_practices, gpu_assisted, debug_printf,
+ thread_safety_obj, stateless_validation_obj, object_tracker_obj,
+ core_checks_obj, best_practices_obj, gpu_assisted_obj, debug_printf_obj,
};
for (auto obj : local_objs) {
if (std::find(device_interceptor->object_dispatch.begin(), device_interceptor->object_dispatch.end(), obj) ==
@@ -755,9 +516,11 @@
VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
dispatch_key key = get_dispatch_key(device);
auto layer_data = GetLayerDataPtr(key, layer_data_map);
+ bool skip = false;
for (auto intercept : layer_data->object_dispatch) {
auto lock = intercept->read_lock();
- (const_cast<const ValidationObject*>(intercept))->PreCallValidateDestroyDevice(device, pAllocator);
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateDestroyDevice(device, pAllocator);
+ if (skip) return;
}
for (auto intercept : layer_data->object_dispatch) {
auto lock = intercept->write_lock();
@@ -986,11 +749,13 @@
auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
bool skip = false;
- cvdescriptorset::AllocateDescriptorSetsData ads_state(pAllocateInfo->descriptorSetCount);
+ cvdescriptorset::AllocateDescriptorSetsData ads_state[LayerObjectTypeMaxEnum];
for (auto intercept : layer_data->object_dispatch) {
+ ads_state[intercept->container_type].Init(pAllocateInfo->descriptorSetCount);
auto lock = intercept->read_lock();
- skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateAllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets, &ads_state);
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateAllocateDescriptorSets(device,
+ pAllocateInfo, pDescriptorSets, &(ads_state[intercept->container_type]));
if (skip) return VK_ERROR_VALIDATION_FAILED_EXT;
}
for (auto intercept : layer_data->object_dispatch) {
@@ -1000,7 +765,8 @@
VkResult result = DispatchAllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
for (auto intercept : layer_data->object_dispatch) {
auto lock = intercept->write_lock();
- intercept->PostCallRecordAllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets, result, &ads_state);
+ intercept->PostCallRecordAllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets,
+ result, &(ads_state[intercept->container_type]));
}
return result;
}
@@ -7674,6 +7440,29 @@
return result;
}
+VKAPI_ATTR VkResult VKAPI_CALL GetImageViewAddressNVX(
+ VkDevice device,
+ VkImageView imageView,
+ VkImageViewAddressPropertiesNVX* pProperties) {
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
+ bool skip = false;
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->read_lock();
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateGetImageViewAddressNVX(device, imageView, pProperties);
+ if (skip) return VK_ERROR_VALIDATION_FAILED_EXT;
+ }
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PreCallRecordGetImageViewAddressNVX(device, imageView, pProperties);
+ }
+ VkResult result = DispatchGetImageViewAddressNVX(device, imageView, pProperties);
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PostCallRecordGetImageViewAddressNVX(device, imageView, pProperties, result);
+ }
+ return result;
+}
+
VKAPI_ATTR void VKAPI_CALL CmdDrawIndirectCountAMD(
VkCommandBuffer commandBuffer,
@@ -9120,6 +8909,7 @@
+
VKAPI_ATTR VkResult VKAPI_CALL GetMemoryHostPointerPropertiesEXT(
VkDevice device,
VkExternalMemoryHandleTypeFlagBits handleType,
@@ -9878,6 +9668,7 @@
}
+
VKAPI_ATTR void VKAPI_CALL ResetQueryPoolEXT(
VkDevice device,
VkQueryPool queryPool,
@@ -9903,6 +9694,270 @@
+VKAPI_ATTR void VKAPI_CALL CmdSetCullModeEXT(
+ VkCommandBuffer commandBuffer,
+ VkCullModeFlags cullMode) {
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ bool skip = false;
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->read_lock();
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateCmdSetCullModeEXT(commandBuffer, cullMode);
+ if (skip) return;
+ }
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PreCallRecordCmdSetCullModeEXT(commandBuffer, cullMode);
+ }
+ DispatchCmdSetCullModeEXT(commandBuffer, cullMode);
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PostCallRecordCmdSetCullModeEXT(commandBuffer, cullMode);
+ }
+}
+
+VKAPI_ATTR void VKAPI_CALL CmdSetFrontFaceEXT(
+ VkCommandBuffer commandBuffer,
+ VkFrontFace frontFace) {
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ bool skip = false;
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->read_lock();
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateCmdSetFrontFaceEXT(commandBuffer, frontFace);
+ if (skip) return;
+ }
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PreCallRecordCmdSetFrontFaceEXT(commandBuffer, frontFace);
+ }
+ DispatchCmdSetFrontFaceEXT(commandBuffer, frontFace);
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PostCallRecordCmdSetFrontFaceEXT(commandBuffer, frontFace);
+ }
+}
+
+VKAPI_ATTR void VKAPI_CALL CmdSetPrimitiveTopologyEXT(
+ VkCommandBuffer commandBuffer,
+ VkPrimitiveTopology primitiveTopology) {
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ bool skip = false;
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->read_lock();
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateCmdSetPrimitiveTopologyEXT(commandBuffer, primitiveTopology);
+ if (skip) return;
+ }
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PreCallRecordCmdSetPrimitiveTopologyEXT(commandBuffer, primitiveTopology);
+ }
+ DispatchCmdSetPrimitiveTopologyEXT(commandBuffer, primitiveTopology);
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PostCallRecordCmdSetPrimitiveTopologyEXT(commandBuffer, primitiveTopology);
+ }
+}
+
+VKAPI_ATTR void VKAPI_CALL CmdSetViewportWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t viewportCount,
+ const VkViewport* pViewports) {
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ bool skip = false;
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->read_lock();
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateCmdSetViewportWithCountEXT(commandBuffer, viewportCount, pViewports);
+ if (skip) return;
+ }
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PreCallRecordCmdSetViewportWithCountEXT(commandBuffer, viewportCount, pViewports);
+ }
+ DispatchCmdSetViewportWithCountEXT(commandBuffer, viewportCount, pViewports);
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PostCallRecordCmdSetViewportWithCountEXT(commandBuffer, viewportCount, pViewports);
+ }
+}
+
+VKAPI_ATTR void VKAPI_CALL CmdSetScissorWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t scissorCount,
+ const VkRect2D* pScissors) {
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ bool skip = false;
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->read_lock();
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateCmdSetScissorWithCountEXT(commandBuffer, scissorCount, pScissors);
+ if (skip) return;
+ }
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PreCallRecordCmdSetScissorWithCountEXT(commandBuffer, scissorCount, pScissors);
+ }
+ DispatchCmdSetScissorWithCountEXT(commandBuffer, scissorCount, pScissors);
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PostCallRecordCmdSetScissorWithCountEXT(commandBuffer, scissorCount, pScissors);
+ }
+}
+
+VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers2EXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t firstBinding,
+ uint32_t bindingCount,
+ const VkBuffer* pBuffers,
+ const VkDeviceSize* pOffsets,
+ const VkDeviceSize* pSizes,
+ const VkDeviceSize* pStrides) {
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ bool skip = false;
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->read_lock();
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateCmdBindVertexBuffers2EXT(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, pStrides);
+ if (skip) return;
+ }
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PreCallRecordCmdBindVertexBuffers2EXT(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, pStrides);
+ }
+ DispatchCmdBindVertexBuffers2EXT(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, pStrides);
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PostCallRecordCmdBindVertexBuffers2EXT(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, pStrides);
+ }
+}
+
+VKAPI_ATTR void VKAPI_CALL CmdSetDepthTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthTestEnable) {
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ bool skip = false;
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->read_lock();
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateCmdSetDepthTestEnableEXT(commandBuffer, depthTestEnable);
+ if (skip) return;
+ }
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PreCallRecordCmdSetDepthTestEnableEXT(commandBuffer, depthTestEnable);
+ }
+ DispatchCmdSetDepthTestEnableEXT(commandBuffer, depthTestEnable);
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PostCallRecordCmdSetDepthTestEnableEXT(commandBuffer, depthTestEnable);
+ }
+}
+
+VKAPI_ATTR void VKAPI_CALL CmdSetDepthWriteEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthWriteEnable) {
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ bool skip = false;
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->read_lock();
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateCmdSetDepthWriteEnableEXT(commandBuffer, depthWriteEnable);
+ if (skip) return;
+ }
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PreCallRecordCmdSetDepthWriteEnableEXT(commandBuffer, depthWriteEnable);
+ }
+ DispatchCmdSetDepthWriteEnableEXT(commandBuffer, depthWriteEnable);
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PostCallRecordCmdSetDepthWriteEnableEXT(commandBuffer, depthWriteEnable);
+ }
+}
+
+VKAPI_ATTR void VKAPI_CALL CmdSetDepthCompareOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkCompareOp depthCompareOp) {
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ bool skip = false;
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->read_lock();
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateCmdSetDepthCompareOpEXT(commandBuffer, depthCompareOp);
+ if (skip) return;
+ }
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PreCallRecordCmdSetDepthCompareOpEXT(commandBuffer, depthCompareOp);
+ }
+ DispatchCmdSetDepthCompareOpEXT(commandBuffer, depthCompareOp);
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PostCallRecordCmdSetDepthCompareOpEXT(commandBuffer, depthCompareOp);
+ }
+}
+
+VKAPI_ATTR void VKAPI_CALL CmdSetDepthBoundsTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthBoundsTestEnable) {
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ bool skip = false;
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->read_lock();
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateCmdSetDepthBoundsTestEnableEXT(commandBuffer, depthBoundsTestEnable);
+ if (skip) return;
+ }
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PreCallRecordCmdSetDepthBoundsTestEnableEXT(commandBuffer, depthBoundsTestEnable);
+ }
+ DispatchCmdSetDepthBoundsTestEnableEXT(commandBuffer, depthBoundsTestEnable);
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PostCallRecordCmdSetDepthBoundsTestEnableEXT(commandBuffer, depthBoundsTestEnable);
+ }
+}
+
+VKAPI_ATTR void VKAPI_CALL CmdSetStencilTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 stencilTestEnable) {
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ bool skip = false;
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->read_lock();
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateCmdSetStencilTestEnableEXT(commandBuffer, stencilTestEnable);
+ if (skip) return;
+ }
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PreCallRecordCmdSetStencilTestEnableEXT(commandBuffer, stencilTestEnable);
+ }
+ DispatchCmdSetStencilTestEnableEXT(commandBuffer, stencilTestEnable);
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PostCallRecordCmdSetStencilTestEnableEXT(commandBuffer, stencilTestEnable);
+ }
+}
+
+VKAPI_ATTR void VKAPI_CALL CmdSetStencilOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkStencilFaceFlags faceMask,
+ VkStencilOp failOp,
+ VkStencilOp passOp,
+ VkStencilOp depthFailOp,
+ VkCompareOp compareOp) {
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ bool skip = false;
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->read_lock();
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateCmdSetStencilOpEXT(commandBuffer, faceMask, failOp, passOp, depthFailOp, compareOp);
+ if (skip) return;
+ }
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PreCallRecordCmdSetStencilOpEXT(commandBuffer, faceMask, failOp, passOp, depthFailOp, compareOp);
+ }
+ DispatchCmdSetStencilOpEXT(commandBuffer, faceMask, failOp, passOp, depthFailOp, compareOp);
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PostCallRecordCmdSetStencilOpEXT(commandBuffer, faceMask, failOp, passOp, depthFailOp, compareOp);
+ }
+}
+
+
VKAPI_ATTR void VKAPI_CALL GetGeneratedCommandsMemoryRequirementsNV(
VkDevice device,
@@ -10043,6 +10098,157 @@
+
+VKAPI_ATTR VkResult VKAPI_CALL CreatePrivateDataSlotEXT(
+ VkDevice device,
+ const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkPrivateDataSlotEXT* pPrivateDataSlot) {
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
+ bool skip = false;
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->read_lock();
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateCreatePrivateDataSlotEXT(device, pCreateInfo, pAllocator, pPrivateDataSlot);
+ if (skip) return VK_ERROR_VALIDATION_FAILED_EXT;
+ }
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PreCallRecordCreatePrivateDataSlotEXT(device, pCreateInfo, pAllocator, pPrivateDataSlot);
+ }
+ VkResult result = DispatchCreatePrivateDataSlotEXT(device, pCreateInfo, pAllocator, pPrivateDataSlot);
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PostCallRecordCreatePrivateDataSlotEXT(device, pCreateInfo, pAllocator, pPrivateDataSlot, result);
+ }
+ return result;
+}
+
+VKAPI_ATTR void VKAPI_CALL DestroyPrivateDataSlotEXT(
+ VkDevice device,
+ VkPrivateDataSlotEXT privateDataSlot,
+ const VkAllocationCallbacks* pAllocator) {
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
+ bool skip = false;
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->read_lock();
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateDestroyPrivateDataSlotEXT(device, privateDataSlot, pAllocator);
+ if (skip) return;
+ }
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PreCallRecordDestroyPrivateDataSlotEXT(device, privateDataSlot, pAllocator);
+ }
+ DispatchDestroyPrivateDataSlotEXT(device, privateDataSlot, pAllocator);
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PostCallRecordDestroyPrivateDataSlotEXT(device, privateDataSlot, pAllocator);
+ }
+}
+
+VKAPI_ATTR VkResult VKAPI_CALL SetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t data) {
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
+ bool skip = false;
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->read_lock();
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateSetPrivateDataEXT(device, objectType, objectHandle, privateDataSlot, data);
+ if (skip) return VK_ERROR_VALIDATION_FAILED_EXT;
+ }
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PreCallRecordSetPrivateDataEXT(device, objectType, objectHandle, privateDataSlot, data);
+ }
+ VkResult result = DispatchSetPrivateDataEXT(device, objectType, objectHandle, privateDataSlot, data);
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PostCallRecordSetPrivateDataEXT(device, objectType, objectHandle, privateDataSlot, data, result);
+ }
+ return result;
+}
+
+VKAPI_ATTR void VKAPI_CALL GetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t* pData) {
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
+ bool skip = false;
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->read_lock();
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateGetPrivateDataEXT(device, objectType, objectHandle, privateDataSlot, pData);
+ if (skip) return;
+ }
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PreCallRecordGetPrivateDataEXT(device, objectType, objectHandle, privateDataSlot, pData);
+ }
+ DispatchGetPrivateDataEXT(device, objectType, objectHandle, privateDataSlot, pData);
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PostCallRecordGetPrivateDataEXT(device, objectType, objectHandle, privateDataSlot, pData);
+ }
+}
+
+
+
+
+
+
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+
+VKAPI_ATTR VkResult VKAPI_CALL CreateDirectFBSurfaceEXT(
+ VkInstance instance,
+ const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkSurfaceKHR* pSurface) {
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(instance), layer_data_map);
+ bool skip = false;
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->read_lock();
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateCreateDirectFBSurfaceEXT(instance, pCreateInfo, pAllocator, pSurface);
+ if (skip) return VK_ERROR_VALIDATION_FAILED_EXT;
+ }
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PreCallRecordCreateDirectFBSurfaceEXT(instance, pCreateInfo, pAllocator, pSurface);
+ }
+ VkResult result = DispatchCreateDirectFBSurfaceEXT(instance, pCreateInfo, pAllocator, pSurface);
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PostCallRecordCreateDirectFBSurfaceEXT(instance, pCreateInfo, pAllocator, pSurface, result);
+ }
+ return result;
+}
+
+VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceDirectFBPresentationSupportEXT(
+ VkPhysicalDevice physicalDevice,
+ uint32_t queueFamilyIndex,
+ IDirectFB* dfb) {
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), layer_data_map);
+ bool skip = false;
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->read_lock();
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateGetPhysicalDeviceDirectFBPresentationSupportEXT(physicalDevice, queueFamilyIndex, dfb);
+ if (skip) return VK_FALSE;
+ }
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PreCallRecordGetPhysicalDeviceDirectFBPresentationSupportEXT(physicalDevice, queueFamilyIndex, dfb);
+ }
+ VkBool32 result = DispatchGetPhysicalDeviceDirectFBPresentationSupportEXT(physicalDevice, queueFamilyIndex, dfb);
+ for (auto intercept : layer_data->object_dispatch) {
+ auto lock = intercept->write_lock();
+ intercept->PostCallRecordGetPhysicalDeviceDirectFBPresentationSupportEXT(physicalDevice, queueFamilyIndex, dfb);
+ }
+ return result;
+}
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
+
#ifdef VK_USE_PLATFORM_FUCHSIA
VKAPI_ATTR VkResult VKAPI_CALL CreateBufferCollectionFUCHSIA(
@@ -10997,6 +11203,7 @@
{"vkCmdEndQueryIndexedEXT", {kFuncTypeDev, (void*)CmdEndQueryIndexedEXT}},
{"vkCmdDrawIndirectByteCountEXT", {kFuncTypeDev, (void*)CmdDrawIndirectByteCountEXT}},
{"vkGetImageViewHandleNVX", {kFuncTypeDev, (void*)GetImageViewHandleNVX}},
+ {"vkGetImageViewAddressNVX", {kFuncTypeDev, (void*)GetImageViewAddressNVX}},
{"vkCmdDrawIndirectCountAMD", {kFuncTypeDev, (void*)CmdDrawIndirectCountAMD}},
{"vkCmdDrawIndexedIndirectCountAMD", {kFuncTypeDev, (void*)CmdDrawIndexedIndirectCountAMD}},
{"vkGetShaderInfoAMD", {kFuncTypeDev, (void*)GetShaderInfoAMD}},
@@ -11123,12 +11330,34 @@
{"vkCreateHeadlessSurfaceEXT", {kFuncTypeInst, (void*)CreateHeadlessSurfaceEXT}},
{"vkCmdSetLineStippleEXT", {kFuncTypeDev, (void*)CmdSetLineStippleEXT}},
{"vkResetQueryPoolEXT", {kFuncTypeDev, (void*)ResetQueryPoolEXT}},
+ {"vkCmdSetCullModeEXT", {kFuncTypeDev, (void*)CmdSetCullModeEXT}},
+ {"vkCmdSetFrontFaceEXT", {kFuncTypeDev, (void*)CmdSetFrontFaceEXT}},
+ {"vkCmdSetPrimitiveTopologyEXT", {kFuncTypeDev, (void*)CmdSetPrimitiveTopologyEXT}},
+ {"vkCmdSetViewportWithCountEXT", {kFuncTypeDev, (void*)CmdSetViewportWithCountEXT}},
+ {"vkCmdSetScissorWithCountEXT", {kFuncTypeDev, (void*)CmdSetScissorWithCountEXT}},
+ {"vkCmdBindVertexBuffers2EXT", {kFuncTypeDev, (void*)CmdBindVertexBuffers2EXT}},
+ {"vkCmdSetDepthTestEnableEXT", {kFuncTypeDev, (void*)CmdSetDepthTestEnableEXT}},
+ {"vkCmdSetDepthWriteEnableEXT", {kFuncTypeDev, (void*)CmdSetDepthWriteEnableEXT}},
+ {"vkCmdSetDepthCompareOpEXT", {kFuncTypeDev, (void*)CmdSetDepthCompareOpEXT}},
+ {"vkCmdSetDepthBoundsTestEnableEXT", {kFuncTypeDev, (void*)CmdSetDepthBoundsTestEnableEXT}},
+ {"vkCmdSetStencilTestEnableEXT", {kFuncTypeDev, (void*)CmdSetStencilTestEnableEXT}},
+ {"vkCmdSetStencilOpEXT", {kFuncTypeDev, (void*)CmdSetStencilOpEXT}},
{"vkGetGeneratedCommandsMemoryRequirementsNV", {kFuncTypeDev, (void*)GetGeneratedCommandsMemoryRequirementsNV}},
{"vkCmdPreprocessGeneratedCommandsNV", {kFuncTypeDev, (void*)CmdPreprocessGeneratedCommandsNV}},
{"vkCmdExecuteGeneratedCommandsNV", {kFuncTypeDev, (void*)CmdExecuteGeneratedCommandsNV}},
{"vkCmdBindPipelineShaderGroupNV", {kFuncTypeDev, (void*)CmdBindPipelineShaderGroupNV}},
{"vkCreateIndirectCommandsLayoutNV", {kFuncTypeDev, (void*)CreateIndirectCommandsLayoutNV}},
{"vkDestroyIndirectCommandsLayoutNV", {kFuncTypeDev, (void*)DestroyIndirectCommandsLayoutNV}},
+ {"vkCreatePrivateDataSlotEXT", {kFuncTypeDev, (void*)CreatePrivateDataSlotEXT}},
+ {"vkDestroyPrivateDataSlotEXT", {kFuncTypeDev, (void*)DestroyPrivateDataSlotEXT}},
+ {"vkSetPrivateDataEXT", {kFuncTypeDev, (void*)SetPrivateDataEXT}},
+ {"vkGetPrivateDataEXT", {kFuncTypeDev, (void*)GetPrivateDataEXT}},
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+ {"vkCreateDirectFBSurfaceEXT", {kFuncTypeInst, (void*)CreateDirectFBSurfaceEXT}},
+#endif
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+ {"vkGetPhysicalDeviceDirectFBPresentationSupportEXT", {kFuncTypePdev, (void*)GetPhysicalDeviceDirectFBPresentationSupportEXT}},
+#endif
#ifdef VK_USE_PLATFORM_FUCHSIA
{"vkCreateBufferCollectionFUCHSIA", {kFuncTypeDev, (void*)CreateBufferCollectionFUCHSIA}},
#endif
diff --git a/layers/generated/chassis.h b/layers/generated/chassis.h
index 1c8e6d2..72f42fc 100644
--- a/layers/generated/chassis.h
+++ b/layers/generated/chassis.h
@@ -37,6 +37,7 @@
#include "vk_loader_platform.h"
#include "vulkan/vulkan.h"
+#include "vk_layer_settings_ext.h"
#include "vk_layer_config.h"
#include "vk_layer_data.h"
#include "vk_layer_logging.h"
@@ -1824,6 +1825,11 @@
VkDevice device,
const VkImageViewHandleInfoNVX* pInfo);
+VKAPI_ATTR VkResult VKAPI_CALL GetImageViewAddressNVX(
+ VkDevice device,
+ VkImageView imageView,
+ VkImageViewAddressPropertiesNVX* pProperties);
+
VKAPI_ATTR void VKAPI_CALL CmdDrawIndirectCountAMD(
VkCommandBuffer commandBuffer,
@@ -2279,6 +2285,7 @@
+
VKAPI_ATTR VkResult VKAPI_CALL GetMemoryHostPointerPropertiesEXT(
VkDevice device,
VkExternalMemoryHandleTypeFlagBits handleType,
@@ -2494,6 +2501,7 @@
uint16_t lineStipplePattern);
+
VKAPI_ATTR void VKAPI_CALL ResetQueryPoolEXT(
VkDevice device,
VkQueryPool queryPool,
@@ -2502,6 +2510,66 @@
+VKAPI_ATTR void VKAPI_CALL CmdSetCullModeEXT(
+ VkCommandBuffer commandBuffer,
+ VkCullModeFlags cullMode);
+
+VKAPI_ATTR void VKAPI_CALL CmdSetFrontFaceEXT(
+ VkCommandBuffer commandBuffer,
+ VkFrontFace frontFace);
+
+VKAPI_ATTR void VKAPI_CALL CmdSetPrimitiveTopologyEXT(
+ VkCommandBuffer commandBuffer,
+ VkPrimitiveTopology primitiveTopology);
+
+VKAPI_ATTR void VKAPI_CALL CmdSetViewportWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t viewportCount,
+ const VkViewport* pViewports);
+
+VKAPI_ATTR void VKAPI_CALL CmdSetScissorWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t scissorCount,
+ const VkRect2D* pScissors);
+
+VKAPI_ATTR void VKAPI_CALL CmdBindVertexBuffers2EXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t firstBinding,
+ uint32_t bindingCount,
+ const VkBuffer* pBuffers,
+ const VkDeviceSize* pOffsets,
+ const VkDeviceSize* pSizes,
+ const VkDeviceSize* pStrides);
+
+VKAPI_ATTR void VKAPI_CALL CmdSetDepthTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthTestEnable);
+
+VKAPI_ATTR void VKAPI_CALL CmdSetDepthWriteEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthWriteEnable);
+
+VKAPI_ATTR void VKAPI_CALL CmdSetDepthCompareOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkCompareOp depthCompareOp);
+
+VKAPI_ATTR void VKAPI_CALL CmdSetDepthBoundsTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthBoundsTestEnable);
+
+VKAPI_ATTR void VKAPI_CALL CmdSetStencilTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 stencilTestEnable);
+
+VKAPI_ATTR void VKAPI_CALL CmdSetStencilOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkStencilFaceFlags faceMask,
+ VkStencilOp failOp,
+ VkStencilOp passOp,
+ VkStencilOp depthFailOp,
+ VkCompareOp compareOp);
+
+
VKAPI_ATTR void VKAPI_CALL GetGeneratedCommandsMemoryRequirementsNV(
VkDevice device,
@@ -2539,6 +2607,51 @@
+
+VKAPI_ATTR VkResult VKAPI_CALL CreatePrivateDataSlotEXT(
+ VkDevice device,
+ const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkPrivateDataSlotEXT* pPrivateDataSlot);
+
+VKAPI_ATTR void VKAPI_CALL DestroyPrivateDataSlotEXT(
+ VkDevice device,
+ VkPrivateDataSlotEXT privateDataSlot,
+ const VkAllocationCallbacks* pAllocator);
+
+VKAPI_ATTR VkResult VKAPI_CALL SetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t data);
+
+VKAPI_ATTR void VKAPI_CALL GetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t* pData);
+
+
+
+
+
+
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+
+VKAPI_ATTR VkResult VKAPI_CALL CreateDirectFBSurfaceEXT(
+ VkInstance instance,
+ const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkSurfaceKHR* pSurface);
+
+VKAPI_ATTR VkBool32 VKAPI_CALL GetPhysicalDeviceDirectFBPresentationSupportEXT(
+ VkPhysicalDevice physicalDevice,
+ uint32_t queueFamilyIndex,
+ IDirectFB* dfb);
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
+
#ifdef VK_USE_PLATFORM_FUCHSIA
VKAPI_ATTR VkResult VKAPI_CALL CreateBufferCollectionFUCHSIA(
@@ -2717,6 +2830,8 @@
LayerObjectTypeBestPractices, // Instance or device best practices layer object
LayerObjectTypeGpuAssisted, // Instance or device gpu assisted validation layer object
LayerObjectTypeDebugPrintf, // Instance or device shader debug printf layer object
+ LayerObjectTypeCommandCounter, // Command Counter validation object, child of corechecks
+ LayerObjectTypeSyncValidation, // Instance or device synchronization validation layer object
LayerObjectTypeMaxEnum, // Max enum count
};
@@ -2751,38 +2866,42 @@
typedef enum VkValidationFeatureEnable {
VK_VALIDATION_FEATURE_ENABLE_SHADER_DEBUG_PRINTF,
+ VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION,
} VkValidationFeatureEnable;
-// CHECK_DISABLED struct is a container for bools that can block validation checks from being performed.
-// These bools are all "false" by default meaning that all checks are enabled. Enum values can be specified
-// via the vk_layer_setting.txt config file or at CreateInstance time via the VK_EXT_validation_features extension
-// that can selectively disable checks.
-struct CHECK_DISABLED {
- bool command_buffer_state; // Skip command buffer state validation
- bool object_in_use; // Skip all object in_use checking
- bool idle_descriptor_set; // Skip check to verify that descriptor set is not in-use
- bool push_constant_range; // Skip push constant range checks
- bool query_validation; // Disable all core validation query-related checks
- bool image_layout_validation; // Disable image layout validation
- bool object_tracking; // Disable object lifetime validation
- bool core_checks; // Disable core validation checks
- bool thread_safety; // Disable thread safety validation
- bool stateless_checks; // Disable stateless validation checks
- bool handle_wrapping; // Disable unique handles/handle wrapping
- bool shader_validation; // Skip validation for shaders
+// CHECK_DISABLED and CHECK_ENABLED vectors are containers for bools that can opt in or out of specific classes of validation
+// checks. Enum values can be specified via the vk_layer_settings.txt config file or at CreateInstance time via the
+// VK_EXT_validation_features extension that can selectively disable or enable checks.
+typedef enum DisableFlags {
+ command_buffer_state,
+ object_in_use,
+ idle_descriptor_set,
+ push_constant_range,
+ query_validation,
+ image_layout_validation,
+ object_tracking,
+ core_checks,
+ thread_safety,
+ stateless_checks,
+ handle_wrapping,
+ shader_validation,
+ // Insert new disables above this line
+ kMaxDisableFlags,
+} DisableFlags;
- void SetAll(bool value) { std::fill(&command_buffer_state, &shader_validation + 1, value); }
-};
+typedef enum EnableFlags {
+ gpu_validation,
+ gpu_validation_reserve_binding_slot,
+ best_practices,
+ vendor_specific_arm,
+ debug_printf,
+ sync_validation,
+ // Insert new enables above this line
+ kMaxEnableFlags,
+} EnableFlags;
-struct CHECK_ENABLED {
- bool gpu_validation;
- bool gpu_validation_reserve_binding_slot;
- bool best_practices;
- bool vendor_specific_arm; // Vendor-specific validation for Arm platforms
- bool debug_printf;
-
- void SetAllVendorSpecific(bool value) { std::fill(&vendor_specific_arm, &vendor_specific_arm + 1, value); }
-};
+typedef std::array<bool, kMaxDisableFlags> CHECK_DISABLED;
+typedef std::array<bool, kMaxEnableFlags> CHECK_ENABLED;
// Layer chassis validation object base class definition
class ValidationObject {
@@ -2821,6 +2940,38 @@
return write_lock_guard_t(validation_object_mutex);
}
+ void RegisterValidationObject(bool vo_enabled, uint32_t instance_api_version,
+ debug_report_data* instance_report_data, std::vector<ValidationObject*> &dispatch_list) {
+ if (vo_enabled) {
+ api_version = instance_api_version;
+ report_data = instance_report_data;
+ dispatch_list.emplace_back(this);
+ }
+ }
+
+ void FinalizeInstanceValidationObject(ValidationObject *framework) {
+ instance_dispatch_table = framework->instance_dispatch_table;
+ enabled = framework->enabled;
+ disabled = framework->disabled;
+ }
+
+ virtual void InitDeviceValidationObject(bool add_obj, ValidationObject *inst_obj, ValidationObject *dev_obj) {
+ if (add_obj) {
+ dev_obj->object_dispatch.emplace_back(this);
+ device = dev_obj->device;
+ physical_device = dev_obj->physical_device;
+ instance = inst_obj->instance;
+ report_data = inst_obj->report_data;
+ device_dispatch_table = dev_obj->device_dispatch_table;
+ api_version = dev_obj->api_version;
+ disabled = inst_obj->disabled;
+ enabled = inst_obj->enabled;
+ instance_dispatch_table = inst_obj->instance_dispatch_table;
+ instance_extensions = inst_obj->instance_extensions;
+ device_extensions = dev_obj->device_extensions;
+ }
+ }
+
ValidationObject* GetValidationObject(std::vector<ValidationObject*>& object_dispatch, LayerObjectTypeId object_type) {
for (auto validation_object : object_dispatch) {
if (validation_object->container_type == object_type) {
@@ -3954,6 +4105,9 @@
virtual bool PreCallValidateGetImageViewHandleNVX(VkDevice device, const VkImageViewHandleInfoNVX* pInfo) const { return false; };
virtual void PreCallRecordGetImageViewHandleNVX(VkDevice device, const VkImageViewHandleInfoNVX* pInfo) {};
virtual void PostCallRecordGetImageViewHandleNVX(VkDevice device, const VkImageViewHandleInfoNVX* pInfo) {};
+ virtual bool PreCallValidateGetImageViewAddressNVX(VkDevice device, VkImageView imageView, VkImageViewAddressPropertiesNVX* pProperties) const { return false; };
+ virtual void PreCallRecordGetImageViewAddressNVX(VkDevice device, VkImageView imageView, VkImageViewAddressPropertiesNVX* pProperties) {};
+ virtual void PostCallRecordGetImageViewAddressNVX(VkDevice device, VkImageView imageView, VkImageViewAddressPropertiesNVX* pProperties, VkResult result) {};
virtual bool PreCallValidateCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride) const { return false; };
virtual void PreCallRecordCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride) {};
virtual void PostCallRecordCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride) {};
@@ -4260,6 +4414,42 @@
virtual bool PreCallValidateResetQueryPoolEXT(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) const { return false; };
virtual void PreCallRecordResetQueryPoolEXT(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) {};
virtual void PostCallRecordResetQueryPoolEXT(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) {};
+ virtual bool PreCallValidateCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) const { return false; };
+ virtual void PreCallRecordCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) {};
+ virtual void PostCallRecordCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) {};
+ virtual bool PreCallValidateCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace) const { return false; };
+ virtual void PreCallRecordCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace) {};
+ virtual void PostCallRecordCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace) {};
+ virtual bool PreCallValidateCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer, VkPrimitiveTopology primitiveTopology) const { return false; };
+ virtual void PreCallRecordCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer, VkPrimitiveTopology primitiveTopology) {};
+ virtual void PostCallRecordCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer, VkPrimitiveTopology primitiveTopology) {};
+ virtual bool PreCallValidateCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount, const VkViewport* pViewports) const { return false; };
+ virtual void PreCallRecordCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount, const VkViewport* pViewports) {};
+ virtual void PostCallRecordCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount, const VkViewport* pViewports) {};
+ virtual bool PreCallValidateCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount, const VkRect2D* pScissors) const { return false; };
+ virtual void PreCallRecordCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount, const VkRect2D* pScissors) {};
+ virtual void PostCallRecordCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount, const VkRect2D* pScissors) {};
+ virtual bool PreCallValidateCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets, const VkDeviceSize* pSizes, const VkDeviceSize* pStrides) const { return false; };
+ virtual void PreCallRecordCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets, const VkDeviceSize* pSizes, const VkDeviceSize* pStrides) {};
+ virtual void PostCallRecordCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets, const VkDeviceSize* pSizes, const VkDeviceSize* pStrides) {};
+ virtual bool PreCallValidateCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) const { return false; };
+ virtual void PreCallRecordCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) {};
+ virtual void PostCallRecordCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) {};
+ virtual bool PreCallValidateCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) const { return false; };
+ virtual void PreCallRecordCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) {};
+ virtual void PostCallRecordCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) {};
+ virtual bool PreCallValidateCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) const { return false; };
+ virtual void PreCallRecordCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) {};
+ virtual void PostCallRecordCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) {};
+ virtual bool PreCallValidateCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthBoundsTestEnable) const { return false; };
+ virtual void PreCallRecordCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthBoundsTestEnable) {};
+ virtual void PostCallRecordCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthBoundsTestEnable) {};
+ virtual bool PreCallValidateCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) const { return false; };
+ virtual void PreCallRecordCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) {};
+ virtual void PostCallRecordCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) {};
+ virtual bool PreCallValidateCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp, VkCompareOp compareOp) const { return false; };
+ virtual void PreCallRecordCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp, VkCompareOp compareOp) {};
+ virtual void PostCallRecordCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp, VkCompareOp compareOp) {};
virtual bool PreCallValidateGetGeneratedCommandsMemoryRequirementsNV(VkDevice device, const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo, VkMemoryRequirements2* pMemoryRequirements) const { return false; };
virtual void PreCallRecordGetGeneratedCommandsMemoryRequirementsNV(VkDevice device, const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo, VkMemoryRequirements2* pMemoryRequirements) {};
virtual void PostCallRecordGetGeneratedCommandsMemoryRequirementsNV(VkDevice device, const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo, VkMemoryRequirements2* pMemoryRequirements) {};
@@ -4278,6 +4468,28 @@
virtual bool PreCallValidateDestroyIndirectCommandsLayoutNV(VkDevice device, VkIndirectCommandsLayoutNV indirectCommandsLayout, const VkAllocationCallbacks* pAllocator) const { return false; };
virtual void PreCallRecordDestroyIndirectCommandsLayoutNV(VkDevice device, VkIndirectCommandsLayoutNV indirectCommandsLayout, const VkAllocationCallbacks* pAllocator) {};
virtual void PostCallRecordDestroyIndirectCommandsLayoutNV(VkDevice device, VkIndirectCommandsLayoutNV indirectCommandsLayout, const VkAllocationCallbacks* pAllocator) {};
+ virtual bool PreCallValidateCreatePrivateDataSlotEXT(VkDevice device, const VkPrivateDataSlotCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPrivateDataSlotEXT* pPrivateDataSlot) const { return false; };
+ virtual void PreCallRecordCreatePrivateDataSlotEXT(VkDevice device, const VkPrivateDataSlotCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPrivateDataSlotEXT* pPrivateDataSlot) {};
+ virtual void PostCallRecordCreatePrivateDataSlotEXT(VkDevice device, const VkPrivateDataSlotCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPrivateDataSlotEXT* pPrivateDataSlot, VkResult result) {};
+ virtual bool PreCallValidateDestroyPrivateDataSlotEXT(VkDevice device, VkPrivateDataSlotEXT privateDataSlot, const VkAllocationCallbacks* pAllocator) const { return false; };
+ virtual void PreCallRecordDestroyPrivateDataSlotEXT(VkDevice device, VkPrivateDataSlotEXT privateDataSlot, const VkAllocationCallbacks* pAllocator) {};
+ virtual void PostCallRecordDestroyPrivateDataSlotEXT(VkDevice device, VkPrivateDataSlotEXT privateDataSlot, const VkAllocationCallbacks* pAllocator) {};
+ virtual bool PreCallValidateSetPrivateDataEXT(VkDevice device, VkObjectType objectType, uint64_t objectHandle, VkPrivateDataSlotEXT privateDataSlot, uint64_t data) const { return false; };
+ virtual void PreCallRecordSetPrivateDataEXT(VkDevice device, VkObjectType objectType, uint64_t objectHandle, VkPrivateDataSlotEXT privateDataSlot, uint64_t data) {};
+ virtual void PostCallRecordSetPrivateDataEXT(VkDevice device, VkObjectType objectType, uint64_t objectHandle, VkPrivateDataSlotEXT privateDataSlot, uint64_t data, VkResult result) {};
+ virtual bool PreCallValidateGetPrivateDataEXT(VkDevice device, VkObjectType objectType, uint64_t objectHandle, VkPrivateDataSlotEXT privateDataSlot, uint64_t* pData) const { return false; };
+ virtual void PreCallRecordGetPrivateDataEXT(VkDevice device, VkObjectType objectType, uint64_t objectHandle, VkPrivateDataSlotEXT privateDataSlot, uint64_t* pData) {};
+ virtual void PostCallRecordGetPrivateDataEXT(VkDevice device, VkObjectType objectType, uint64_t objectHandle, VkPrivateDataSlotEXT privateDataSlot, uint64_t* pData) {};
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+ virtual bool PreCallValidateCreateDirectFBSurfaceEXT(VkInstance instance, const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) const { return false; };
+ virtual void PreCallRecordCreateDirectFBSurfaceEXT(VkInstance instance, const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) {};
+ virtual void PostCallRecordCreateDirectFBSurfaceEXT(VkInstance instance, const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface, VkResult result) {};
+#endif
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+ virtual bool PreCallValidateGetPhysicalDeviceDirectFBPresentationSupportEXT(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, IDirectFB* dfb) const { return false; };
+ virtual void PreCallRecordGetPhysicalDeviceDirectFBPresentationSupportEXT(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, IDirectFB* dfb) {};
+ virtual void PostCallRecordGetPhysicalDeviceDirectFBPresentationSupportEXT(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, IDirectFB* dfb) {};
+#endif
#ifdef VK_USE_PLATFORM_FUCHSIA
virtual bool PreCallValidateCreateBufferCollectionFUCHSIA(VkDevice device, const VkBufferCollectionCreateInfoFUCHSIA* pImportInfo, const VkAllocationCallbacks* pAllocator, VkBufferCollectionFUCHSIA* pCollection) const { return false; };
virtual void PreCallRecordCreateBufferCollectionFUCHSIA(VkDevice device, const VkBufferCollectionCreateInfoFUCHSIA* pImportInfo, const VkAllocationCallbacks* pAllocator, VkBufferCollectionFUCHSIA* pCollection) {};
@@ -4339,9 +4551,9 @@
virtual void PostCallRecordCmdBuildAccelerationStructureKHR(VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR* pInfos, const VkAccelerationStructureBuildOffsetInfoKHR* const* ppOffsetInfos) {};
#endif
#ifdef VK_ENABLE_BETA_EXTENSIONS
- virtual bool PreCallValidateCmdBuildAccelerationStructureIndirectKHR(VkCommandBuffer commandBuffer, const VkAccelerationStructureBuildGeometryInfoKHR* pInfo, VkBuffer indirectBuffer, VkDeviceSize indirectOffset, uint32_t indirectStride) const { return false; };
- virtual void PreCallRecordCmdBuildAccelerationStructureIndirectKHR(VkCommandBuffer commandBuffer, const VkAccelerationStructureBuildGeometryInfoKHR* pInfo, VkBuffer indirectBuffer, VkDeviceSize indirectOffset, uint32_t indirectStride) {};
- virtual void PostCallRecordCmdBuildAccelerationStructureIndirectKHR(VkCommandBuffer commandBuffer, const VkAccelerationStructureBuildGeometryInfoKHR* pInfo, VkBuffer indirectBuffer, VkDeviceSize indirectOffset, uint32_t indirectStride) {};
+ virtual bool PreCallValidateCmdBuildAccelerationStructureIndirectKHR(VkCommandBuffer commandBuffer, const VkAccelerationStructureBuildGeometryInfoKHR* pInfo, VkBuffer indirectBuffer, VkDeviceSize indirectOffset, uint32_t indirectStride) const { return false; };
+ virtual void PreCallRecordCmdBuildAccelerationStructureIndirectKHR(VkCommandBuffer commandBuffer, const VkAccelerationStructureBuildGeometryInfoKHR* pInfo, VkBuffer indirectBuffer, VkDeviceSize indirectOffset, uint32_t indirectStride) {};
+ virtual void PostCallRecordCmdBuildAccelerationStructureIndirectKHR(VkCommandBuffer commandBuffer, const VkAccelerationStructureBuildGeometryInfoKHR* pInfo, VkBuffer indirectBuffer, VkDeviceSize indirectOffset, uint32_t indirectStride) {};
#endif
#ifdef VK_ENABLE_BETA_EXTENSIONS
virtual bool PreCallValidateBuildAccelerationStructureKHR(VkDevice device, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR* pInfos, const VkAccelerationStructureBuildOffsetInfoKHR* const* ppOffsetInfos) const { return false; };
diff --git a/layers/generated/command_counter_helper.cpp b/layers/generated/command_counter_helper.cpp
index a309759..c0b3434 100644
--- a/layers/generated/command_counter_helper.cpp
+++ b/layers/generated/command_counter_helper.cpp
@@ -318,6 +318,42 @@
void CommandCounter::PreCallRecordCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, uint16_t lineStipplePattern) {
coreChecks->IncrementCommandCount(commandBuffer);
}
+void CommandCounter::PreCallRecordCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) {
+ coreChecks->IncrementCommandCount(commandBuffer);
+}
+void CommandCounter::PreCallRecordCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace) {
+ coreChecks->IncrementCommandCount(commandBuffer);
+}
+void CommandCounter::PreCallRecordCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer, VkPrimitiveTopology primitiveTopology) {
+ coreChecks->IncrementCommandCount(commandBuffer);
+}
+void CommandCounter::PreCallRecordCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount, const VkViewport* pViewports) {
+ coreChecks->IncrementCommandCount(commandBuffer);
+}
+void CommandCounter::PreCallRecordCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount, const VkRect2D* pScissors) {
+ coreChecks->IncrementCommandCount(commandBuffer);
+}
+void CommandCounter::PreCallRecordCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets, const VkDeviceSize* pSizes, const VkDeviceSize* pStrides) {
+ coreChecks->IncrementCommandCount(commandBuffer);
+}
+void CommandCounter::PreCallRecordCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) {
+ coreChecks->IncrementCommandCount(commandBuffer);
+}
+void CommandCounter::PreCallRecordCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) {
+ coreChecks->IncrementCommandCount(commandBuffer);
+}
+void CommandCounter::PreCallRecordCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) {
+ coreChecks->IncrementCommandCount(commandBuffer);
+}
+void CommandCounter::PreCallRecordCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthBoundsTestEnable) {
+ coreChecks->IncrementCommandCount(commandBuffer);
+}
+void CommandCounter::PreCallRecordCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) {
+ coreChecks->IncrementCommandCount(commandBuffer);
+}
+void CommandCounter::PreCallRecordCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp, VkCompareOp compareOp) {
+ coreChecks->IncrementCommandCount(commandBuffer);
+}
void CommandCounter::PreCallRecordCmdPreprocessGeneratedCommandsNV(VkCommandBuffer commandBuffer, const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo) {
coreChecks->IncrementCommandCount(commandBuffer);
}
@@ -333,7 +369,7 @@
}
#endif // VK_ENABLE_BETA_EXTENSIONS
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void CommandCounter::PreCallRecordCmdBuildAccelerationStructureIndirectKHR(VkCommandBuffer commandBuffer, const VkAccelerationStructureBuildGeometryInfoKHR* pInfo, VkBuffer indirectBuffer, VkDeviceSize indirectOffset, uint32_t indirectStride) {
+void CommandCounter::PreCallRecordCmdBuildAccelerationStructureIndirectKHR(VkCommandBuffer commandBuffer, const VkAccelerationStructureBuildGeometryInfoKHR* pInfo, VkBuffer indirectBuffer, VkDeviceSize indirectOffset, uint32_t indirectStride) {
coreChecks->IncrementCommandCount(commandBuffer);
}
#endif // VK_ENABLE_BETA_EXTENSIONS
diff --git a/layers/generated/command_counter_helper.h b/layers/generated/command_counter_helper.h
index e5e8e8d..6b04610 100644
--- a/layers/generated/command_counter_helper.h
+++ b/layers/generated/command_counter_helper.h
@@ -121,6 +121,18 @@
void PreCallRecordCmdSetPerformanceStreamMarkerINTEL(VkCommandBuffer commandBuffer, const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo);
void PreCallRecordCmdSetPerformanceOverrideINTEL(VkCommandBuffer commandBuffer, const VkPerformanceOverrideInfoINTEL* pOverrideInfo);
void PreCallRecordCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, uint16_t lineStipplePattern);
+void PreCallRecordCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode);
+void PreCallRecordCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace);
+void PreCallRecordCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer, VkPrimitiveTopology primitiveTopology);
+void PreCallRecordCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount, const VkViewport* pViewports);
+void PreCallRecordCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount, const VkRect2D* pScissors);
+void PreCallRecordCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets, const VkDeviceSize* pSizes, const VkDeviceSize* pStrides);
+void PreCallRecordCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable);
+void PreCallRecordCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable);
+void PreCallRecordCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp);
+void PreCallRecordCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthBoundsTestEnable);
+void PreCallRecordCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable);
+void PreCallRecordCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp, VkCompareOp compareOp);
void PreCallRecordCmdPreprocessGeneratedCommandsNV(VkCommandBuffer commandBuffer, const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo);
void PreCallRecordCmdExecuteGeneratedCommandsNV(VkCommandBuffer commandBuffer, VkBool32 isPreprocessed, const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo);
void PreCallRecordCmdBindPipelineShaderGroupNV(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline, uint32_t groupIndex);
@@ -128,7 +140,7 @@
void PreCallRecordCmdBuildAccelerationStructureKHR(VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR* pInfos, const VkAccelerationStructureBuildOffsetInfoKHR* const* ppOffsetInfos);
#endif // VK_ENABLE_BETA_EXTENSIONS
#ifdef VK_ENABLE_BETA_EXTENSIONS
-void PreCallRecordCmdBuildAccelerationStructureIndirectKHR(VkCommandBuffer commandBuffer, const VkAccelerationStructureBuildGeometryInfoKHR* pInfo, VkBuffer indirectBuffer, VkDeviceSize indirectOffset, uint32_t indirectStride);
+void PreCallRecordCmdBuildAccelerationStructureIndirectKHR(VkCommandBuffer commandBuffer, const VkAccelerationStructureBuildGeometryInfoKHR* pInfo, VkBuffer indirectBuffer, VkDeviceSize indirectOffset, uint32_t indirectStride);
#endif // VK_ENABLE_BETA_EXTENSIONS
#ifdef VK_ENABLE_BETA_EXTENSIONS
void PreCallRecordCmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer, const VkCopyAccelerationStructureInfoKHR* pInfo);
diff --git a/layers/generated/layer_chassis_dispatch.cpp b/layers/generated/layer_chassis_dispatch.cpp
index 1569db3..8a366b1 100644
--- a/layers/generated/layer_chassis_dispatch.cpp
+++ b/layers/generated/layer_chassis_dispatch.cpp
@@ -26,9 +26,7 @@
#include "chassis.h"
#include "layer_chassis_dispatch.h"
#include "vk_layer_utils.h"
-
-// This intentionally includes a cpp file
-#include "vk_safe_struct.cpp"
+#include "vk_safe_struct.h"
ReadWriteLock dispatch_lock;
@@ -5759,6 +5757,21 @@
return result;
}
+VkResult DispatchGetImageViewAddressNVX(
+ VkDevice device,
+ VkImageView imageView,
+ VkImageViewAddressPropertiesNVX* pProperties)
+{
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
+ if (!wrap_handles) return layer_data->device_dispatch_table.GetImageViewAddressNVX(device, imageView, pProperties);
+ {
+ imageView = layer_data->Unwrap(imageView);
+ }
+ VkResult result = layer_data->device_dispatch_table.GetImageViewAddressNVX(device, imageView, pProperties);
+
+ return result;
+}
+
void DispatchCmdDrawIndirectCountAMD(
VkCommandBuffer commandBuffer,
VkBuffer buffer,
@@ -7311,6 +7324,137 @@
}
+void DispatchCmdSetCullModeEXT(
+ VkCommandBuffer commandBuffer,
+ VkCullModeFlags cullMode)
+{
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ layer_data->device_dispatch_table.CmdSetCullModeEXT(commandBuffer, cullMode);
+
+}
+
+void DispatchCmdSetFrontFaceEXT(
+ VkCommandBuffer commandBuffer,
+ VkFrontFace frontFace)
+{
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ layer_data->device_dispatch_table.CmdSetFrontFaceEXT(commandBuffer, frontFace);
+
+}
+
+void DispatchCmdSetPrimitiveTopologyEXT(
+ VkCommandBuffer commandBuffer,
+ VkPrimitiveTopology primitiveTopology)
+{
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ layer_data->device_dispatch_table.CmdSetPrimitiveTopologyEXT(commandBuffer, primitiveTopology);
+
+}
+
+void DispatchCmdSetViewportWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t viewportCount,
+ const VkViewport* pViewports)
+{
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ layer_data->device_dispatch_table.CmdSetViewportWithCountEXT(commandBuffer, viewportCount, pViewports);
+
+}
+
+void DispatchCmdSetScissorWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t scissorCount,
+ const VkRect2D* pScissors)
+{
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ layer_data->device_dispatch_table.CmdSetScissorWithCountEXT(commandBuffer, scissorCount, pScissors);
+
+}
+
+void DispatchCmdBindVertexBuffers2EXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t firstBinding,
+ uint32_t bindingCount,
+ const VkBuffer* pBuffers,
+ const VkDeviceSize* pOffsets,
+ const VkDeviceSize* pSizes,
+ const VkDeviceSize* pStrides)
+{
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ if (!wrap_handles) return layer_data->device_dispatch_table.CmdBindVertexBuffers2EXT(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, pStrides);
+ VkBuffer var_local_pBuffers[DISPATCH_MAX_STACK_ALLOCATIONS];
+ VkBuffer *local_pBuffers = NULL;
+ {
+ if (pBuffers) {
+ local_pBuffers = bindingCount > DISPATCH_MAX_STACK_ALLOCATIONS ? new VkBuffer[bindingCount] : var_local_pBuffers;
+ for (uint32_t index0 = 0; index0 < bindingCount; ++index0) {
+ local_pBuffers[index0] = layer_data->Unwrap(pBuffers[index0]);
+ }
+ }
+ }
+ layer_data->device_dispatch_table.CmdBindVertexBuffers2EXT(commandBuffer, firstBinding, bindingCount, (const VkBuffer*)local_pBuffers, pOffsets, pSizes, pStrides);
+ if (local_pBuffers != var_local_pBuffers)
+ delete[] local_pBuffers;
+}
+
+void DispatchCmdSetDepthTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthTestEnable)
+{
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ layer_data->device_dispatch_table.CmdSetDepthTestEnableEXT(commandBuffer, depthTestEnable);
+
+}
+
+void DispatchCmdSetDepthWriteEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthWriteEnable)
+{
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ layer_data->device_dispatch_table.CmdSetDepthWriteEnableEXT(commandBuffer, depthWriteEnable);
+
+}
+
+void DispatchCmdSetDepthCompareOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkCompareOp depthCompareOp)
+{
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ layer_data->device_dispatch_table.CmdSetDepthCompareOpEXT(commandBuffer, depthCompareOp);
+
+}
+
+void DispatchCmdSetDepthBoundsTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthBoundsTestEnable)
+{
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ layer_data->device_dispatch_table.CmdSetDepthBoundsTestEnableEXT(commandBuffer, depthBoundsTestEnable);
+
+}
+
+void DispatchCmdSetStencilTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 stencilTestEnable)
+{
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ layer_data->device_dispatch_table.CmdSetStencilTestEnableEXT(commandBuffer, stencilTestEnable);
+
+}
+
+void DispatchCmdSetStencilOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkStencilFaceFlags faceMask,
+ VkStencilOp failOp,
+ VkStencilOp passOp,
+ VkStencilOp depthFailOp,
+ VkCompareOp compareOp)
+{
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(commandBuffer), layer_data_map);
+ layer_data->device_dispatch_table.CmdSetStencilOpEXT(commandBuffer, faceMask, failOp, passOp, depthFailOp, compareOp);
+
+}
+
void DispatchGetGeneratedCommandsMemoryRequirementsNV(
VkDevice device,
const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo,
@@ -7480,6 +7624,104 @@
}
+VkResult DispatchCreatePrivateDataSlotEXT(
+ VkDevice device,
+ const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkPrivateDataSlotEXT* pPrivateDataSlot)
+{
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
+ if (!wrap_handles) return layer_data->device_dispatch_table.CreatePrivateDataSlotEXT(device, pCreateInfo, pAllocator, pPrivateDataSlot);
+ VkResult result = layer_data->device_dispatch_table.CreatePrivateDataSlotEXT(device, pCreateInfo, pAllocator, pPrivateDataSlot);
+ if (VK_SUCCESS == result) {
+ *pPrivateDataSlot = layer_data->WrapNew(*pPrivateDataSlot);
+ }
+ return result;
+}
+
+void DispatchDestroyPrivateDataSlotEXT(
+ VkDevice device,
+ VkPrivateDataSlotEXT privateDataSlot,
+ const VkAllocationCallbacks* pAllocator)
+{
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
+ if (!wrap_handles) return layer_data->device_dispatch_table.DestroyPrivateDataSlotEXT(device, privateDataSlot, pAllocator);
+ uint64_t privateDataSlot_id = reinterpret_cast<uint64_t &>(privateDataSlot);
+ auto iter = unique_id_mapping.pop(privateDataSlot_id);
+ if (iter != unique_id_mapping.end()) {
+ privateDataSlot = (VkPrivateDataSlotEXT)iter->second;
+ } else {
+ privateDataSlot = (VkPrivateDataSlotEXT)0;
+ }
+ layer_data->device_dispatch_table.DestroyPrivateDataSlotEXT(device, privateDataSlot, pAllocator);
+
+}
+
+VkResult DispatchSetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t data)
+{
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
+ if (!wrap_handles) return layer_data->device_dispatch_table.SetPrivateDataEXT(device, objectType, objectHandle, privateDataSlot, data);
+ {
+ privateDataSlot = layer_data->Unwrap(privateDataSlot);
+ }
+ VkResult result = layer_data->device_dispatch_table.SetPrivateDataEXT(device, objectType, objectHandle, privateDataSlot, data);
+
+ return result;
+}
+
+void DispatchGetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t* pData)
+{
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
+ if (!wrap_handles) return layer_data->device_dispatch_table.GetPrivateDataEXT(device, objectType, objectHandle, privateDataSlot, pData);
+ {
+ privateDataSlot = layer_data->Unwrap(privateDataSlot);
+ }
+ layer_data->device_dispatch_table.GetPrivateDataEXT(device, objectType, objectHandle, privateDataSlot, pData);
+
+}
+
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+
+VkResult DispatchCreateDirectFBSurfaceEXT(
+ VkInstance instance,
+ const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkSurfaceKHR* pSurface)
+{
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(instance), layer_data_map);
+ if (!wrap_handles) return layer_data->instance_dispatch_table.CreateDirectFBSurfaceEXT(instance, pCreateInfo, pAllocator, pSurface);
+ VkResult result = layer_data->instance_dispatch_table.CreateDirectFBSurfaceEXT(instance, pCreateInfo, pAllocator, pSurface);
+ if (VK_SUCCESS == result) {
+ *pSurface = layer_data->WrapNew(*pSurface);
+ }
+ return result;
+}
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
+
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+
+VkBool32 DispatchGetPhysicalDeviceDirectFBPresentationSupportEXT(
+ VkPhysicalDevice physicalDevice,
+ uint32_t queueFamilyIndex,
+ IDirectFB* dfb)
+{
+ auto layer_data = GetLayerDataPtr(get_dispatch_key(physicalDevice), layer_data_map);
+ VkBool32 result = layer_data->instance_dispatch_table.GetPhysicalDeviceDirectFBPresentationSupportEXT(physicalDevice, queueFamilyIndex, dfb);
+
+ return result;
+}
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
+
#ifdef VK_USE_PLATFORM_FUCHSIA
VkResult DispatchCreateBufferCollectionFUCHSIA(
diff --git a/layers/generated/layer_chassis_dispatch.h b/layers/generated/layer_chassis_dispatch.h
index 1f32cc9..ab9c056 100644
--- a/layers/generated/layer_chassis_dispatch.h
+++ b/layers/generated/layer_chassis_dispatch.h
@@ -1419,6 +1419,10 @@
uint32_t DispatchGetImageViewHandleNVX(
VkDevice device,
const VkImageViewHandleInfoNVX* pInfo);
+VkResult DispatchGetImageViewAddressNVX(
+ VkDevice device,
+ VkImageView imageView,
+ VkImageViewAddressPropertiesNVX* pProperties);
void DispatchCmdDrawIndirectCountAMD(
VkCommandBuffer commandBuffer,
VkBuffer buffer,
@@ -1896,6 +1900,53 @@
VkQueryPool queryPool,
uint32_t firstQuery,
uint32_t queryCount);
+void DispatchCmdSetCullModeEXT(
+ VkCommandBuffer commandBuffer,
+ VkCullModeFlags cullMode);
+void DispatchCmdSetFrontFaceEXT(
+ VkCommandBuffer commandBuffer,
+ VkFrontFace frontFace);
+void DispatchCmdSetPrimitiveTopologyEXT(
+ VkCommandBuffer commandBuffer,
+ VkPrimitiveTopology primitiveTopology);
+void DispatchCmdSetViewportWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t viewportCount,
+ const VkViewport* pViewports);
+void DispatchCmdSetScissorWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t scissorCount,
+ const VkRect2D* pScissors);
+void DispatchCmdBindVertexBuffers2EXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t firstBinding,
+ uint32_t bindingCount,
+ const VkBuffer* pBuffers,
+ const VkDeviceSize* pOffsets,
+ const VkDeviceSize* pSizes,
+ const VkDeviceSize* pStrides);
+void DispatchCmdSetDepthTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthTestEnable);
+void DispatchCmdSetDepthWriteEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthWriteEnable);
+void DispatchCmdSetDepthCompareOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkCompareOp depthCompareOp);
+void DispatchCmdSetDepthBoundsTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthBoundsTestEnable);
+void DispatchCmdSetStencilTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 stencilTestEnable);
+void DispatchCmdSetStencilOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkStencilFaceFlags faceMask,
+ VkStencilOp failOp,
+ VkStencilOp passOp,
+ VkStencilOp depthFailOp,
+ VkCompareOp compareOp);
void DispatchGetGeneratedCommandsMemoryRequirementsNV(
VkDevice device,
const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo,
@@ -1921,6 +1972,40 @@
VkDevice device,
VkIndirectCommandsLayoutNV indirectCommandsLayout,
const VkAllocationCallbacks* pAllocator);
+VkResult DispatchCreatePrivateDataSlotEXT(
+ VkDevice device,
+ const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkPrivateDataSlotEXT* pPrivateDataSlot);
+void DispatchDestroyPrivateDataSlotEXT(
+ VkDevice device,
+ VkPrivateDataSlotEXT privateDataSlot,
+ const VkAllocationCallbacks* pAllocator);
+VkResult DispatchSetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t data);
+void DispatchGetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t* pData);
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+VkResult DispatchCreateDirectFBSurfaceEXT(
+ VkInstance instance,
+ const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkSurfaceKHR* pSurface);
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+VkBool32 DispatchGetPhysicalDeviceDirectFBPresentationSupportEXT(
+ VkPhysicalDevice physicalDevice,
+ uint32_t queueFamilyIndex,
+ IDirectFB* dfb);
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
#ifdef VK_USE_PLATFORM_FUCHSIA
VkResult DispatchCreateBufferCollectionFUCHSIA(
VkDevice device,
diff --git a/layers/generated/object_tracker.cpp b/layers/generated/object_tracker.cpp
index 2175179..25e9059 100644
--- a/layers/generated/object_tracker.cpp
+++ b/layers/generated/object_tracker.cpp
@@ -37,8 +37,8 @@
bool skip = false;
skip |= ReportLeakedInstanceObjects(instance, kVulkanObjectTypeSurfaceKHR, error_code);
skip |= ReportLeakedInstanceObjects(instance, kVulkanObjectTypeSwapchainKHR, error_code);
- skip |= ReportLeakedInstanceObjects(instance, kVulkanObjectTypeDisplayKHR, error_code);
- skip |= ReportLeakedInstanceObjects(instance, kVulkanObjectTypeDisplayModeKHR, error_code);
+ // No destroy API -- do not report: skip |= ReportLeakedInstanceObjects(instance, kVulkanObjectTypeDisplayKHR, error_code);
+ // No destroy API -- do not report: skip |= ReportLeakedInstanceObjects(instance, kVulkanObjectTypeDisplayModeKHR, error_code);
skip |= ReportLeakedInstanceObjects(instance, kVulkanObjectTypeDebugReportCallbackEXT, error_code);
skip |= ReportLeakedInstanceObjects(instance, kVulkanObjectTypeDebugUtilsMessengerEXT, error_code);
return skip;
@@ -46,11 +46,11 @@
bool ObjectLifetimes::ReportUndestroyedDeviceObjects(VkDevice device, const std::string& error_code) const {
bool skip = false;
skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeCommandBuffer, error_code);
+ skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeBuffer, error_code);
+ skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeImage, error_code);
skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeSemaphore, error_code);
skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeFence, error_code);
skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeDeviceMemory, error_code);
- skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeBuffer, error_code);
- skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeImage, error_code);
skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeEvent, error_code);
skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeQueryPool, error_code);
skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeBufferView, error_code);
@@ -58,12 +58,12 @@
skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeShaderModule, error_code);
skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypePipelineCache, error_code);
skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypePipelineLayout, error_code);
- skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeRenderPass, error_code);
skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypePipeline, error_code);
+ skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeRenderPass, error_code);
skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeDescriptorSetLayout, error_code);
skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeSampler, error_code);
- skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeDescriptorPool, error_code);
skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeDescriptorSet, error_code);
+ skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeDescriptorPool, error_code);
skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeFramebuffer, error_code);
skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeCommandPool, error_code);
skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeSamplerYcbcrConversion, error_code);
@@ -73,6 +73,7 @@
skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeAccelerationStructureKHR, error_code);
skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypePerformanceConfigurationINTEL, error_code);
skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeIndirectCommandsLayoutNV, error_code);
+ skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypePrivateDataSlotEXT, error_code);
skip |= ReportLeakedDeviceObjects(device, kVulkanObjectTypeBufferCollectionFUCHSIA, error_code);
return skip;
}
@@ -87,11 +88,11 @@
}
void ObjectLifetimes::DestroyLeakedDeviceObjects() {
DestroyUndestroyedObjects(kVulkanObjectTypeCommandBuffer);
+ DestroyUndestroyedObjects(kVulkanObjectTypeBuffer);
+ DestroyUndestroyedObjects(kVulkanObjectTypeImage);
DestroyUndestroyedObjects(kVulkanObjectTypeSemaphore);
DestroyUndestroyedObjects(kVulkanObjectTypeFence);
DestroyUndestroyedObjects(kVulkanObjectTypeDeviceMemory);
- DestroyUndestroyedObjects(kVulkanObjectTypeBuffer);
- DestroyUndestroyedObjects(kVulkanObjectTypeImage);
DestroyUndestroyedObjects(kVulkanObjectTypeEvent);
DestroyUndestroyedObjects(kVulkanObjectTypeQueryPool);
DestroyUndestroyedObjects(kVulkanObjectTypeBufferView);
@@ -99,12 +100,12 @@
DestroyUndestroyedObjects(kVulkanObjectTypeShaderModule);
DestroyUndestroyedObjects(kVulkanObjectTypePipelineCache);
DestroyUndestroyedObjects(kVulkanObjectTypePipelineLayout);
- DestroyUndestroyedObjects(kVulkanObjectTypeRenderPass);
DestroyUndestroyedObjects(kVulkanObjectTypePipeline);
+ DestroyUndestroyedObjects(kVulkanObjectTypeRenderPass);
DestroyUndestroyedObjects(kVulkanObjectTypeDescriptorSetLayout);
DestroyUndestroyedObjects(kVulkanObjectTypeSampler);
- DestroyUndestroyedObjects(kVulkanObjectTypeDescriptorPool);
DestroyUndestroyedObjects(kVulkanObjectTypeDescriptorSet);
+ DestroyUndestroyedObjects(kVulkanObjectTypeDescriptorPool);
DestroyUndestroyedObjects(kVulkanObjectTypeFramebuffer);
DestroyUndestroyedObjects(kVulkanObjectTypeCommandPool);
DestroyUndestroyedObjects(kVulkanObjectTypeSamplerYcbcrConversion);
@@ -114,6 +115,7 @@
DestroyUndestroyedObjects(kVulkanObjectTypeAccelerationStructureKHR);
DestroyUndestroyedObjects(kVulkanObjectTypePerformanceConfigurationINTEL);
DestroyUndestroyedObjects(kVulkanObjectTypeIndirectCommandsLayoutNV);
+ DestroyUndestroyedObjects(kVulkanObjectTypePrivateDataSlotEXT);
DestroyUndestroyedObjects(kVulkanObjectTypeBufferCollectionFUCHSIA);
}
@@ -188,28 +190,6 @@
return skip;
}
-bool ObjectLifetimes::PreCallValidateCreateDevice(
- VkPhysicalDevice physicalDevice,
- const VkDeviceCreateInfo* pCreateInfo,
- const VkAllocationCallbacks* pAllocator,
- VkDevice* pDevice) const {
- bool skip = false;
- skip |= ValidateObject(physicalDevice, kVulkanObjectTypePhysicalDevice, false, "VUID-vkCreateDevice-physicalDevice-parameter", kVUIDUndefined);
-
- return skip;
-}
-
-void ObjectLifetimes::PostCallRecordCreateDevice(
- VkPhysicalDevice physicalDevice,
- const VkDeviceCreateInfo* pCreateInfo,
- const VkAllocationCallbacks* pAllocator,
- VkDevice* pDevice,
- VkResult result) {
- if (result != VK_SUCCESS) return;
- CreateObject(*pDevice, kVulkanObjectTypeDevice, pAllocator);
-
-}
-
bool ObjectLifetimes::PreCallValidateEnumerateDeviceExtensionProperties(
VkPhysicalDevice physicalDevice,
const char* pLayerName,
@@ -1577,7 +1557,7 @@
skip |= ValidateObject(commandBuffer, kVulkanObjectTypeCommandBuffer, false, "VUID-vkCmdBindVertexBuffers-commandBuffer-parameter", "VUID-vkCmdBindVertexBuffers-commonparent");
if (pBuffers) {
for (uint32_t index0 = 0; index0 < bindingCount; ++index0) {
- skip |= ValidateObject(pBuffers[index0], kVulkanObjectTypeBuffer, false, "VUID-vkCmdBindVertexBuffers-pBuffers-parameter", "VUID-vkCmdBindVertexBuffers-commonparent");
+ skip |= ValidateObject(pBuffers[index0], kVulkanObjectTypeBuffer, true, "VUID-vkCmdBindVertexBuffers-pBuffers-parameter", "VUID-vkCmdBindVertexBuffers-commonparent");
}
}
@@ -3721,7 +3701,7 @@
const VkAllocationCallbacks* pAllocator) const {
bool skip = false;
skip |= ValidateObject(device, kVulkanObjectTypeDevice, false, "VUID-vkDestroyDeferredOperationKHR-device-parameter", kVUIDUndefined);
- skip |= ValidateObject(operation, kVulkanObjectTypeDeferredOperationKHR, false, "VUID-vkDestroyDeferredOperationKHR-operation-parameter", "VUID-vkDestroyDeferredOperationKHR-operation-parent");
+ skip |= ValidateObject(operation, kVulkanObjectTypeDeferredOperationKHR, true, "VUID-vkDestroyDeferredOperationKHR-operation-parameter", "VUID-vkDestroyDeferredOperationKHR-operation-parent");
skip |= ValidateDestroyObject(operation, kVulkanObjectTypeDeferredOperationKHR, pAllocator, kVUIDUndefined, kVUIDUndefined);
return skip;
@@ -3845,7 +3825,7 @@
const VkAllocationCallbacks* pAllocator) const {
bool skip = false;
skip |= ValidateObject(instance, kVulkanObjectTypeInstance, false, "VUID-vkDestroyDebugReportCallbackEXT-instance-parameter", kVUIDUndefined);
- skip |= ValidateObject(callback, kVulkanObjectTypeDebugReportCallbackEXT, false, "VUID-vkDestroyDebugReportCallbackEXT-callback-parameter", "VUID-vkDestroyDebugReportCallbackEXT-callback-parent");
+ skip |= ValidateObject(callback, kVulkanObjectTypeDebugReportCallbackEXT, true, "VUID-vkDestroyDebugReportCallbackEXT-callback-parameter", "VUID-vkDestroyDebugReportCallbackEXT-callback-parent");
skip |= ValidateDestroyObject(callback, kVulkanObjectTypeDebugReportCallbackEXT, pAllocator, kVUIDUndefined, kVUIDUndefined);
return skip;
@@ -4019,6 +3999,17 @@
return skip;
}
+bool ObjectLifetimes::PreCallValidateGetImageViewAddressNVX(
+ VkDevice device,
+ VkImageView imageView,
+ VkImageViewAddressPropertiesNVX* pProperties) const {
+ bool skip = false;
+ skip |= ValidateObject(device, kVulkanObjectTypeDevice, false, "VUID-vkGetImageViewAddressNVX-device-parameter", kVUIDUndefined);
+ skip |= ValidateObject(imageView, kVulkanObjectTypeImageView, false, "VUID-vkGetImageViewAddressNVX-imageView-parameter", "VUID-vkGetImageViewAddressNVX-imageView-parent");
+
+ return skip;
+}
+
bool ObjectLifetimes::PreCallValidateCmdDrawIndirectCountAMD(
VkCommandBuffer commandBuffer,
VkBuffer buffer,
@@ -4486,7 +4477,7 @@
const VkAllocationCallbacks* pAllocator) const {
bool skip = false;
skip |= ValidateObject(instance, kVulkanObjectTypeInstance, false, "VUID-vkDestroyDebugUtilsMessengerEXT-instance-parameter", kVUIDUndefined);
- skip |= ValidateObject(messenger, kVulkanObjectTypeDebugUtilsMessengerEXT, false, "VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parameter", "VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parent");
+ skip |= ValidateObject(messenger, kVulkanObjectTypeDebugUtilsMessengerEXT, true, "VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parameter", "VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parent");
skip |= ValidateDestroyObject(messenger, kVulkanObjectTypeDebugUtilsMessengerEXT, pAllocator, kVUIDUndefined, kVUIDUndefined);
return skip;
@@ -4712,7 +4703,7 @@
const VkAllocationCallbacks* pAllocator) const {
bool skip = false;
skip |= ValidateObject(device, kVulkanObjectTypeDevice, false, "VUID-vkDestroyAccelerationStructureKHR-device-parameter", kVUIDUndefined);
- skip |= ValidateObject(accelerationStructure, kVulkanObjectTypeAccelerationStructureKHR, false, "VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-parameter", "VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-parent");
+ skip |= ValidateObject(accelerationStructure, kVulkanObjectTypeAccelerationStructureKHR, true, "VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-parameter", "VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-parent");
skip |= ValidateDestroyObject(accelerationStructure, kVulkanObjectTypeAccelerationStructureKHR, pAllocator, kVUIDUndefined, kVUIDUndefined);
return skip;
@@ -4732,7 +4723,7 @@
const VkAllocationCallbacks* pAllocator) const {
bool skip = false;
skip |= ValidateObject(device, kVulkanObjectTypeDevice, false, "VUID-vkDestroyAccelerationStructureKHR-device-parameter", kVUIDUndefined);
- skip |= ValidateObject(accelerationStructure, kVulkanObjectTypeAccelerationStructureKHR, false, "VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-parameter", "VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-parent");
+ skip |= ValidateObject(accelerationStructure, kVulkanObjectTypeAccelerationStructureKHR, true, "VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-parameter", "VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-parent");
skip |= ValidateDestroyObject(accelerationStructure, kVulkanObjectTypeAccelerationStructureKHR, pAllocator, kVUIDUndefined, kVUIDUndefined);
return skip;
@@ -5365,6 +5356,130 @@
return skip;
}
+bool ObjectLifetimes::PreCallValidateCmdSetCullModeEXT(
+ VkCommandBuffer commandBuffer,
+ VkCullModeFlags cullMode) const {
+ bool skip = false;
+ skip |= ValidateObject(commandBuffer, kVulkanObjectTypeCommandBuffer, false, "VUID-vkCmdSetCullModeEXT-commandBuffer-parameter", kVUIDUndefined);
+
+ return skip;
+}
+
+bool ObjectLifetimes::PreCallValidateCmdSetFrontFaceEXT(
+ VkCommandBuffer commandBuffer,
+ VkFrontFace frontFace) const {
+ bool skip = false;
+ skip |= ValidateObject(commandBuffer, kVulkanObjectTypeCommandBuffer, false, "VUID-vkCmdSetFrontFaceEXT-commandBuffer-parameter", kVUIDUndefined);
+
+ return skip;
+}
+
+bool ObjectLifetimes::PreCallValidateCmdSetPrimitiveTopologyEXT(
+ VkCommandBuffer commandBuffer,
+ VkPrimitiveTopology primitiveTopology) const {
+ bool skip = false;
+ skip |= ValidateObject(commandBuffer, kVulkanObjectTypeCommandBuffer, false, "VUID-vkCmdSetPrimitiveTopologyEXT-commandBuffer-parameter", kVUIDUndefined);
+
+ return skip;
+}
+
+bool ObjectLifetimes::PreCallValidateCmdSetViewportWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t viewportCount,
+ const VkViewport* pViewports) const {
+ bool skip = false;
+ skip |= ValidateObject(commandBuffer, kVulkanObjectTypeCommandBuffer, false, "VUID-vkCmdSetViewportWithCountEXT-commandBuffer-parameter", kVUIDUndefined);
+
+ return skip;
+}
+
+bool ObjectLifetimes::PreCallValidateCmdSetScissorWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t scissorCount,
+ const VkRect2D* pScissors) const {
+ bool skip = false;
+ skip |= ValidateObject(commandBuffer, kVulkanObjectTypeCommandBuffer, false, "VUID-vkCmdSetScissorWithCountEXT-commandBuffer-parameter", kVUIDUndefined);
+
+ return skip;
+}
+
+bool ObjectLifetimes::PreCallValidateCmdBindVertexBuffers2EXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t firstBinding,
+ uint32_t bindingCount,
+ const VkBuffer* pBuffers,
+ const VkDeviceSize* pOffsets,
+ const VkDeviceSize* pSizes,
+ const VkDeviceSize* pStrides) const {
+ bool skip = false;
+ skip |= ValidateObject(commandBuffer, kVulkanObjectTypeCommandBuffer, false, "VUID-vkCmdBindVertexBuffers2EXT-commandBuffer-parameter", "VUID-vkCmdBindVertexBuffers2EXT-commonparent");
+ if (pBuffers) {
+ for (uint32_t index0 = 0; index0 < bindingCount; ++index0) {
+ skip |= ValidateObject(pBuffers[index0], kVulkanObjectTypeBuffer, false, "VUID-vkCmdBindVertexBuffers2EXT-pBuffers-parameter", "VUID-vkCmdBindVertexBuffers2EXT-commonparent");
+ }
+ }
+
+ return skip;
+}
+
+bool ObjectLifetimes::PreCallValidateCmdSetDepthTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthTestEnable) const {
+ bool skip = false;
+ skip |= ValidateObject(commandBuffer, kVulkanObjectTypeCommandBuffer, false, "VUID-vkCmdSetDepthTestEnableEXT-commandBuffer-parameter", kVUIDUndefined);
+
+ return skip;
+}
+
+bool ObjectLifetimes::PreCallValidateCmdSetDepthWriteEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthWriteEnable) const {
+ bool skip = false;
+ skip |= ValidateObject(commandBuffer, kVulkanObjectTypeCommandBuffer, false, "VUID-vkCmdSetDepthWriteEnableEXT-commandBuffer-parameter", kVUIDUndefined);
+
+ return skip;
+}
+
+bool ObjectLifetimes::PreCallValidateCmdSetDepthCompareOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkCompareOp depthCompareOp) const {
+ bool skip = false;
+ skip |= ValidateObject(commandBuffer, kVulkanObjectTypeCommandBuffer, false, "VUID-vkCmdSetDepthCompareOpEXT-commandBuffer-parameter", kVUIDUndefined);
+
+ return skip;
+}
+
+bool ObjectLifetimes::PreCallValidateCmdSetDepthBoundsTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthBoundsTestEnable) const {
+ bool skip = false;
+ skip |= ValidateObject(commandBuffer, kVulkanObjectTypeCommandBuffer, false, "VUID-vkCmdSetDepthBoundsTestEnableEXT-commandBuffer-parameter", kVUIDUndefined);
+
+ return skip;
+}
+
+bool ObjectLifetimes::PreCallValidateCmdSetStencilTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 stencilTestEnable) const {
+ bool skip = false;
+ skip |= ValidateObject(commandBuffer, kVulkanObjectTypeCommandBuffer, false, "VUID-vkCmdSetStencilTestEnableEXT-commandBuffer-parameter", kVUIDUndefined);
+
+ return skip;
+}
+
+bool ObjectLifetimes::PreCallValidateCmdSetStencilOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkStencilFaceFlags faceMask,
+ VkStencilOp failOp,
+ VkStencilOp passOp,
+ VkStencilOp depthFailOp,
+ VkCompareOp compareOp) const {
+ bool skip = false;
+ skip |= ValidateObject(commandBuffer, kVulkanObjectTypeCommandBuffer, false, "VUID-vkCmdSetStencilOpEXT-commandBuffer-parameter", kVUIDUndefined);
+
+ return skip;
+}
+
bool ObjectLifetimes::PreCallValidateGetGeneratedCommandsMemoryRequirementsNV(
VkDevice device,
const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo,
@@ -5372,8 +5487,8 @@
bool skip = false;
skip |= ValidateObject(device, kVulkanObjectTypeDevice, false, "VUID-vkGetGeneratedCommandsMemoryRequirementsNV-device-parameter", kVUIDUndefined);
if (pInfo) {
- skip |= ValidateObject(pInfo->pipeline, kVulkanObjectTypePipeline, false, kVUIDUndefined, kVUIDUndefined);
- skip |= ValidateObject(pInfo->indirectCommandsLayout, kVulkanObjectTypeIndirectCommandsLayoutNV, false, kVUIDUndefined, kVUIDUndefined);
+ skip |= ValidateObject(pInfo->pipeline, kVulkanObjectTypePipeline, false, "VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-pipeline-parameter", "VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-commonparent");
+ skip |= ValidateObject(pInfo->indirectCommandsLayout, kVulkanObjectTypeIndirectCommandsLayoutNV, false, "VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-indirectCommandsLayout-parameter", "VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-commonparent");
}
return skip;
@@ -5469,7 +5584,7 @@
const VkAllocationCallbacks* pAllocator) const {
bool skip = false;
skip |= ValidateObject(device, kVulkanObjectTypeDevice, false, "VUID-vkDestroyIndirectCommandsLayoutNV-device-parameter", kVUIDUndefined);
- skip |= ValidateObject(indirectCommandsLayout, kVulkanObjectTypeIndirectCommandsLayoutNV, false, "VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-parameter", "VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-parent");
+ skip |= ValidateObject(indirectCommandsLayout, kVulkanObjectTypeIndirectCommandsLayoutNV, true, "VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-parameter", "VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-parent");
skip |= ValidateDestroyObject(indirectCommandsLayout, kVulkanObjectTypeIndirectCommandsLayoutNV, pAllocator, kVUIDUndefined, kVUIDUndefined);
return skip;
@@ -5483,6 +5598,112 @@
}
+bool ObjectLifetimes::PreCallValidateCreatePrivateDataSlotEXT(
+ VkDevice device,
+ const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkPrivateDataSlotEXT* pPrivateDataSlot) const {
+ bool skip = false;
+ skip |= ValidateObject(device, kVulkanObjectTypeDevice, false, "VUID-vkCreatePrivateDataSlotEXT-device-parameter", kVUIDUndefined);
+
+ return skip;
+}
+
+void ObjectLifetimes::PostCallRecordCreatePrivateDataSlotEXT(
+ VkDevice device,
+ const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkPrivateDataSlotEXT* pPrivateDataSlot,
+ VkResult result) {
+ if (result != VK_SUCCESS) return;
+ CreateObject(*pPrivateDataSlot, kVulkanObjectTypePrivateDataSlotEXT, pAllocator);
+
+}
+
+bool ObjectLifetimes::PreCallValidateDestroyPrivateDataSlotEXT(
+ VkDevice device,
+ VkPrivateDataSlotEXT privateDataSlot,
+ const VkAllocationCallbacks* pAllocator) const {
+ bool skip = false;
+ skip |= ValidateObject(device, kVulkanObjectTypeDevice, false, "VUID-vkDestroyPrivateDataSlotEXT-device-parameter", kVUIDUndefined);
+ skip |= ValidateObject(privateDataSlot, kVulkanObjectTypePrivateDataSlotEXT, true, "VUID-vkDestroyPrivateDataSlotEXT-privateDataSlot-parameter", "VUID-vkDestroyPrivateDataSlotEXT-privateDataSlot-parent");
+ skip |= ValidateDestroyObject(privateDataSlot, kVulkanObjectTypePrivateDataSlotEXT, pAllocator, kVUIDUndefined, kVUIDUndefined);
+
+ return skip;
+}
+
+void ObjectLifetimes::PreCallRecordDestroyPrivateDataSlotEXT(
+ VkDevice device,
+ VkPrivateDataSlotEXT privateDataSlot,
+ const VkAllocationCallbacks* pAllocator) {
+ RecordDestroyObject(privateDataSlot, kVulkanObjectTypePrivateDataSlotEXT);
+
+}
+
+bool ObjectLifetimes::PreCallValidateSetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t data) const {
+ bool skip = false;
+ skip |= ValidateObject(device, kVulkanObjectTypeDevice, false, "VUID-vkSetPrivateDataEXT-device-parameter", kVUIDUndefined);
+ skip |= ValidateObject(privateDataSlot, kVulkanObjectTypePrivateDataSlotEXT, false, "VUID-vkSetPrivateDataEXT-privateDataSlot-parameter", "VUID-vkSetPrivateDataEXT-privateDataSlot-parent");
+
+ return skip;
+}
+
+bool ObjectLifetimes::PreCallValidateGetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t* pData) const {
+ bool skip = false;
+ skip |= ValidateObject(device, kVulkanObjectTypeDevice, false, "VUID-vkGetPrivateDataEXT-device-parameter", kVUIDUndefined);
+ skip |= ValidateObject(privateDataSlot, kVulkanObjectTypePrivateDataSlotEXT, false, "VUID-vkGetPrivateDataEXT-privateDataSlot-parameter", "VUID-vkGetPrivateDataEXT-privateDataSlot-parent");
+
+ return skip;
+}
+
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+
+bool ObjectLifetimes::PreCallValidateCreateDirectFBSurfaceEXT(
+ VkInstance instance,
+ const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkSurfaceKHR* pSurface) const {
+ bool skip = false;
+ skip |= ValidateObject(instance, kVulkanObjectTypeInstance, false, "VUID-vkCreateDirectFBSurfaceEXT-instance-parameter", kVUIDUndefined);
+
+ return skip;
+}
+
+void ObjectLifetimes::PostCallRecordCreateDirectFBSurfaceEXT(
+ VkInstance instance,
+ const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkSurfaceKHR* pSurface,
+ VkResult result) {
+ if (result != VK_SUCCESS) return;
+ CreateObject(*pSurface, kVulkanObjectTypeSurfaceKHR, pAllocator);
+
+}
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
+
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+
+bool ObjectLifetimes::PreCallValidateGetPhysicalDeviceDirectFBPresentationSupportEXT(
+ VkPhysicalDevice physicalDevice,
+ uint32_t queueFamilyIndex,
+ IDirectFB* dfb) const {
+ bool skip = false;
+ skip |= ValidateObject(physicalDevice, kVulkanObjectTypePhysicalDevice, false, "VUID-vkGetPhysicalDeviceDirectFBPresentationSupportEXT-physicalDevice-parameter", kVUIDUndefined);
+
+ return skip;
+}
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
+
#ifdef VK_USE_PLATFORM_FUCHSIA
bool ObjectLifetimes::PreCallValidateCreateBufferCollectionFUCHSIA(
@@ -5905,7 +6126,7 @@
}
skip |= ValidateObject(pCreateInfos[index0].layout, kVulkanObjectTypePipelineLayout, false, "VUID-VkRayTracingPipelineCreateInfoKHR-layout-parameter", "VUID-VkRayTracingPipelineCreateInfoKHR-commonparent");
if ((pCreateInfos[index0].flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) && (pCreateInfos[index0].basePipelineIndex == -1))
- skip |= ValidateObject(pCreateInfos[index0].basePipelineHandle, kVulkanObjectTypePipeline, false, kVUIDUndefined, "VUID-VkRayTracingPipelineCreateInfoKHR-commonparent");
+ skip |= ValidateObject(pCreateInfos[index0].basePipelineHandle, kVulkanObjectTypePipeline, false, "VUID-VkRayTracingPipelineCreateInfoKHR-flags-03421", "VUID-VkRayTracingPipelineCreateInfoKHR-commonparent");
}
}
diff --git a/layers/generated/object_tracker.h b/layers/generated/object_tracker.h
index 6410cf0..7e52355 100644
--- a/layers/generated/object_tracker.h
+++ b/layers/generated/object_tracker.h
@@ -1814,6 +1814,10 @@
bool PreCallValidateGetImageViewHandleNVX(
VkDevice device,
const VkImageViewHandleInfoNVX* pInfo) const;
+bool PreCallValidateGetImageViewAddressNVX(
+ VkDevice device,
+ VkImageView imageView,
+ VkImageViewAddressPropertiesNVX* pProperties) const;
bool PreCallValidateCmdDrawIndirectCountAMD(
VkCommandBuffer commandBuffer,
VkBuffer buffer,
@@ -2409,6 +2413,53 @@
VkQueryPool queryPool,
uint32_t firstQuery,
uint32_t queryCount) const;
+bool PreCallValidateCmdSetCullModeEXT(
+ VkCommandBuffer commandBuffer,
+ VkCullModeFlags cullMode) const;
+bool PreCallValidateCmdSetFrontFaceEXT(
+ VkCommandBuffer commandBuffer,
+ VkFrontFace frontFace) const;
+bool PreCallValidateCmdSetPrimitiveTopologyEXT(
+ VkCommandBuffer commandBuffer,
+ VkPrimitiveTopology primitiveTopology) const;
+bool PreCallValidateCmdSetViewportWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t viewportCount,
+ const VkViewport* pViewports) const;
+bool PreCallValidateCmdSetScissorWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t scissorCount,
+ const VkRect2D* pScissors) const;
+bool PreCallValidateCmdBindVertexBuffers2EXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t firstBinding,
+ uint32_t bindingCount,
+ const VkBuffer* pBuffers,
+ const VkDeviceSize* pOffsets,
+ const VkDeviceSize* pSizes,
+ const VkDeviceSize* pStrides) const;
+bool PreCallValidateCmdSetDepthTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthTestEnable) const;
+bool PreCallValidateCmdSetDepthWriteEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthWriteEnable) const;
+bool PreCallValidateCmdSetDepthCompareOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkCompareOp depthCompareOp) const;
+bool PreCallValidateCmdSetDepthBoundsTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthBoundsTestEnable) const;
+bool PreCallValidateCmdSetStencilTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 stencilTestEnable) const;
+bool PreCallValidateCmdSetStencilOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkStencilFaceFlags faceMask,
+ VkStencilOp failOp,
+ VkStencilOp passOp,
+ VkStencilOp depthFailOp,
+ VkCompareOp compareOp) const;
bool PreCallValidateGetGeneratedCommandsMemoryRequirementsNV(
VkDevice device,
const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo,
@@ -2444,6 +2495,58 @@
VkDevice device,
VkIndirectCommandsLayoutNV indirectCommandsLayout,
const VkAllocationCallbacks* pAllocator);
+bool PreCallValidateCreatePrivateDataSlotEXT(
+ VkDevice device,
+ const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkPrivateDataSlotEXT* pPrivateDataSlot) const;
+void PostCallRecordCreatePrivateDataSlotEXT(
+ VkDevice device,
+ const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkPrivateDataSlotEXT* pPrivateDataSlot,
+ VkResult result);
+bool PreCallValidateDestroyPrivateDataSlotEXT(
+ VkDevice device,
+ VkPrivateDataSlotEXT privateDataSlot,
+ const VkAllocationCallbacks* pAllocator) const;
+void PreCallRecordDestroyPrivateDataSlotEXT(
+ VkDevice device,
+ VkPrivateDataSlotEXT privateDataSlot,
+ const VkAllocationCallbacks* pAllocator);
+bool PreCallValidateSetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t data) const;
+bool PreCallValidateGetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t* pData) const;
+
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+bool PreCallValidateCreateDirectFBSurfaceEXT(
+ VkInstance instance,
+ const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkSurfaceKHR* pSurface) const;
+void PostCallRecordCreateDirectFBSurfaceEXT(
+ VkInstance instance,
+ const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkSurfaceKHR* pSurface,
+ VkResult result);
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
+
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+bool PreCallValidateGetPhysicalDeviceDirectFBPresentationSupportEXT(
+ VkPhysicalDevice physicalDevice,
+ uint32_t queueFamilyIndex,
+ IDirectFB* dfb) const;
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
#ifdef VK_USE_PLATFORM_FUCHSIA
bool PreCallValidateCreateBufferCollectionFUCHSIA(
diff --git a/layers/generated/parameter_validation.cpp b/layers/generated/parameter_validation.cpp
index dfe3a73..f48c41d 100644
--- a/layers/generated/parameter_validation.cpp
+++ b/layers/generated/parameter_validation.cpp
@@ -27,7 +27,7 @@
#include "stateless_validation.h"
-const uint32_t GeneratedVulkanHeaderVersion = 135;
+const uint32_t GeneratedVulkanHeaderVersion = 148;
const DECORATE_UNUSED VkAccessFlags AllVkAccessFlagBits = VK_ACCESS_INDIRECT_COMMAND_READ_BIT|VK_ACCESS_INDEX_READ_BIT|VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT|VK_ACCESS_UNIFORM_READ_BIT|VK_ACCESS_INPUT_ATTACHMENT_READ_BIT|VK_ACCESS_SHADER_READ_BIT|VK_ACCESS_SHADER_WRITE_BIT|VK_ACCESS_COLOR_ATTACHMENT_READ_BIT|VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT|VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT|VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT|VK_ACCESS_TRANSFER_READ_BIT|VK_ACCESS_TRANSFER_WRITE_BIT|VK_ACCESS_HOST_READ_BIT|VK_ACCESS_HOST_WRITE_BIT|VK_ACCESS_MEMORY_READ_BIT|VK_ACCESS_MEMORY_WRITE_BIT|VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT|VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT|VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT|VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT|VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT|VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR|VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR|VK_ACCESS_SHADING_RATE_IMAGE_READ_BIT_NV|VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_NV|VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_NV|VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT|VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV|VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV;
const DECORATE_UNUSED VkAttachmentDescriptionFlags AllVkAttachmentDescriptionFlagBits = VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT;
@@ -49,7 +49,7 @@
const DECORATE_UNUSED VkImageAspectFlags AllVkImageAspectFlagBits = VK_IMAGE_ASPECT_COLOR_BIT|VK_IMAGE_ASPECT_DEPTH_BIT|VK_IMAGE_ASPECT_STENCIL_BIT|VK_IMAGE_ASPECT_METADATA_BIT|VK_IMAGE_ASPECT_PLANE_0_BIT|VK_IMAGE_ASPECT_PLANE_1_BIT|VK_IMAGE_ASPECT_PLANE_2_BIT|VK_IMAGE_ASPECT_PLANE_0_BIT_KHR|VK_IMAGE_ASPECT_PLANE_1_BIT_KHR|VK_IMAGE_ASPECT_PLANE_2_BIT_KHR|VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT|VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT|VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT|VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT;
const DECORATE_UNUSED VkImageCreateFlags AllVkImageCreateFlagBits = VK_IMAGE_CREATE_SPARSE_BINDING_BIT|VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT|VK_IMAGE_CREATE_SPARSE_ALIASED_BIT|VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT|VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT|VK_IMAGE_CREATE_ALIAS_BIT|VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT|VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT|VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT|VK_IMAGE_CREATE_EXTENDED_USAGE_BIT|VK_IMAGE_CREATE_PROTECTED_BIT|VK_IMAGE_CREATE_DISJOINT_BIT|VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV|VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR|VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR|VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_KHR|VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR|VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT|VK_IMAGE_CREATE_DISJOINT_BIT_KHR|VK_IMAGE_CREATE_ALIAS_BIT_KHR|VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT;
const DECORATE_UNUSED VkImageUsageFlags AllVkImageUsageFlagBits = VK_IMAGE_USAGE_TRANSFER_SRC_BIT|VK_IMAGE_USAGE_TRANSFER_DST_BIT|VK_IMAGE_USAGE_SAMPLED_BIT|VK_IMAGE_USAGE_STORAGE_BIT|VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT|VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT|VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT|VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT|VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV|VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT;
-const DECORATE_UNUSED VkImageViewCreateFlags AllVkImageViewCreateFlagBits = VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT;
+const DECORATE_UNUSED VkImageViewCreateFlags AllVkImageViewCreateFlagBits = VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT|VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT;
const DECORATE_UNUSED VkMemoryHeapFlags AllVkMemoryHeapFlagBits = VK_MEMORY_HEAP_DEVICE_LOCAL_BIT|VK_MEMORY_HEAP_MULTI_INSTANCE_BIT|VK_MEMORY_HEAP_MULTI_INSTANCE_BIT_KHR;
const DECORATE_UNUSED VkMemoryPropertyFlags AllVkMemoryPropertyFlagBits = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT|VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT|VK_MEMORY_PROPERTY_HOST_COHERENT_BIT|VK_MEMORY_PROPERTY_HOST_CACHED_BIT|VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT|VK_MEMORY_PROPERTY_PROTECTED_BIT|VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD|VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD;
const DECORATE_UNUSED VkPipelineCacheCreateFlags AllVkPipelineCacheCreateFlagBits = VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT;
@@ -67,13 +67,13 @@
const DECORATE_UNUSED VkSparseImageFormatFlags AllVkSparseImageFormatFlagBits = VK_SPARSE_IMAGE_FORMAT_SINGLE_MIPTAIL_BIT|VK_SPARSE_IMAGE_FORMAT_ALIGNED_MIP_SIZE_BIT|VK_SPARSE_IMAGE_FORMAT_NONSTANDARD_BLOCK_SIZE_BIT;
const DECORATE_UNUSED VkSparseMemoryBindFlags AllVkSparseMemoryBindFlagBits = VK_SPARSE_MEMORY_BIND_METADATA_BIT;
const DECORATE_UNUSED VkStencilFaceFlags AllVkStencilFaceFlagBits = VK_STENCIL_FACE_FRONT_BIT|VK_STENCIL_FACE_BACK_BIT|VK_STENCIL_FACE_FRONT_AND_BACK|VK_STENCIL_FRONT_AND_BACK;
-const DECORATE_UNUSED VkSubpassDescriptionFlags AllVkSubpassDescriptionFlagBits = VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX|VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX;
+const DECORATE_UNUSED VkSubpassDescriptionFlags AllVkSubpassDescriptionFlagBits = VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX|VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX|VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM|VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM;
const DECORATE_UNUSED VkExternalFenceFeatureFlags AllVkExternalFenceFeatureFlagBits = VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT|VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT|VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT_KHR|VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT_KHR;
const DECORATE_UNUSED VkExternalFenceHandleTypeFlags AllVkExternalFenceHandleTypeFlagBits = VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT|VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT|VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT|VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT|VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR|VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR|VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR|VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR;
const DECORATE_UNUSED VkExternalMemoryFeatureFlags AllVkExternalMemoryFeatureFlagBits = VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT|VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT|VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT|VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_KHR|VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_KHR|VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_KHR;
const DECORATE_UNUSED VkExternalMemoryHandleTypeFlags AllVkExternalMemoryHandleTypeFlagBits = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR|VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR|VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR|VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT_KHR|VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT_KHR|VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT_KHR|VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT_KHR|VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID|VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA;
const DECORATE_UNUSED VkExternalSemaphoreFeatureFlags AllVkExternalSemaphoreFeatureFlagBits = VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT|VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT|VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT_KHR|VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT_KHR;
-const DECORATE_UNUSED VkExternalSemaphoreHandleTypeFlags AllVkExternalSemaphoreHandleTypeFlagBits = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT_KHR|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT_KHR|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TEMP_ZIRCON_EVENT_BIT_FUCHSIA;
+const DECORATE_UNUSED VkExternalSemaphoreHandleTypeFlags AllVkExternalSemaphoreHandleTypeFlagBits = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT_KHR|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT_KHR|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TEMP_ZIRCON_EVENT_BIT_FUCHSIA;
const DECORATE_UNUSED VkFenceImportFlags AllVkFenceImportFlagBits = VK_FENCE_IMPORT_TEMPORARY_BIT|VK_FENCE_IMPORT_TEMPORARY_BIT_KHR;
const DECORATE_UNUSED VkMemoryAllocateFlags AllVkMemoryAllocateFlagBits = VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT|VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT|VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT|VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT_KHR|VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR|VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR;
const DECORATE_UNUSED VkPeerMemoryFeatureFlags AllVkPeerMemoryFeatureFlagBits = VK_PEER_MEMORY_FEATURE_COPY_SRC_BIT|VK_PEER_MEMORY_FEATURE_COPY_DST_BIT|VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT|VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT|VK_PEER_MEMORY_FEATURE_COPY_SRC_BIT_KHR|VK_PEER_MEMORY_FEATURE_COPY_DST_BIT_KHR|VK_PEER_MEMORY_FEATURE_GENERIC_SRC_BIT_KHR|VK_PEER_MEMORY_FEATURE_GENERIC_DST_BIT_KHR;
@@ -92,7 +92,7 @@
const DECORATE_UNUSED VkExternalMemoryFeatureFlagsKHR AllVkExternalMemoryFeatureFlagBitsKHR = VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT|VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT|VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT|VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_KHR|VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_KHR|VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_KHR;
const DECORATE_UNUSED VkExternalMemoryHandleTypeFlagsKHR AllVkExternalMemoryHandleTypeFlagBitsKHR = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR|VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR|VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR|VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT_KHR|VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT_KHR|VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT_KHR|VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT_KHR|VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID|VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT|VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA;
const DECORATE_UNUSED VkExternalSemaphoreFeatureFlagsKHR AllVkExternalSemaphoreFeatureFlagBitsKHR = VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT|VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT|VK_EXTERNAL_SEMAPHORE_FEATURE_EXPORTABLE_BIT_KHR|VK_EXTERNAL_SEMAPHORE_FEATURE_IMPORTABLE_BIT_KHR;
-const DECORATE_UNUSED VkExternalSemaphoreHandleTypeFlagsKHR AllVkExternalSemaphoreHandleTypeFlagBitsKHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT_KHR|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT_KHR|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TEMP_ZIRCON_EVENT_BIT_FUCHSIA;
+const DECORATE_UNUSED VkExternalSemaphoreHandleTypeFlagsKHR AllVkExternalSemaphoreHandleTypeFlagBitsKHR = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D11_FENCE_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT_KHR|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT_KHR|VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TEMP_ZIRCON_EVENT_BIT_FUCHSIA;
const DECORATE_UNUSED VkSemaphoreImportFlagsKHR AllVkSemaphoreImportFlagBitsKHR = VK_SEMAPHORE_IMPORT_TEMPORARY_BIT|VK_SEMAPHORE_IMPORT_TEMPORARY_BIT_KHR;
const DECORATE_UNUSED VkExternalFenceFeatureFlagsKHR AllVkExternalFenceFeatureFlagBitsKHR = VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT|VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT|VK_EXTERNAL_FENCE_FEATURE_EXPORTABLE_BIT_KHR|VK_EXTERNAL_FENCE_FEATURE_IMPORTABLE_BIT_KHR;
const DECORATE_UNUSED VkExternalFenceHandleTypeFlagsKHR AllVkExternalFenceHandleTypeFlagBitsKHR = VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT|VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT|VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT|VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT|VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_FD_BIT_KHR|VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR|VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR|VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT_KHR;
@@ -120,55 +120,55 @@
const DECORATE_UNUSED VkIndirectStateFlagsNV AllVkIndirectStateFlagBitsNV = VK_INDIRECT_STATE_FLAG_FRONTFACE_BIT_NV;
const DECORATE_UNUSED VkDeviceDiagnosticsConfigFlagsNV AllVkDeviceDiagnosticsConfigFlagBitsNV = VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_SHADER_DEBUG_INFO_BIT_NV|VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_RESOURCE_TRACKING_BIT_NV|VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_AUTOMATIC_CHECKPOINTS_BIT_NV;
+const std::vector<VkResult> AllVkResultEnums = {VK_SUCCESS, VK_NOT_READY, VK_TIMEOUT, VK_EVENT_SET, VK_EVENT_RESET, VK_INCOMPLETE, VK_ERROR_OUT_OF_HOST_MEMORY, VK_ERROR_OUT_OF_DEVICE_MEMORY, VK_ERROR_INITIALIZATION_FAILED, VK_ERROR_DEVICE_LOST, VK_ERROR_MEMORY_MAP_FAILED, VK_ERROR_LAYER_NOT_PRESENT, VK_ERROR_EXTENSION_NOT_PRESENT, VK_ERROR_FEATURE_NOT_PRESENT, VK_ERROR_INCOMPATIBLE_DRIVER, VK_ERROR_TOO_MANY_OBJECTS, VK_ERROR_FORMAT_NOT_SUPPORTED, VK_ERROR_FRAGMENTED_POOL, VK_ERROR_UNKNOWN, VK_ERROR_OUT_OF_POOL_MEMORY, VK_ERROR_INVALID_EXTERNAL_HANDLE, VK_ERROR_FRAGMENTATION, VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS, VK_ERROR_SURFACE_LOST_KHR, VK_ERROR_NATIVE_WINDOW_IN_USE_KHR, VK_SUBOPTIMAL_KHR, VK_ERROR_OUT_OF_DATE_KHR, VK_ERROR_INCOMPATIBLE_DISPLAY_KHR, VK_ERROR_VALIDATION_FAILED_EXT, VK_ERROR_INVALID_SHADER_NV, VK_ERROR_OUT_OF_POOL_MEMORY_KHR, VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR, VK_ERROR_INCOMPATIBLE_VERSION_KHR, VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT, VK_ERROR_FRAGMENTATION_EXT, VK_ERROR_NOT_PERMITTED_EXT, VK_ERROR_INVALID_DEVICE_ADDRESS_EXT, VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT, VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR, VK_THREAD_IDLE_KHR, VK_THREAD_DONE_KHR, VK_OPERATION_DEFERRED_KHR, VK_OPERATION_NOT_DEFERRED_KHR, VK_PIPELINE_COMPILE_REQUIRED_EXT, VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT, };
+const std::vector<VkImageLayout> AllVkImageLayoutEnums = {VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR, VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV, VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR, VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR, };
+const std::vector<VkObjectType> AllVkObjectTypeEnums = {VK_OBJECT_TYPE_UNKNOWN, VK_OBJECT_TYPE_INSTANCE, VK_OBJECT_TYPE_PHYSICAL_DEVICE, VK_OBJECT_TYPE_DEVICE, VK_OBJECT_TYPE_QUEUE, VK_OBJECT_TYPE_SEMAPHORE, VK_OBJECT_TYPE_COMMAND_BUFFER, VK_OBJECT_TYPE_FENCE, VK_OBJECT_TYPE_DEVICE_MEMORY, VK_OBJECT_TYPE_BUFFER, VK_OBJECT_TYPE_IMAGE, VK_OBJECT_TYPE_EVENT, VK_OBJECT_TYPE_QUERY_POOL, VK_OBJECT_TYPE_BUFFER_VIEW, VK_OBJECT_TYPE_IMAGE_VIEW, VK_OBJECT_TYPE_SHADER_MODULE, VK_OBJECT_TYPE_PIPELINE_CACHE, VK_OBJECT_TYPE_PIPELINE_LAYOUT, VK_OBJECT_TYPE_RENDER_PASS, VK_OBJECT_TYPE_PIPELINE, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, VK_OBJECT_TYPE_SAMPLER, VK_OBJECT_TYPE_DESCRIPTOR_POOL, VK_OBJECT_TYPE_DESCRIPTOR_SET, VK_OBJECT_TYPE_FRAMEBUFFER, VK_OBJECT_TYPE_COMMAND_POOL, VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION, VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE, VK_OBJECT_TYPE_SURFACE_KHR, VK_OBJECT_TYPE_SWAPCHAIN_KHR, VK_OBJECT_TYPE_DISPLAY_KHR, VK_OBJECT_TYPE_DISPLAY_MODE_KHR, VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT, VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR, VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT, VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR, VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_KHR, VK_OBJECT_TYPE_VALIDATION_CACHE_EXT, VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV, VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL, VK_OBJECT_TYPE_DEFERRED_OPERATION_KHR, VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV, VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT, VK_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA, };
+const std::vector<VkVendorId> AllVkVendorIdEnums = {VK_VENDOR_ID_VIV, VK_VENDOR_ID_VSI, VK_VENDOR_ID_KAZAN, VK_VENDOR_ID_CODEPLAY, VK_VENDOR_ID_MESA, };
const std::vector<VkPipelineCacheHeaderVersion> AllVkPipelineCacheHeaderVersionEnums = {VK_PIPELINE_CACHE_HEADER_VERSION_ONE, };
-const std::vector<VkResult> AllVkResultEnums = {VK_SUCCESS, VK_NOT_READY, VK_TIMEOUT, VK_EVENT_SET, VK_EVENT_RESET, VK_INCOMPLETE, VK_ERROR_OUT_OF_HOST_MEMORY, VK_ERROR_OUT_OF_DEVICE_MEMORY, VK_ERROR_INITIALIZATION_FAILED, VK_ERROR_DEVICE_LOST, VK_ERROR_MEMORY_MAP_FAILED, VK_ERROR_LAYER_NOT_PRESENT, VK_ERROR_EXTENSION_NOT_PRESENT, VK_ERROR_FEATURE_NOT_PRESENT, VK_ERROR_INCOMPATIBLE_DRIVER, VK_ERROR_TOO_MANY_OBJECTS, VK_ERROR_FORMAT_NOT_SUPPORTED, VK_ERROR_FRAGMENTED_POOL, VK_ERROR_UNKNOWN, VK_ERROR_OUT_OF_POOL_MEMORY, VK_ERROR_INVALID_EXTERNAL_HANDLE, VK_ERROR_FRAGMENTATION, VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS, VK_ERROR_SURFACE_LOST_KHR, VK_ERROR_NATIVE_WINDOW_IN_USE_KHR, VK_SUBOPTIMAL_KHR, VK_ERROR_OUT_OF_DATE_KHR, VK_ERROR_INCOMPATIBLE_DISPLAY_KHR, VK_ERROR_VALIDATION_FAILED_EXT, VK_ERROR_INVALID_SHADER_NV, VK_ERROR_OUT_OF_POOL_MEMORY_KHR, VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR, VK_ERROR_INCOMPATIBLE_VERSION_KHR, VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT, VK_ERROR_FRAGMENTATION_EXT, VK_ERROR_NOT_PERMITTED_EXT, VK_ERROR_INVALID_DEVICE_ADDRESS_EXT, VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT, VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR, VK_THREAD_IDLE_KHR, VK_THREAD_DONE_KHR, VK_OPERATION_DEFERRED_KHR, VK_OPERATION_NOT_DEFERRED_KHR, VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT, };
const std::vector<VkSystemAllocationScope> AllVkSystemAllocationScopeEnums = {VK_SYSTEM_ALLOCATION_SCOPE_COMMAND, VK_SYSTEM_ALLOCATION_SCOPE_OBJECT, VK_SYSTEM_ALLOCATION_SCOPE_CACHE, VK_SYSTEM_ALLOCATION_SCOPE_DEVICE, VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE, };
const std::vector<VkInternalAllocationType> AllVkInternalAllocationTypeEnums = {VK_INTERNAL_ALLOCATION_TYPE_EXECUTABLE, };
const std::vector<VkFormat> AllVkFormatEnums = {VK_FORMAT_UNDEFINED, VK_FORMAT_R4G4_UNORM_PACK8, VK_FORMAT_R4G4B4A4_UNORM_PACK16, VK_FORMAT_B4G4R4A4_UNORM_PACK16, VK_FORMAT_R5G6B5_UNORM_PACK16, VK_FORMAT_B5G6R5_UNORM_PACK16, VK_FORMAT_R5G5B5A1_UNORM_PACK16, VK_FORMAT_B5G5R5A1_UNORM_PACK16, VK_FORMAT_A1R5G5B5_UNORM_PACK16, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_SNORM, VK_FORMAT_R8_USCALED, VK_FORMAT_R8_SSCALED, VK_FORMAT_R8_UINT, VK_FORMAT_R8_SINT, VK_FORMAT_R8_SRGB, VK_FORMAT_R8G8_UNORM, VK_FORMAT_R8G8_SNORM, VK_FORMAT_R8G8_USCALED, VK_FORMAT_R8G8_SSCALED, VK_FORMAT_R8G8_UINT, VK_FORMAT_R8G8_SINT, VK_FORMAT_R8G8_SRGB, VK_FORMAT_R8G8B8_UNORM, VK_FORMAT_R8G8B8_SNORM, VK_FORMAT_R8G8B8_USCALED, VK_FORMAT_R8G8B8_SSCALED, VK_FORMAT_R8G8B8_UINT, VK_FORMAT_R8G8B8_SINT, VK_FORMAT_R8G8B8_SRGB, VK_FORMAT_B8G8R8_UNORM, VK_FORMAT_B8G8R8_SNORM, VK_FORMAT_B8G8R8_USCALED, VK_FORMAT_B8G8R8_SSCALED, VK_FORMAT_B8G8R8_UINT, VK_FORMAT_B8G8R8_SINT, VK_FORMAT_B8G8R8_SRGB, VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_R8G8B8A8_SNORM, VK_FORMAT_R8G8B8A8_USCALED, VK_FORMAT_R8G8B8A8_SSCALED, VK_FORMAT_R8G8B8A8_UINT, VK_FORMAT_R8G8B8A8_SINT, VK_FORMAT_R8G8B8A8_SRGB, VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_B8G8R8A8_SNORM, VK_FORMAT_B8G8R8A8_USCALED, VK_FORMAT_B8G8R8A8_SSCALED, VK_FORMAT_B8G8R8A8_UINT, VK_FORMAT_B8G8R8A8_SINT, VK_FORMAT_B8G8R8A8_SRGB, VK_FORMAT_A8B8G8R8_UNORM_PACK32, VK_FORMAT_A8B8G8R8_SNORM_PACK32, VK_FORMAT_A8B8G8R8_USCALED_PACK32, VK_FORMAT_A8B8G8R8_SSCALED_PACK32, VK_FORMAT_A8B8G8R8_UINT_PACK32, VK_FORMAT_A8B8G8R8_SINT_PACK32, VK_FORMAT_A8B8G8R8_SRGB_PACK32, VK_FORMAT_A2R10G10B10_UNORM_PACK32, VK_FORMAT_A2R10G10B10_SNORM_PACK32, VK_FORMAT_A2R10G10B10_USCALED_PACK32, VK_FORMAT_A2R10G10B10_SSCALED_PACK32, VK_FORMAT_A2R10G10B10_UINT_PACK32, VK_FORMAT_A2R10G10B10_SINT_PACK32, VK_FORMAT_A2B10G10R10_UNORM_PACK32, VK_FORMAT_A2B10G10R10_SNORM_PACK32, VK_FORMAT_A2B10G10R10_USCALED_PACK32, VK_FORMAT_A2B10G10R10_SSCALED_PACK32, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_FORMAT_A2B10G10R10_SINT_PACK32, VK_FORMAT_R16_UNORM, VK_FORMAT_R16_SNORM, VK_FORMAT_R16_USCALED, VK_FORMAT_R16_SSCALED, VK_FORMAT_R16_UINT, VK_FORMAT_R16_SINT, VK_FORMAT_R16_SFLOAT, VK_FORMAT_R16G16_UNORM, VK_FORMAT_R16G16_SNORM, VK_FORMAT_R16G16_USCALED, VK_FORMAT_R16G16_SSCALED, VK_FORMAT_R16G16_UINT, VK_FORMAT_R16G16_SINT, VK_FORMAT_R16G16_SFLOAT, VK_FORMAT_R16G16B16_UNORM, VK_FORMAT_R16G16B16_SNORM, VK_FORMAT_R16G16B16_USCALED, VK_FORMAT_R16G16B16_SSCALED, VK_FORMAT_R16G16B16_UINT, VK_FORMAT_R16G16B16_SINT, VK_FORMAT_R16G16B16_SFLOAT, VK_FORMAT_R16G16B16A16_UNORM, VK_FORMAT_R16G16B16A16_SNORM, VK_FORMAT_R16G16B16A16_USCALED, VK_FORMAT_R16G16B16A16_SSCALED, VK_FORMAT_R16G16B16A16_UINT, VK_FORMAT_R16G16B16A16_SINT, VK_FORMAT_R16G16B16A16_SFLOAT, VK_FORMAT_R32_UINT, VK_FORMAT_R32_SINT, VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32G32_UINT, VK_FORMAT_R32G32_SINT, VK_FORMAT_R32G32_SFLOAT, VK_FORMAT_R32G32B32_UINT, VK_FORMAT_R32G32B32_SINT, VK_FORMAT_R32G32B32_SFLOAT, VK_FORMAT_R32G32B32A32_UINT, VK_FORMAT_R32G32B32A32_SINT, VK_FORMAT_R32G32B32A32_SFLOAT, VK_FORMAT_R64_UINT, VK_FORMAT_R64_SINT, VK_FORMAT_R64_SFLOAT, VK_FORMAT_R64G64_UINT, VK_FORMAT_R64G64_SINT, VK_FORMAT_R64G64_SFLOAT, VK_FORMAT_R64G64B64_UINT, VK_FORMAT_R64G64B64_SINT, VK_FORMAT_R64G64B64_SFLOAT, VK_FORMAT_R64G64B64A64_UINT, VK_FORMAT_R64G64B64A64_SINT, VK_FORMAT_R64G64B64A64_SFLOAT, VK_FORMAT_B10G11R11_UFLOAT_PACK32, VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, VK_FORMAT_D16_UNORM, VK_FORMAT_X8_D24_UNORM_PACK32, VK_FORMAT_D32_SFLOAT, VK_FORMAT_S8_UINT, VK_FORMAT_D16_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_BC1_RGB_UNORM_BLOCK, VK_FORMAT_BC1_RGB_SRGB_BLOCK, VK_FORMAT_BC1_RGBA_UNORM_BLOCK, VK_FORMAT_BC1_RGBA_SRGB_BLOCK, VK_FORMAT_BC2_UNORM_BLOCK, VK_FORMAT_BC2_SRGB_BLOCK, VK_FORMAT_BC3_UNORM_BLOCK, VK_FORMAT_BC3_SRGB_BLOCK, VK_FORMAT_BC4_UNORM_BLOCK, VK_FORMAT_BC4_SNORM_BLOCK, VK_FORMAT_BC5_UNORM_BLOCK, VK_FORMAT_BC5_SNORM_BLOCK, VK_FORMAT_BC6H_UFLOAT_BLOCK, VK_FORMAT_BC6H_SFLOAT_BLOCK, VK_FORMAT_BC7_UNORM_BLOCK, VK_FORMAT_BC7_SRGB_BLOCK, VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK, VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK, VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK, VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK, VK_FORMAT_EAC_R11_UNORM_BLOCK, VK_FORMAT_EAC_R11_SNORM_BLOCK, VK_FORMAT_EAC_R11G11_UNORM_BLOCK, VK_FORMAT_EAC_R11G11_SNORM_BLOCK, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_FORMAT_ASTC_4x4_SRGB_BLOCK, VK_FORMAT_ASTC_5x4_UNORM_BLOCK, VK_FORMAT_ASTC_5x4_SRGB_BLOCK, VK_FORMAT_ASTC_5x5_UNORM_BLOCK, VK_FORMAT_ASTC_5x5_SRGB_BLOCK, VK_FORMAT_ASTC_6x5_UNORM_BLOCK, VK_FORMAT_ASTC_6x5_SRGB_BLOCK, VK_FORMAT_ASTC_6x6_UNORM_BLOCK, VK_FORMAT_ASTC_6x6_SRGB_BLOCK, VK_FORMAT_ASTC_8x5_UNORM_BLOCK, VK_FORMAT_ASTC_8x5_SRGB_BLOCK, VK_FORMAT_ASTC_8x6_UNORM_BLOCK, VK_FORMAT_ASTC_8x6_SRGB_BLOCK, VK_FORMAT_ASTC_8x8_UNORM_BLOCK, VK_FORMAT_ASTC_8x8_SRGB_BLOCK, VK_FORMAT_ASTC_10x5_UNORM_BLOCK, VK_FORMAT_ASTC_10x5_SRGB_BLOCK, VK_FORMAT_ASTC_10x6_UNORM_BLOCK, VK_FORMAT_ASTC_10x6_SRGB_BLOCK, VK_FORMAT_ASTC_10x8_UNORM_BLOCK, VK_FORMAT_ASTC_10x8_SRGB_BLOCK, VK_FORMAT_ASTC_10x10_UNORM_BLOCK, VK_FORMAT_ASTC_10x10_SRGB_BLOCK, VK_FORMAT_ASTC_12x10_UNORM_BLOCK, VK_FORMAT_ASTC_12x10_SRGB_BLOCK, VK_FORMAT_ASTC_12x12_UNORM_BLOCK, VK_FORMAT_ASTC_12x12_SRGB_BLOCK, VK_FORMAT_G8B8G8R8_422_UNORM, VK_FORMAT_B8G8R8G8_422_UNORM, VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM, VK_FORMAT_G8_B8R8_2PLANE_422_UNORM, VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM, VK_FORMAT_R10X6_UNORM_PACK16, VK_FORMAT_R10X6G10X6_UNORM_2PACK16, VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16, VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16, VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16, VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16, VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16, VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16, VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16, VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16, VK_FORMAT_R12X4_UNORM_PACK16, VK_FORMAT_R12X4G12X4_UNORM_2PACK16, VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16, VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16, VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16, VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16, VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16, VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16, VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16, VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16, VK_FORMAT_G16B16G16R16_422_UNORM, VK_FORMAT_B16G16R16G16_422_UNORM, VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM, VK_FORMAT_G16_B16R16_2PLANE_420_UNORM, VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM, VK_FORMAT_G16_B16R16_2PLANE_422_UNORM, VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM, VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG, VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG, VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG, VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG, VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG, VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG, VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG, VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG, VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT, VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT, VK_FORMAT_G8B8G8R8_422_UNORM_KHR, VK_FORMAT_B8G8R8G8_422_UNORM_KHR, VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM_KHR, VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR, VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR, VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR, VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM_KHR, VK_FORMAT_R10X6_UNORM_PACK16_KHR, VK_FORMAT_R10X6G10X6_UNORM_2PACK16_KHR, VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16_KHR, VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16_KHR, VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16_KHR, VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16_KHR, VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16_KHR, VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16_KHR, VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16_KHR, VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16_KHR, VK_FORMAT_R12X4_UNORM_PACK16_KHR, VK_FORMAT_R12X4G12X4_UNORM_2PACK16_KHR, VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16_KHR, VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16_KHR, VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16_KHR, VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16_KHR, VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16_KHR, VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16_KHR, VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16_KHR, VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16_KHR, VK_FORMAT_G16B16G16R16_422_UNORM_KHR, VK_FORMAT_B16G16R16G16_422_UNORM_KHR, VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM_KHR, VK_FORMAT_G16_B16R16_2PLANE_420_UNORM_KHR, VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM_KHR, VK_FORMAT_G16_B16R16_2PLANE_422_UNORM_KHR, VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM_KHR, };
-const std::vector<VkImageType> AllVkImageTypeEnums = {VK_IMAGE_TYPE_1D, VK_IMAGE_TYPE_2D, VK_IMAGE_TYPE_3D, };
const std::vector<VkImageTiling> AllVkImageTilingEnums = {VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_TILING_LINEAR, VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, };
+const std::vector<VkImageType> AllVkImageTypeEnums = {VK_IMAGE_TYPE_1D, VK_IMAGE_TYPE_2D, VK_IMAGE_TYPE_3D, };
const std::vector<VkPhysicalDeviceType> AllVkPhysicalDeviceTypeEnums = {VK_PHYSICAL_DEVICE_TYPE_OTHER, VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU, VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU, VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU, VK_PHYSICAL_DEVICE_TYPE_CPU, };
const std::vector<VkQueryType> AllVkQueryTypeEnums = {VK_QUERY_TYPE_OCCLUSION, VK_QUERY_TYPE_PIPELINE_STATISTICS, VK_QUERY_TYPE_TIMESTAMP, VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT, VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR, VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR, VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV, VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL, };
const std::vector<VkSharingMode> AllVkSharingModeEnums = {VK_SHARING_MODE_EXCLUSIVE, VK_SHARING_MODE_CONCURRENT, };
-const std::vector<VkImageLayout> AllVkImageLayoutEnums = {VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR, VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV, VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR, VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR, };
-const std::vector<VkImageViewType> AllVkImageViewTypeEnums = {VK_IMAGE_VIEW_TYPE_1D, VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY, VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, };
const std::vector<VkComponentSwizzle> AllVkComponentSwizzleEnums = {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_ZERO, VK_COMPONENT_SWIZZLE_ONE, VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A, };
+const std::vector<VkImageViewType> AllVkImageViewTypeEnums = {VK_IMAGE_VIEW_TYPE_1D, VK_IMAGE_VIEW_TYPE_2D, VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY, VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, };
+const std::vector<VkBlendFactor> AllVkBlendFactorEnums = {VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_SRC_COLOR, VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR, VK_BLEND_FACTOR_DST_COLOR, VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR, VK_BLEND_FACTOR_SRC_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, VK_BLEND_FACTOR_DST_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA, VK_BLEND_FACTOR_CONSTANT_COLOR, VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR, VK_BLEND_FACTOR_CONSTANT_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA, VK_BLEND_FACTOR_SRC_ALPHA_SATURATE, VK_BLEND_FACTOR_SRC1_COLOR, VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR, VK_BLEND_FACTOR_SRC1_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA, };
+const std::vector<VkBlendOp> AllVkBlendOpEnums = {VK_BLEND_OP_ADD, VK_BLEND_OP_SUBTRACT, VK_BLEND_OP_REVERSE_SUBTRACT, VK_BLEND_OP_MIN, VK_BLEND_OP_MAX, VK_BLEND_OP_ZERO_EXT, VK_BLEND_OP_SRC_EXT, VK_BLEND_OP_DST_EXT, VK_BLEND_OP_SRC_OVER_EXT, VK_BLEND_OP_DST_OVER_EXT, VK_BLEND_OP_SRC_IN_EXT, VK_BLEND_OP_DST_IN_EXT, VK_BLEND_OP_SRC_OUT_EXT, VK_BLEND_OP_DST_OUT_EXT, VK_BLEND_OP_SRC_ATOP_EXT, VK_BLEND_OP_DST_ATOP_EXT, VK_BLEND_OP_XOR_EXT, VK_BLEND_OP_MULTIPLY_EXT, VK_BLEND_OP_SCREEN_EXT, VK_BLEND_OP_OVERLAY_EXT, VK_BLEND_OP_DARKEN_EXT, VK_BLEND_OP_LIGHTEN_EXT, VK_BLEND_OP_COLORDODGE_EXT, VK_BLEND_OP_COLORBURN_EXT, VK_BLEND_OP_HARDLIGHT_EXT, VK_BLEND_OP_SOFTLIGHT_EXT, VK_BLEND_OP_DIFFERENCE_EXT, VK_BLEND_OP_EXCLUSION_EXT, VK_BLEND_OP_INVERT_EXT, VK_BLEND_OP_INVERT_RGB_EXT, VK_BLEND_OP_LINEARDODGE_EXT, VK_BLEND_OP_LINEARBURN_EXT, VK_BLEND_OP_VIVIDLIGHT_EXT, VK_BLEND_OP_LINEARLIGHT_EXT, VK_BLEND_OP_PINLIGHT_EXT, VK_BLEND_OP_HARDMIX_EXT, VK_BLEND_OP_HSL_HUE_EXT, VK_BLEND_OP_HSL_SATURATION_EXT, VK_BLEND_OP_HSL_COLOR_EXT, VK_BLEND_OP_HSL_LUMINOSITY_EXT, VK_BLEND_OP_PLUS_EXT, VK_BLEND_OP_PLUS_CLAMPED_EXT, VK_BLEND_OP_PLUS_CLAMPED_ALPHA_EXT, VK_BLEND_OP_PLUS_DARKER_EXT, VK_BLEND_OP_MINUS_EXT, VK_BLEND_OP_MINUS_CLAMPED_EXT, VK_BLEND_OP_CONTRAST_EXT, VK_BLEND_OP_INVERT_OVG_EXT, VK_BLEND_OP_RED_EXT, VK_BLEND_OP_GREEN_EXT, VK_BLEND_OP_BLUE_EXT, };
+const std::vector<VkCompareOp> AllVkCompareOpEnums = {VK_COMPARE_OP_NEVER, VK_COMPARE_OP_LESS, VK_COMPARE_OP_EQUAL, VK_COMPARE_OP_LESS_OR_EQUAL, VK_COMPARE_OP_GREATER, VK_COMPARE_OP_NOT_EQUAL, VK_COMPARE_OP_GREATER_OR_EQUAL, VK_COMPARE_OP_ALWAYS, };
+const std::vector<VkDynamicState> AllVkDynamicStateEnums = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH, VK_DYNAMIC_STATE_DEPTH_BIAS, VK_DYNAMIC_STATE_BLEND_CONSTANTS, VK_DYNAMIC_STATE_DEPTH_BOUNDS, VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK, VK_DYNAMIC_STATE_STENCIL_WRITE_MASK, VK_DYNAMIC_STATE_STENCIL_REFERENCE, VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV, VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT, VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT, VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV, VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV, VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV, VK_DYNAMIC_STATE_LINE_STIPPLE_EXT, VK_DYNAMIC_STATE_CULL_MODE_EXT, VK_DYNAMIC_STATE_FRONT_FACE_EXT, VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT, VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT, VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT, VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT, VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT, VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT, VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT, VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT, VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT, VK_DYNAMIC_STATE_STENCIL_OP_EXT, };
+const std::vector<VkFrontFace> AllVkFrontFaceEnums = {VK_FRONT_FACE_COUNTER_CLOCKWISE, VK_FRONT_FACE_CLOCKWISE, };
const std::vector<VkVertexInputRate> AllVkVertexInputRateEnums = {VK_VERTEX_INPUT_RATE_VERTEX, VK_VERTEX_INPUT_RATE_INSTANCE, };
const std::vector<VkPrimitiveTopology> AllVkPrimitiveTopologyEnums = {VK_PRIMITIVE_TOPOLOGY_POINT_LIST, VK_PRIMITIVE_TOPOLOGY_LINE_LIST, VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN, VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY, VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY, VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, };
const std::vector<VkPolygonMode> AllVkPolygonModeEnums = {VK_POLYGON_MODE_FILL, VK_POLYGON_MODE_LINE, VK_POLYGON_MODE_POINT, VK_POLYGON_MODE_FILL_RECTANGLE_NV, };
-const std::vector<VkFrontFace> AllVkFrontFaceEnums = {VK_FRONT_FACE_COUNTER_CLOCKWISE, VK_FRONT_FACE_CLOCKWISE, };
-const std::vector<VkCompareOp> AllVkCompareOpEnums = {VK_COMPARE_OP_NEVER, VK_COMPARE_OP_LESS, VK_COMPARE_OP_EQUAL, VK_COMPARE_OP_LESS_OR_EQUAL, VK_COMPARE_OP_GREATER, VK_COMPARE_OP_NOT_EQUAL, VK_COMPARE_OP_GREATER_OR_EQUAL, VK_COMPARE_OP_ALWAYS, };
const std::vector<VkStencilOp> AllVkStencilOpEnums = {VK_STENCIL_OP_KEEP, VK_STENCIL_OP_ZERO, VK_STENCIL_OP_REPLACE, VK_STENCIL_OP_INCREMENT_AND_CLAMP, VK_STENCIL_OP_DECREMENT_AND_CLAMP, VK_STENCIL_OP_INVERT, VK_STENCIL_OP_INCREMENT_AND_WRAP, VK_STENCIL_OP_DECREMENT_AND_WRAP, };
const std::vector<VkLogicOp> AllVkLogicOpEnums = {VK_LOGIC_OP_CLEAR, VK_LOGIC_OP_AND, VK_LOGIC_OP_AND_REVERSE, VK_LOGIC_OP_COPY, VK_LOGIC_OP_AND_INVERTED, VK_LOGIC_OP_NO_OP, VK_LOGIC_OP_XOR, VK_LOGIC_OP_OR, VK_LOGIC_OP_NOR, VK_LOGIC_OP_EQUIVALENT, VK_LOGIC_OP_INVERT, VK_LOGIC_OP_OR_REVERSE, VK_LOGIC_OP_COPY_INVERTED, VK_LOGIC_OP_OR_INVERTED, VK_LOGIC_OP_NAND, VK_LOGIC_OP_SET, };
-const std::vector<VkBlendFactor> AllVkBlendFactorEnums = {VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_SRC_COLOR, VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR, VK_BLEND_FACTOR_DST_COLOR, VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR, VK_BLEND_FACTOR_SRC_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, VK_BLEND_FACTOR_DST_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA, VK_BLEND_FACTOR_CONSTANT_COLOR, VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR, VK_BLEND_FACTOR_CONSTANT_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA, VK_BLEND_FACTOR_SRC_ALPHA_SATURATE, VK_BLEND_FACTOR_SRC1_COLOR, VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR, VK_BLEND_FACTOR_SRC1_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA, };
-const std::vector<VkBlendOp> AllVkBlendOpEnums = {VK_BLEND_OP_ADD, VK_BLEND_OP_SUBTRACT, VK_BLEND_OP_REVERSE_SUBTRACT, VK_BLEND_OP_MIN, VK_BLEND_OP_MAX, VK_BLEND_OP_ZERO_EXT, VK_BLEND_OP_SRC_EXT, VK_BLEND_OP_DST_EXT, VK_BLEND_OP_SRC_OVER_EXT, VK_BLEND_OP_DST_OVER_EXT, VK_BLEND_OP_SRC_IN_EXT, VK_BLEND_OP_DST_IN_EXT, VK_BLEND_OP_SRC_OUT_EXT, VK_BLEND_OP_DST_OUT_EXT, VK_BLEND_OP_SRC_ATOP_EXT, VK_BLEND_OP_DST_ATOP_EXT, VK_BLEND_OP_XOR_EXT, VK_BLEND_OP_MULTIPLY_EXT, VK_BLEND_OP_SCREEN_EXT, VK_BLEND_OP_OVERLAY_EXT, VK_BLEND_OP_DARKEN_EXT, VK_BLEND_OP_LIGHTEN_EXT, VK_BLEND_OP_COLORDODGE_EXT, VK_BLEND_OP_COLORBURN_EXT, VK_BLEND_OP_HARDLIGHT_EXT, VK_BLEND_OP_SOFTLIGHT_EXT, VK_BLEND_OP_DIFFERENCE_EXT, VK_BLEND_OP_EXCLUSION_EXT, VK_BLEND_OP_INVERT_EXT, VK_BLEND_OP_INVERT_RGB_EXT, VK_BLEND_OP_LINEARDODGE_EXT, VK_BLEND_OP_LINEARBURN_EXT, VK_BLEND_OP_VIVIDLIGHT_EXT, VK_BLEND_OP_LINEARLIGHT_EXT, VK_BLEND_OP_PINLIGHT_EXT, VK_BLEND_OP_HARDMIX_EXT, VK_BLEND_OP_HSL_HUE_EXT, VK_BLEND_OP_HSL_SATURATION_EXT, VK_BLEND_OP_HSL_COLOR_EXT, VK_BLEND_OP_HSL_LUMINOSITY_EXT, VK_BLEND_OP_PLUS_EXT, VK_BLEND_OP_PLUS_CLAMPED_EXT, VK_BLEND_OP_PLUS_CLAMPED_ALPHA_EXT, VK_BLEND_OP_PLUS_DARKER_EXT, VK_BLEND_OP_MINUS_EXT, VK_BLEND_OP_MINUS_CLAMPED_EXT, VK_BLEND_OP_CONTRAST_EXT, VK_BLEND_OP_INVERT_OVG_EXT, VK_BLEND_OP_RED_EXT, VK_BLEND_OP_GREEN_EXT, VK_BLEND_OP_BLUE_EXT, };
-const std::vector<VkDynamicState> AllVkDynamicStateEnums = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH, VK_DYNAMIC_STATE_DEPTH_BIAS, VK_DYNAMIC_STATE_BLEND_CONSTANTS, VK_DYNAMIC_STATE_DEPTH_BOUNDS, VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK, VK_DYNAMIC_STATE_STENCIL_WRITE_MASK, VK_DYNAMIC_STATE_STENCIL_REFERENCE, VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV, VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT, VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT, VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV, VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV, VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV, VK_DYNAMIC_STATE_LINE_STIPPLE_EXT, };
+const std::vector<VkBorderColor> AllVkBorderColorEnums = {VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK, VK_BORDER_COLOR_INT_TRANSPARENT_BLACK, VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK, VK_BORDER_COLOR_INT_OPAQUE_BLACK, VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE, VK_BORDER_COLOR_INT_OPAQUE_WHITE, VK_BORDER_COLOR_FLOAT_CUSTOM_EXT, VK_BORDER_COLOR_INT_CUSTOM_EXT, };
const std::vector<VkFilter> AllVkFilterEnums = {VK_FILTER_NEAREST, VK_FILTER_LINEAR, VK_FILTER_CUBIC_IMG, VK_FILTER_CUBIC_EXT, };
-const std::vector<VkSamplerMipmapMode> AllVkSamplerMipmapModeEnums = {VK_SAMPLER_MIPMAP_MODE_NEAREST, VK_SAMPLER_MIPMAP_MODE_LINEAR, };
const std::vector<VkSamplerAddressMode> AllVkSamplerAddressModeEnums = {VK_SAMPLER_ADDRESS_MODE_REPEAT, VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE, VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE, VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE_KHR, };
-const std::vector<VkBorderColor> AllVkBorderColorEnums = {VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK, VK_BORDER_COLOR_INT_TRANSPARENT_BLACK, VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK, VK_BORDER_COLOR_INT_OPAQUE_BLACK, VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE, VK_BORDER_COLOR_INT_OPAQUE_WHITE, };
+const std::vector<VkSamplerMipmapMode> AllVkSamplerMipmapModeEnums = {VK_SAMPLER_MIPMAP_MODE_NEAREST, VK_SAMPLER_MIPMAP_MODE_LINEAR, };
const std::vector<VkDescriptorType> AllVkDescriptorTypeEnums = {VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV, };
const std::vector<VkAttachmentLoadOp> AllVkAttachmentLoadOpEnums = {VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_LOAD_OP_DONT_CARE, };
-const std::vector<VkAttachmentStoreOp> AllVkAttachmentStoreOpEnums = {VK_ATTACHMENT_STORE_OP_STORE, VK_ATTACHMENT_STORE_OP_DONT_CARE, };
+const std::vector<VkAttachmentStoreOp> AllVkAttachmentStoreOpEnums = {VK_ATTACHMENT_STORE_OP_STORE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_NONE_QCOM, };
const std::vector<VkPipelineBindPoint> AllVkPipelineBindPointEnums = {VK_PIPELINE_BIND_POINT_GRAPHICS, VK_PIPELINE_BIND_POINT_COMPUTE, VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, };
const std::vector<VkCommandBufferLevel> AllVkCommandBufferLevelEnums = {VK_COMMAND_BUFFER_LEVEL_PRIMARY, VK_COMMAND_BUFFER_LEVEL_SECONDARY, };
const std::vector<VkIndexType> AllVkIndexTypeEnums = {VK_INDEX_TYPE_UINT16, VK_INDEX_TYPE_UINT32, VK_INDEX_TYPE_NONE_KHR, VK_INDEX_TYPE_NONE_NV, VK_INDEX_TYPE_UINT8_EXT, };
const std::vector<VkSubpassContents> AllVkSubpassContentsEnums = {VK_SUBPASS_CONTENTS_INLINE, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS, };
-const std::vector<VkObjectType> AllVkObjectTypeEnums = {VK_OBJECT_TYPE_UNKNOWN, VK_OBJECT_TYPE_INSTANCE, VK_OBJECT_TYPE_PHYSICAL_DEVICE, VK_OBJECT_TYPE_DEVICE, VK_OBJECT_TYPE_QUEUE, VK_OBJECT_TYPE_SEMAPHORE, VK_OBJECT_TYPE_COMMAND_BUFFER, VK_OBJECT_TYPE_FENCE, VK_OBJECT_TYPE_DEVICE_MEMORY, VK_OBJECT_TYPE_BUFFER, VK_OBJECT_TYPE_IMAGE, VK_OBJECT_TYPE_EVENT, VK_OBJECT_TYPE_QUERY_POOL, VK_OBJECT_TYPE_BUFFER_VIEW, VK_OBJECT_TYPE_IMAGE_VIEW, VK_OBJECT_TYPE_SHADER_MODULE, VK_OBJECT_TYPE_PIPELINE_CACHE, VK_OBJECT_TYPE_PIPELINE_LAYOUT, VK_OBJECT_TYPE_RENDER_PASS, VK_OBJECT_TYPE_PIPELINE, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, VK_OBJECT_TYPE_SAMPLER, VK_OBJECT_TYPE_DESCRIPTOR_POOL, VK_OBJECT_TYPE_DESCRIPTOR_SET, VK_OBJECT_TYPE_FRAMEBUFFER, VK_OBJECT_TYPE_COMMAND_POOL, VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION, VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE, VK_OBJECT_TYPE_SURFACE_KHR, VK_OBJECT_TYPE_SWAPCHAIN_KHR, VK_OBJECT_TYPE_DISPLAY_KHR, VK_OBJECT_TYPE_DISPLAY_MODE_KHR, VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT, VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR, VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT, VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR, VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_KHR, VK_OBJECT_TYPE_VALIDATION_CACHE_EXT, VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV, VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL, VK_OBJECT_TYPE_DEFERRED_OPERATION_KHR, VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV, VK_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA, };
-const std::vector<VkVendorId> AllVkVendorIdEnums = {VK_VENDOR_ID_VIV, VK_VENDOR_ID_VSI, VK_VENDOR_ID_KAZAN, VK_VENDOR_ID_CODEPLAY, };
const std::vector<VkPointClippingBehavior> AllVkPointClippingBehaviorEnums = {VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES, VK_POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY, VK_POINT_CLIPPING_BEHAVIOR_ALL_CLIP_PLANES_KHR, VK_POINT_CLIPPING_BEHAVIOR_USER_CLIP_PLANES_ONLY_KHR, };
const std::vector<VkTessellationDomainOrigin> AllVkTessellationDomainOriginEnums = {VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT, VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT, VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT_KHR, VK_TESSELLATION_DOMAIN_ORIGIN_LOWER_LEFT_KHR, };
const std::vector<VkSamplerYcbcrModelConversion> AllVkSamplerYcbcrModelConversionEnums = {VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY, VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY, VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709, VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601, VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020, VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY_KHR, VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY_KHR, VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709_KHR, VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601_KHR, VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020_KHR, };
const std::vector<VkSamplerYcbcrRange> AllVkSamplerYcbcrRangeEnums = {VK_SAMPLER_YCBCR_RANGE_ITU_FULL, VK_SAMPLER_YCBCR_RANGE_ITU_NARROW, VK_SAMPLER_YCBCR_RANGE_ITU_FULL_KHR, VK_SAMPLER_YCBCR_RANGE_ITU_NARROW_KHR, };
const std::vector<VkChromaLocation> AllVkChromaLocationEnums = {VK_CHROMA_LOCATION_COSITED_EVEN, VK_CHROMA_LOCATION_MIDPOINT, VK_CHROMA_LOCATION_COSITED_EVEN_KHR, VK_CHROMA_LOCATION_MIDPOINT_KHR, };
-const std::vector<VkDescriptorUpdateTemplateType> AllVkDescriptorUpdateTemplateTypeEnums = {VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET, VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET_KHR, VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, };
-const std::vector<VkDriverId> AllVkDriverIdEnums = {VK_DRIVER_ID_AMD_PROPRIETARY, VK_DRIVER_ID_AMD_OPEN_SOURCE, VK_DRIVER_ID_MESA_RADV, VK_DRIVER_ID_NVIDIA_PROPRIETARY, VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS, VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA, VK_DRIVER_ID_IMAGINATION_PROPRIETARY, VK_DRIVER_ID_QUALCOMM_PROPRIETARY, VK_DRIVER_ID_ARM_PROPRIETARY, VK_DRIVER_ID_GOOGLE_SWIFTSHADER, VK_DRIVER_ID_GGP_PROPRIETARY, VK_DRIVER_ID_BROADCOM_PROPRIETARY, VK_DRIVER_ID_AMD_PROPRIETARY_KHR, VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR, VK_DRIVER_ID_MESA_RADV_KHR, VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR, VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS_KHR, VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA_KHR, VK_DRIVER_ID_IMAGINATION_PROPRIETARY_KHR, VK_DRIVER_ID_QUALCOMM_PROPRIETARY_KHR, VK_DRIVER_ID_ARM_PROPRIETARY_KHR, VK_DRIVER_ID_GOOGLE_SWIFTSHADER_KHR, VK_DRIVER_ID_GGP_PROPRIETARY_KHR, VK_DRIVER_ID_BROADCOM_PROPRIETARY_KHR, };
+const std::vector<VkDescriptorUpdateTemplateType> AllVkDescriptorUpdateTemplateTypeEnums = {VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET, VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET_KHR, VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, };
+const std::vector<VkDriverId> AllVkDriverIdEnums = {VK_DRIVER_ID_AMD_PROPRIETARY, VK_DRIVER_ID_AMD_OPEN_SOURCE, VK_DRIVER_ID_MESA_RADV, VK_DRIVER_ID_NVIDIA_PROPRIETARY, VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS, VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA, VK_DRIVER_ID_IMAGINATION_PROPRIETARY, VK_DRIVER_ID_QUALCOMM_PROPRIETARY, VK_DRIVER_ID_ARM_PROPRIETARY, VK_DRIVER_ID_GOOGLE_SWIFTSHADER, VK_DRIVER_ID_GGP_PROPRIETARY, VK_DRIVER_ID_BROADCOM_PROPRIETARY, VK_DRIVER_ID_MESA_LLVMPIPE, VK_DRIVER_ID_MOLTENVK, VK_DRIVER_ID_AMD_PROPRIETARY_KHR, VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR, VK_DRIVER_ID_MESA_RADV_KHR, VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR, VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS_KHR, VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA_KHR, VK_DRIVER_ID_IMAGINATION_PROPRIETARY_KHR, VK_DRIVER_ID_QUALCOMM_PROPRIETARY_KHR, VK_DRIVER_ID_ARM_PROPRIETARY_KHR, VK_DRIVER_ID_GOOGLE_SWIFTSHADER_KHR, VK_DRIVER_ID_GGP_PROPRIETARY_KHR, VK_DRIVER_ID_BROADCOM_PROPRIETARY_KHR, };
const std::vector<VkShaderFloatControlsIndependence> AllVkShaderFloatControlsIndependenceEnums = {VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY, VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL, VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE, VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY_KHR, VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL_KHR, VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE_KHR, };
const std::vector<VkSamplerReductionMode> AllVkSamplerReductionModeEnums = {VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE, VK_SAMPLER_REDUCTION_MODE_MIN, VK_SAMPLER_REDUCTION_MODE_MAX, VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT, VK_SAMPLER_REDUCTION_MODE_MIN_EXT, VK_SAMPLER_REDUCTION_MODE_MAX_EXT, };
const std::vector<VkSemaphoreType> AllVkSemaphoreTypeEnums = {VK_SEMAPHORE_TYPE_BINARY, VK_SEMAPHORE_TYPE_TIMELINE, VK_SEMAPHORE_TYPE_BINARY_KHR, VK_SEMAPHORE_TYPE_TIMELINE_KHR, };
-const std::vector<VkColorSpaceKHR> AllVkColorSpaceKHREnums = {VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, VK_COLORSPACE_SRGB_NONLINEAR_KHR, VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT, VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT, VK_COLOR_SPACE_DISPLAY_P3_LINEAR_EXT, VK_COLOR_SPACE_DCI_P3_NONLINEAR_EXT, VK_COLOR_SPACE_BT709_LINEAR_EXT, VK_COLOR_SPACE_BT709_NONLINEAR_EXT, VK_COLOR_SPACE_BT2020_LINEAR_EXT, VK_COLOR_SPACE_HDR10_ST2084_EXT, VK_COLOR_SPACE_DOLBYVISION_EXT, VK_COLOR_SPACE_HDR10_HLG_EXT, VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT, VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT, VK_COLOR_SPACE_PASS_THROUGH_EXT, VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT, VK_COLOR_SPACE_DCI_P3_LINEAR_EXT, VK_COLOR_SPACE_DISPLAY_NATIVE_AMD, };
const std::vector<VkPresentModeKHR> AllVkPresentModeKHREnums = {VK_PRESENT_MODE_IMMEDIATE_KHR, VK_PRESENT_MODE_MAILBOX_KHR, VK_PRESENT_MODE_FIFO_KHR, VK_PRESENT_MODE_FIFO_RELAXED_KHR, VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR, VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR, };
-const std::vector<VkDescriptorUpdateTemplateTypeKHR> AllVkDescriptorUpdateTemplateTypeKHREnums = {VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET, VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET_KHR, VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, };
+const std::vector<VkColorSpaceKHR> AllVkColorSpaceKHREnums = {VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, VK_COLORSPACE_SRGB_NONLINEAR_KHR, VK_COLOR_SPACE_DISPLAY_P3_NONLINEAR_EXT, VK_COLOR_SPACE_EXTENDED_SRGB_LINEAR_EXT, VK_COLOR_SPACE_DISPLAY_P3_LINEAR_EXT, VK_COLOR_SPACE_DCI_P3_NONLINEAR_EXT, VK_COLOR_SPACE_BT709_LINEAR_EXT, VK_COLOR_SPACE_BT709_NONLINEAR_EXT, VK_COLOR_SPACE_BT2020_LINEAR_EXT, VK_COLOR_SPACE_HDR10_ST2084_EXT, VK_COLOR_SPACE_DOLBYVISION_EXT, VK_COLOR_SPACE_HDR10_HLG_EXT, VK_COLOR_SPACE_ADOBERGB_LINEAR_EXT, VK_COLOR_SPACE_ADOBERGB_NONLINEAR_EXT, VK_COLOR_SPACE_PASS_THROUGH_EXT, VK_COLOR_SPACE_EXTENDED_SRGB_NONLINEAR_EXT, VK_COLOR_SPACE_DCI_P3_LINEAR_EXT, VK_COLOR_SPACE_DISPLAY_NATIVE_AMD, };
+const std::vector<VkDescriptorUpdateTemplateTypeKHR> AllVkDescriptorUpdateTemplateTypeKHREnums = {VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET, VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET_KHR, VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, };
const std::vector<VkPerformanceCounterUnitKHR> AllVkPerformanceCounterUnitKHREnums = {VK_PERFORMANCE_COUNTER_UNIT_GENERIC_KHR, VK_PERFORMANCE_COUNTER_UNIT_PERCENTAGE_KHR, VK_PERFORMANCE_COUNTER_UNIT_NANOSECONDS_KHR, VK_PERFORMANCE_COUNTER_UNIT_BYTES_KHR, VK_PERFORMANCE_COUNTER_UNIT_BYTES_PER_SECOND_KHR, VK_PERFORMANCE_COUNTER_UNIT_KELVIN_KHR, VK_PERFORMANCE_COUNTER_UNIT_WATTS_KHR, VK_PERFORMANCE_COUNTER_UNIT_VOLTS_KHR, VK_PERFORMANCE_COUNTER_UNIT_AMPS_KHR, VK_PERFORMANCE_COUNTER_UNIT_HERTZ_KHR, VK_PERFORMANCE_COUNTER_UNIT_CYCLES_KHR, };
const std::vector<VkPerformanceCounterScopeKHR> AllVkPerformanceCounterScopeKHREnums = {VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR, VK_PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR, VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_KHR, VK_QUERY_SCOPE_COMMAND_BUFFER_KHR, VK_QUERY_SCOPE_RENDER_PASS_KHR, VK_QUERY_SCOPE_COMMAND_KHR, };
const std::vector<VkPerformanceCounterStorageKHR> AllVkPerformanceCounterStorageKHREnums = {VK_PERFORMANCE_COUNTER_STORAGE_INT32_KHR, VK_PERFORMANCE_COUNTER_STORAGE_INT64_KHR, VK_PERFORMANCE_COUNTER_STORAGE_UINT32_KHR, VK_PERFORMANCE_COUNTER_STORAGE_UINT64_KHR, VK_PERFORMANCE_COUNTER_STORAGE_FLOAT32_KHR, VK_PERFORMANCE_COUNTER_STORAGE_FLOAT64_KHR, };
@@ -177,7 +177,7 @@
const std::vector<VkSamplerYcbcrModelConversionKHR> AllVkSamplerYcbcrModelConversionKHREnums = {VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY, VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY, VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709, VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601, VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020, VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY_KHR, VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY_KHR, VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709_KHR, VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601_KHR, VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020_KHR, };
const std::vector<VkSamplerYcbcrRangeKHR> AllVkSamplerYcbcrRangeKHREnums = {VK_SAMPLER_YCBCR_RANGE_ITU_FULL, VK_SAMPLER_YCBCR_RANGE_ITU_NARROW, VK_SAMPLER_YCBCR_RANGE_ITU_FULL_KHR, VK_SAMPLER_YCBCR_RANGE_ITU_NARROW_KHR, };
const std::vector<VkChromaLocationKHR> AllVkChromaLocationKHREnums = {VK_CHROMA_LOCATION_COSITED_EVEN, VK_CHROMA_LOCATION_MIDPOINT, VK_CHROMA_LOCATION_COSITED_EVEN_KHR, VK_CHROMA_LOCATION_MIDPOINT_KHR, };
-const std::vector<VkDriverIdKHR> AllVkDriverIdKHREnums = {VK_DRIVER_ID_AMD_PROPRIETARY, VK_DRIVER_ID_AMD_OPEN_SOURCE, VK_DRIVER_ID_MESA_RADV, VK_DRIVER_ID_NVIDIA_PROPRIETARY, VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS, VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA, VK_DRIVER_ID_IMAGINATION_PROPRIETARY, VK_DRIVER_ID_QUALCOMM_PROPRIETARY, VK_DRIVER_ID_ARM_PROPRIETARY, VK_DRIVER_ID_GOOGLE_SWIFTSHADER, VK_DRIVER_ID_GGP_PROPRIETARY, VK_DRIVER_ID_BROADCOM_PROPRIETARY, VK_DRIVER_ID_AMD_PROPRIETARY_KHR, VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR, VK_DRIVER_ID_MESA_RADV_KHR, VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR, VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS_KHR, VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA_KHR, VK_DRIVER_ID_IMAGINATION_PROPRIETARY_KHR, VK_DRIVER_ID_QUALCOMM_PROPRIETARY_KHR, VK_DRIVER_ID_ARM_PROPRIETARY_KHR, VK_DRIVER_ID_GOOGLE_SWIFTSHADER_KHR, VK_DRIVER_ID_GGP_PROPRIETARY_KHR, VK_DRIVER_ID_BROADCOM_PROPRIETARY_KHR, };
+const std::vector<VkDriverIdKHR> AllVkDriverIdKHREnums = {VK_DRIVER_ID_AMD_PROPRIETARY, VK_DRIVER_ID_AMD_OPEN_SOURCE, VK_DRIVER_ID_MESA_RADV, VK_DRIVER_ID_NVIDIA_PROPRIETARY, VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS, VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA, VK_DRIVER_ID_IMAGINATION_PROPRIETARY, VK_DRIVER_ID_QUALCOMM_PROPRIETARY, VK_DRIVER_ID_ARM_PROPRIETARY, VK_DRIVER_ID_GOOGLE_SWIFTSHADER, VK_DRIVER_ID_GGP_PROPRIETARY, VK_DRIVER_ID_BROADCOM_PROPRIETARY, VK_DRIVER_ID_MESA_LLVMPIPE, VK_DRIVER_ID_MOLTENVK, VK_DRIVER_ID_AMD_PROPRIETARY_KHR, VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR, VK_DRIVER_ID_MESA_RADV_KHR, VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR, VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS_KHR, VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA_KHR, VK_DRIVER_ID_IMAGINATION_PROPRIETARY_KHR, VK_DRIVER_ID_QUALCOMM_PROPRIETARY_KHR, VK_DRIVER_ID_ARM_PROPRIETARY_KHR, VK_DRIVER_ID_GOOGLE_SWIFTSHADER_KHR, VK_DRIVER_ID_GGP_PROPRIETARY_KHR, VK_DRIVER_ID_BROADCOM_PROPRIETARY_KHR, };
const std::vector<VkShaderFloatControlsIndependenceKHR> AllVkShaderFloatControlsIndependenceKHREnums = {VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY, VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL, VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE, VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY_KHR, VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_ALL_KHR, VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE_KHR, };
const std::vector<VkSemaphoreTypeKHR> AllVkSemaphoreTypeKHREnums = {VK_SEMAPHORE_TYPE_BINARY, VK_SEMAPHORE_TYPE_TIMELINE, VK_SEMAPHORE_TYPE_BINARY_KHR, VK_SEMAPHORE_TYPE_TIMELINE_KHR, };
const std::vector<VkPipelineExecutableStatisticFormatKHR> AllVkPipelineExecutableStatisticFormatKHREnums = {VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_BOOL32_KHR, VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_INT64_KHR, VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_UINT64_KHR, VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_FLOAT64_KHR, };
@@ -236,8 +236,10 @@
bool skip = false;
switch(header->sType) {
+ // No Validation code for VkPhysicalDeviceSubgroupProperties structure members -- Covers VUID-VkPhysicalDeviceSubgroupProperties-sType-sType
+
// Validation code for VkPhysicalDevice16BitStorageFeatures structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES: { // Covers VUID-VkPhysicalDevice16BitStorageFeatures-sType-sType
VkPhysicalDevice16BitStorageFeatures *structure = (VkPhysicalDevice16BitStorageFeatures *) header;
skip |= validate_bool32("VkPhysicalDevice16BitStorageFeatures", "storageBuffer16BitAccess", structure->storageBuffer16BitAccess);
@@ -248,14 +250,18 @@
skip |= validate_bool32("VkPhysicalDevice16BitStorageFeatures", "storageInputOutput16", structure->storageInputOutput16);
} break;
+ // No Validation code for VkMemoryDedicatedRequirements structure members -- Covers VUID-VkMemoryDedicatedRequirements-sType-sType
+
+ // No Validation code for VkMemoryDedicatedAllocateInfo structure members -- Covers VUID-VkMemoryDedicatedAllocateInfo-sType-sType
+
// Validation code for VkMemoryAllocateFlagsInfo structure members
- case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO: {
+ case VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO: { // Covers VUID-VkMemoryAllocateFlagsInfo-sType-sType
VkMemoryAllocateFlagsInfo *structure = (VkMemoryAllocateFlagsInfo *) header;
skip |= validate_flags("VkMemoryAllocateFlagsInfo", "flags", "VkMemoryAllocateFlagBits", AllVkMemoryAllocateFlagBits, structure->flags, kOptionalFlags, "VUID-VkMemoryAllocateFlagsInfo-flags-parameter");
} break;
// Validation code for VkDeviceGroupRenderPassBeginInfo structure members
- case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO: {
+ case VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO: { // Covers VUID-VkDeviceGroupRenderPassBeginInfo-sType-sType
VkDeviceGroupRenderPassBeginInfo *structure = (VkDeviceGroupRenderPassBeginInfo *) header;
skip |= validate_array("VkDeviceGroupRenderPassBeginInfo", "deviceRenderAreaCount", "pDeviceRenderAreas", structure->deviceRenderAreaCount, &structure->pDeviceRenderAreas, false, true, kVUIDUndefined, "VUID-VkDeviceGroupRenderPassBeginInfo-pDeviceRenderAreas-parameter");
@@ -267,8 +273,10 @@
}
} break;
+ // No Validation code for VkDeviceGroupCommandBufferBeginInfo structure members -- Covers VUID-VkDeviceGroupCommandBufferBeginInfo-sType-sType
+
// Validation code for VkDeviceGroupSubmitInfo structure members
- case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO: {
+ case VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO: { // Covers VUID-VkDeviceGroupSubmitInfo-sType-sType
VkDeviceGroupSubmitInfo *structure = (VkDeviceGroupSubmitInfo *) header;
skip |= validate_array("VkDeviceGroupSubmitInfo", "waitSemaphoreCount", "pWaitSemaphoreDeviceIndices", structure->waitSemaphoreCount, &structure->pWaitSemaphoreDeviceIndices, false, true, kVUIDUndefined, "VUID-VkDeviceGroupSubmitInfo-pWaitSemaphoreDeviceIndices-parameter");
@@ -277,14 +285,16 @@
skip |= validate_array("VkDeviceGroupSubmitInfo", "signalSemaphoreCount", "pSignalSemaphoreDeviceIndices", structure->signalSemaphoreCount, &structure->pSignalSemaphoreDeviceIndices, false, true, kVUIDUndefined, "VUID-VkDeviceGroupSubmitInfo-pSignalSemaphoreDeviceIndices-parameter");
} break;
+ // No Validation code for VkDeviceGroupBindSparseInfo structure members -- Covers VUID-VkDeviceGroupBindSparseInfo-sType-sType
+
// Validation code for VkBindBufferMemoryDeviceGroupInfo structure members
- case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO: {
+ case VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO: { // Covers VUID-VkBindBufferMemoryDeviceGroupInfo-sType-sType
VkBindBufferMemoryDeviceGroupInfo *structure = (VkBindBufferMemoryDeviceGroupInfo *) header;
skip |= validate_array("VkBindBufferMemoryDeviceGroupInfo", "deviceIndexCount", "pDeviceIndices", structure->deviceIndexCount, &structure->pDeviceIndices, false, true, kVUIDUndefined, "VUID-VkBindBufferMemoryDeviceGroupInfo-pDeviceIndices-parameter");
} break;
// Validation code for VkBindImageMemoryDeviceGroupInfo structure members
- case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO: {
+ case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO: { // Covers VUID-VkBindImageMemoryDeviceGroupInfo-sType-sType
VkBindImageMemoryDeviceGroupInfo *structure = (VkBindImageMemoryDeviceGroupInfo *) header;
skip |= validate_array("VkBindImageMemoryDeviceGroupInfo", "deviceIndexCount", "pDeviceIndices", structure->deviceIndexCount, &structure->pDeviceIndices, false, true, kVUIDUndefined, "VUID-VkBindImageMemoryDeviceGroupInfo-pDeviceIndices-parameter");
@@ -299,13 +309,13 @@
} break;
// Validation code for VkDeviceGroupDeviceCreateInfo structure members
- case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO: {
+ case VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO: { // Covers VUID-VkDeviceGroupDeviceCreateInfo-sType-sType
VkDeviceGroupDeviceCreateInfo *structure = (VkDeviceGroupDeviceCreateInfo *) header;
skip |= validate_array("VkDeviceGroupDeviceCreateInfo", "physicalDeviceCount", "pPhysicalDevices", structure->physicalDeviceCount, &structure->pPhysicalDevices, false, true, kVUIDUndefined, "VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-parameter");
} break;
// Validation code for VkPhysicalDeviceFeatures2 structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2: { // Covers VUID-VkPhysicalDeviceFeatures2-sType-sType
VkPhysicalDeviceFeatures2 *structure = (VkPhysicalDeviceFeatures2 *) header;
skip |= validate_bool32("VkPhysicalDeviceFeatures2", "features.robustBufferAccess", structure->features.robustBufferAccess);
@@ -418,8 +428,10 @@
skip |= validate_bool32("VkPhysicalDeviceFeatures2", "features.inheritedQueries", structure->features.inheritedQueries);
} break;
+ // No Validation code for VkPhysicalDevicePointClippingProperties structure members -- Covers VUID-VkPhysicalDevicePointClippingProperties-sType-sType
+
// Validation code for VkRenderPassInputAttachmentAspectCreateInfo structure members
- case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO: {
+ case VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO: { // Covers VUID-VkRenderPassInputAttachmentAspectCreateInfo-sType-sType
VkRenderPassInputAttachmentAspectCreateInfo *structure = (VkRenderPassInputAttachmentAspectCreateInfo *) header;
skip |= validate_array("VkRenderPassInputAttachmentAspectCreateInfo", "aspectReferenceCount", "pAspectReferences", structure->aspectReferenceCount, &structure->pAspectReferences, true, true, "VUID-VkRenderPassInputAttachmentAspectCreateInfo-aspectReferenceCount-arraylength", "VUID-VkRenderPassInputAttachmentAspectCreateInfo-pAspectReferences-parameter");
@@ -433,19 +445,19 @@
} break;
// Validation code for VkImageViewUsageCreateInfo structure members
- case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO: {
+ case VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO: { // Covers VUID-VkImageViewUsageCreateInfo-sType-sType
VkImageViewUsageCreateInfo *structure = (VkImageViewUsageCreateInfo *) header;
skip |= validate_flags("VkImageViewUsageCreateInfo", "usage", "VkImageUsageFlagBits", AllVkImageUsageFlagBits, structure->usage, kRequiredFlags, "VUID-VkImageViewUsageCreateInfo-usage-parameter", "VUID-VkImageViewUsageCreateInfo-usage-requiredbitmask");
} break;
// Validation code for VkPipelineTessellationDomainOriginStateCreateInfo structure members
- case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO: {
+ case VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO: { // Covers VUID-VkPipelineTessellationDomainOriginStateCreateInfo-sType-sType
VkPipelineTessellationDomainOriginStateCreateInfo *structure = (VkPipelineTessellationDomainOriginStateCreateInfo *) header;
skip |= validate_ranged_enum("VkPipelineTessellationDomainOriginStateCreateInfo", "domainOrigin", "VkTessellationDomainOrigin", AllVkTessellationDomainOriginEnums, structure->domainOrigin, "VUID-VkPipelineTessellationDomainOriginStateCreateInfo-domainOrigin-parameter");
} break;
// Validation code for VkRenderPassMultiviewCreateInfo structure members
- case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO: {
+ case VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO: { // Covers VUID-VkRenderPassMultiviewCreateInfo-sType-sType
VkRenderPassMultiviewCreateInfo *structure = (VkRenderPassMultiviewCreateInfo *) header;
skip |= validate_array("VkRenderPassMultiviewCreateInfo", "subpassCount", "pViewMasks", structure->subpassCount, &structure->pViewMasks, false, true, kVUIDUndefined, "VUID-VkRenderPassMultiviewCreateInfo-pViewMasks-parameter");
@@ -455,7 +467,7 @@
} break;
// Validation code for VkPhysicalDeviceMultiviewFeatures structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES: { // Covers VUID-VkPhysicalDeviceMultiviewFeatures-sType-sType
VkPhysicalDeviceMultiviewFeatures *structure = (VkPhysicalDeviceMultiviewFeatures *) header;
skip |= validate_bool32("VkPhysicalDeviceMultiviewFeatures", "multiview", structure->multiview);
@@ -464,8 +476,10 @@
skip |= validate_bool32("VkPhysicalDeviceMultiviewFeatures", "multiviewTessellationShader", structure->multiviewTessellationShader);
} break;
+ // No Validation code for VkPhysicalDeviceMultiviewProperties structure members -- Covers VUID-VkPhysicalDeviceMultiviewProperties-sType-sType
+
// Validation code for VkPhysicalDeviceVariablePointersFeatures structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES: { // Covers VUID-VkPhysicalDeviceVariablePointersFeatures-sType-sType
VkPhysicalDeviceVariablePointersFeatures *structure = (VkPhysicalDeviceVariablePointersFeatures *) header;
skip |= validate_bool32("VkPhysicalDeviceVariablePointersFeatures", "variablePointersStorageBuffer", structure->variablePointersStorageBuffer);
@@ -473,85 +487,95 @@
} break;
// Validation code for VkPhysicalDeviceProtectedMemoryFeatures structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES: { // Covers VUID-VkPhysicalDeviceProtectedMemoryFeatures-sType-sType
VkPhysicalDeviceProtectedMemoryFeatures *structure = (VkPhysicalDeviceProtectedMemoryFeatures *) header;
skip |= validate_bool32("VkPhysicalDeviceProtectedMemoryFeatures", "protectedMemory", structure->protectedMemory);
} break;
+ // No Validation code for VkPhysicalDeviceProtectedMemoryProperties structure members -- Covers VUID-VkPhysicalDeviceProtectedMemoryProperties-sType-sType
+
// Validation code for VkProtectedSubmitInfo structure members
- case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO: {
+ case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO: { // Covers VUID-VkProtectedSubmitInfo-sType-sType
VkProtectedSubmitInfo *structure = (VkProtectedSubmitInfo *) header;
skip |= validate_bool32("VkProtectedSubmitInfo", "protectedSubmit", structure->protectedSubmit);
} break;
// Validation code for VkSamplerYcbcrConversionInfo structure members
- case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO: {
+ case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO: { // Covers VUID-VkSamplerYcbcrConversionInfo-sType-sType
VkSamplerYcbcrConversionInfo *structure = (VkSamplerYcbcrConversionInfo *) header;
skip |= validate_required_handle("VkSamplerYcbcrConversionInfo", "conversion", structure->conversion);
} break;
// Validation code for VkBindImagePlaneMemoryInfo structure members
- case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO: {
+ case VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO: { // Covers VUID-VkBindImagePlaneMemoryInfo-sType-sType
VkBindImagePlaneMemoryInfo *structure = (VkBindImagePlaneMemoryInfo *) header;
skip |= validate_flags("VkBindImagePlaneMemoryInfo", "planeAspect", "VkImageAspectFlagBits", AllVkImageAspectFlagBits, structure->planeAspect, kRequiredSingleBit, "VUID-VkBindImagePlaneMemoryInfo-planeAspect-parameter", "VUID-VkBindImagePlaneMemoryInfo-planeAspect-parameter");
} break;
// Validation code for VkImagePlaneMemoryRequirementsInfo structure members
- case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO: {
+ case VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO: { // Covers VUID-VkImagePlaneMemoryRequirementsInfo-sType-sType
VkImagePlaneMemoryRequirementsInfo *structure = (VkImagePlaneMemoryRequirementsInfo *) header;
skip |= validate_flags("VkImagePlaneMemoryRequirementsInfo", "planeAspect", "VkImageAspectFlagBits", AllVkImageAspectFlagBits, structure->planeAspect, kRequiredSingleBit, "VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-parameter", "VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-parameter");
} break;
// Validation code for VkPhysicalDeviceSamplerYcbcrConversionFeatures structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES: { // Covers VUID-VkPhysicalDeviceSamplerYcbcrConversionFeatures-sType-sType
VkPhysicalDeviceSamplerYcbcrConversionFeatures *structure = (VkPhysicalDeviceSamplerYcbcrConversionFeatures *) header;
skip |= validate_bool32("VkPhysicalDeviceSamplerYcbcrConversionFeatures", "samplerYcbcrConversion", structure->samplerYcbcrConversion);
} break;
+ // No Validation code for VkSamplerYcbcrConversionImageFormatProperties structure members -- Covers VUID-VkSamplerYcbcrConversionImageFormatProperties-sType-sType
+
// Validation code for VkPhysicalDeviceExternalImageFormatInfo structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO: { // Covers VUID-VkPhysicalDeviceExternalImageFormatInfo-sType-sType
VkPhysicalDeviceExternalImageFormatInfo *structure = (VkPhysicalDeviceExternalImageFormatInfo *) header;
skip |= validate_flags("VkPhysicalDeviceExternalImageFormatInfo", "handleType", "VkExternalMemoryHandleTypeFlagBits", AllVkExternalMemoryHandleTypeFlagBits, structure->handleType, kOptionalSingleBit, "VUID-VkPhysicalDeviceExternalImageFormatInfo-handleType-parameter");
} break;
+ // No Validation code for VkExternalImageFormatProperties structure members -- Covers VUID-VkExternalImageFormatProperties-sType-sType
+
+ // No Validation code for VkPhysicalDeviceIDProperties structure members -- Covers VUID-VkPhysicalDeviceIDProperties-sType-sType
+
// Validation code for VkExternalMemoryImageCreateInfo structure members
- case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO: {
+ case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO: { // Covers VUID-VkExternalMemoryImageCreateInfo-sType-sType
VkExternalMemoryImageCreateInfo *structure = (VkExternalMemoryImageCreateInfo *) header;
skip |= validate_flags("VkExternalMemoryImageCreateInfo", "handleTypes", "VkExternalMemoryHandleTypeFlagBits", AllVkExternalMemoryHandleTypeFlagBits, structure->handleTypes, kRequiredFlags, "VUID-VkExternalMemoryImageCreateInfo-handleTypes-parameter", "VUID-VkExternalMemoryImageCreateInfo-handleTypes-requiredbitmask");
} break;
// Validation code for VkExternalMemoryBufferCreateInfo structure members
- case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO: {
+ case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO: { // Covers VUID-VkExternalMemoryBufferCreateInfo-sType-sType
VkExternalMemoryBufferCreateInfo *structure = (VkExternalMemoryBufferCreateInfo *) header;
skip |= validate_flags("VkExternalMemoryBufferCreateInfo", "handleTypes", "VkExternalMemoryHandleTypeFlagBits", AllVkExternalMemoryHandleTypeFlagBits, structure->handleTypes, kOptionalFlags, "VUID-VkExternalMemoryBufferCreateInfo-handleTypes-parameter");
} break;
// Validation code for VkExportMemoryAllocateInfo structure members
- case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO: {
+ case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO: { // Covers VUID-VkExportMemoryAllocateInfo-sType-sType
VkExportMemoryAllocateInfo *structure = (VkExportMemoryAllocateInfo *) header;
skip |= validate_flags("VkExportMemoryAllocateInfo", "handleTypes", "VkExternalMemoryHandleTypeFlagBits", AllVkExternalMemoryHandleTypeFlagBits, structure->handleTypes, kOptionalFlags, "VUID-VkExportMemoryAllocateInfo-handleTypes-parameter");
} break;
// Validation code for VkExportFenceCreateInfo structure members
- case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO: {
+ case VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO: { // Covers VUID-VkExportFenceCreateInfo-sType-sType
VkExportFenceCreateInfo *structure = (VkExportFenceCreateInfo *) header;
skip |= validate_flags("VkExportFenceCreateInfo", "handleTypes", "VkExternalFenceHandleTypeFlagBits", AllVkExternalFenceHandleTypeFlagBits, structure->handleTypes, kOptionalFlags, "VUID-VkExportFenceCreateInfo-handleTypes-parameter");
} break;
// Validation code for VkExportSemaphoreCreateInfo structure members
- case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO: {
+ case VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO: { // Covers VUID-VkExportSemaphoreCreateInfo-sType-sType
VkExportSemaphoreCreateInfo *structure = (VkExportSemaphoreCreateInfo *) header;
skip |= validate_flags("VkExportSemaphoreCreateInfo", "handleTypes", "VkExternalSemaphoreHandleTypeFlagBits", AllVkExternalSemaphoreHandleTypeFlagBits, structure->handleTypes, kOptionalFlags, "VUID-VkExportSemaphoreCreateInfo-handleTypes-parameter");
} break;
+ // No Validation code for VkPhysicalDeviceMaintenance3Properties structure members -- Covers VUID-VkPhysicalDeviceMaintenance3Properties-sType-sType
+
// Validation code for VkPhysicalDeviceShaderDrawParametersFeatures structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES: { // Covers VUID-VkPhysicalDeviceShaderDrawParametersFeatures-sType-sType
VkPhysicalDeviceShaderDrawParametersFeatures *structure = (VkPhysicalDeviceShaderDrawParametersFeatures *) header;
skip |= validate_bool32("VkPhysicalDeviceShaderDrawParametersFeatures", "shaderDrawParameters", structure->shaderDrawParameters);
} break;
// Validation code for VkPhysicalDeviceVulkan11Features structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES: { // Covers VUID-VkPhysicalDeviceVulkan11Features-sType-sType
VkPhysicalDeviceVulkan11Features *structure = (VkPhysicalDeviceVulkan11Features *) header;
skip |= validate_bool32("VkPhysicalDeviceVulkan11Features", "storageBuffer16BitAccess", structure->storageBuffer16BitAccess);
@@ -578,18 +602,10 @@
skip |= validate_bool32("VkPhysicalDeviceVulkan11Features", "shaderDrawParameters", structure->shaderDrawParameters);
} break;
- // Validation code for VkPhysicalDeviceVulkan11Properties structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: {
- VkPhysicalDeviceVulkan11Properties *structure = (VkPhysicalDeviceVulkan11Properties *) header;
- skip |= validate_bool32("VkPhysicalDeviceVulkan11Properties", "deviceLUIDValid", structure->deviceLUIDValid);
-
- skip |= validate_ranged_enum("VkPhysicalDeviceVulkan11Properties", "pointClippingBehavior", "VkPointClippingBehavior", AllVkPointClippingBehaviorEnums, structure->pointClippingBehavior, "VUID-VkPhysicalDeviceVulkan11Properties-pointClippingBehavior-parameter");
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan11Properties", "protectedNoFault", structure->protectedNoFault);
- } break;
+ // No Validation code for VkPhysicalDeviceVulkan11Properties structure members -- Covers VUID-VkPhysicalDeviceVulkan11Properties-sType-sType
// Validation code for VkPhysicalDeviceVulkan12Features structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES: { // Covers VUID-VkPhysicalDeviceVulkan12Features-sType-sType
VkPhysicalDeviceVulkan12Features *structure = (VkPhysicalDeviceVulkan12Features *) header;
skip |= validate_bool32("VkPhysicalDeviceVulkan12Features", "samplerMirrorClampToEdge", structure->samplerMirrorClampToEdge);
@@ -686,82 +702,16 @@
skip |= validate_bool32("VkPhysicalDeviceVulkan12Features", "subgroupBroadcastDynamicId", structure->subgroupBroadcastDynamicId);
} break;
- // Validation code for VkPhysicalDeviceVulkan12Properties structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: {
- VkPhysicalDeviceVulkan12Properties *structure = (VkPhysicalDeviceVulkan12Properties *) header;
- skip |= validate_ranged_enum("VkPhysicalDeviceVulkan12Properties", "driverID", "VkDriverId", AllVkDriverIdEnums, structure->driverID, "VUID-VkPhysicalDeviceVulkan12Properties-driverID-parameter");
-
- skip |= validate_ranged_enum("VkPhysicalDeviceVulkan12Properties", "denormBehaviorIndependence", "VkShaderFloatControlsIndependence", AllVkShaderFloatControlsIndependenceEnums, structure->denormBehaviorIndependence, "VUID-VkPhysicalDeviceVulkan12Properties-denormBehaviorIndependence-parameter");
-
- skip |= validate_ranged_enum("VkPhysicalDeviceVulkan12Properties", "roundingModeIndependence", "VkShaderFloatControlsIndependence", AllVkShaderFloatControlsIndependenceEnums, structure->roundingModeIndependence, "VUID-VkPhysicalDeviceVulkan12Properties-roundingModeIndependence-parameter");
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "shaderSignedZeroInfNanPreserveFloat16", structure->shaderSignedZeroInfNanPreserveFloat16);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "shaderSignedZeroInfNanPreserveFloat32", structure->shaderSignedZeroInfNanPreserveFloat32);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "shaderSignedZeroInfNanPreserveFloat64", structure->shaderSignedZeroInfNanPreserveFloat64);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "shaderDenormPreserveFloat16", structure->shaderDenormPreserveFloat16);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "shaderDenormPreserveFloat32", structure->shaderDenormPreserveFloat32);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "shaderDenormPreserveFloat64", structure->shaderDenormPreserveFloat64);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "shaderDenormFlushToZeroFloat16", structure->shaderDenormFlushToZeroFloat16);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "shaderDenormFlushToZeroFloat32", structure->shaderDenormFlushToZeroFloat32);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "shaderDenormFlushToZeroFloat64", structure->shaderDenormFlushToZeroFloat64);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "shaderRoundingModeRTEFloat16", structure->shaderRoundingModeRTEFloat16);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "shaderRoundingModeRTEFloat32", structure->shaderRoundingModeRTEFloat32);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "shaderRoundingModeRTEFloat64", structure->shaderRoundingModeRTEFloat64);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "shaderRoundingModeRTZFloat16", structure->shaderRoundingModeRTZFloat16);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "shaderRoundingModeRTZFloat32", structure->shaderRoundingModeRTZFloat32);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "shaderRoundingModeRTZFloat64", structure->shaderRoundingModeRTZFloat64);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "shaderUniformBufferArrayNonUniformIndexingNative", structure->shaderUniformBufferArrayNonUniformIndexingNative);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "shaderSampledImageArrayNonUniformIndexingNative", structure->shaderSampledImageArrayNonUniformIndexingNative);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "shaderStorageBufferArrayNonUniformIndexingNative", structure->shaderStorageBufferArrayNonUniformIndexingNative);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "shaderStorageImageArrayNonUniformIndexingNative", structure->shaderStorageImageArrayNonUniformIndexingNative);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "shaderInputAttachmentArrayNonUniformIndexingNative", structure->shaderInputAttachmentArrayNonUniformIndexingNative);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "robustBufferAccessUpdateAfterBind", structure->robustBufferAccessUpdateAfterBind);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "quadDivergentImplicitLod", structure->quadDivergentImplicitLod);
-
- skip |= validate_flags("VkPhysicalDeviceVulkan12Properties", "supportedDepthResolveModes", "VkResolveModeFlagBits", AllVkResolveModeFlagBits, structure->supportedDepthResolveModes, kRequiredFlags, "VUID-VkPhysicalDeviceVulkan12Properties-supportedDepthResolveModes-parameter", "VUID-VkPhysicalDeviceVulkan12Properties-supportedDepthResolveModes-requiredbitmask");
-
- skip |= validate_flags("VkPhysicalDeviceVulkan12Properties", "supportedStencilResolveModes", "VkResolveModeFlagBits", AllVkResolveModeFlagBits, structure->supportedStencilResolveModes, kRequiredFlags, "VUID-VkPhysicalDeviceVulkan12Properties-supportedStencilResolveModes-parameter", "VUID-VkPhysicalDeviceVulkan12Properties-supportedStencilResolveModes-requiredbitmask");
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "independentResolveNone", structure->independentResolveNone);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "independentResolve", structure->independentResolve);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "filterMinmaxSingleComponentFormats", structure->filterMinmaxSingleComponentFormats);
-
- skip |= validate_bool32("VkPhysicalDeviceVulkan12Properties", "filterMinmaxImageComponentMapping", structure->filterMinmaxImageComponentMapping);
-
- skip |= validate_flags("VkPhysicalDeviceVulkan12Properties", "framebufferIntegerColorSampleCounts", "VkSampleCountFlagBits", AllVkSampleCountFlagBits, structure->framebufferIntegerColorSampleCounts, kOptionalFlags, "VUID-VkPhysicalDeviceVulkan12Properties-framebufferIntegerColorSampleCounts-parameter");
- } break;
+ // No Validation code for VkPhysicalDeviceVulkan12Properties structure members -- Covers VUID-VkPhysicalDeviceVulkan12Properties-sType-sType
// Validation code for VkImageFormatListCreateInfo structure members
- case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO: {
+ case VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO: { // Covers VUID-VkImageFormatListCreateInfo-sType-sType
VkImageFormatListCreateInfo *structure = (VkImageFormatListCreateInfo *) header;
skip |= validate_ranged_enum_array("VkImageFormatListCreateInfo", "viewFormatCount", "pViewFormats", "VkFormat", AllVkFormatEnums, structure->viewFormatCount, structure->pViewFormats, false, true);
} break;
// Validation code for VkPhysicalDevice8BitStorageFeatures structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES: { // Covers VUID-VkPhysicalDevice8BitStorageFeatures-sType-sType
VkPhysicalDevice8BitStorageFeatures *structure = (VkPhysicalDevice8BitStorageFeatures *) header;
skip |= validate_bool32("VkPhysicalDevice8BitStorageFeatures", "storageBuffer8BitAccess", structure->storageBuffer8BitAccess);
@@ -770,8 +720,10 @@
skip |= validate_bool32("VkPhysicalDevice8BitStorageFeatures", "storagePushConstant8", structure->storagePushConstant8);
} break;
+ // No Validation code for VkPhysicalDeviceDriverProperties structure members -- Covers VUID-VkPhysicalDeviceDriverProperties-sType-sType
+
// Validation code for VkPhysicalDeviceShaderAtomicInt64Features structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES: { // Covers VUID-VkPhysicalDeviceShaderAtomicInt64Features-sType-sType
VkPhysicalDeviceShaderAtomicInt64Features *structure = (VkPhysicalDeviceShaderAtomicInt64Features *) header;
skip |= validate_bool32("VkPhysicalDeviceShaderAtomicInt64Features", "shaderBufferInt64Atomics", structure->shaderBufferInt64Atomics);
@@ -779,21 +731,23 @@
} break;
// Validation code for VkPhysicalDeviceShaderFloat16Int8Features structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES: { // Covers VUID-VkPhysicalDeviceShaderFloat16Int8Features-sType-sType
VkPhysicalDeviceShaderFloat16Int8Features *structure = (VkPhysicalDeviceShaderFloat16Int8Features *) header;
skip |= validate_bool32("VkPhysicalDeviceShaderFloat16Int8Features", "shaderFloat16", structure->shaderFloat16);
skip |= validate_bool32("VkPhysicalDeviceShaderFloat16Int8Features", "shaderInt8", structure->shaderInt8);
} break;
+ // No Validation code for VkPhysicalDeviceFloatControlsProperties structure members -- Covers VUID-VkPhysicalDeviceFloatControlsProperties-sType-sType
+
// Validation code for VkDescriptorSetLayoutBindingFlagsCreateInfo structure members
- case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO: {
+ case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO: { // Covers VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-sType-sType
VkDescriptorSetLayoutBindingFlagsCreateInfo *structure = (VkDescriptorSetLayoutBindingFlagsCreateInfo *) header;
skip |= validate_flags_array("VkDescriptorSetLayoutBindingFlagsCreateInfo", "bindingCount", "pBindingFlags", "VkDescriptorBindingFlagBits", AllVkDescriptorBindingFlagBits, structure->bindingCount, structure->pBindingFlags, false, false);
} break;
// Validation code for VkPhysicalDeviceDescriptorIndexingFeatures structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES: { // Covers VUID-VkPhysicalDeviceDescriptorIndexingFeatures-sType-sType
VkPhysicalDeviceDescriptorIndexingFeatures *structure = (VkPhysicalDeviceDescriptorIndexingFeatures *) header;
skip |= validate_bool32("VkPhysicalDeviceDescriptorIndexingFeatures", "shaderInputAttachmentArrayDynamicIndexing", structure->shaderInputAttachmentArrayDynamicIndexing);
@@ -836,14 +790,18 @@
skip |= validate_bool32("VkPhysicalDeviceDescriptorIndexingFeatures", "runtimeDescriptorArray", structure->runtimeDescriptorArray);
} break;
+ // No Validation code for VkPhysicalDeviceDescriptorIndexingProperties structure members -- Covers VUID-VkPhysicalDeviceDescriptorIndexingProperties-sType-sType
+
// Validation code for VkDescriptorSetVariableDescriptorCountAllocateInfo structure members
- case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO: {
+ case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO: { // Covers VUID-VkDescriptorSetVariableDescriptorCountAllocateInfo-sType-sType
VkDescriptorSetVariableDescriptorCountAllocateInfo *structure = (VkDescriptorSetVariableDescriptorCountAllocateInfo *) header;
skip |= validate_array("VkDescriptorSetVariableDescriptorCountAllocateInfo", "descriptorSetCount", "pDescriptorCounts", structure->descriptorSetCount, &structure->pDescriptorCounts, false, true, kVUIDUndefined, "VUID-VkDescriptorSetVariableDescriptorCountAllocateInfo-pDescriptorCounts-parameter");
} break;
+ // No Validation code for VkDescriptorSetVariableDescriptorCountLayoutSupport structure members -- Covers VUID-VkDescriptorSetVariableDescriptorCountLayoutSupport-sType-sType
+
// Validation code for VkSubpassDescriptionDepthStencilResolve structure members
- case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE: {
+ case VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE: { // Covers VUID-VkSubpassDescriptionDepthStencilResolve-sType-sType
VkSubpassDescriptionDepthStencilResolve *structure = (VkSubpassDescriptionDepthStencilResolve *) header;
skip |= validate_flags("VkSubpassDescriptionDepthStencilResolve", "depthResolveMode", "VkResolveModeFlagBits", AllVkResolveModeFlagBits, structure->depthResolveMode, kRequiredSingleBit, "VUID-VkSubpassDescriptionDepthStencilResolve-depthResolveMode-parameter", "VUID-VkSubpassDescriptionDepthStencilResolve-depthResolveMode-parameter");
@@ -857,26 +815,30 @@
}
} break;
+ // No Validation code for VkPhysicalDeviceDepthStencilResolveProperties structure members -- Covers VUID-VkPhysicalDeviceDepthStencilResolveProperties-sType-sType
+
// Validation code for VkPhysicalDeviceScalarBlockLayoutFeatures structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES: { // Covers VUID-VkPhysicalDeviceScalarBlockLayoutFeatures-sType-sType
VkPhysicalDeviceScalarBlockLayoutFeatures *structure = (VkPhysicalDeviceScalarBlockLayoutFeatures *) header;
skip |= validate_bool32("VkPhysicalDeviceScalarBlockLayoutFeatures", "scalarBlockLayout", structure->scalarBlockLayout);
} break;
// Validation code for VkImageStencilUsageCreateInfo structure members
- case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO: {
+ case VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO: { // Covers VUID-VkImageStencilUsageCreateInfo-sType-sType
VkImageStencilUsageCreateInfo *structure = (VkImageStencilUsageCreateInfo *) header;
skip |= validate_flags("VkImageStencilUsageCreateInfo", "stencilUsage", "VkImageUsageFlagBits", AllVkImageUsageFlagBits, structure->stencilUsage, kRequiredFlags, "VUID-VkImageStencilUsageCreateInfo-stencilUsage-parameter", "VUID-VkImageStencilUsageCreateInfo-stencilUsage-requiredbitmask");
} break;
// Validation code for VkSamplerReductionModeCreateInfo structure members
- case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO: {
+ case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO: { // Covers VUID-VkSamplerReductionModeCreateInfo-sType-sType
VkSamplerReductionModeCreateInfo *structure = (VkSamplerReductionModeCreateInfo *) header;
skip |= validate_ranged_enum("VkSamplerReductionModeCreateInfo", "reductionMode", "VkSamplerReductionMode", AllVkSamplerReductionModeEnums, structure->reductionMode, "VUID-VkSamplerReductionModeCreateInfo-reductionMode-parameter");
} break;
+ // No Validation code for VkPhysicalDeviceSamplerFilterMinmaxProperties structure members -- Covers VUID-VkPhysicalDeviceSamplerFilterMinmaxProperties-sType-sType
+
// Validation code for VkPhysicalDeviceVulkanMemoryModelFeatures structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES: { // Covers VUID-VkPhysicalDeviceVulkanMemoryModelFeatures-sType-sType
VkPhysicalDeviceVulkanMemoryModelFeatures *structure = (VkPhysicalDeviceVulkanMemoryModelFeatures *) header;
skip |= validate_bool32("VkPhysicalDeviceVulkanMemoryModelFeatures", "vulkanMemoryModel", structure->vulkanMemoryModel);
@@ -886,13 +848,13 @@
} break;
// Validation code for VkPhysicalDeviceImagelessFramebufferFeatures structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES: { // Covers VUID-VkPhysicalDeviceImagelessFramebufferFeatures-sType-sType
VkPhysicalDeviceImagelessFramebufferFeatures *structure = (VkPhysicalDeviceImagelessFramebufferFeatures *) header;
skip |= validate_bool32("VkPhysicalDeviceImagelessFramebufferFeatures", "imagelessFramebuffer", structure->imagelessFramebuffer);
} break;
// Validation code for VkFramebufferAttachmentsCreateInfo structure members
- case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO: {
+ case VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO: { // Covers VUID-VkFramebufferAttachmentsCreateInfo-sType-sType
VkFramebufferAttachmentsCreateInfo *structure = (VkFramebufferAttachmentsCreateInfo *) header;
skip |= validate_struct_type_array("VkFramebufferAttachmentsCreateInfo", "attachmentImageInfoCount", "pAttachmentImageInfos", "VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO", structure->attachmentImageInfoCount, structure->pAttachmentImageInfos, VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO, false, true, "VUID-VkFramebufferAttachmentImageInfo-sType-sType", "VUID-VkFramebufferAttachmentsCreateInfo-pAttachmentImageInfos-parameter", kVUIDUndefined);
@@ -910,31 +872,33 @@
} break;
// Validation code for VkRenderPassAttachmentBeginInfo structure members
- case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO: {
+ case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO: { // Covers VUID-VkRenderPassAttachmentBeginInfo-sType-sType
VkRenderPassAttachmentBeginInfo *structure = (VkRenderPassAttachmentBeginInfo *) header;
skip |= validate_array("VkRenderPassAttachmentBeginInfo", "attachmentCount", "pAttachments", structure->attachmentCount, &structure->pAttachments, false, true, kVUIDUndefined, "VUID-VkRenderPassAttachmentBeginInfo-pAttachments-parameter");
} break;
// Validation code for VkPhysicalDeviceUniformBufferStandardLayoutFeatures structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES: { // Covers VUID-VkPhysicalDeviceUniformBufferStandardLayoutFeatures-sType-sType
VkPhysicalDeviceUniformBufferStandardLayoutFeatures *structure = (VkPhysicalDeviceUniformBufferStandardLayoutFeatures *) header;
skip |= validate_bool32("VkPhysicalDeviceUniformBufferStandardLayoutFeatures", "uniformBufferStandardLayout", structure->uniformBufferStandardLayout);
} break;
+ // No Validation code for VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures structure members -- Covers VUID-VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures-sType-sType
+
// Validation code for VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES: { // Covers VUID-VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures-sType-sType
VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures *structure = (VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures *) header;
skip |= validate_bool32("VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures", "separateDepthStencilLayouts", structure->separateDepthStencilLayouts);
} break;
// Validation code for VkAttachmentReferenceStencilLayout structure members
- case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT: {
+ case VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT: { // Covers VUID-VkAttachmentReferenceStencilLayout-sType-sType
VkAttachmentReferenceStencilLayout *structure = (VkAttachmentReferenceStencilLayout *) header;
skip |= validate_ranged_enum("VkAttachmentReferenceStencilLayout", "stencilLayout", "VkImageLayout", AllVkImageLayoutEnums, structure->stencilLayout, "VUID-VkAttachmentReferenceStencilLayout-stencilLayout-parameter");
} break;
// Validation code for VkAttachmentDescriptionStencilLayout structure members
- case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT: {
+ case VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT: { // Covers VUID-VkAttachmentDescriptionStencilLayout-sType-sType
VkAttachmentDescriptionStencilLayout *structure = (VkAttachmentDescriptionStencilLayout *) header;
skip |= validate_ranged_enum("VkAttachmentDescriptionStencilLayout", "stencilInitialLayout", "VkImageLayout", AllVkImageLayoutEnums, structure->stencilInitialLayout, "VUID-VkAttachmentDescriptionStencilLayout-stencilInitialLayout-parameter");
@@ -942,25 +906,29 @@
} break;
// Validation code for VkPhysicalDeviceHostQueryResetFeatures structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES: { // Covers VUID-VkPhysicalDeviceHostQueryResetFeatures-sType-sType
VkPhysicalDeviceHostQueryResetFeatures *structure = (VkPhysicalDeviceHostQueryResetFeatures *) header;
skip |= validate_bool32("VkPhysicalDeviceHostQueryResetFeatures", "hostQueryReset", structure->hostQueryReset);
} break;
// Validation code for VkPhysicalDeviceTimelineSemaphoreFeatures structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES: { // Covers VUID-VkPhysicalDeviceTimelineSemaphoreFeatures-sType-sType
VkPhysicalDeviceTimelineSemaphoreFeatures *structure = (VkPhysicalDeviceTimelineSemaphoreFeatures *) header;
skip |= validate_bool32("VkPhysicalDeviceTimelineSemaphoreFeatures", "timelineSemaphore", structure->timelineSemaphore);
} break;
+ // No Validation code for VkPhysicalDeviceTimelineSemaphoreProperties structure members -- Covers VUID-VkPhysicalDeviceTimelineSemaphoreProperties-sType-sType
+
// Validation code for VkSemaphoreTypeCreateInfo structure members
- case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO: {
+ case VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO: { // Covers VUID-VkSemaphoreTypeCreateInfo-sType-sType
VkSemaphoreTypeCreateInfo *structure = (VkSemaphoreTypeCreateInfo *) header;
skip |= validate_ranged_enum("VkSemaphoreTypeCreateInfo", "semaphoreType", "VkSemaphoreType", AllVkSemaphoreTypeEnums, structure->semaphoreType, "VUID-VkSemaphoreTypeCreateInfo-semaphoreType-parameter");
} break;
+ // No Validation code for VkTimelineSemaphoreSubmitInfo structure members -- Covers VUID-VkTimelineSemaphoreSubmitInfo-sType-sType
+
// Validation code for VkPhysicalDeviceBufferDeviceAddressFeatures structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES: { // Covers VUID-VkPhysicalDeviceBufferDeviceAddressFeatures-sType-sType
VkPhysicalDeviceBufferDeviceAddressFeatures *structure = (VkPhysicalDeviceBufferDeviceAddressFeatures *) header;
skip |= validate_bool32("VkPhysicalDeviceBufferDeviceAddressFeatures", "bufferDeviceAddress", structure->bufferDeviceAddress);
@@ -969,14 +937,20 @@
skip |= validate_bool32("VkPhysicalDeviceBufferDeviceAddressFeatures", "bufferDeviceAddressMultiDevice", structure->bufferDeviceAddressMultiDevice);
} break;
+ // No Validation code for VkBufferOpaqueCaptureAddressCreateInfo structure members -- Covers VUID-VkBufferOpaqueCaptureAddressCreateInfo-sType-sType
+
+ // No Validation code for VkMemoryOpaqueCaptureAddressAllocateInfo structure members -- Covers VUID-VkMemoryOpaqueCaptureAddressAllocateInfo-sType-sType
+
+ // No Validation code for VkImageSwapchainCreateInfoKHR structure members -- Covers VUID-VkImageSwapchainCreateInfoKHR-sType-sType
+
// Validation code for VkBindImageMemorySwapchainInfoKHR structure members
- case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR: {
+ case VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR: { // Covers VUID-VkBindImageMemorySwapchainInfoKHR-sType-sType
VkBindImageMemorySwapchainInfoKHR *structure = (VkBindImageMemorySwapchainInfoKHR *) header;
skip |= validate_required_handle("VkBindImageMemorySwapchainInfoKHR", "swapchain", structure->swapchain);
} break;
// Validation code for VkDeviceGroupPresentInfoKHR structure members
- case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR: {
+ case VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR: { // Covers VUID-VkDeviceGroupPresentInfoKHR-sType-sType
VkDeviceGroupPresentInfoKHR *structure = (VkDeviceGroupPresentInfoKHR *) header;
skip |= validate_array("VkDeviceGroupPresentInfoKHR", "swapchainCount", "pDeviceMasks", structure->swapchainCount, &structure->pDeviceMasks, false, true, kVUIDUndefined, "VUID-VkDeviceGroupPresentInfoKHR-pDeviceMasks-parameter");
@@ -984,34 +958,36 @@
} break;
// Validation code for VkDeviceGroupSwapchainCreateInfoKHR structure members
- case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR: {
+ case VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR: { // Covers VUID-VkDeviceGroupSwapchainCreateInfoKHR-sType-sType
VkDeviceGroupSwapchainCreateInfoKHR *structure = (VkDeviceGroupSwapchainCreateInfoKHR *) header;
skip |= validate_flags("VkDeviceGroupSwapchainCreateInfoKHR", "modes", "VkDeviceGroupPresentModeFlagBitsKHR", AllVkDeviceGroupPresentModeFlagBitsKHR, structure->modes, kRequiredFlags, "VUID-VkDeviceGroupSwapchainCreateInfoKHR-modes-parameter", "VUID-VkDeviceGroupSwapchainCreateInfoKHR-modes-requiredbitmask");
} break;
// Validation code for VkDisplayPresentInfoKHR structure members
- case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR: {
+ case VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR: { // Covers VUID-VkDisplayPresentInfoKHR-sType-sType
VkDisplayPresentInfoKHR *structure = (VkDisplayPresentInfoKHR *) header;
skip |= validate_bool32("VkDisplayPresentInfoKHR", "persistent", structure->persistent);
} break;
#ifdef VK_USE_PLATFORM_WIN32_KHR
// Validation code for VkImportMemoryWin32HandleInfoKHR structure members
- case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR: {
+ case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR: { // Covers VUID-VkImportMemoryWin32HandleInfoKHR-sType-sType
VkImportMemoryWin32HandleInfoKHR *structure = (VkImportMemoryWin32HandleInfoKHR *) header;
skip |= validate_flags("VkImportMemoryWin32HandleInfoKHR", "handleType", "VkExternalMemoryHandleTypeFlagBits", AllVkExternalMemoryHandleTypeFlagBits, structure->handleType, kOptionalSingleBit, "VUID-VkImportMemoryWin32HandleInfoKHR-handleType-parameter");
} break;
#endif // VK_USE_PLATFORM_WIN32_KHR
+ // No Validation code for VkExportMemoryWin32HandleInfoKHR structure members -- Covers VUID-VkExportMemoryWin32HandleInfoKHR-sType-sType
+
// Validation code for VkImportMemoryFdInfoKHR structure members
- case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR: {
+ case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR: { // Covers VUID-VkImportMemoryFdInfoKHR-sType-sType
VkImportMemoryFdInfoKHR *structure = (VkImportMemoryFdInfoKHR *) header;
skip |= validate_flags("VkImportMemoryFdInfoKHR", "handleType", "VkExternalMemoryHandleTypeFlagBits", AllVkExternalMemoryHandleTypeFlagBits, structure->handleType, kOptionalSingleBit, "VUID-VkImportMemoryFdInfoKHR-handleType-parameter");
} break;
#ifdef VK_USE_PLATFORM_WIN32_KHR
// Validation code for VkWin32KeyedMutexAcquireReleaseInfoKHR structure members
- case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR: {
+ case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR: { // Covers VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-sType-sType
VkWin32KeyedMutexAcquireReleaseInfoKHR *structure = (VkWin32KeyedMutexAcquireReleaseInfoKHR *) header;
skip |= validate_array("VkWin32KeyedMutexAcquireReleaseInfoKHR", "acquireCount", "pAcquireSyncs", structure->acquireCount, &structure->pAcquireSyncs, false, true, kVUIDUndefined, "VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pAcquireSyncs-parameter");
@@ -1025,8 +1001,14 @@
} break;
#endif // VK_USE_PLATFORM_WIN32_KHR
+ // No Validation code for VkExportSemaphoreWin32HandleInfoKHR structure members -- Covers VUID-VkExportSemaphoreWin32HandleInfoKHR-sType-sType
+
+ // No Validation code for VkD3D12FenceSubmitInfoKHR structure members -- Covers VUID-VkD3D12FenceSubmitInfoKHR-sType-sType
+
+ // No Validation code for VkPhysicalDevicePushDescriptorPropertiesKHR structure members -- Covers VUID-VkPhysicalDevicePushDescriptorPropertiesKHR-sType-sType
+
// Validation code for VkPresentRegionsKHR structure members
- case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR: {
+ case VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR: { // Covers VUID-VkPresentRegionsKHR-sType-sType
VkPresentRegionsKHR *structure = (VkPresentRegionsKHR *) header;
skip |= validate_array("VkPresentRegionsKHR", "swapchainCount", "pRegions", structure->swapchainCount, &structure->pRegions, true, false, "VUID-VkPresentRegionsKHR-swapchainCount-arraylength", "VUID-VkPresentRegionsKHR-pRegions-parameter");
@@ -1044,22 +1026,30 @@
}
} break;
+ // No Validation code for VkSharedPresentSurfaceCapabilitiesKHR structure members -- Covers VUID-VkSharedPresentSurfaceCapabilitiesKHR-sType-sType
+
+ // No Validation code for VkExportFenceWin32HandleInfoKHR structure members -- Covers VUID-VkExportFenceWin32HandleInfoKHR-sType-sType
+
// Validation code for VkPhysicalDevicePerformanceQueryFeaturesKHR structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR: { // Covers VUID-VkPhysicalDevicePerformanceQueryFeaturesKHR-sType-sType
VkPhysicalDevicePerformanceQueryFeaturesKHR *structure = (VkPhysicalDevicePerformanceQueryFeaturesKHR *) header;
skip |= validate_bool32("VkPhysicalDevicePerformanceQueryFeaturesKHR", "performanceCounterQueryPools", structure->performanceCounterQueryPools);
skip |= validate_bool32("VkPhysicalDevicePerformanceQueryFeaturesKHR", "performanceCounterMultipleQueryPools", structure->performanceCounterMultipleQueryPools);
} break;
+ // No Validation code for VkPhysicalDevicePerformanceQueryPropertiesKHR structure members -- Covers VUID-VkPhysicalDevicePerformanceQueryPropertiesKHR-sType-sType
+
// Validation code for VkQueryPoolPerformanceCreateInfoKHR structure members
- case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR: {
+ case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR: { // Covers VUID-VkQueryPoolPerformanceCreateInfoKHR-sType-sType
VkQueryPoolPerformanceCreateInfoKHR *structure = (VkQueryPoolPerformanceCreateInfoKHR *) header;
skip |= validate_array("VkQueryPoolPerformanceCreateInfoKHR", "counterIndexCount", "pCounterIndices", structure->counterIndexCount, &structure->pCounterIndices, true, true, "VUID-VkQueryPoolPerformanceCreateInfoKHR-counterIndexCount-arraylength", "VUID-VkQueryPoolPerformanceCreateInfoKHR-pCounterIndices-parameter");
} break;
+ // No Validation code for VkPerformanceQuerySubmitInfoKHR structure members -- Covers VUID-VkPerformanceQuerySubmitInfoKHR-sType-sType
+
// Validation code for VkPhysicalDeviceShaderClockFeaturesKHR structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR: { // Covers VUID-VkPhysicalDeviceShaderClockFeaturesKHR-sType-sType
VkPhysicalDeviceShaderClockFeaturesKHR *structure = (VkPhysicalDeviceShaderClockFeaturesKHR *) header;
skip |= validate_bool32("VkPhysicalDeviceShaderClockFeaturesKHR", "shaderSubgroupClock", structure->shaderSubgroupClock);
@@ -1067,19 +1057,21 @@
} break;
// Validation code for VkSurfaceProtectedCapabilitiesKHR structure members
- case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR: {
+ case VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR: { // Covers VUID-VkSurfaceProtectedCapabilitiesKHR-sType-sType
VkSurfaceProtectedCapabilitiesKHR *structure = (VkSurfaceProtectedCapabilitiesKHR *) header;
skip |= validate_bool32("VkSurfaceProtectedCapabilitiesKHR", "supportsProtected", structure->supportsProtected);
} break;
+ // No Validation code for VkDeferredOperationInfoKHR structure members -- Covers VUID-VkDeferredOperationInfoKHR-sType-sType
+
// Validation code for VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR: { // Covers VUID-VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR-sType-sType
VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR *structure = (VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR *) header;
skip |= validate_bool32("VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR", "pipelineExecutableInfo", structure->pipelineExecutableInfo);
} break;
// Validation code for VkDebugReportCallbackCreateInfoEXT structure members
- case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT: { // Covers VUID-VkDebugReportCallbackCreateInfoEXT-sType-sType
VkDebugReportCallbackCreateInfoEXT *structure = (VkDebugReportCallbackCreateInfoEXT *) header;
skip |= validate_flags("VkDebugReportCallbackCreateInfoEXT", "flags", "VkDebugReportFlagBitsEXT", AllVkDebugReportFlagBitsEXT, structure->flags, kOptionalFlags, "VUID-VkDebugReportCallbackCreateInfoEXT-flags-parameter");
@@ -1087,66 +1079,74 @@
} break;
// Validation code for VkPipelineRasterizationStateRasterizationOrderAMD structure members
- case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD: {
+ case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD: { // Covers VUID-VkPipelineRasterizationStateRasterizationOrderAMD-sType-sType
VkPipelineRasterizationStateRasterizationOrderAMD *structure = (VkPipelineRasterizationStateRasterizationOrderAMD *) header;
skip |= validate_ranged_enum("VkPipelineRasterizationStateRasterizationOrderAMD", "rasterizationOrder", "VkRasterizationOrderAMD", AllVkRasterizationOrderAMDEnums, structure->rasterizationOrder, "VUID-VkPipelineRasterizationStateRasterizationOrderAMD-rasterizationOrder-parameter");
} break;
// Validation code for VkDedicatedAllocationImageCreateInfoNV structure members
- case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV: {
+ case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV: { // Covers VUID-VkDedicatedAllocationImageCreateInfoNV-sType-sType
VkDedicatedAllocationImageCreateInfoNV *structure = (VkDedicatedAllocationImageCreateInfoNV *) header;
skip |= validate_bool32("VkDedicatedAllocationImageCreateInfoNV", "dedicatedAllocation", structure->dedicatedAllocation);
} break;
// Validation code for VkDedicatedAllocationBufferCreateInfoNV structure members
- case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV: {
+ case VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV: { // Covers VUID-VkDedicatedAllocationBufferCreateInfoNV-sType-sType
VkDedicatedAllocationBufferCreateInfoNV *structure = (VkDedicatedAllocationBufferCreateInfoNV *) header;
skip |= validate_bool32("VkDedicatedAllocationBufferCreateInfoNV", "dedicatedAllocation", structure->dedicatedAllocation);
} break;
+ // No Validation code for VkDedicatedAllocationMemoryAllocateInfoNV structure members -- Covers VUID-VkDedicatedAllocationMemoryAllocateInfoNV-sType-sType
+
// Validation code for VkPhysicalDeviceTransformFeedbackFeaturesEXT structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceTransformFeedbackFeaturesEXT-sType-sType
VkPhysicalDeviceTransformFeedbackFeaturesEXT *structure = (VkPhysicalDeviceTransformFeedbackFeaturesEXT *) header;
skip |= validate_bool32("VkPhysicalDeviceTransformFeedbackFeaturesEXT", "transformFeedback", structure->transformFeedback);
skip |= validate_bool32("VkPhysicalDeviceTransformFeedbackFeaturesEXT", "geometryStreams", structure->geometryStreams);
} break;
+ // No Validation code for VkPhysicalDeviceTransformFeedbackPropertiesEXT structure members -- Covers VUID-VkPhysicalDeviceTransformFeedbackPropertiesEXT-sType-sType
+
// Validation code for VkPipelineRasterizationStateStreamCreateInfoEXT structure members
- case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT: { // Covers VUID-VkPipelineRasterizationStateStreamCreateInfoEXT-sType-sType
VkPipelineRasterizationStateStreamCreateInfoEXT *structure = (VkPipelineRasterizationStateStreamCreateInfoEXT *) header;
skip |= validate_reserved_flags("VkPipelineRasterizationStateStreamCreateInfoEXT", "flags", structure->flags, "VUID-VkPipelineRasterizationStateStreamCreateInfoEXT-flags-zerobitmask");
} break;
+ // No Validation code for VkTextureLODGatherFormatPropertiesAMD structure members -- Covers VUID-VkTextureLODGatherFormatPropertiesAMD-sType-sType
+
// Validation code for VkPhysicalDeviceCornerSampledImageFeaturesNV structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV: { // Covers VUID-VkPhysicalDeviceCornerSampledImageFeaturesNV-sType-sType
VkPhysicalDeviceCornerSampledImageFeaturesNV *structure = (VkPhysicalDeviceCornerSampledImageFeaturesNV *) header;
skip |= validate_bool32("VkPhysicalDeviceCornerSampledImageFeaturesNV", "cornerSampledImage", structure->cornerSampledImage);
} break;
// Validation code for VkExternalMemoryImageCreateInfoNV structure members
- case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV: {
+ case VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV: { // Covers VUID-VkExternalMemoryImageCreateInfoNV-sType-sType
VkExternalMemoryImageCreateInfoNV *structure = (VkExternalMemoryImageCreateInfoNV *) header;
skip |= validate_flags("VkExternalMemoryImageCreateInfoNV", "handleTypes", "VkExternalMemoryHandleTypeFlagBitsNV", AllVkExternalMemoryHandleTypeFlagBitsNV, structure->handleTypes, kOptionalFlags, "VUID-VkExternalMemoryImageCreateInfoNV-handleTypes-parameter");
} break;
// Validation code for VkExportMemoryAllocateInfoNV structure members
- case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV: {
+ case VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV: { // Covers VUID-VkExportMemoryAllocateInfoNV-sType-sType
VkExportMemoryAllocateInfoNV *structure = (VkExportMemoryAllocateInfoNV *) header;
skip |= validate_flags("VkExportMemoryAllocateInfoNV", "handleTypes", "VkExternalMemoryHandleTypeFlagBitsNV", AllVkExternalMemoryHandleTypeFlagBitsNV, structure->handleTypes, kOptionalFlags, "VUID-VkExportMemoryAllocateInfoNV-handleTypes-parameter");
} break;
#ifdef VK_USE_PLATFORM_WIN32_KHR
// Validation code for VkImportMemoryWin32HandleInfoNV structure members
- case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV: {
+ case VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV: { // Covers VUID-VkImportMemoryWin32HandleInfoNV-sType-sType
VkImportMemoryWin32HandleInfoNV *structure = (VkImportMemoryWin32HandleInfoNV *) header;
skip |= validate_flags("VkImportMemoryWin32HandleInfoNV", "handleType", "VkExternalMemoryHandleTypeFlagBitsNV", AllVkExternalMemoryHandleTypeFlagBitsNV, structure->handleType, kOptionalFlags, "VUID-VkImportMemoryWin32HandleInfoNV-handleType-parameter");
} break;
#endif // VK_USE_PLATFORM_WIN32_KHR
+ // No Validation code for VkExportMemoryWin32HandleInfoNV structure members -- Covers VUID-VkExportMemoryWin32HandleInfoNV-sType-sType
+
#ifdef VK_USE_PLATFORM_WIN32_KHR
// Validation code for VkWin32KeyedMutexAcquireReleaseInfoNV structure members
- case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV: {
+ case VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV: { // Covers VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-sType-sType
VkWin32KeyedMutexAcquireReleaseInfoNV *structure = (VkWin32KeyedMutexAcquireReleaseInfoNV *) header;
skip |= validate_array("VkWin32KeyedMutexAcquireReleaseInfoNV", "acquireCount", "pAcquireSyncs", structure->acquireCount, &structure->pAcquireSyncs, false, true, kVUIDUndefined, "VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pAcquireSyncs-parameter");
@@ -1161,31 +1161,31 @@
#endif // VK_USE_PLATFORM_WIN32_KHR
// Validation code for VkValidationFlagsEXT structure members
- case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT: {
+ case VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT: { // Covers VUID-VkValidationFlagsEXT-sType-sType
VkValidationFlagsEXT *structure = (VkValidationFlagsEXT *) header;
skip |= validate_ranged_enum_array("VkValidationFlagsEXT", "disabledValidationCheckCount", "pDisabledValidationChecks", "VkValidationCheckEXT", AllVkValidationCheckEXTEnums, structure->disabledValidationCheckCount, structure->pDisabledValidationChecks, true, true);
} break;
// Validation code for VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT-sType-sType
VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT *structure = (VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT *) header;
skip |= validate_bool32("VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT", "textureCompressionASTC_HDR", structure->textureCompressionASTC_HDR);
} break;
// Validation code for VkImageViewASTCDecodeModeEXT structure members
- case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT: {
+ case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT: { // Covers VUID-VkImageViewASTCDecodeModeEXT-sType-sType
VkImageViewASTCDecodeModeEXT *structure = (VkImageViewASTCDecodeModeEXT *) header;
skip |= validate_ranged_enum("VkImageViewASTCDecodeModeEXT", "decodeMode", "VkFormat", AllVkFormatEnums, structure->decodeMode, "VUID-VkImageViewASTCDecodeModeEXT-decodeMode-parameter");
} break;
// Validation code for VkPhysicalDeviceASTCDecodeFeaturesEXT structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceASTCDecodeFeaturesEXT-sType-sType
VkPhysicalDeviceASTCDecodeFeaturesEXT *structure = (VkPhysicalDeviceASTCDecodeFeaturesEXT *) header;
skip |= validate_bool32("VkPhysicalDeviceASTCDecodeFeaturesEXT", "decodeModeSharedExponent", structure->decodeModeSharedExponent);
} break;
// Validation code for VkPhysicalDeviceConditionalRenderingFeaturesEXT structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceConditionalRenderingFeaturesEXT-sType-sType
VkPhysicalDeviceConditionalRenderingFeaturesEXT *structure = (VkPhysicalDeviceConditionalRenderingFeaturesEXT *) header;
skip |= validate_bool32("VkPhysicalDeviceConditionalRenderingFeaturesEXT", "conditionalRendering", structure->conditionalRendering);
@@ -1193,25 +1193,25 @@
} break;
// Validation code for VkCommandBufferInheritanceConditionalRenderingInfoEXT structure members
- case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT: { // Covers VUID-VkCommandBufferInheritanceConditionalRenderingInfoEXT-sType-sType
VkCommandBufferInheritanceConditionalRenderingInfoEXT *structure = (VkCommandBufferInheritanceConditionalRenderingInfoEXT *) header;
skip |= validate_bool32("VkCommandBufferInheritanceConditionalRenderingInfoEXT", "conditionalRenderingEnable", structure->conditionalRenderingEnable);
} break;
// Validation code for VkPipelineViewportWScalingStateCreateInfoNV structure members
- case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV: {
+ case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV: { // Covers VUID-VkPipelineViewportWScalingStateCreateInfoNV-sType-sType
VkPipelineViewportWScalingStateCreateInfoNV *structure = (VkPipelineViewportWScalingStateCreateInfoNV *) header;
skip |= validate_bool32("VkPipelineViewportWScalingStateCreateInfoNV", "viewportWScalingEnable", structure->viewportWScalingEnable);
} break;
// Validation code for VkSwapchainCounterCreateInfoEXT structure members
- case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT: { // Covers VUID-VkSwapchainCounterCreateInfoEXT-sType-sType
VkSwapchainCounterCreateInfoEXT *structure = (VkSwapchainCounterCreateInfoEXT *) header;
skip |= validate_flags("VkSwapchainCounterCreateInfoEXT", "surfaceCounters", "VkSurfaceCounterFlagBitsEXT", AllVkSurfaceCounterFlagBitsEXT, structure->surfaceCounters, kOptionalFlags, "VUID-VkSwapchainCounterCreateInfoEXT-surfaceCounters-parameter");
} break;
// Validation code for VkPresentTimesInfoGOOGLE structure members
- case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE: {
+ case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE: { // Covers VUID-VkPresentTimesInfoGOOGLE-sType-sType
VkPresentTimesInfoGOOGLE *structure = (VkPresentTimesInfoGOOGLE *) header;
skip |= validate_array("VkPresentTimesInfoGOOGLE", "swapchainCount", "pTimes", structure->swapchainCount, &structure->pTimes, true, false, "VUID-VkPresentTimesInfoGOOGLE-swapchainCount-arraylength", "VUID-VkPresentTimesInfoGOOGLE-pTimes-parameter");
@@ -1223,8 +1223,10 @@
}
} break;
+ // No Validation code for VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX structure members -- Covers VUID-VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX-sType-sType
+
// Validation code for VkPipelineViewportSwizzleStateCreateInfoNV structure members
- case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV: {
+ case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV: { // Covers VUID-VkPipelineViewportSwizzleStateCreateInfoNV-sType-sType
VkPipelineViewportSwizzleStateCreateInfoNV *structure = (VkPipelineViewportSwizzleStateCreateInfoNV *) header;
skip |= validate_reserved_flags("VkPipelineViewportSwizzleStateCreateInfoNV", "flags", structure->flags, "VUID-VkPipelineViewportSwizzleStateCreateInfoNV-flags-zerobitmask");
@@ -1245,16 +1247,20 @@
}
} break;
+ // No Validation code for VkPhysicalDeviceDiscardRectanglePropertiesEXT structure members -- Covers VUID-VkPhysicalDeviceDiscardRectanglePropertiesEXT-sType-sType
+
// Validation code for VkPipelineDiscardRectangleStateCreateInfoEXT structure members
- case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT: { // Covers VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-sType-sType
VkPipelineDiscardRectangleStateCreateInfoEXT *structure = (VkPipelineDiscardRectangleStateCreateInfoEXT *) header;
skip |= validate_reserved_flags("VkPipelineDiscardRectangleStateCreateInfoEXT", "flags", structure->flags, "VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-flags-zerobitmask");
skip |= validate_ranged_enum("VkPipelineDiscardRectangleStateCreateInfoEXT", "discardRectangleMode", "VkDiscardRectangleModeEXT", AllVkDiscardRectangleModeEXTEnums, structure->discardRectangleMode, "VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-discardRectangleMode-parameter");
} break;
+ // No Validation code for VkPhysicalDeviceConservativeRasterizationPropertiesEXT structure members -- Covers VUID-VkPhysicalDeviceConservativeRasterizationPropertiesEXT-sType-sType
+
// Validation code for VkPipelineRasterizationConservativeStateCreateInfoEXT structure members
- case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT: { // Covers VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-sType-sType
VkPipelineRasterizationConservativeStateCreateInfoEXT *structure = (VkPipelineRasterizationConservativeStateCreateInfoEXT *) header;
skip |= validate_reserved_flags("VkPipelineRasterizationConservativeStateCreateInfoEXT", "flags", structure->flags, "VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-flags-zerobitmask");
@@ -1262,13 +1268,13 @@
} break;
// Validation code for VkPhysicalDeviceDepthClipEnableFeaturesEXT structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceDepthClipEnableFeaturesEXT-sType-sType
VkPhysicalDeviceDepthClipEnableFeaturesEXT *structure = (VkPhysicalDeviceDepthClipEnableFeaturesEXT *) header;
skip |= validate_bool32("VkPhysicalDeviceDepthClipEnableFeaturesEXT", "depthClipEnable", structure->depthClipEnable);
} break;
// Validation code for VkPipelineRasterizationDepthClipStateCreateInfoEXT structure members
- case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT: { // Covers VUID-VkPipelineRasterizationDepthClipStateCreateInfoEXT-sType-sType
VkPipelineRasterizationDepthClipStateCreateInfoEXT *structure = (VkPipelineRasterizationDepthClipStateCreateInfoEXT *) header;
skip |= validate_reserved_flags("VkPipelineRasterizationDepthClipStateCreateInfoEXT", "flags", structure->flags, "VUID-VkPipelineRasterizationDepthClipStateCreateInfoEXT-flags-zerobitmask");
@@ -1276,7 +1282,7 @@
} break;
// Validation code for VkDebugUtilsMessengerCreateInfoEXT structure members
- case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT: { // Covers VUID-VkDebugUtilsMessengerCreateInfoEXT-sType-sType
VkDebugUtilsMessengerCreateInfoEXT *structure = (VkDebugUtilsMessengerCreateInfoEXT *) header;
skip |= validate_reserved_flags("VkDebugUtilsMessengerCreateInfoEXT", "flags", structure->flags, "VUID-VkDebugUtilsMessengerCreateInfoEXT-flags-zerobitmask");
@@ -1287,30 +1293,40 @@
skip |= validate_required_pointer("VkDebugUtilsMessengerCreateInfoEXT", "pfnUserCallback", reinterpret_cast<const void*>(structure->pfnUserCallback), "VUID-VkDebugUtilsMessengerCreateInfoEXT-pfnUserCallback-parameter");
} break;
+ // No Validation code for VkAndroidHardwareBufferUsageANDROID structure members -- Covers VUID-VkAndroidHardwareBufferUsageANDROID-sType-sType
+
+ // No Validation code for VkAndroidHardwareBufferFormatPropertiesANDROID structure members -- Covers VUID-VkAndroidHardwareBufferFormatPropertiesANDROID-sType-sType
+
#ifdef VK_USE_PLATFORM_ANDROID_KHR
// Validation code for VkImportAndroidHardwareBufferInfoANDROID structure members
- case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID: {
+ case VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID: { // Covers VUID-VkImportAndroidHardwareBufferInfoANDROID-sType-sType
VkImportAndroidHardwareBufferInfoANDROID *structure = (VkImportAndroidHardwareBufferInfoANDROID *) header;
skip |= validate_required_pointer("VkImportAndroidHardwareBufferInfoANDROID", "buffer", structure->buffer, "VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-parameter");
} break;
#endif // VK_USE_PLATFORM_ANDROID_KHR
+ // No Validation code for VkExternalFormatANDROID structure members -- Covers VUID-VkExternalFormatANDROID-sType-sType
+
// Validation code for VkPhysicalDeviceInlineUniformBlockFeaturesEXT structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceInlineUniformBlockFeaturesEXT-sType-sType
VkPhysicalDeviceInlineUniformBlockFeaturesEXT *structure = (VkPhysicalDeviceInlineUniformBlockFeaturesEXT *) header;
skip |= validate_bool32("VkPhysicalDeviceInlineUniformBlockFeaturesEXT", "inlineUniformBlock", structure->inlineUniformBlock);
skip |= validate_bool32("VkPhysicalDeviceInlineUniformBlockFeaturesEXT", "descriptorBindingInlineUniformBlockUpdateAfterBind", structure->descriptorBindingInlineUniformBlockUpdateAfterBind);
} break;
+ // No Validation code for VkPhysicalDeviceInlineUniformBlockPropertiesEXT structure members -- Covers VUID-VkPhysicalDeviceInlineUniformBlockPropertiesEXT-sType-sType
+
// Validation code for VkWriteDescriptorSetInlineUniformBlockEXT structure members
- case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT: {
+ case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT: { // Covers VUID-VkWriteDescriptorSetInlineUniformBlockEXT-sType-sType
VkWriteDescriptorSetInlineUniformBlockEXT *structure = (VkWriteDescriptorSetInlineUniformBlockEXT *) header;
skip |= validate_array("VkWriteDescriptorSetInlineUniformBlockEXT", "dataSize", "pData", structure->dataSize, &structure->pData, true, true, "VUID-VkWriteDescriptorSetInlineUniformBlockEXT-dataSize-arraylength", "VUID-VkWriteDescriptorSetInlineUniformBlockEXT-pData-parameter");
} break;
+ // No Validation code for VkDescriptorPoolInlineUniformBlockCreateInfoEXT structure members -- Covers VUID-VkDescriptorPoolInlineUniformBlockCreateInfoEXT-sType-sType
+
// Validation code for VkSampleLocationsInfoEXT structure members
- case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT: { // Covers VUID-VkSampleLocationsInfoEXT-sType-sType
VkSampleLocationsInfoEXT *structure = (VkSampleLocationsInfoEXT *) header;
skip |= validate_flags("VkSampleLocationsInfoEXT", "sampleLocationsPerPixel", "VkSampleCountFlagBits", AllVkSampleCountFlagBits, structure->sampleLocationsPerPixel, kOptionalSingleBit, "VUID-VkSampleLocationsInfoEXT-sampleLocationsPerPixel-parameter");
@@ -1325,7 +1341,7 @@
} break;
// Validation code for VkRenderPassSampleLocationsBeginInfoEXT structure members
- case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT: { // Covers VUID-VkRenderPassSampleLocationsBeginInfoEXT-sType-sType
VkRenderPassSampleLocationsBeginInfoEXT *structure = (VkRenderPassSampleLocationsBeginInfoEXT *) header;
skip |= validate_array("VkRenderPassSampleLocationsBeginInfoEXT", "attachmentInitialSampleLocationsCount", "pAttachmentInitialSampleLocations", structure->attachmentInitialSampleLocationsCount, &structure->pAttachmentInitialSampleLocations, false, true, kVUIDUndefined, "VUID-VkRenderPassSampleLocationsBeginInfoEXT-pAttachmentInitialSampleLocations-parameter");
@@ -1371,7 +1387,7 @@
} break;
// Validation code for VkPipelineSampleLocationsStateCreateInfoEXT structure members
- case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT: { // Covers VUID-VkPipelineSampleLocationsStateCreateInfoEXT-sType-sType
VkPipelineSampleLocationsStateCreateInfoEXT *structure = (VkPipelineSampleLocationsStateCreateInfoEXT *) header;
skip |= validate_bool32("VkPipelineSampleLocationsStateCreateInfoEXT", "sampleLocationsEnable", structure->sampleLocationsEnable);
@@ -1389,14 +1405,18 @@
}
} break;
+ // No Validation code for VkPhysicalDeviceSampleLocationsPropertiesEXT structure members -- Covers VUID-VkPhysicalDeviceSampleLocationsPropertiesEXT-sType-sType
+
// Validation code for VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT-sType-sType
VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT *structure = (VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT *) header;
skip |= validate_bool32("VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT", "advancedBlendCoherentOperations", structure->advancedBlendCoherentOperations);
} break;
+ // No Validation code for VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT structure members -- Covers VUID-VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT-sType-sType
+
// Validation code for VkPipelineColorBlendAdvancedStateCreateInfoEXT structure members
- case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT: { // Covers VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-sType-sType
VkPipelineColorBlendAdvancedStateCreateInfoEXT *structure = (VkPipelineColorBlendAdvancedStateCreateInfoEXT *) header;
skip |= validate_bool32("VkPipelineColorBlendAdvancedStateCreateInfoEXT", "srcPremultiplied", structure->srcPremultiplied);
@@ -1406,7 +1426,7 @@
} break;
// Validation code for VkPipelineCoverageToColorStateCreateInfoNV structure members
- case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV: {
+ case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV: { // Covers VUID-VkPipelineCoverageToColorStateCreateInfoNV-sType-sType
VkPipelineCoverageToColorStateCreateInfoNV *structure = (VkPipelineCoverageToColorStateCreateInfoNV *) header;
skip |= validate_reserved_flags("VkPipelineCoverageToColorStateCreateInfoNV", "flags", structure->flags, "VUID-VkPipelineCoverageToColorStateCreateInfoNV-flags-zerobitmask");
@@ -1414,7 +1434,7 @@
} break;
// Validation code for VkPipelineCoverageModulationStateCreateInfoNV structure members
- case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV: {
+ case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV: { // Covers VUID-VkPipelineCoverageModulationStateCreateInfoNV-sType-sType
VkPipelineCoverageModulationStateCreateInfoNV *structure = (VkPipelineCoverageModulationStateCreateInfoNV *) header;
skip |= validate_reserved_flags("VkPipelineCoverageModulationStateCreateInfoNV", "flags", structure->flags, "VUID-VkPipelineCoverageModulationStateCreateInfoNV-flags-zerobitmask");
@@ -1423,26 +1443,30 @@
skip |= validate_bool32("VkPipelineCoverageModulationStateCreateInfoNV", "coverageModulationTableEnable", structure->coverageModulationTableEnable);
} break;
+ // No Validation code for VkPhysicalDeviceShaderSMBuiltinsPropertiesNV structure members -- Covers VUID-VkPhysicalDeviceShaderSMBuiltinsPropertiesNV-sType-sType
+
// Validation code for VkPhysicalDeviceShaderSMBuiltinsFeaturesNV structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV: { // Covers VUID-VkPhysicalDeviceShaderSMBuiltinsFeaturesNV-sType-sType
VkPhysicalDeviceShaderSMBuiltinsFeaturesNV *structure = (VkPhysicalDeviceShaderSMBuiltinsFeaturesNV *) header;
skip |= validate_bool32("VkPhysicalDeviceShaderSMBuiltinsFeaturesNV", "shaderSMBuiltins", structure->shaderSMBuiltins);
} break;
+ // No Validation code for VkDrmFormatModifierPropertiesListEXT structure members -- Covers VUID-VkDrmFormatModifierPropertiesListEXT-sType-sType
+
// Validation code for VkPhysicalDeviceImageDrmFormatModifierInfoEXT structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT: { // Covers VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sType-sType
VkPhysicalDeviceImageDrmFormatModifierInfoEXT *structure = (VkPhysicalDeviceImageDrmFormatModifierInfoEXT *) header;
skip |= validate_ranged_enum("VkPhysicalDeviceImageDrmFormatModifierInfoEXT", "sharingMode", "VkSharingMode", AllVkSharingModeEnums, structure->sharingMode, "VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sharingMode-parameter");
} break;
// Validation code for VkImageDrmFormatModifierListCreateInfoEXT structure members
- case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT: { // Covers VUID-VkImageDrmFormatModifierListCreateInfoEXT-sType-sType
VkImageDrmFormatModifierListCreateInfoEXT *structure = (VkImageDrmFormatModifierListCreateInfoEXT *) header;
skip |= validate_array("VkImageDrmFormatModifierListCreateInfoEXT", "drmFormatModifierCount", "pDrmFormatModifiers", structure->drmFormatModifierCount, &structure->pDrmFormatModifiers, true, true, "VUID-VkImageDrmFormatModifierListCreateInfoEXT-drmFormatModifierCount-arraylength", "VUID-VkImageDrmFormatModifierListCreateInfoEXT-pDrmFormatModifiers-parameter");
} break;
// Validation code for VkImageDrmFormatModifierExplicitCreateInfoEXT structure members
- case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT: { // Covers VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-sType-sType
VkImageDrmFormatModifierExplicitCreateInfoEXT *structure = (VkImageDrmFormatModifierExplicitCreateInfoEXT *) header;
skip |= validate_array("VkImageDrmFormatModifierExplicitCreateInfoEXT", "drmFormatModifierPlaneCount", "pPlaneLayouts", structure->drmFormatModifierPlaneCount, &structure->pPlaneLayouts, true, true, kVUIDUndefined, "VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-pPlaneLayouts-parameter");
@@ -1455,35 +1479,29 @@
} break;
// Validation code for VkShaderModuleValidationCacheCreateInfoEXT structure members
- case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT: { // Covers VUID-VkShaderModuleValidationCacheCreateInfoEXT-sType-sType
VkShaderModuleValidationCacheCreateInfoEXT *structure = (VkShaderModuleValidationCacheCreateInfoEXT *) header;
skip |= validate_required_handle("VkShaderModuleValidationCacheCreateInfoEXT", "validationCache", structure->validationCache);
} break;
// Validation code for VkPipelineViewportShadingRateImageStateCreateInfoNV structure members
- case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV: {
+ case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV: { // Covers VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-sType-sType
VkPipelineViewportShadingRateImageStateCreateInfoNV *structure = (VkPipelineViewportShadingRateImageStateCreateInfoNV *) header;
skip |= validate_bool32("VkPipelineViewportShadingRateImageStateCreateInfoNV", "shadingRateImageEnable", structure->shadingRateImageEnable);
-
- if (structure->pShadingRatePalettes != NULL)
- {
- for (uint32_t viewportIndex = 0; viewportIndex < structure->viewportCount; ++viewportIndex)
- {
- skip |= validate_ranged_enum_array("VkPipelineViewportShadingRateImageStateCreateInfoNV", ParameterName("pShadingRatePalettes[%i].shadingRatePaletteEntryCount", ParameterName::IndexVector{ viewportIndex }), ParameterName("pShadingRatePalettes[%i].pShadingRatePaletteEntries", ParameterName::IndexVector{ viewportIndex }), "VkShadingRatePaletteEntryNV", AllVkShadingRatePaletteEntryNVEnums, structure->pShadingRatePalettes[viewportIndex].shadingRatePaletteEntryCount, structure->pShadingRatePalettes[viewportIndex].pShadingRatePaletteEntries, true, true);
- }
- }
} break;
// Validation code for VkPhysicalDeviceShadingRateImageFeaturesNV structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV: { // Covers VUID-VkPhysicalDeviceShadingRateImageFeaturesNV-sType-sType
VkPhysicalDeviceShadingRateImageFeaturesNV *structure = (VkPhysicalDeviceShadingRateImageFeaturesNV *) header;
skip |= validate_bool32("VkPhysicalDeviceShadingRateImageFeaturesNV", "shadingRateImage", structure->shadingRateImage);
skip |= validate_bool32("VkPhysicalDeviceShadingRateImageFeaturesNV", "shadingRateCoarseSampleOrder", structure->shadingRateCoarseSampleOrder);
} break;
+ // No Validation code for VkPhysicalDeviceShadingRateImagePropertiesNV structure members -- Covers VUID-VkPhysicalDeviceShadingRateImagePropertiesNV-sType-sType
+
// Validation code for VkPipelineViewportCoarseSampleOrderStateCreateInfoNV structure members
- case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV: {
+ case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV: { // Covers VUID-VkPipelineViewportCoarseSampleOrderStateCreateInfoNV-sType-sType
VkPipelineViewportCoarseSampleOrderStateCreateInfoNV *structure = (VkPipelineViewportCoarseSampleOrderStateCreateInfoNV *) header;
skip |= validate_ranged_enum("VkPipelineViewportCoarseSampleOrderStateCreateInfoNV", "sampleOrderType", "VkCoarseSampleOrderTypeNV", AllVkCoarseSampleOrderTypeNVEnums, structure->sampleOrderType, "VUID-VkPipelineViewportCoarseSampleOrderStateCreateInfoNV-sampleOrderType-parameter");
@@ -1508,57 +1526,67 @@
} break;
// Validation code for VkWriteDescriptorSetAccelerationStructureKHR structure members
- case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR: {
+ case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR: { // Covers VUID-VkWriteDescriptorSetAccelerationStructureKHR-sType-sType
VkWriteDescriptorSetAccelerationStructureKHR *structure = (VkWriteDescriptorSetAccelerationStructureKHR *) header;
skip |= validate_handle_array("VkWriteDescriptorSetAccelerationStructureKHR", "accelerationStructureCount", "pAccelerationStructures", structure->accelerationStructureCount, structure->pAccelerationStructures, true, true);
} break;
+ // No Validation code for VkPhysicalDeviceRayTracingPropertiesNV structure members -- Covers VUID-VkPhysicalDeviceRayTracingPropertiesNV-sType-sType
+
// Validation code for VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV: { // Covers VUID-VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV-sType-sType
VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV *structure = (VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV *) header;
skip |= validate_bool32("VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV", "representativeFragmentTest", structure->representativeFragmentTest);
} break;
// Validation code for VkPipelineRepresentativeFragmentTestStateCreateInfoNV structure members
- case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV: {
+ case VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV: { // Covers VUID-VkPipelineRepresentativeFragmentTestStateCreateInfoNV-sType-sType
VkPipelineRepresentativeFragmentTestStateCreateInfoNV *structure = (VkPipelineRepresentativeFragmentTestStateCreateInfoNV *) header;
skip |= validate_bool32("VkPipelineRepresentativeFragmentTestStateCreateInfoNV", "representativeFragmentTestEnable", structure->representativeFragmentTestEnable);
} break;
// Validation code for VkPhysicalDeviceImageViewImageFormatInfoEXT structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT: { // Covers VUID-VkPhysicalDeviceImageViewImageFormatInfoEXT-sType-sType
VkPhysicalDeviceImageViewImageFormatInfoEXT *structure = (VkPhysicalDeviceImageViewImageFormatInfoEXT *) header;
skip |= validate_ranged_enum("VkPhysicalDeviceImageViewImageFormatInfoEXT", "imageViewType", "VkImageViewType", AllVkImageViewTypeEnums, structure->imageViewType, "VUID-VkPhysicalDeviceImageViewImageFormatInfoEXT-imageViewType-parameter");
} break;
+ // No Validation code for VkFilterCubicImageViewImageFormatPropertiesEXT structure members -- Covers VUID-VkFilterCubicImageViewImageFormatPropertiesEXT-sType-sType
+
// Validation code for VkDeviceQueueGlobalPriorityCreateInfoEXT structure members
- case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT: { // Covers VUID-VkDeviceQueueGlobalPriorityCreateInfoEXT-sType-sType
VkDeviceQueueGlobalPriorityCreateInfoEXT *structure = (VkDeviceQueueGlobalPriorityCreateInfoEXT *) header;
skip |= validate_ranged_enum("VkDeviceQueueGlobalPriorityCreateInfoEXT", "globalPriority", "VkQueueGlobalPriorityEXT", AllVkQueueGlobalPriorityEXTEnums, structure->globalPriority, "VUID-VkDeviceQueueGlobalPriorityCreateInfoEXT-globalPriority-parameter");
} break;
// Validation code for VkImportMemoryHostPointerInfoEXT structure members
- case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT: { // Covers VUID-VkImportMemoryHostPointerInfoEXT-sType-sType
VkImportMemoryHostPointerInfoEXT *structure = (VkImportMemoryHostPointerInfoEXT *) header;
skip |= validate_flags("VkImportMemoryHostPointerInfoEXT", "handleType", "VkExternalMemoryHandleTypeFlagBits", AllVkExternalMemoryHandleTypeFlagBits, structure->handleType, kRequiredSingleBit, "VUID-VkImportMemoryHostPointerInfoEXT-handleType-parameter", "VUID-VkImportMemoryHostPointerInfoEXT-handleType-parameter");
skip |= validate_required_pointer("VkImportMemoryHostPointerInfoEXT", "pHostPointer", structure->pHostPointer, kVUIDUndefined);
} break;
+ // No Validation code for VkPhysicalDeviceExternalMemoryHostPropertiesEXT structure members -- Covers VUID-VkPhysicalDeviceExternalMemoryHostPropertiesEXT-sType-sType
+
// Validation code for VkPipelineCompilerControlCreateInfoAMD structure members
- case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD: {
+ case VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD: { // Covers VUID-VkPipelineCompilerControlCreateInfoAMD-sType-sType
VkPipelineCompilerControlCreateInfoAMD *structure = (VkPipelineCompilerControlCreateInfoAMD *) header;
skip |= validate_reserved_flags("VkPipelineCompilerControlCreateInfoAMD", "compilerControlFlags", structure->compilerControlFlags, "VUID-VkPipelineCompilerControlCreateInfoAMD-compilerControlFlags-zerobitmask");
} break;
+ // No Validation code for VkPhysicalDeviceShaderCorePropertiesAMD structure members -- Covers VUID-VkPhysicalDeviceShaderCorePropertiesAMD-sType-sType
+
// Validation code for VkDeviceMemoryOverallocationCreateInfoAMD structure members
- case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD: {
+ case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD: { // Covers VUID-VkDeviceMemoryOverallocationCreateInfoAMD-sType-sType
VkDeviceMemoryOverallocationCreateInfoAMD *structure = (VkDeviceMemoryOverallocationCreateInfoAMD *) header;
skip |= validate_ranged_enum("VkDeviceMemoryOverallocationCreateInfoAMD", "overallocationBehavior", "VkMemoryOverallocationBehaviorAMD", AllVkMemoryOverallocationBehaviorAMDEnums, structure->overallocationBehavior, "VUID-VkDeviceMemoryOverallocationCreateInfoAMD-overallocationBehavior-parameter");
} break;
+ // No Validation code for VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT structure members -- Covers VUID-VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT-sType-sType
+
// Validation code for VkPipelineVertexInputDivisorStateCreateInfoEXT structure members
- case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT: { // Covers VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-sType-sType
VkPipelineVertexInputDivisorStateCreateInfoEXT *structure = (VkPipelineVertexInputDivisorStateCreateInfoEXT *) header;
skip |= validate_array("VkPipelineVertexInputDivisorStateCreateInfoEXT", "vertexBindingDivisorCount", "pVertexBindingDivisors", structure->vertexBindingDivisorCount, &structure->pVertexBindingDivisors, true, true, "VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-vertexBindingDivisorCount-arraylength", "VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-pVertexBindingDivisors-parameter");
@@ -1571,15 +1599,17 @@
} break;
// Validation code for VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT-sType-sType
VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *structure = (VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT *) header;
skip |= validate_bool32("VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT", "vertexAttributeInstanceRateDivisor", structure->vertexAttributeInstanceRateDivisor);
skip |= validate_bool32("VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT", "vertexAttributeInstanceRateZeroDivisor", structure->vertexAttributeInstanceRateZeroDivisor);
} break;
+ // No Validation code for VkPresentFrameTokenGGP structure members -- Covers VUID-VkPresentFrameTokenGGP-sType-sType
+
// Validation code for VkPipelineCreationFeedbackCreateInfoEXT structure members
- case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT: { // Covers VUID-VkPipelineCreationFeedbackCreateInfoEXT-sType-sType
VkPipelineCreationFeedbackCreateInfoEXT *structure = (VkPipelineCreationFeedbackCreateInfoEXT *) header;
skip |= validate_required_pointer("VkPipelineCreationFeedbackCreateInfoEXT", "pPipelineCreationFeedback", structure->pPipelineCreationFeedback, "VUID-VkPipelineCreationFeedbackCreateInfoEXT-pPipelineCreationFeedback-parameter");
@@ -1598,7 +1628,7 @@
} break;
// Validation code for VkPhysicalDeviceComputeShaderDerivativesFeaturesNV structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV: { // Covers VUID-VkPhysicalDeviceComputeShaderDerivativesFeaturesNV-sType-sType
VkPhysicalDeviceComputeShaderDerivativesFeaturesNV *structure = (VkPhysicalDeviceComputeShaderDerivativesFeaturesNV *) header;
skip |= validate_bool32("VkPhysicalDeviceComputeShaderDerivativesFeaturesNV", "computeDerivativeGroupQuads", structure->computeDerivativeGroupQuads);
@@ -1606,94 +1636,115 @@
} break;
// Validation code for VkPhysicalDeviceMeshShaderFeaturesNV structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV: { // Covers VUID-VkPhysicalDeviceMeshShaderFeaturesNV-sType-sType
VkPhysicalDeviceMeshShaderFeaturesNV *structure = (VkPhysicalDeviceMeshShaderFeaturesNV *) header;
skip |= validate_bool32("VkPhysicalDeviceMeshShaderFeaturesNV", "taskShader", structure->taskShader);
skip |= validate_bool32("VkPhysicalDeviceMeshShaderFeaturesNV", "meshShader", structure->meshShader);
} break;
+ // No Validation code for VkPhysicalDeviceMeshShaderPropertiesNV structure members -- Covers VUID-VkPhysicalDeviceMeshShaderPropertiesNV-sType-sType
+
// Validation code for VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV: { // Covers VUID-VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV-sType-sType
VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV *structure = (VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV *) header;
skip |= validate_bool32("VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV", "fragmentShaderBarycentric", structure->fragmentShaderBarycentric);
} break;
// Validation code for VkPhysicalDeviceShaderImageFootprintFeaturesNV structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV: { // Covers VUID-VkPhysicalDeviceShaderImageFootprintFeaturesNV-sType-sType
VkPhysicalDeviceShaderImageFootprintFeaturesNV *structure = (VkPhysicalDeviceShaderImageFootprintFeaturesNV *) header;
skip |= validate_bool32("VkPhysicalDeviceShaderImageFootprintFeaturesNV", "imageFootprint", structure->imageFootprint);
} break;
- // Validation code for VkPipelineViewportExclusiveScissorStateCreateInfoNV structure members
- case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV: {
- VkPipelineViewportExclusiveScissorStateCreateInfoNV *structure = (VkPipelineViewportExclusiveScissorStateCreateInfoNV *) header;
- if (structure->pExclusiveScissors != NULL)
- {
- for (uint32_t exclusiveScissorIndex = 0; exclusiveScissorIndex < structure->exclusiveScissorCount; ++exclusiveScissorIndex)
- {
- }
- }
- } break;
+ // No Validation code for VkPipelineViewportExclusiveScissorStateCreateInfoNV structure members -- Covers VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-sType-sType
// Validation code for VkPhysicalDeviceExclusiveScissorFeaturesNV structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV: { // Covers VUID-VkPhysicalDeviceExclusiveScissorFeaturesNV-sType-sType
VkPhysicalDeviceExclusiveScissorFeaturesNV *structure = (VkPhysicalDeviceExclusiveScissorFeaturesNV *) header;
skip |= validate_bool32("VkPhysicalDeviceExclusiveScissorFeaturesNV", "exclusiveScissor", structure->exclusiveScissor);
} break;
+ // No Validation code for VkQueueFamilyCheckpointPropertiesNV structure members -- Covers VUID-VkQueueFamilyCheckpointPropertiesNV-sType-sType
+
// Validation code for VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL: { // Covers VUID-VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL-sType-sType
VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL *structure = (VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL *) header;
skip |= validate_bool32("VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL", "shaderIntegerFunctions2", structure->shaderIntegerFunctions2);
} break;
// Validation code for VkQueryPoolPerformanceQueryCreateInfoINTEL structure members
- case VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL: {
+ case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL: { // Covers VUID-VkQueryPoolPerformanceQueryCreateInfoINTEL-sType-sType
VkQueryPoolPerformanceQueryCreateInfoINTEL *structure = (VkQueryPoolPerformanceQueryCreateInfoINTEL *) header;
skip |= validate_ranged_enum("VkQueryPoolPerformanceQueryCreateInfoINTEL", "performanceCountersSampling", "VkQueryPoolSamplingModeINTEL", AllVkQueryPoolSamplingModeINTELEnums, structure->performanceCountersSampling, "VUID-VkQueryPoolPerformanceQueryCreateInfoINTEL-performanceCountersSampling-parameter");
} break;
+ // No Validation code for VkPhysicalDevicePCIBusInfoPropertiesEXT structure members -- Covers VUID-VkPhysicalDevicePCIBusInfoPropertiesEXT-sType-sType
+
+ // No Validation code for VkDisplayNativeHdrSurfaceCapabilitiesAMD structure members -- Covers VUID-VkDisplayNativeHdrSurfaceCapabilitiesAMD-sType-sType
+
// Validation code for VkSwapchainDisplayNativeHdrCreateInfoAMD structure members
- case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD: {
+ case VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD: { // Covers VUID-VkSwapchainDisplayNativeHdrCreateInfoAMD-sType-sType
VkSwapchainDisplayNativeHdrCreateInfoAMD *structure = (VkSwapchainDisplayNativeHdrCreateInfoAMD *) header;
skip |= validate_bool32("VkSwapchainDisplayNativeHdrCreateInfoAMD", "localDimmingEnable", structure->localDimmingEnable);
} break;
+ // Validation code for VkPhysicalDeviceFragmentDensityMapFeaturesEXT structure members
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceFragmentDensityMapFeaturesEXT-sType-sType
+ VkPhysicalDeviceFragmentDensityMapFeaturesEXT *structure = (VkPhysicalDeviceFragmentDensityMapFeaturesEXT *) header;
+ skip |= validate_bool32("VkPhysicalDeviceFragmentDensityMapFeaturesEXT", "fragmentDensityMap", structure->fragmentDensityMap);
+
+ skip |= validate_bool32("VkPhysicalDeviceFragmentDensityMapFeaturesEXT", "fragmentDensityMapDynamic", structure->fragmentDensityMapDynamic);
+
+ skip |= validate_bool32("VkPhysicalDeviceFragmentDensityMapFeaturesEXT", "fragmentDensityMapNonSubsampledImages", structure->fragmentDensityMapNonSubsampledImages);
+ } break;
+
+ // No Validation code for VkPhysicalDeviceFragmentDensityMapPropertiesEXT structure members -- Covers VUID-VkPhysicalDeviceFragmentDensityMapPropertiesEXT-sType-sType
+
// Validation code for VkRenderPassFragmentDensityMapCreateInfoEXT structure members
- case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT: { // Covers VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-sType-sType
VkRenderPassFragmentDensityMapCreateInfoEXT *structure = (VkRenderPassFragmentDensityMapCreateInfoEXT *) header;
skip |= validate_ranged_enum("VkRenderPassFragmentDensityMapCreateInfoEXT", "fragmentDensityMapAttachment.layout", "VkImageLayout", AllVkImageLayoutEnums, structure->fragmentDensityMapAttachment.layout, "VUID-VkAttachmentReference-layout-parameter");
} break;
// Validation code for VkPhysicalDeviceSubgroupSizeControlFeaturesEXT structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceSubgroupSizeControlFeaturesEXT-sType-sType
VkPhysicalDeviceSubgroupSizeControlFeaturesEXT *structure = (VkPhysicalDeviceSubgroupSizeControlFeaturesEXT *) header;
skip |= validate_bool32("VkPhysicalDeviceSubgroupSizeControlFeaturesEXT", "subgroupSizeControl", structure->subgroupSizeControl);
skip |= validate_bool32("VkPhysicalDeviceSubgroupSizeControlFeaturesEXT", "computeFullSubgroups", structure->computeFullSubgroups);
} break;
+ // No Validation code for VkPhysicalDeviceSubgroupSizeControlPropertiesEXT structure members -- Covers VUID-VkPhysicalDeviceSubgroupSizeControlPropertiesEXT-sType-sType
+
+ // No Validation code for VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT structure members -- Covers VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT-sType-sType
+
+ // No Validation code for VkPhysicalDeviceShaderCoreProperties2AMD structure members -- Covers VUID-VkPhysicalDeviceShaderCoreProperties2AMD-sType-sType
+
// Validation code for VkPhysicalDeviceCoherentMemoryFeaturesAMD structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD: { // Covers VUID-VkPhysicalDeviceCoherentMemoryFeaturesAMD-sType-sType
VkPhysicalDeviceCoherentMemoryFeaturesAMD *structure = (VkPhysicalDeviceCoherentMemoryFeaturesAMD *) header;
skip |= validate_bool32("VkPhysicalDeviceCoherentMemoryFeaturesAMD", "deviceCoherentMemory", structure->deviceCoherentMemory);
} break;
+ // No Validation code for VkPhysicalDeviceMemoryBudgetPropertiesEXT structure members -- Covers VUID-VkPhysicalDeviceMemoryBudgetPropertiesEXT-sType-sType
+
// Validation code for VkPhysicalDeviceMemoryPriorityFeaturesEXT structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceMemoryPriorityFeaturesEXT-sType-sType
VkPhysicalDeviceMemoryPriorityFeaturesEXT *structure = (VkPhysicalDeviceMemoryPriorityFeaturesEXT *) header;
skip |= validate_bool32("VkPhysicalDeviceMemoryPriorityFeaturesEXT", "memoryPriority", structure->memoryPriority);
} break;
+ // No Validation code for VkMemoryPriorityAllocateInfoEXT structure members -- Covers VUID-VkMemoryPriorityAllocateInfoEXT-sType-sType
+
// Validation code for VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV: { // Covers VUID-VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV-sType-sType
VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV *structure = (VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV *) header;
skip |= validate_bool32("VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV", "dedicatedAllocationImageAliasing", structure->dedicatedAllocationImageAliasing);
} break;
// Validation code for VkPhysicalDeviceBufferDeviceAddressFeaturesEXT structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceBufferDeviceAddressFeaturesEXT-sType-sType
VkPhysicalDeviceBufferDeviceAddressFeaturesEXT *structure = (VkPhysicalDeviceBufferDeviceAddressFeaturesEXT *) header;
skip |= validate_bool32("VkPhysicalDeviceBufferDeviceAddressFeaturesEXT", "bufferDeviceAddress", structure->bufferDeviceAddress);
@@ -1702,8 +1753,10 @@
skip |= validate_bool32("VkPhysicalDeviceBufferDeviceAddressFeaturesEXT", "bufferDeviceAddressMultiDevice", structure->bufferDeviceAddressMultiDevice);
} break;
+ // No Validation code for VkBufferDeviceAddressCreateInfoEXT structure members -- Covers VUID-VkBufferDeviceAddressCreateInfoEXT-sType-sType
+
// Validation code for VkValidationFeaturesEXT structure members
- case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT: {
+ case VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT: { // Covers VUID-VkValidationFeaturesEXT-sType-sType
VkValidationFeaturesEXT *structure = (VkValidationFeaturesEXT *) header;
skip |= validate_ranged_enum_array("VkValidationFeaturesEXT", "enabledValidationFeatureCount", "pEnabledValidationFeatures", "VkValidationFeatureEnableEXT", AllVkValidationFeatureEnableEXTEnums, structure->enabledValidationFeatureCount, structure->pEnabledValidationFeatures, false, true);
@@ -1711,21 +1764,23 @@
} break;
// Validation code for VkPhysicalDeviceCooperativeMatrixFeaturesNV structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV: { // Covers VUID-VkPhysicalDeviceCooperativeMatrixFeaturesNV-sType-sType
VkPhysicalDeviceCooperativeMatrixFeaturesNV *structure = (VkPhysicalDeviceCooperativeMatrixFeaturesNV *) header;
skip |= validate_bool32("VkPhysicalDeviceCooperativeMatrixFeaturesNV", "cooperativeMatrix", structure->cooperativeMatrix);
skip |= validate_bool32("VkPhysicalDeviceCooperativeMatrixFeaturesNV", "cooperativeMatrixRobustBufferAccess", structure->cooperativeMatrixRobustBufferAccess);
} break;
+ // No Validation code for VkPhysicalDeviceCooperativeMatrixPropertiesNV structure members -- Covers VUID-VkPhysicalDeviceCooperativeMatrixPropertiesNV-sType-sType
+
// Validation code for VkPhysicalDeviceCoverageReductionModeFeaturesNV structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV: { // Covers VUID-VkPhysicalDeviceCoverageReductionModeFeaturesNV-sType-sType
VkPhysicalDeviceCoverageReductionModeFeaturesNV *structure = (VkPhysicalDeviceCoverageReductionModeFeaturesNV *) header;
skip |= validate_bool32("VkPhysicalDeviceCoverageReductionModeFeaturesNV", "coverageReductionMode", structure->coverageReductionMode);
} break;
// Validation code for VkPipelineCoverageReductionStateCreateInfoNV structure members
- case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV: {
+ case VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV: { // Covers VUID-VkPipelineCoverageReductionStateCreateInfoNV-sType-sType
VkPipelineCoverageReductionStateCreateInfoNV *structure = (VkPipelineCoverageReductionStateCreateInfoNV *) header;
skip |= validate_reserved_flags("VkPipelineCoverageReductionStateCreateInfoNV", "flags", structure->flags, "VUID-VkPipelineCoverageReductionStateCreateInfoNV-flags-zerobitmask");
@@ -1733,7 +1788,7 @@
} break;
// Validation code for VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT-sType-sType
VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT *structure = (VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT *) header;
skip |= validate_bool32("VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT", "fragmentShaderSampleInterlock", structure->fragmentShaderSampleInterlock);
@@ -1743,14 +1798,14 @@
} break;
// Validation code for VkPhysicalDeviceYcbcrImageArraysFeaturesEXT structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceYcbcrImageArraysFeaturesEXT-sType-sType
VkPhysicalDeviceYcbcrImageArraysFeaturesEXT *structure = (VkPhysicalDeviceYcbcrImageArraysFeaturesEXT *) header;
skip |= validate_bool32("VkPhysicalDeviceYcbcrImageArraysFeaturesEXT", "ycbcrImageArrays", structure->ycbcrImageArrays);
} break;
#ifdef VK_USE_PLATFORM_WIN32_KHR
// Validation code for VkSurfaceFullScreenExclusiveInfoEXT structure members
- case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT: { // Covers VUID-VkSurfaceFullScreenExclusiveInfoEXT-sType-sType
VkSurfaceFullScreenExclusiveInfoEXT *structure = (VkSurfaceFullScreenExclusiveInfoEXT *) header;
skip |= validate_ranged_enum("VkSurfaceFullScreenExclusiveInfoEXT", "fullScreenExclusive", "VkFullScreenExclusiveEXT", AllVkFullScreenExclusiveEXTEnums, structure->fullScreenExclusive, "VUID-VkSurfaceFullScreenExclusiveInfoEXT-fullScreenExclusive-parameter");
} break;
@@ -1758,14 +1813,16 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
// Validation code for VkSurfaceCapabilitiesFullScreenExclusiveEXT structure members
- case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT: {
+ case VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT: { // Covers VUID-VkSurfaceCapabilitiesFullScreenExclusiveEXT-sType-sType
VkSurfaceCapabilitiesFullScreenExclusiveEXT *structure = (VkSurfaceCapabilitiesFullScreenExclusiveEXT *) header;
skip |= validate_bool32("VkSurfaceCapabilitiesFullScreenExclusiveEXT", "fullScreenExclusiveSupported", structure->fullScreenExclusiveSupported);
} break;
#endif // VK_USE_PLATFORM_WIN32_KHR
+ // No Validation code for VkSurfaceFullScreenExclusiveWin32InfoEXT structure members -- Covers VUID-VkSurfaceFullScreenExclusiveWin32InfoEXT-sType-sType
+
// Validation code for VkPhysicalDeviceLineRasterizationFeaturesEXT structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceLineRasterizationFeaturesEXT-sType-sType
VkPhysicalDeviceLineRasterizationFeaturesEXT *structure = (VkPhysicalDeviceLineRasterizationFeaturesEXT *) header;
skip |= validate_bool32("VkPhysicalDeviceLineRasterizationFeaturesEXT", "rectangularLines", structure->rectangularLines);
@@ -1780,34 +1837,72 @@
skip |= validate_bool32("VkPhysicalDeviceLineRasterizationFeaturesEXT", "stippledSmoothLines", structure->stippledSmoothLines);
} break;
+ // No Validation code for VkPhysicalDeviceLineRasterizationPropertiesEXT structure members -- Covers VUID-VkPhysicalDeviceLineRasterizationPropertiesEXT-sType-sType
+
// Validation code for VkPipelineRasterizationLineStateCreateInfoEXT structure members
- case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT: {
+ case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT: { // Covers VUID-VkPipelineRasterizationLineStateCreateInfoEXT-sType-sType
VkPipelineRasterizationLineStateCreateInfoEXT *structure = (VkPipelineRasterizationLineStateCreateInfoEXT *) header;
skip |= validate_ranged_enum("VkPipelineRasterizationLineStateCreateInfoEXT", "lineRasterizationMode", "VkLineRasterizationModeEXT", AllVkLineRasterizationModeEXTEnums, structure->lineRasterizationMode, "VUID-VkPipelineRasterizationLineStateCreateInfoEXT-lineRasterizationMode-parameter");
skip |= validate_bool32("VkPipelineRasterizationLineStateCreateInfoEXT", "stippledLineEnable", structure->stippledLineEnable);
} break;
+ // Validation code for VkPhysicalDeviceShaderAtomicFloatFeaturesEXT structure members
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceShaderAtomicFloatFeaturesEXT-sType-sType
+ VkPhysicalDeviceShaderAtomicFloatFeaturesEXT *structure = (VkPhysicalDeviceShaderAtomicFloatFeaturesEXT *) header;
+ skip |= validate_bool32("VkPhysicalDeviceShaderAtomicFloatFeaturesEXT", "shaderBufferFloat32Atomics", structure->shaderBufferFloat32Atomics);
+
+ skip |= validate_bool32("VkPhysicalDeviceShaderAtomicFloatFeaturesEXT", "shaderBufferFloat32AtomicAdd", structure->shaderBufferFloat32AtomicAdd);
+
+ skip |= validate_bool32("VkPhysicalDeviceShaderAtomicFloatFeaturesEXT", "shaderBufferFloat64Atomics", structure->shaderBufferFloat64Atomics);
+
+ skip |= validate_bool32("VkPhysicalDeviceShaderAtomicFloatFeaturesEXT", "shaderBufferFloat64AtomicAdd", structure->shaderBufferFloat64AtomicAdd);
+
+ skip |= validate_bool32("VkPhysicalDeviceShaderAtomicFloatFeaturesEXT", "shaderSharedFloat32Atomics", structure->shaderSharedFloat32Atomics);
+
+ skip |= validate_bool32("VkPhysicalDeviceShaderAtomicFloatFeaturesEXT", "shaderSharedFloat32AtomicAdd", structure->shaderSharedFloat32AtomicAdd);
+
+ skip |= validate_bool32("VkPhysicalDeviceShaderAtomicFloatFeaturesEXT", "shaderSharedFloat64Atomics", structure->shaderSharedFloat64Atomics);
+
+ skip |= validate_bool32("VkPhysicalDeviceShaderAtomicFloatFeaturesEXT", "shaderSharedFloat64AtomicAdd", structure->shaderSharedFloat64AtomicAdd);
+
+ skip |= validate_bool32("VkPhysicalDeviceShaderAtomicFloatFeaturesEXT", "shaderImageFloat32Atomics", structure->shaderImageFloat32Atomics);
+
+ skip |= validate_bool32("VkPhysicalDeviceShaderAtomicFloatFeaturesEXT", "shaderImageFloat32AtomicAdd", structure->shaderImageFloat32AtomicAdd);
+
+ skip |= validate_bool32("VkPhysicalDeviceShaderAtomicFloatFeaturesEXT", "sparseImageFloat32Atomics", structure->sparseImageFloat32Atomics);
+
+ skip |= validate_bool32("VkPhysicalDeviceShaderAtomicFloatFeaturesEXT", "sparseImageFloat32AtomicAdd", structure->sparseImageFloat32AtomicAdd);
+ } break;
+
// Validation code for VkPhysicalDeviceIndexTypeUint8FeaturesEXT structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceIndexTypeUint8FeaturesEXT-sType-sType
VkPhysicalDeviceIndexTypeUint8FeaturesEXT *structure = (VkPhysicalDeviceIndexTypeUint8FeaturesEXT *) header;
skip |= validate_bool32("VkPhysicalDeviceIndexTypeUint8FeaturesEXT", "indexTypeUint8", structure->indexTypeUint8);
} break;
+ // Validation code for VkPhysicalDeviceExtendedDynamicStateFeaturesEXT structure members
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceExtendedDynamicStateFeaturesEXT-sType-sType
+ VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *structure = (VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *) header;
+ skip |= validate_bool32("VkPhysicalDeviceExtendedDynamicStateFeaturesEXT", "extendedDynamicState", structure->extendedDynamicState);
+ } break;
+
// Validation code for VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT-sType-sType
VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT *structure = (VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT *) header;
skip |= validate_bool32("VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT", "shaderDemoteToHelperInvocation", structure->shaderDemoteToHelperInvocation);
} break;
+ // No Validation code for VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV structure members -- Covers VUID-VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV-sType-sType
+
// Validation code for VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV: { // Covers VUID-VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV-sType-sType
VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV *structure = (VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV *) header;
skip |= validate_bool32("VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV", "deviceGeneratedCommands", structure->deviceGeneratedCommands);
} break;
// Validation code for VkGraphicsPipelineShaderGroupsCreateInfoNV structure members
- case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV: {
+ case VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV: { // Covers VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-sType-sType
VkGraphicsPipelineShaderGroupsCreateInfoNV *structure = (VkGraphicsPipelineShaderGroupsCreateInfoNV *) header;
skip |= validate_struct_type_array("VkGraphicsPipelineShaderGroupsCreateInfoNV", "groupCount", "pGroups", "VK_STRUCTURE_TYPE_GRAPHICS_SHADER_GROUP_CREATE_INFO_NV", structure->groupCount, structure->pGroups, VK_STRUCTURE_TYPE_GRAPHICS_SHADER_GROUP_CREATE_INFO_NV, true, true, "VUID-VkGraphicsShaderGroupCreateInfoNV-sType-sType", "VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-parameter", "VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-groupCount-arraylength");
@@ -1851,32 +1946,88 @@
} break;
// Validation code for VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT-sType-sType
VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *structure = (VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT *) header;
skip |= validate_bool32("VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT", "texelBufferAlignment", structure->texelBufferAlignment);
} break;
+ // No Validation code for VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT structure members -- Covers VUID-VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT-sType-sType
+
+ // No Validation code for VkRenderPassTransformBeginInfoQCOM structure members -- Covers VUID-VkRenderPassTransformBeginInfoQCOM-sType-sType
+
+ // No Validation code for VkCommandBufferInheritanceRenderPassTransformInfoQCOM structure members -- Covers VUID-VkCommandBufferInheritanceRenderPassTransformInfoQCOM-sType-sType
+
+ // Validation code for VkPhysicalDeviceRobustness2FeaturesEXT structure members
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceRobustness2FeaturesEXT-sType-sType
+ VkPhysicalDeviceRobustness2FeaturesEXT *structure = (VkPhysicalDeviceRobustness2FeaturesEXT *) header;
+ skip |= validate_bool32("VkPhysicalDeviceRobustness2FeaturesEXT", "robustBufferAccess2", structure->robustBufferAccess2);
+
+ skip |= validate_bool32("VkPhysicalDeviceRobustness2FeaturesEXT", "robustImageAccess2", structure->robustImageAccess2);
+
+ skip |= validate_bool32("VkPhysicalDeviceRobustness2FeaturesEXT", "nullDescriptor", structure->nullDescriptor);
+ } break;
+
+ // No Validation code for VkPhysicalDeviceRobustness2PropertiesEXT structure members -- Covers VUID-VkPhysicalDeviceRobustness2PropertiesEXT-sType-sType
+
+ // Validation code for VkSamplerCustomBorderColorCreateInfoEXT structure members
+ case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT: { // Covers VUID-VkSamplerCustomBorderColorCreateInfoEXT-sType-sType
+ VkSamplerCustomBorderColorCreateInfoEXT *structure = (VkSamplerCustomBorderColorCreateInfoEXT *) header;
+ skip |= validate_ranged_enum("VkSamplerCustomBorderColorCreateInfoEXT", "format", "VkFormat", AllVkFormatEnums, structure->format, "VUID-VkSamplerCustomBorderColorCreateInfoEXT-format-parameter");
+ } break;
+
+ // No Validation code for VkPhysicalDeviceCustomBorderColorPropertiesEXT structure members -- Covers VUID-VkPhysicalDeviceCustomBorderColorPropertiesEXT-sType-sType
+
+ // Validation code for VkPhysicalDeviceCustomBorderColorFeaturesEXT structure members
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceCustomBorderColorFeaturesEXT-sType-sType
+ VkPhysicalDeviceCustomBorderColorFeaturesEXT *structure = (VkPhysicalDeviceCustomBorderColorFeaturesEXT *) header;
+ skip |= validate_bool32("VkPhysicalDeviceCustomBorderColorFeaturesEXT", "customBorderColors", structure->customBorderColors);
+
+ skip |= validate_bool32("VkPhysicalDeviceCustomBorderColorFeaturesEXT", "customBorderColorWithoutFormat", structure->customBorderColorWithoutFormat);
+ } break;
+
+ // Validation code for VkPhysicalDevicePrivateDataFeaturesEXT structure members
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT: { // Covers VUID-VkPhysicalDevicePrivateDataFeaturesEXT-sType-sType
+ VkPhysicalDevicePrivateDataFeaturesEXT *structure = (VkPhysicalDevicePrivateDataFeaturesEXT *) header;
+ skip |= validate_bool32("VkPhysicalDevicePrivateDataFeaturesEXT", "privateData", structure->privateData);
+ } break;
+
+ // No Validation code for VkDevicePrivateDataCreateInfoEXT structure members -- Covers VUID-VkDevicePrivateDataCreateInfoEXT-sType-sType
+
// Validation code for VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT: { // Covers VUID-VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT-sType-sType
VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT *structure = (VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT *) header;
skip |= validate_bool32("VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT", "pipelineCreationCacheControl", structure->pipelineCreationCacheControl);
} break;
// Validation code for VkPhysicalDeviceDiagnosticsConfigFeaturesNV structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV: { // Covers VUID-VkPhysicalDeviceDiagnosticsConfigFeaturesNV-sType-sType
VkPhysicalDeviceDiagnosticsConfigFeaturesNV *structure = (VkPhysicalDeviceDiagnosticsConfigFeaturesNV *) header;
skip |= validate_bool32("VkPhysicalDeviceDiagnosticsConfigFeaturesNV", "diagnosticsConfig", structure->diagnosticsConfig);
} break;
// Validation code for VkDeviceDiagnosticsConfigCreateInfoNV structure members
- case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV: {
+ case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV: { // Covers VUID-VkDeviceDiagnosticsConfigCreateInfoNV-sType-sType
VkDeviceDiagnosticsConfigCreateInfoNV *structure = (VkDeviceDiagnosticsConfigCreateInfoNV *) header;
skip |= validate_flags("VkDeviceDiagnosticsConfigCreateInfoNV", "flags", "VkDeviceDiagnosticsConfigFlagBitsNV", AllVkDeviceDiagnosticsConfigFlagBitsNV, structure->flags, kOptionalFlags, "VUID-VkDeviceDiagnosticsConfigCreateInfoNV-flags-parameter");
} break;
+ // Validation code for VkPhysicalDeviceFragmentDensityMap2FeaturesEXT structure members
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceFragmentDensityMap2FeaturesEXT-sType-sType
+ VkPhysicalDeviceFragmentDensityMap2FeaturesEXT *structure = (VkPhysicalDeviceFragmentDensityMap2FeaturesEXT *) header;
+ skip |= validate_bool32("VkPhysicalDeviceFragmentDensityMap2FeaturesEXT", "fragmentDensityMapDeferred", structure->fragmentDensityMapDeferred);
+ } break;
+
+ // No Validation code for VkPhysicalDeviceFragmentDensityMap2PropertiesEXT structure members -- Covers VUID-VkPhysicalDeviceFragmentDensityMap2PropertiesEXT-sType-sType
+
+ // Validation code for VkPhysicalDeviceImageRobustnessFeaturesEXT structure members
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT: { // Covers VUID-VkPhysicalDeviceImageRobustnessFeaturesEXT-sType-sType
+ VkPhysicalDeviceImageRobustnessFeaturesEXT *structure = (VkPhysicalDeviceImageRobustnessFeaturesEXT *) header;
+ skip |= validate_bool32("VkPhysicalDeviceImageRobustnessFeaturesEXT", "robustImageAccess", structure->robustImageAccess);
+ } break;
+
#ifdef VK_USE_PLATFORM_FUCHSIA
// Validation code for VkFuchsiaImageFormatFUCHSIA structure members
- case VK_STRUCTURE_TYPE_FUCHSIA_IMAGE_FORMAT_FUCHSIA: {
+ case VK_STRUCTURE_TYPE_FUCHSIA_IMAGE_FORMAT_FUCHSIA: { // Covers VUID-VkFuchsiaImageFormatFUCHSIA-sType-sType
VkFuchsiaImageFormatFUCHSIA *structure = (VkFuchsiaImageFormatFUCHSIA *) header;
skip |= validate_required_pointer("VkFuchsiaImageFormatFUCHSIA", "imageFormat", structure->imageFormat, kVUIDUndefined);
} break;
@@ -1884,7 +2035,7 @@
#ifdef VK_USE_PLATFORM_FUCHSIA
// Validation code for VkImportMemoryBufferCollectionFUCHSIA structure members
- case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA: {
+ case VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA: { // Covers VUID-VkImportMemoryBufferCollectionFUCHSIA-sType-sType
VkImportMemoryBufferCollectionFUCHSIA *structure = (VkImportMemoryBufferCollectionFUCHSIA *) header;
skip |= validate_required_handle("VkImportMemoryBufferCollectionFUCHSIA", "collection", structure->collection);
} break;
@@ -1892,7 +2043,7 @@
#ifdef VK_USE_PLATFORM_FUCHSIA
// Validation code for VkBufferCollectionImageCreateInfoFUCHSIA structure members
- case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA: {
+ case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA: { // Covers VUID-VkBufferCollectionImageCreateInfoFUCHSIA-sType-sType
VkBufferCollectionImageCreateInfoFUCHSIA *structure = (VkBufferCollectionImageCreateInfoFUCHSIA *) header;
skip |= validate_required_handle("VkBufferCollectionImageCreateInfoFUCHSIA", "collection", structure->collection);
} break;
@@ -1900,7 +2051,7 @@
#ifdef VK_USE_PLATFORM_FUCHSIA
// Validation code for VkBufferCollectionBufferCreateInfoFUCHSIA structure members
- case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA: {
+ case VK_STRUCTURE_TYPE_BUFFER_COLLECTION_BUFFER_CREATE_INFO_FUCHSIA: { // Covers VUID-VkBufferCollectionBufferCreateInfoFUCHSIA-sType-sType
VkBufferCollectionBufferCreateInfoFUCHSIA *structure = (VkBufferCollectionBufferCreateInfoFUCHSIA *) header;
skip |= validate_required_handle("VkBufferCollectionBufferCreateInfoFUCHSIA", "collection", structure->collection);
} break;
@@ -1908,7 +2059,7 @@
#ifdef VK_USE_PLATFORM_FUCHSIA
// Validation code for VkImportMemoryZirconHandleInfoFUCHSIA structure members
- case VK_STRUCTURE_TYPE_TEMP_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA: {
+ case VK_STRUCTURE_TYPE_TEMP_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA: { // Covers VUID-VkImportMemoryZirconHandleInfoFUCHSIA-sType-sType
VkImportMemoryZirconHandleInfoFUCHSIA *structure = (VkImportMemoryZirconHandleInfoFUCHSIA *) header;
skip |= validate_flags("VkImportMemoryZirconHandleInfoFUCHSIA", "handleType", "VkExternalMemoryHandleTypeFlagBits", AllVkExternalMemoryHandleTypeFlagBits, structure->handleType, kOptionalSingleBit, kVUIDUndefined);
} break;
@@ -1916,7 +2067,7 @@
#ifdef VK_ENABLE_BETA_EXTENSIONS
// Validation code for VkPhysicalDeviceRayTracingFeaturesKHR structure members
- case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_FEATURES_KHR: {
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_FEATURES_KHR: { // Covers VUID-VkPhysicalDeviceRayTracingFeaturesKHR-sType-sType
VkPhysicalDeviceRayTracingFeaturesKHR *structure = (VkPhysicalDeviceRayTracingFeaturesKHR *) header;
skip |= validate_bool32("VkPhysicalDeviceRayTracingFeaturesKHR", "rayTracing", structure->rayTracing);
@@ -1937,6 +2088,8 @@
skip |= validate_bool32("VkPhysicalDeviceRayTracingFeaturesKHR", "rayTracingPrimitiveCulling", structure->rayTracingPrimitiveCulling);
} break;
#endif // VK_ENABLE_BETA_EXTENSIONS
+
+ // No Validation code for VkPhysicalDeviceRayTracingPropertiesKHR structure members -- Covers VUID-VkPhysicalDeviceRayTracingPropertiesKHR-sType-sType
default:
skip = false;
}
@@ -2130,9 +2283,9 @@
skip |= validate_struct_type("vkCreateDevice", "pCreateInfo", "VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO", pCreateInfo, VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, true, "VUID-vkCreateDevice-pCreateInfo-parameter", "VUID-VkDeviceCreateInfo-sType-sType");
if (pCreateInfo != NULL)
{
- const VkStructureType allowed_structs_VkDeviceCreateInfo[] = { VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV, VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO, VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_FEATURES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT };
+ const VkStructureType allowed_structs_VkDeviceCreateInfo[] = { VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV, VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO, VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD, VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_FEATURES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT };
- skip |= validate_struct_pnext("vkCreateDevice", "pCreateInfo->pNext", "VkDeviceDiagnosticsConfigCreateInfoNV, VkDeviceGroupDeviceCreateInfo, VkDeviceMemoryOverallocationCreateInfoAMD, VkPhysicalDevice16BitStorageFeatures, VkPhysicalDevice8BitStorageFeatures, VkPhysicalDeviceASTCDecodeFeaturesEXT, VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT, VkPhysicalDeviceBufferDeviceAddressFeatures, VkPhysicalDeviceBufferDeviceAddressFeaturesEXT, VkPhysicalDeviceCoherentMemoryFeaturesAMD, VkPhysicalDeviceComputeShaderDerivativesFeaturesNV, VkPhysicalDeviceConditionalRenderingFeaturesEXT, VkPhysicalDeviceCooperativeMatrixFeaturesNV, VkPhysicalDeviceCornerSampledImageFeaturesNV, VkPhysicalDeviceCoverageReductionModeFeaturesNV, VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV, VkPhysicalDeviceDepthClipEnableFeaturesEXT, VkPhysicalDeviceDescriptorIndexingFeatures, VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV, VkPhysicalDeviceDiagnosticsConfigFeaturesNV, VkPhysicalDeviceExclusiveScissorFeaturesNV, VkPhysicalDeviceFeatures2, VkPhysicalDeviceFragmentDensityMapFeaturesEXT, VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV, VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT, VkPhysicalDeviceHostQueryResetFeatures, VkPhysicalDeviceImagelessFramebufferFeatures, VkPhysicalDeviceIndexTypeUint8FeaturesEXT, VkPhysicalDeviceInlineUniformBlockFeaturesEXT, VkPhysicalDeviceLineRasterizationFeaturesEXT, VkPhysicalDeviceMemoryPriorityFeaturesEXT, VkPhysicalDeviceMeshShaderFeaturesNV, VkPhysicalDeviceMultiviewFeatures, VkPhysicalDevicePerformanceQueryFeaturesKHR, VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT, VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR, VkPhysicalDeviceProtectedMemoryFeatures, VkPhysicalDeviceRayTracingFeaturesKHR, VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV, VkPhysicalDeviceSamplerYcbcrConversionFeatures, VkPhysicalDeviceScalarBlockLayoutFeatures, VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures, VkPhysicalDeviceShaderAtomicInt64Features, VkPhysicalDeviceShaderClockFeaturesKHR, VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT, VkPhysicalDeviceShaderDrawParametersFeatures, VkPhysicalDeviceShaderFloat16Int8Features, VkPhysicalDeviceShaderImageFootprintFeaturesNV, VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL, VkPhysicalDeviceShaderSMBuiltinsFeaturesNV, VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures, VkPhysicalDeviceShadingRateImageFeaturesNV, VkPhysicalDeviceSubgroupSizeControlFeaturesEXT, VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT, VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT, VkPhysicalDeviceTimelineSemaphoreFeatures, VkPhysicalDeviceTransformFeedbackFeaturesEXT, VkPhysicalDeviceUniformBufferStandardLayoutFeatures, VkPhysicalDeviceVariablePointersFeatures, VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT, VkPhysicalDeviceVulkan11Features, VkPhysicalDeviceVulkan12Features, VkPhysicalDeviceVulkanMemoryModelFeatures, VkPhysicalDeviceYcbcrImageArraysFeaturesEXT", pCreateInfo->pNext, ARRAY_SIZE(allowed_structs_VkDeviceCreateInfo), allowed_structs_VkDeviceCreateInfo, GeneratedVulkanHeaderVersion, "VUID-VkDeviceCreateInfo-pNext-pNext", "VUID-VkDeviceCreateInfo-sType-unique");
+ skip |= validate_struct_pnext("vkCreateDevice", "pCreateInfo->pNext", "VkDeviceDiagnosticsConfigCreateInfoNV, VkDeviceGroupDeviceCreateInfo, VkDeviceMemoryOverallocationCreateInfoAMD, VkDevicePrivateDataCreateInfoEXT, VkPhysicalDevice16BitStorageFeatures, VkPhysicalDevice8BitStorageFeatures, VkPhysicalDeviceASTCDecodeFeaturesEXT, VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT, VkPhysicalDeviceBufferDeviceAddressFeatures, VkPhysicalDeviceBufferDeviceAddressFeaturesEXT, VkPhysicalDeviceCoherentMemoryFeaturesAMD, VkPhysicalDeviceComputeShaderDerivativesFeaturesNV, VkPhysicalDeviceConditionalRenderingFeaturesEXT, VkPhysicalDeviceCooperativeMatrixFeaturesNV, VkPhysicalDeviceCornerSampledImageFeaturesNV, VkPhysicalDeviceCoverageReductionModeFeaturesNV, VkPhysicalDeviceCustomBorderColorFeaturesEXT, VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV, VkPhysicalDeviceDepthClipEnableFeaturesEXT, VkPhysicalDeviceDescriptorIndexingFeatures, VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV, VkPhysicalDeviceDiagnosticsConfigFeaturesNV, VkPhysicalDeviceExclusiveScissorFeaturesNV, VkPhysicalDeviceExtendedDynamicStateFeaturesEXT, VkPhysicalDeviceFeatures2, VkPhysicalDeviceFragmentDensityMap2FeaturesEXT, VkPhysicalDeviceFragmentDensityMapFeaturesEXT, VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV, VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT, VkPhysicalDeviceHostQueryResetFeatures, VkPhysicalDeviceImageRobustnessFeaturesEXT, VkPhysicalDeviceImagelessFramebufferFeatures, VkPhysicalDeviceIndexTypeUint8FeaturesEXT, VkPhysicalDeviceInlineUniformBlockFeaturesEXT, VkPhysicalDeviceLineRasterizationFeaturesEXT, VkPhysicalDeviceMemoryPriorityFeaturesEXT, VkPhysicalDeviceMeshShaderFeaturesNV, VkPhysicalDeviceMultiviewFeatures, VkPhysicalDevicePerformanceQueryFeaturesKHR, VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT, VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR, VkPhysicalDevicePrivateDataFeaturesEXT, VkPhysicalDeviceProtectedMemoryFeatures, VkPhysicalDeviceRayTracingFeaturesKHR, VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV, VkPhysicalDeviceRobustness2FeaturesEXT, VkPhysicalDeviceSamplerYcbcrConversionFeatures, VkPhysicalDeviceScalarBlockLayoutFeatures, VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures, VkPhysicalDeviceShaderAtomicFloatFeaturesEXT, VkPhysicalDeviceShaderAtomicInt64Features, VkPhysicalDeviceShaderClockFeaturesKHR, VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT, VkPhysicalDeviceShaderDrawParametersFeatures, VkPhysicalDeviceShaderFloat16Int8Features, VkPhysicalDeviceShaderImageFootprintFeaturesNV, VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL, VkPhysicalDeviceShaderSMBuiltinsFeaturesNV, VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures, VkPhysicalDeviceShadingRateImageFeaturesNV, VkPhysicalDeviceSubgroupSizeControlFeaturesEXT, VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT, VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT, VkPhysicalDeviceTimelineSemaphoreFeatures, VkPhysicalDeviceTransformFeedbackFeaturesEXT, VkPhysicalDeviceUniformBufferStandardLayoutFeatures, VkPhysicalDeviceVariablePointersFeatures, VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT, VkPhysicalDeviceVulkan11Features, VkPhysicalDeviceVulkan12Features, VkPhysicalDeviceVulkanMemoryModelFeatures, VkPhysicalDeviceYcbcrImageArraysFeaturesEXT", pCreateInfo->pNext, ARRAY_SIZE(allowed_structs_VkDeviceCreateInfo), allowed_structs_VkDeviceCreateInfo, GeneratedVulkanHeaderVersion, "VUID-VkDeviceCreateInfo-pNext-pNext", "VUID-VkDeviceCreateInfo-sType-unique");
skip |= validate_reserved_flags("vkCreateDevice", "pCreateInfo->flags", pCreateInfo->flags, "VUID-VkDeviceCreateInfo-flags-zerobitmask");
@@ -2949,7 +3102,7 @@
skip |= validate_struct_type("vkCreateQueryPool", "pCreateInfo", "VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO", pCreateInfo, VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO, true, "VUID-vkCreateQueryPool-pCreateInfo-parameter", "VUID-VkQueryPoolCreateInfo-sType-sType");
if (pCreateInfo != NULL)
{
- const VkStructureType allowed_structs_VkQueryPoolCreateInfo[] = { VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR, VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL };
+ const VkStructureType allowed_structs_VkQueryPoolCreateInfo[] = { VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR, VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL };
skip |= validate_struct_pnext("vkCreateQueryPool", "pCreateInfo->pNext", "VkQueryPoolPerformanceCreateInfoKHR, VkQueryPoolPerformanceQueryCreateInfoINTEL", pCreateInfo->pNext, ARRAY_SIZE(allowed_structs_VkQueryPoolCreateInfo), allowed_structs_VkQueryPoolCreateInfo, GeneratedVulkanHeaderVersion, "VUID-VkQueryPoolCreateInfo-pNext-pNext", "VUID-VkQueryPoolCreateInfo-sType-unique");
@@ -3323,6 +3476,7 @@
}
}
skip |= validate_required_pointer("vkCreateImageView", "pView", pView, "VUID-vkCreateImageView-pView-parameter");
+ if (!skip) skip |= manual_PreCallValidateCreateImageView(device, pCreateInfo, pAllocator, pView);
return skip;
}
@@ -3820,9 +3974,9 @@
skip |= validate_struct_type("vkCreateSampler", "pCreateInfo", "VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO", pCreateInfo, VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO, true, "VUID-vkCreateSampler-pCreateInfo-parameter", "VUID-VkSamplerCreateInfo-sType-sType");
if (pCreateInfo != NULL)
{
- const VkStructureType allowed_structs_VkSamplerCreateInfo[] = { VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO, VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO };
+ const VkStructureType allowed_structs_VkSamplerCreateInfo[] = { VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT, VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO, VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO };
- skip |= validate_struct_pnext("vkCreateSampler", "pCreateInfo->pNext", "VkSamplerReductionModeCreateInfo, VkSamplerYcbcrConversionInfo", pCreateInfo->pNext, ARRAY_SIZE(allowed_structs_VkSamplerCreateInfo), allowed_structs_VkSamplerCreateInfo, GeneratedVulkanHeaderVersion, "VUID-VkSamplerCreateInfo-pNext-pNext", "VUID-VkSamplerCreateInfo-sType-unique");
+ skip |= validate_struct_pnext("vkCreateSampler", "pCreateInfo->pNext", "VkSamplerCustomBorderColorCreateInfoEXT, VkSamplerReductionModeCreateInfo, VkSamplerYcbcrConversionInfo", pCreateInfo->pNext, ARRAY_SIZE(allowed_structs_VkSamplerCreateInfo), allowed_structs_VkSamplerCreateInfo, GeneratedVulkanHeaderVersion, "VUID-VkSamplerCreateInfo-pNext-pNext", "VUID-VkSamplerCreateInfo-sType-unique");
skip |= validate_flags("vkCreateSampler", "pCreateInfo->flags", "VkSamplerCreateFlagBits", AllVkSamplerCreateFlagBits, pCreateInfo->flags, kOptionalFlags, "VUID-VkSamplerCreateInfo-flags-parameter");
@@ -4654,7 +4808,7 @@
const VkBuffer* pBuffers,
const VkDeviceSize* pOffsets) const {
bool skip = false;
- skip |= validate_handle_array("vkCmdBindVertexBuffers", "bindingCount", "pBuffers", bindingCount, pBuffers, true, true);
+ skip |= validate_array("vkCmdBindVertexBuffers", "bindingCount", "pBuffers", bindingCount, &pBuffers, true, false, "VUID-vkCmdBindVertexBuffers-bindingCount-arraylength", "VUID-vkCmdBindVertexBuffers-pBuffers-parameter");
skip |= validate_array("vkCmdBindVertexBuffers", "bindingCount", "pOffsets", bindingCount, &pOffsets, true, true, "VUID-vkCmdBindVertexBuffers-bindingCount-arraylength", "VUID-vkCmdBindVertexBuffers-pOffsets-parameter");
if (!skip) skip |= manual_PreCallValidateCmdBindVertexBuffers(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets);
return skip;
@@ -5453,9 +5607,9 @@
skip |= validate_struct_type("vkGetPhysicalDeviceProperties2", "pProperties", "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2", pProperties, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, true, "VUID-vkGetPhysicalDeviceProperties2-pProperties-parameter", "VUID-VkPhysicalDeviceProperties2-sType-sType");
if (pProperties != NULL)
{
- const VkStructureType allowed_structs_VkPhysicalDeviceProperties2[] = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES };
+ const VkStructureType allowed_structs_VkPhysicalDeviceProperties2[] = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES };
- skip |= validate_struct_pnext("vkGetPhysicalDeviceProperties2", "pProperties->pNext", "VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT, VkPhysicalDeviceConservativeRasterizationPropertiesEXT, VkPhysicalDeviceCooperativeMatrixPropertiesNV, VkPhysicalDeviceDepthStencilResolveProperties, VkPhysicalDeviceDescriptorIndexingProperties, VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV, VkPhysicalDeviceDiscardRectanglePropertiesEXT, VkPhysicalDeviceDriverProperties, VkPhysicalDeviceExternalMemoryHostPropertiesEXT, VkPhysicalDeviceFloatControlsProperties, VkPhysicalDeviceFragmentDensityMapPropertiesEXT, VkPhysicalDeviceIDProperties, VkPhysicalDeviceInlineUniformBlockPropertiesEXT, VkPhysicalDeviceLineRasterizationPropertiesEXT, VkPhysicalDeviceMaintenance3Properties, VkPhysicalDeviceMeshShaderPropertiesNV, VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX, VkPhysicalDeviceMultiviewProperties, VkPhysicalDevicePCIBusInfoPropertiesEXT, VkPhysicalDevicePerformanceQueryPropertiesKHR, VkPhysicalDevicePointClippingProperties, VkPhysicalDeviceProtectedMemoryProperties, VkPhysicalDevicePushDescriptorPropertiesKHR, VkPhysicalDeviceRayTracingPropertiesKHR, VkPhysicalDeviceRayTracingPropertiesNV, VkPhysicalDeviceSampleLocationsPropertiesEXT, VkPhysicalDeviceSamplerFilterMinmaxProperties, VkPhysicalDeviceShaderCoreProperties2AMD, VkPhysicalDeviceShaderCorePropertiesAMD, VkPhysicalDeviceShaderSMBuiltinsPropertiesNV, VkPhysicalDeviceShadingRateImagePropertiesNV, VkPhysicalDeviceSubgroupProperties, VkPhysicalDeviceSubgroupSizeControlPropertiesEXT, VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT, VkPhysicalDeviceTimelineSemaphoreProperties, VkPhysicalDeviceTransformFeedbackPropertiesEXT, VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT, VkPhysicalDeviceVulkan11Properties, VkPhysicalDeviceVulkan12Properties", pProperties->pNext, ARRAY_SIZE(allowed_structs_VkPhysicalDeviceProperties2), allowed_structs_VkPhysicalDeviceProperties2, GeneratedVulkanHeaderVersion, "VUID-VkPhysicalDeviceProperties2-pNext-pNext", "VUID-VkPhysicalDeviceProperties2-sType-unique");
+ skip |= validate_struct_pnext("vkGetPhysicalDeviceProperties2", "pProperties->pNext", "VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT, VkPhysicalDeviceConservativeRasterizationPropertiesEXT, VkPhysicalDeviceCooperativeMatrixPropertiesNV, VkPhysicalDeviceCustomBorderColorPropertiesEXT, VkPhysicalDeviceDepthStencilResolveProperties, VkPhysicalDeviceDescriptorIndexingProperties, VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV, VkPhysicalDeviceDiscardRectanglePropertiesEXT, VkPhysicalDeviceDriverProperties, VkPhysicalDeviceExternalMemoryHostPropertiesEXT, VkPhysicalDeviceFloatControlsProperties, VkPhysicalDeviceFragmentDensityMap2PropertiesEXT, VkPhysicalDeviceFragmentDensityMapPropertiesEXT, VkPhysicalDeviceIDProperties, VkPhysicalDeviceInlineUniformBlockPropertiesEXT, VkPhysicalDeviceLineRasterizationPropertiesEXT, VkPhysicalDeviceMaintenance3Properties, VkPhysicalDeviceMeshShaderPropertiesNV, VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX, VkPhysicalDeviceMultiviewProperties, VkPhysicalDevicePCIBusInfoPropertiesEXT, VkPhysicalDevicePerformanceQueryPropertiesKHR, VkPhysicalDevicePointClippingProperties, VkPhysicalDeviceProtectedMemoryProperties, VkPhysicalDevicePushDescriptorPropertiesKHR, VkPhysicalDeviceRayTracingPropertiesKHR, VkPhysicalDeviceRayTracingPropertiesNV, VkPhysicalDeviceRobustness2PropertiesEXT, VkPhysicalDeviceSampleLocationsPropertiesEXT, VkPhysicalDeviceSamplerFilterMinmaxProperties, VkPhysicalDeviceShaderCoreProperties2AMD, VkPhysicalDeviceShaderCorePropertiesAMD, VkPhysicalDeviceShaderSMBuiltinsPropertiesNV, VkPhysicalDeviceShadingRateImagePropertiesNV, VkPhysicalDeviceSubgroupProperties, VkPhysicalDeviceSubgroupSizeControlPropertiesEXT, VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT, VkPhysicalDeviceTimelineSemaphoreProperties, VkPhysicalDeviceTransformFeedbackPropertiesEXT, VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT, VkPhysicalDeviceVulkan11Properties, VkPhysicalDeviceVulkan12Properties", pProperties->pNext, ARRAY_SIZE(allowed_structs_VkPhysicalDeviceProperties2), allowed_structs_VkPhysicalDeviceProperties2, GeneratedVulkanHeaderVersion, "VUID-VkPhysicalDeviceProperties2-pNext-pNext", "VUID-VkPhysicalDeviceProperties2-sType-unique");
}
return skip;
}
@@ -5888,6 +6042,7 @@
bool skip = false;
skip |= validate_required_handle("vkCmdDrawIndirectCount", "buffer", buffer);
skip |= validate_required_handle("vkCmdDrawIndirectCount", "countBuffer", countBuffer);
+ if (!skip) skip |= manual_PreCallValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
return skip;
}
@@ -5902,6 +6057,7 @@
bool skip = false;
skip |= validate_required_handle("vkCmdDrawIndexedIndirectCount", "buffer", buffer);
skip |= validate_required_handle("vkCmdDrawIndexedIndirectCount", "countBuffer", countBuffer);
+ if (!skip) skip |= manual_PreCallValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
return skip;
}
@@ -7030,9 +7186,9 @@
skip |= validate_struct_type("vkGetPhysicalDeviceProperties2KHR", "pProperties", "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2", pProperties, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, true, "VUID-vkGetPhysicalDeviceProperties2-pProperties-parameter", "VUID-VkPhysicalDeviceProperties2-sType-sType");
if (pProperties != NULL)
{
- const VkStructureType allowed_structs_VkPhysicalDeviceProperties2[] = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES };
+ const VkStructureType allowed_structs_VkPhysicalDeviceProperties2[] = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES };
- skip |= validate_struct_pnext("vkGetPhysicalDeviceProperties2KHR", "pProperties->pNext", "VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT, VkPhysicalDeviceConservativeRasterizationPropertiesEXT, VkPhysicalDeviceCooperativeMatrixPropertiesNV, VkPhysicalDeviceDepthStencilResolveProperties, VkPhysicalDeviceDescriptorIndexingProperties, VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV, VkPhysicalDeviceDiscardRectanglePropertiesEXT, VkPhysicalDeviceDriverProperties, VkPhysicalDeviceExternalMemoryHostPropertiesEXT, VkPhysicalDeviceFloatControlsProperties, VkPhysicalDeviceFragmentDensityMapPropertiesEXT, VkPhysicalDeviceIDProperties, VkPhysicalDeviceInlineUniformBlockPropertiesEXT, VkPhysicalDeviceLineRasterizationPropertiesEXT, VkPhysicalDeviceMaintenance3Properties, VkPhysicalDeviceMeshShaderPropertiesNV, VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX, VkPhysicalDeviceMultiviewProperties, VkPhysicalDevicePCIBusInfoPropertiesEXT, VkPhysicalDevicePerformanceQueryPropertiesKHR, VkPhysicalDevicePointClippingProperties, VkPhysicalDeviceProtectedMemoryProperties, VkPhysicalDevicePushDescriptorPropertiesKHR, VkPhysicalDeviceRayTracingPropertiesKHR, VkPhysicalDeviceRayTracingPropertiesNV, VkPhysicalDeviceSampleLocationsPropertiesEXT, VkPhysicalDeviceSamplerFilterMinmaxProperties, VkPhysicalDeviceShaderCoreProperties2AMD, VkPhysicalDeviceShaderCorePropertiesAMD, VkPhysicalDeviceShaderSMBuiltinsPropertiesNV, VkPhysicalDeviceShadingRateImagePropertiesNV, VkPhysicalDeviceSubgroupProperties, VkPhysicalDeviceSubgroupSizeControlPropertiesEXT, VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT, VkPhysicalDeviceTimelineSemaphoreProperties, VkPhysicalDeviceTransformFeedbackPropertiesEXT, VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT, VkPhysicalDeviceVulkan11Properties, VkPhysicalDeviceVulkan12Properties", pProperties->pNext, ARRAY_SIZE(allowed_structs_VkPhysicalDeviceProperties2), allowed_structs_VkPhysicalDeviceProperties2, GeneratedVulkanHeaderVersion, "VUID-VkPhysicalDeviceProperties2-pNext-pNext", "VUID-VkPhysicalDeviceProperties2-sType-unique");
+ skip |= validate_struct_pnext("vkGetPhysicalDeviceProperties2KHR", "pProperties->pNext", "VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT, VkPhysicalDeviceConservativeRasterizationPropertiesEXT, VkPhysicalDeviceCooperativeMatrixPropertiesNV, VkPhysicalDeviceCustomBorderColorPropertiesEXT, VkPhysicalDeviceDepthStencilResolveProperties, VkPhysicalDeviceDescriptorIndexingProperties, VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV, VkPhysicalDeviceDiscardRectanglePropertiesEXT, VkPhysicalDeviceDriverProperties, VkPhysicalDeviceExternalMemoryHostPropertiesEXT, VkPhysicalDeviceFloatControlsProperties, VkPhysicalDeviceFragmentDensityMap2PropertiesEXT, VkPhysicalDeviceFragmentDensityMapPropertiesEXT, VkPhysicalDeviceIDProperties, VkPhysicalDeviceInlineUniformBlockPropertiesEXT, VkPhysicalDeviceLineRasterizationPropertiesEXT, VkPhysicalDeviceMaintenance3Properties, VkPhysicalDeviceMeshShaderPropertiesNV, VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX, VkPhysicalDeviceMultiviewProperties, VkPhysicalDevicePCIBusInfoPropertiesEXT, VkPhysicalDevicePerformanceQueryPropertiesKHR, VkPhysicalDevicePointClippingProperties, VkPhysicalDeviceProtectedMemoryProperties, VkPhysicalDevicePushDescriptorPropertiesKHR, VkPhysicalDeviceRayTracingPropertiesKHR, VkPhysicalDeviceRayTracingPropertiesNV, VkPhysicalDeviceRobustness2PropertiesEXT, VkPhysicalDeviceSampleLocationsPropertiesEXT, VkPhysicalDeviceSamplerFilterMinmaxProperties, VkPhysicalDeviceShaderCoreProperties2AMD, VkPhysicalDeviceShaderCorePropertiesAMD, VkPhysicalDeviceShaderSMBuiltinsPropertiesNV, VkPhysicalDeviceShadingRateImagePropertiesNV, VkPhysicalDeviceSubgroupProperties, VkPhysicalDeviceSubgroupSizeControlPropertiesEXT, VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT, VkPhysicalDeviceTimelineSemaphoreProperties, VkPhysicalDeviceTransformFeedbackPropertiesEXT, VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT, VkPhysicalDeviceVulkan11Properties, VkPhysicalDeviceVulkan12Properties", pProperties->pNext, ARRAY_SIZE(allowed_structs_VkPhysicalDeviceProperties2), allowed_structs_VkPhysicalDeviceProperties2, GeneratedVulkanHeaderVersion, "VUID-VkPhysicalDeviceProperties2-pNext-pNext", "VUID-VkPhysicalDeviceProperties2-sType-unique");
}
return skip;
}
@@ -7496,6 +7652,7 @@
uint32_t set,
const void* pData) const {
bool skip = false;
+ if (!device_extensions.vk_khr_descriptor_update_template) skip |= OutputExtensionError("vkCmdPushDescriptorSetWithTemplateKHR", VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME);
if (!device_extensions.vk_khr_get_physical_device_properties_2) skip |= OutputExtensionError("vkCmdPushDescriptorSetWithTemplateKHR", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
if (!device_extensions.vk_khr_push_descriptor) skip |= OutputExtensionError("vkCmdPushDescriptorSetWithTemplateKHR", VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
skip |= validate_required_handle("vkCmdPushDescriptorSetWithTemplateKHR", "descriptorUpdateTemplate", descriptorUpdateTemplate);
@@ -8445,6 +8602,7 @@
if (!device_extensions.vk_khr_draw_indirect_count) skip |= OutputExtensionError("vkCmdDrawIndirectCountKHR", VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
skip |= validate_required_handle("vkCmdDrawIndirectCountKHR", "buffer", buffer);
skip |= validate_required_handle("vkCmdDrawIndirectCountKHR", "countBuffer", countBuffer);
+ if (!skip) skip |= manual_PreCallValidateCmdDrawIndirectCountKHR(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
return skip;
}
@@ -8460,6 +8618,7 @@
if (!device_extensions.vk_khr_draw_indirect_count) skip |= OutputExtensionError("vkCmdDrawIndexedIndirectCountKHR", VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
skip |= validate_required_handle("vkCmdDrawIndexedIndirectCountKHR", "buffer", buffer);
skip |= validate_required_handle("vkCmdDrawIndexedIndirectCountKHR", "countBuffer", countBuffer);
+ if (!skip) skip |= manual_PreCallValidateCmdDrawIndexedIndirectCountKHR(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
return skip;
}
@@ -8630,7 +8789,6 @@
const VkAllocationCallbacks* pAllocator) const {
bool skip = false;
if (!device_extensions.vk_khr_deferred_host_operations) skip |= OutputExtensionError("vkDestroyDeferredOperationKHR", VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME);
- skip |= validate_required_handle("vkDestroyDeferredOperationKHR", "operation", operation);
if (pAllocator != NULL)
{
skip |= validate_required_pointer("vkDestroyDeferredOperationKHR", "pAllocator->pfnAllocation", reinterpret_cast<const void*>(pAllocator->pfnAllocation), "VUID-VkAllocationCallbacks-pfnAllocation-00632");
@@ -8689,6 +8847,7 @@
uint32_t* pExecutableCount,
VkPipelineExecutablePropertiesKHR* pProperties) const {
bool skip = false;
+ if (!device_extensions.vk_khr_get_physical_device_properties_2) skip |= OutputExtensionError("vkGetPipelineExecutablePropertiesKHR", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
if (!device_extensions.vk_khr_pipeline_executable_properties) skip |= OutputExtensionError("vkGetPipelineExecutablePropertiesKHR", VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME);
skip |= validate_struct_type("vkGetPipelineExecutablePropertiesKHR", "pPipelineInfo", "VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR", pPipelineInfo, VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR, true, "VUID-vkGetPipelineExecutablePropertiesKHR-pPipelineInfo-parameter", "VUID-VkPipelineInfoKHR-sType-sType");
if (pPipelineInfo != NULL)
@@ -8714,6 +8873,7 @@
uint32_t* pStatisticCount,
VkPipelineExecutableStatisticKHR* pStatistics) const {
bool skip = false;
+ if (!device_extensions.vk_khr_get_physical_device_properties_2) skip |= OutputExtensionError("vkGetPipelineExecutableStatisticsKHR", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
if (!device_extensions.vk_khr_pipeline_executable_properties) skip |= OutputExtensionError("vkGetPipelineExecutableStatisticsKHR", VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME);
skip |= validate_struct_type("vkGetPipelineExecutableStatisticsKHR", "pExecutableInfo", "VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR", pExecutableInfo, VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR, true, "VUID-vkGetPipelineExecutableStatisticsKHR-pExecutableInfo-parameter", "VUID-VkPipelineExecutableInfoKHR-sType-sType");
if (pExecutableInfo != NULL)
@@ -8739,6 +8899,7 @@
uint32_t* pInternalRepresentationCount,
VkPipelineExecutableInternalRepresentationKHR* pInternalRepresentations) const {
bool skip = false;
+ if (!device_extensions.vk_khr_get_physical_device_properties_2) skip |= OutputExtensionError("vkGetPipelineExecutableInternalRepresentationsKHR", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
if (!device_extensions.vk_khr_pipeline_executable_properties) skip |= OutputExtensionError("vkGetPipelineExecutableInternalRepresentationsKHR", VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME);
skip |= validate_struct_type("vkGetPipelineExecutableInternalRepresentationsKHR", "pExecutableInfo", "VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR", pExecutableInfo, VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR, true, "VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pExecutableInfo-parameter", "VUID-VkPipelineExecutableInfoKHR-sType-sType");
if (pExecutableInfo != NULL)
@@ -8812,7 +8973,6 @@
const VkAllocationCallbacks* pAllocator) const {
bool skip = false;
if (!instance_extensions.vk_ext_debug_report) skip |= OutputExtensionError("vkDestroyDebugReportCallbackEXT", VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
- skip |= validate_required_handle("vkDestroyDebugReportCallbackEXT", "callback", callback);
if (pAllocator != NULL)
{
skip |= validate_required_pointer("vkDestroyDebugReportCallbackEXT", "pAllocator->pfnAllocation", reinterpret_cast<const void*>(pAllocator->pfnAllocation), "VUID-VkAllocationCallbacks-pfnAllocation-00632");
@@ -8963,7 +9123,7 @@
if (!device_extensions.vk_ext_transform_feedback) skip |= OutputExtensionError("vkCmdBindTransformFeedbackBuffersEXT", VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
skip |= validate_handle_array("vkCmdBindTransformFeedbackBuffersEXT", "bindingCount", "pBuffers", bindingCount, pBuffers, true, true);
skip |= validate_array("vkCmdBindTransformFeedbackBuffersEXT", "bindingCount", "pOffsets", bindingCount, &pOffsets, true, true, "VUID-vkCmdBindTransformFeedbackBuffersEXT-bindingCount-arraylength", "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-parameter");
- skip |= validate_array("vkCmdBindTransformFeedbackBuffersEXT", "bindingCount", "pSizes", bindingCount, &pSizes, true, false, "VUID-vkCmdBindTransformFeedbackBuffersEXT-bindingCount-arraylength", "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-parameter");
+ if (!skip) skip |= manual_PreCallValidateCmdBindTransformFeedbackBuffersEXT(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes);
return skip;
}
@@ -8977,6 +9137,7 @@
if (!device_extensions.vk_khr_get_physical_device_properties_2) skip |= OutputExtensionError("vkCmdBeginTransformFeedbackEXT", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
if (!device_extensions.vk_ext_transform_feedback) skip |= OutputExtensionError("vkCmdBeginTransformFeedbackEXT", VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
// No xml-driven validation
+ if (!skip) skip |= manual_PreCallValidateCmdBeginTransformFeedbackEXT(commandBuffer, firstCounterBuffer, counterBufferCount, pCounterBuffers, pCounterBufferOffsets);
return skip;
}
@@ -8990,6 +9151,7 @@
if (!device_extensions.vk_khr_get_physical_device_properties_2) skip |= OutputExtensionError("vkCmdEndTransformFeedbackEXT", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
if (!device_extensions.vk_ext_transform_feedback) skip |= OutputExtensionError("vkCmdEndTransformFeedbackEXT", VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
// No xml-driven validation
+ if (!skip) skip |= manual_PreCallValidateCmdEndTransformFeedbackEXT(commandBuffer, firstCounterBuffer, counterBufferCount, pCounterBuffers, pCounterBufferOffsets);
return skip;
}
@@ -9054,6 +9216,21 @@
return skip;
}
+bool StatelessValidation::PreCallValidateGetImageViewAddressNVX(
+ VkDevice device,
+ VkImageView imageView,
+ VkImageViewAddressPropertiesNVX* pProperties) const {
+ bool skip = false;
+ if (!device_extensions.vk_nvx_image_view_handle) skip |= OutputExtensionError("vkGetImageViewAddressNVX", VK_NVX_IMAGE_VIEW_HANDLE_EXTENSION_NAME);
+ skip |= validate_required_handle("vkGetImageViewAddressNVX", "imageView", imageView);
+ skip |= validate_struct_type("vkGetImageViewAddressNVX", "pProperties", "VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX", pProperties, VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX, true, "VUID-vkGetImageViewAddressNVX-pProperties-parameter", "VUID-VkImageViewAddressPropertiesNVX-sType-sType");
+ if (pProperties != NULL)
+ {
+ skip |= validate_struct_pnext("vkGetImageViewAddressNVX", "pProperties->pNext", NULL, pProperties->pNext, 0, NULL, GeneratedVulkanHeaderVersion, "VUID-VkImageViewAddressPropertiesNVX-pNext-pNext", kVUIDUndefined);
+ }
+ return skip;
+}
+
bool StatelessValidation::PreCallValidateCmdDrawIndirectCountAMD(
@@ -9692,8 +9869,6 @@
skip |= validate_struct_pnext("vkSetDebugUtilsObjectNameEXT", "pNameInfo->pNext", NULL, pNameInfo->pNext, 0, NULL, GeneratedVulkanHeaderVersion, "VUID-VkDebugUtilsObjectNameInfoEXT-pNext-pNext", kVUIDUndefined);
skip |= validate_ranged_enum("vkSetDebugUtilsObjectNameEXT", "pNameInfo->objectType", "VkObjectType", AllVkObjectTypeEnums, pNameInfo->objectType, "VUID-VkDebugUtilsObjectNameInfoEXT-objectType-parameter");
-
- skip |= validate_required_pointer("vkSetDebugUtilsObjectNameEXT", "pNameInfo->pObjectName", pNameInfo->pObjectName, "VUID-VkDebugUtilsObjectNameInfoEXT-pObjectName-parameter");
}
if (!skip) skip |= manual_PreCallValidateSetDebugUtilsObjectNameEXT(device, pNameInfo);
return skip;
@@ -9843,7 +10018,6 @@
const VkAllocationCallbacks* pAllocator) const {
bool skip = false;
if (!instance_extensions.vk_ext_debug_utils) skip |= OutputExtensionError("vkDestroyDebugUtilsMessengerEXT", VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
- skip |= validate_required_handle("vkDestroyDebugUtilsMessengerEXT", "messenger", messenger);
if (pAllocator != NULL)
{
skip |= validate_required_pointer("vkDestroyDebugUtilsMessengerEXT", "pAllocator->pfnAllocation", reinterpret_cast<const void*>(pAllocator->pfnAllocation), "VUID-VkAllocationCallbacks-pfnAllocation-00632");
@@ -9918,8 +10092,6 @@
skip |= validate_struct_pnext("vkSubmitDebugUtilsMessageEXT", ParameterName("pCallbackData->pObjects[%i].pNext", ParameterName::IndexVector{ objectIndex }), NULL, pCallbackData->pObjects[objectIndex].pNext, 0, NULL, GeneratedVulkanHeaderVersion, "VUID-VkDebugUtilsObjectNameInfoEXT-pNext-pNext", kVUIDUndefined);
skip |= validate_ranged_enum("vkSubmitDebugUtilsMessageEXT", ParameterName("pCallbackData->pObjects[%i].objectType", ParameterName::IndexVector{ objectIndex }), "VkObjectType", AllVkObjectTypeEnums, pCallbackData->pObjects[objectIndex].objectType, "VUID-VkDebugUtilsObjectNameInfoEXT-objectType-parameter");
-
- skip |= validate_required_pointer("vkSubmitDebugUtilsMessageEXT", ParameterName("pCallbackData->pObjects[%i].pObjectName", ParameterName::IndexVector{ objectIndex }), pCallbackData->pObjects[objectIndex].pObjectName, "VUID-VkDebugUtilsObjectNameInfoEXT-pObjectName-parameter");
}
}
}
@@ -9935,6 +10107,7 @@
const struct AHardwareBuffer* buffer,
VkAndroidHardwareBufferPropertiesANDROID* pProperties) const {
bool skip = false;
+ if (!device_extensions.vk_khr_dedicated_allocation) skip |= OutputExtensionError("vkGetAndroidHardwareBufferPropertiesANDROID", VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME);
if (!device_extensions.vk_ext_queue_family_foreign) skip |= OutputExtensionError("vkGetAndroidHardwareBufferPropertiesANDROID", VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME);
if (!device_extensions.vk_khr_external_memory) skip |= OutputExtensionError("vkGetAndroidHardwareBufferPropertiesANDROID", VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
if (!device_extensions.vk_khr_sampler_ycbcr_conversion) skip |= OutputExtensionError("vkGetAndroidHardwareBufferPropertiesANDROID", VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
@@ -9955,6 +10128,7 @@
const VkMemoryGetAndroidHardwareBufferInfoANDROID* pInfo,
struct AHardwareBuffer** pBuffer) const {
bool skip = false;
+ if (!device_extensions.vk_khr_dedicated_allocation) skip |= OutputExtensionError("vkGetMemoryAndroidHardwareBufferANDROID", VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME);
if (!device_extensions.vk_ext_queue_family_foreign) skip |= OutputExtensionError("vkGetMemoryAndroidHardwareBufferANDROID", VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME);
if (!device_extensions.vk_khr_external_memory) skip |= OutputExtensionError("vkGetMemoryAndroidHardwareBufferANDROID", VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
if (!device_extensions.vk_khr_sampler_ycbcr_conversion) skip |= OutputExtensionError("vkGetMemoryAndroidHardwareBufferANDROID", VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
@@ -10244,6 +10418,8 @@
skip |= validate_ranged_enum("vkCreateAccelerationStructureNV", "pCreateInfo->info.type", "VkAccelerationStructureTypeNV", AllVkAccelerationStructureTypeNVEnums, pCreateInfo->info.type, "VUID-VkAccelerationStructureInfoNV-type-parameter");
+ skip |= validate_flags("vkCreateAccelerationStructureNV", "pCreateInfo->info.flags", "VkBuildAccelerationStructureFlagBitsNV", AllVkBuildAccelerationStructureFlagBitsNV, pCreateInfo->info.flags, kOptionalFlags, "VUID-VkAccelerationStructureInfoNV-flags-parameter");
+
skip |= validate_struct_type_array("vkCreateAccelerationStructureNV", "pCreateInfo->info.geometryCount", "pCreateInfo->info.pGeometries", "VK_STRUCTURE_TYPE_GEOMETRY_NV", pCreateInfo->info.geometryCount, pCreateInfo->info.pGeometries, VK_STRUCTURE_TYPE_GEOMETRY_NV, false, true, "VUID-VkGeometryNV-sType-sType", "VUID-VkAccelerationStructureInfoNV-pGeometries-parameter", kVUIDUndefined);
if (pCreateInfo->info.pGeometries != NULL)
@@ -10300,7 +10476,6 @@
VkAccelerationStructureKHR accelerationStructure,
const VkAllocationCallbacks* pAllocator) const {
bool skip = false;
- skip |= validate_required_handle("vkDestroyAccelerationStructureKHR", "accelerationStructure", accelerationStructure);
if (pAllocator != NULL)
{
skip |= validate_required_pointer("vkDestroyAccelerationStructureKHR", "pAllocator->pfnAllocation", reinterpret_cast<const void*>(pAllocator->pfnAllocation), "VUID-VkAllocationCallbacks-pfnAllocation-00632");
@@ -10332,7 +10507,6 @@
if (!device_extensions.vk_khr_get_memory_requirements_2) skip |= OutputExtensionError("vkDestroyAccelerationStructureNV", VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
if (!device_extensions.vk_khr_get_physical_device_properties_2) skip |= OutputExtensionError("vkDestroyAccelerationStructureNV", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
if (!device_extensions.vk_nv_ray_tracing) skip |= OutputExtensionError("vkDestroyAccelerationStructureNV", VK_NV_RAY_TRACING_EXTENSION_NAME);
- skip |= validate_required_handle("vkDestroyAccelerationStructureNV", "accelerationStructure", accelerationStructure);
if (pAllocator != NULL)
{
skip |= validate_required_pointer("vkDestroyAccelerationStructureNV", "pAllocator->pfnAllocation", reinterpret_cast<const void*>(pAllocator->pfnAllocation), "VUID-VkAllocationCallbacks-pfnAllocation-00632");
@@ -10445,6 +10619,8 @@
skip |= validate_ranged_enum("vkCmdBuildAccelerationStructureNV", "pInfo->type", "VkAccelerationStructureTypeNV", AllVkAccelerationStructureTypeNVEnums, pInfo->type, "VUID-VkAccelerationStructureInfoNV-type-parameter");
+ skip |= validate_flags("vkCmdBuildAccelerationStructureNV", "pInfo->flags", "VkBuildAccelerationStructureFlagBitsNV", AllVkBuildAccelerationStructureFlagBitsNV, pInfo->flags, kOptionalFlags, "VUID-VkAccelerationStructureInfoNV-flags-parameter");
+
skip |= validate_struct_type_array("vkCmdBuildAccelerationStructureNV", "pInfo->geometryCount", "pInfo->pGeometries", "VK_STRUCTURE_TYPE_GEOMETRY_NV", pInfo->geometryCount, pInfo->pGeometries, VK_STRUCTURE_TYPE_GEOMETRY_NV, false, true, "VUID-VkGeometryNV-sType-sType", "VUID-VkAccelerationStructureInfoNV-pGeometries-parameter", kVUIDUndefined);
if (pInfo->pGeometries != NULL)
@@ -10514,6 +10690,7 @@
if (!device_extensions.vk_khr_get_physical_device_properties_2) skip |= OutputExtensionError("vkCmdTraceRaysNV", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
if (!device_extensions.vk_nv_ray_tracing) skip |= OutputExtensionError("vkCmdTraceRaysNV", VK_NV_RAY_TRACING_EXTENSION_NAME);
skip |= validate_required_handle("vkCmdTraceRaysNV", "raygenShaderBindingTableBuffer", raygenShaderBindingTableBuffer);
+ if (!skip) skip |= manual_PreCallValidateCmdTraceRaysNV(commandBuffer, raygenShaderBindingTableBuffer, raygenShaderBindingOffset, missShaderBindingTableBuffer, missShaderBindingOffset, missShaderBindingStride, hitShaderBindingTableBuffer, hitShaderBindingOffset, hitShaderBindingStride, callableShaderBindingTableBuffer, callableShaderBindingOffset, callableShaderBindingStride, width, height, depth);
return skip;
}
@@ -10669,6 +10846,7 @@
skip |= validate_handle_array("vkCmdWriteAccelerationStructuresPropertiesKHR", "accelerationStructureCount", "pAccelerationStructures", accelerationStructureCount, pAccelerationStructures, true, true);
skip |= validate_ranged_enum("vkCmdWriteAccelerationStructuresPropertiesKHR", "queryType", "VkQueryType", AllVkQueryTypeEnums, queryType, "VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryType-parameter");
skip |= validate_required_handle("vkCmdWriteAccelerationStructuresPropertiesKHR", "queryPool", queryPool);
+ if (!skip) skip |= manual_PreCallValidateCmdWriteAccelerationStructuresPropertiesKHR(commandBuffer, accelerationStructureCount, pAccelerationStructures, queryType, queryPool, firstQuery);
return skip;
}
@@ -10709,6 +10887,8 @@
+
+
bool StatelessValidation::PreCallValidateGetMemoryHostPointerPropertiesEXT(
VkDevice device,
VkExternalMemoryHandleTypeFlagBits handleType,
@@ -11316,6 +11496,8 @@
+
+
bool StatelessValidation::PreCallValidateResetQueryPoolEXT(
VkDevice device,
VkQueryPool queryPool,
@@ -11332,6 +11514,165 @@
+bool StatelessValidation::PreCallValidateCmdSetCullModeEXT(
+ VkCommandBuffer commandBuffer,
+ VkCullModeFlags cullMode) const {
+ bool skip = false;
+ if (!device_extensions.vk_khr_get_physical_device_properties_2) skip |= OutputExtensionError("vkCmdSetCullModeEXT", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ if (!device_extensions.vk_ext_extended_dynamic_state) skip |= OutputExtensionError("vkCmdSetCullModeEXT", VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
+ skip |= validate_flags("vkCmdSetCullModeEXT", "cullMode", "VkCullModeFlagBits", AllVkCullModeFlagBits, cullMode, kOptionalFlags, "VUID-vkCmdSetCullModeEXT-cullMode-parameter");
+ return skip;
+}
+
+bool StatelessValidation::PreCallValidateCmdSetFrontFaceEXT(
+ VkCommandBuffer commandBuffer,
+ VkFrontFace frontFace) const {
+ bool skip = false;
+ if (!device_extensions.vk_khr_get_physical_device_properties_2) skip |= OutputExtensionError("vkCmdSetFrontFaceEXT", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ if (!device_extensions.vk_ext_extended_dynamic_state) skip |= OutputExtensionError("vkCmdSetFrontFaceEXT", VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
+ skip |= validate_ranged_enum("vkCmdSetFrontFaceEXT", "frontFace", "VkFrontFace", AllVkFrontFaceEnums, frontFace, "VUID-vkCmdSetFrontFaceEXT-frontFace-parameter");
+ return skip;
+}
+
+bool StatelessValidation::PreCallValidateCmdSetPrimitiveTopologyEXT(
+ VkCommandBuffer commandBuffer,
+ VkPrimitiveTopology primitiveTopology) const {
+ bool skip = false;
+ if (!device_extensions.vk_khr_get_physical_device_properties_2) skip |= OutputExtensionError("vkCmdSetPrimitiveTopologyEXT", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ if (!device_extensions.vk_ext_extended_dynamic_state) skip |= OutputExtensionError("vkCmdSetPrimitiveTopologyEXT", VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
+ skip |= validate_ranged_enum("vkCmdSetPrimitiveTopologyEXT", "primitiveTopology", "VkPrimitiveTopology", AllVkPrimitiveTopologyEnums, primitiveTopology, "VUID-vkCmdSetPrimitiveTopologyEXT-primitiveTopology-parameter");
+ return skip;
+}
+
+bool StatelessValidation::PreCallValidateCmdSetViewportWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t viewportCount,
+ const VkViewport* pViewports) const {
+ bool skip = false;
+ if (!device_extensions.vk_khr_get_physical_device_properties_2) skip |= OutputExtensionError("vkCmdSetViewportWithCountEXT", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ if (!device_extensions.vk_ext_extended_dynamic_state) skip |= OutputExtensionError("vkCmdSetViewportWithCountEXT", VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
+ skip |= validate_array("vkCmdSetViewportWithCountEXT", "viewportCount", "pViewports", viewportCount, &pViewports, true, true, "VUID-vkCmdSetViewportWithCountEXT-viewportCount-arraylength", "VUID-vkCmdSetViewportWithCountEXT-pViewports-parameter");
+ if (pViewports != NULL)
+ {
+ for (uint32_t viewportIndex = 0; viewportIndex < viewportCount; ++viewportIndex)
+ {
+ // No xml-driven validation
+ }
+ }
+ if (!skip) skip |= manual_PreCallValidateCmdSetViewportWithCountEXT(commandBuffer, viewportCount, pViewports);
+ return skip;
+}
+
+bool StatelessValidation::PreCallValidateCmdSetScissorWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t scissorCount,
+ const VkRect2D* pScissors) const {
+ bool skip = false;
+ if (!device_extensions.vk_khr_get_physical_device_properties_2) skip |= OutputExtensionError("vkCmdSetScissorWithCountEXT", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ if (!device_extensions.vk_ext_extended_dynamic_state) skip |= OutputExtensionError("vkCmdSetScissorWithCountEXT", VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
+ skip |= validate_array("vkCmdSetScissorWithCountEXT", "scissorCount", "pScissors", scissorCount, &pScissors, true, true, "VUID-vkCmdSetScissorWithCountEXT-scissorCount-arraylength", "VUID-vkCmdSetScissorWithCountEXT-pScissors-parameter");
+ if (pScissors != NULL)
+ {
+ for (uint32_t scissorIndex = 0; scissorIndex < scissorCount; ++scissorIndex)
+ {
+ // No xml-driven validation
+
+ // No xml-driven validation
+ }
+ }
+ if (!skip) skip |= manual_PreCallValidateCmdSetScissorWithCountEXT(commandBuffer, scissorCount, pScissors);
+ return skip;
+}
+
+bool StatelessValidation::PreCallValidateCmdBindVertexBuffers2EXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t firstBinding,
+ uint32_t bindingCount,
+ const VkBuffer* pBuffers,
+ const VkDeviceSize* pOffsets,
+ const VkDeviceSize* pSizes,
+ const VkDeviceSize* pStrides) const {
+ bool skip = false;
+ if (!device_extensions.vk_khr_get_physical_device_properties_2) skip |= OutputExtensionError("vkCmdBindVertexBuffers2EXT", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ if (!device_extensions.vk_ext_extended_dynamic_state) skip |= OutputExtensionError("vkCmdBindVertexBuffers2EXT", VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
+ skip |= validate_handle_array("vkCmdBindVertexBuffers2EXT", "bindingCount", "pBuffers", bindingCount, pBuffers, true, true);
+ skip |= validate_array("vkCmdBindVertexBuffers2EXT", "bindingCount", "pOffsets", bindingCount, &pOffsets, true, true, "VUID-vkCmdBindVertexBuffers2EXT-bindingCount-arraylength", "VUID-vkCmdBindVertexBuffers2EXT-pOffsets-parameter");
+ skip |= validate_array("vkCmdBindVertexBuffers2EXT", "bindingCount", "pSizes", bindingCount, &pSizes, true, false, "VUID-vkCmdBindVertexBuffers2EXT-bindingCount-arraylength", "VUID-vkCmdBindVertexBuffers2EXT-pSizes-parameter");
+ skip |= validate_array("vkCmdBindVertexBuffers2EXT", "bindingCount", "pStrides", bindingCount, &pStrides, true, false, "VUID-vkCmdBindVertexBuffers2EXT-bindingCount-arraylength", "VUID-vkCmdBindVertexBuffers2EXT-pStrides-parameter");
+ if (!skip) skip |= manual_PreCallValidateCmdBindVertexBuffers2EXT(commandBuffer, firstBinding, bindingCount, pBuffers, pOffsets, pSizes, pStrides);
+ return skip;
+}
+
+bool StatelessValidation::PreCallValidateCmdSetDepthTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthTestEnable) const {
+ bool skip = false;
+ if (!device_extensions.vk_khr_get_physical_device_properties_2) skip |= OutputExtensionError("vkCmdSetDepthTestEnableEXT", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ if (!device_extensions.vk_ext_extended_dynamic_state) skip |= OutputExtensionError("vkCmdSetDepthTestEnableEXT", VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
+ skip |= validate_bool32("vkCmdSetDepthTestEnableEXT", "depthTestEnable", depthTestEnable);
+ return skip;
+}
+
+bool StatelessValidation::PreCallValidateCmdSetDepthWriteEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthWriteEnable) const {
+ bool skip = false;
+ if (!device_extensions.vk_khr_get_physical_device_properties_2) skip |= OutputExtensionError("vkCmdSetDepthWriteEnableEXT", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ if (!device_extensions.vk_ext_extended_dynamic_state) skip |= OutputExtensionError("vkCmdSetDepthWriteEnableEXT", VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
+ skip |= validate_bool32("vkCmdSetDepthWriteEnableEXT", "depthWriteEnable", depthWriteEnable);
+ return skip;
+}
+
+bool StatelessValidation::PreCallValidateCmdSetDepthCompareOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkCompareOp depthCompareOp) const {
+ bool skip = false;
+ if (!device_extensions.vk_khr_get_physical_device_properties_2) skip |= OutputExtensionError("vkCmdSetDepthCompareOpEXT", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ if (!device_extensions.vk_ext_extended_dynamic_state) skip |= OutputExtensionError("vkCmdSetDepthCompareOpEXT", VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
+ skip |= validate_ranged_enum("vkCmdSetDepthCompareOpEXT", "depthCompareOp", "VkCompareOp", AllVkCompareOpEnums, depthCompareOp, "VUID-vkCmdSetDepthCompareOpEXT-depthCompareOp-parameter");
+ return skip;
+}
+
+bool StatelessValidation::PreCallValidateCmdSetDepthBoundsTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthBoundsTestEnable) const {
+ bool skip = false;
+ if (!device_extensions.vk_khr_get_physical_device_properties_2) skip |= OutputExtensionError("vkCmdSetDepthBoundsTestEnableEXT", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ if (!device_extensions.vk_ext_extended_dynamic_state) skip |= OutputExtensionError("vkCmdSetDepthBoundsTestEnableEXT", VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
+ skip |= validate_bool32("vkCmdSetDepthBoundsTestEnableEXT", "depthBoundsTestEnable", depthBoundsTestEnable);
+ return skip;
+}
+
+bool StatelessValidation::PreCallValidateCmdSetStencilTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 stencilTestEnable) const {
+ bool skip = false;
+ if (!device_extensions.vk_khr_get_physical_device_properties_2) skip |= OutputExtensionError("vkCmdSetStencilTestEnableEXT", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ if (!device_extensions.vk_ext_extended_dynamic_state) skip |= OutputExtensionError("vkCmdSetStencilTestEnableEXT", VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
+ skip |= validate_bool32("vkCmdSetStencilTestEnableEXT", "stencilTestEnable", stencilTestEnable);
+ return skip;
+}
+
+bool StatelessValidation::PreCallValidateCmdSetStencilOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkStencilFaceFlags faceMask,
+ VkStencilOp failOp,
+ VkStencilOp passOp,
+ VkStencilOp depthFailOp,
+ VkCompareOp compareOp) const {
+ bool skip = false;
+ if (!device_extensions.vk_khr_get_physical_device_properties_2) skip |= OutputExtensionError("vkCmdSetStencilOpEXT", VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ if (!device_extensions.vk_ext_extended_dynamic_state) skip |= OutputExtensionError("vkCmdSetStencilOpEXT", VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
+ skip |= validate_flags("vkCmdSetStencilOpEXT", "faceMask", "VkStencilFaceFlagBits", AllVkStencilFaceFlagBits, faceMask, kRequiredFlags, "VUID-vkCmdSetStencilOpEXT-faceMask-parameter", "VUID-vkCmdSetStencilOpEXT-faceMask-requiredbitmask");
+ skip |= validate_ranged_enum("vkCmdSetStencilOpEXT", "failOp", "VkStencilOp", AllVkStencilOpEnums, failOp, "VUID-vkCmdSetStencilOpEXT-failOp-parameter");
+ skip |= validate_ranged_enum("vkCmdSetStencilOpEXT", "passOp", "VkStencilOp", AllVkStencilOpEnums, passOp, "VUID-vkCmdSetStencilOpEXT-passOp-parameter");
+ skip |= validate_ranged_enum("vkCmdSetStencilOpEXT", "depthFailOp", "VkStencilOp", AllVkStencilOpEnums, depthFailOp, "VUID-vkCmdSetStencilOpEXT-depthFailOp-parameter");
+ skip |= validate_ranged_enum("vkCmdSetStencilOpEXT", "compareOp", "VkCompareOp", AllVkCompareOpEnums, compareOp, "VUID-vkCmdSetStencilOpEXT-compareOp-parameter");
+ return skip;
+}
+
+
+
bool StatelessValidation::PreCallValidateGetGeneratedCommandsMemoryRequirementsNV(
@@ -11344,6 +11685,12 @@
if (pInfo != NULL)
{
skip |= validate_struct_pnext("vkGetGeneratedCommandsMemoryRequirementsNV", "pInfo->pNext", NULL, pInfo->pNext, 0, NULL, GeneratedVulkanHeaderVersion, "VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-pNext-pNext", kVUIDUndefined);
+
+ skip |= validate_ranged_enum("vkGetGeneratedCommandsMemoryRequirementsNV", "pInfo->pipelineBindPoint", "VkPipelineBindPoint", AllVkPipelineBindPointEnums, pInfo->pipelineBindPoint, "VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-pipelineBindPoint-parameter");
+
+ skip |= validate_required_handle("vkGetGeneratedCommandsMemoryRequirementsNV", "pInfo->pipeline", pInfo->pipeline);
+
+ skip |= validate_required_handle("vkGetGeneratedCommandsMemoryRequirementsNV", "pInfo->indirectCommandsLayout", pInfo->indirectCommandsLayout);
}
skip |= validate_struct_type("vkGetGeneratedCommandsMemoryRequirementsNV", "pMemoryRequirements", "VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2", pMemoryRequirements, VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2, true, "VUID-vkGetGeneratedCommandsMemoryRequirementsNV-pMemoryRequirements-parameter", "VUID-VkMemoryRequirements2-sType-sType");
if (pMemoryRequirements != NULL)
@@ -11501,7 +11848,6 @@
const VkAllocationCallbacks* pAllocator) const {
bool skip = false;
if (!device_extensions.vk_nv_device_generated_commands) skip |= OutputExtensionError("vkDestroyIndirectCommandsLayoutNV", VK_NV_DEVICE_GENERATED_COMMANDS_EXTENSION_NAME);
- skip |= validate_required_handle("vkDestroyIndirectCommandsLayoutNV", "indirectCommandsLayout", indirectCommandsLayout);
if (pAllocator != NULL)
{
skip |= validate_required_pointer("vkDestroyIndirectCommandsLayoutNV", "pAllocator->pfnAllocation", reinterpret_cast<const void*>(pAllocator->pfnAllocation), "VUID-VkAllocationCallbacks-pfnAllocation-00632");
@@ -11537,6 +11883,166 @@
+bool StatelessValidation::PreCallValidateCreatePrivateDataSlotEXT(
+ VkDevice device,
+ const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkPrivateDataSlotEXT* pPrivateDataSlot) const {
+ bool skip = false;
+ if (!device_extensions.vk_ext_private_data) skip |= OutputExtensionError("vkCreatePrivateDataSlotEXT", VK_EXT_PRIVATE_DATA_EXTENSION_NAME);
+ skip |= validate_struct_type("vkCreatePrivateDataSlotEXT", "pCreateInfo", "VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO_EXT", pCreateInfo, VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO_EXT, true, "VUID-vkCreatePrivateDataSlotEXT-pCreateInfo-parameter", "VUID-VkPrivateDataSlotCreateInfoEXT-sType-sType");
+ if (pCreateInfo != NULL)
+ {
+ skip |= validate_struct_pnext("vkCreatePrivateDataSlotEXT", "pCreateInfo->pNext", NULL, pCreateInfo->pNext, 0, NULL, GeneratedVulkanHeaderVersion, "VUID-VkPrivateDataSlotCreateInfoEXT-pNext-pNext", kVUIDUndefined);
+
+ skip |= validate_reserved_flags("vkCreatePrivateDataSlotEXT", "pCreateInfo->flags", pCreateInfo->flags, "VUID-VkPrivateDataSlotCreateInfoEXT-flags-zerobitmask");
+ }
+ if (pAllocator != NULL)
+ {
+ skip |= validate_required_pointer("vkCreatePrivateDataSlotEXT", "pAllocator->pfnAllocation", reinterpret_cast<const void*>(pAllocator->pfnAllocation), "VUID-VkAllocationCallbacks-pfnAllocation-00632");
+
+ skip |= validate_required_pointer("vkCreatePrivateDataSlotEXT", "pAllocator->pfnReallocation", reinterpret_cast<const void*>(pAllocator->pfnReallocation), "VUID-VkAllocationCallbacks-pfnReallocation-00633");
+
+ skip |= validate_required_pointer("vkCreatePrivateDataSlotEXT", "pAllocator->pfnFree", reinterpret_cast<const void*>(pAllocator->pfnFree), "VUID-VkAllocationCallbacks-pfnFree-00634");
+
+ if (pAllocator->pfnInternalAllocation != NULL)
+ {
+ skip |= validate_required_pointer("vkCreatePrivateDataSlotEXT", "pAllocator->pfnInternalFree", reinterpret_cast<const void*>(pAllocator->pfnInternalFree), "VUID-VkAllocationCallbacks-pfnInternalAllocation-00635");
+
+ }
+
+ if (pAllocator->pfnInternalFree != NULL)
+ {
+ skip |= validate_required_pointer("vkCreatePrivateDataSlotEXT", "pAllocator->pfnInternalAllocation", reinterpret_cast<const void*>(pAllocator->pfnInternalAllocation), "VUID-VkAllocationCallbacks-pfnInternalAllocation-00635");
+
+ }
+ }
+ skip |= validate_required_pointer("vkCreatePrivateDataSlotEXT", "pPrivateDataSlot", pPrivateDataSlot, "VUID-vkCreatePrivateDataSlotEXT-pPrivateDataSlot-parameter");
+ return skip;
+}
+
+bool StatelessValidation::PreCallValidateDestroyPrivateDataSlotEXT(
+ VkDevice device,
+ VkPrivateDataSlotEXT privateDataSlot,
+ const VkAllocationCallbacks* pAllocator) const {
+ bool skip = false;
+ if (!device_extensions.vk_ext_private_data) skip |= OutputExtensionError("vkDestroyPrivateDataSlotEXT", VK_EXT_PRIVATE_DATA_EXTENSION_NAME);
+ if (pAllocator != NULL)
+ {
+ skip |= validate_required_pointer("vkDestroyPrivateDataSlotEXT", "pAllocator->pfnAllocation", reinterpret_cast<const void*>(pAllocator->pfnAllocation), "VUID-VkAllocationCallbacks-pfnAllocation-00632");
+
+ skip |= validate_required_pointer("vkDestroyPrivateDataSlotEXT", "pAllocator->pfnReallocation", reinterpret_cast<const void*>(pAllocator->pfnReallocation), "VUID-VkAllocationCallbacks-pfnReallocation-00633");
+
+ skip |= validate_required_pointer("vkDestroyPrivateDataSlotEXT", "pAllocator->pfnFree", reinterpret_cast<const void*>(pAllocator->pfnFree), "VUID-VkAllocationCallbacks-pfnFree-00634");
+
+ if (pAllocator->pfnInternalAllocation != NULL)
+ {
+ skip |= validate_required_pointer("vkDestroyPrivateDataSlotEXT", "pAllocator->pfnInternalFree", reinterpret_cast<const void*>(pAllocator->pfnInternalFree), "VUID-VkAllocationCallbacks-pfnInternalAllocation-00635");
+
+ }
+
+ if (pAllocator->pfnInternalFree != NULL)
+ {
+ skip |= validate_required_pointer("vkDestroyPrivateDataSlotEXT", "pAllocator->pfnInternalAllocation", reinterpret_cast<const void*>(pAllocator->pfnInternalAllocation), "VUID-VkAllocationCallbacks-pfnInternalAllocation-00635");
+
+ }
+ }
+ return skip;
+}
+
+bool StatelessValidation::PreCallValidateSetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t data) const {
+ bool skip = false;
+ if (!device_extensions.vk_ext_private_data) skip |= OutputExtensionError("vkSetPrivateDataEXT", VK_EXT_PRIVATE_DATA_EXTENSION_NAME);
+ skip |= validate_ranged_enum("vkSetPrivateDataEXT", "objectType", "VkObjectType", AllVkObjectTypeEnums, objectType, "VUID-vkSetPrivateDataEXT-objectType-parameter");
+ skip |= validate_required_handle("vkSetPrivateDataEXT", "privateDataSlot", privateDataSlot);
+ return skip;
+}
+
+bool StatelessValidation::PreCallValidateGetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t* pData) const {
+ bool skip = false;
+ if (!device_extensions.vk_ext_private_data) skip |= OutputExtensionError("vkGetPrivateDataEXT", VK_EXT_PRIVATE_DATA_EXTENSION_NAME);
+ skip |= validate_ranged_enum("vkGetPrivateDataEXT", "objectType", "VkObjectType", AllVkObjectTypeEnums, objectType, "VUID-vkGetPrivateDataEXT-objectType-parameter");
+ skip |= validate_required_handle("vkGetPrivateDataEXT", "privateDataSlot", privateDataSlot);
+ skip |= validate_required_pointer("vkGetPrivateDataEXT", "pData", pData, "VUID-vkGetPrivateDataEXT-pData-parameter");
+ return skip;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+
+bool StatelessValidation::PreCallValidateCreateDirectFBSurfaceEXT(
+ VkInstance instance,
+ const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkSurfaceKHR* pSurface) const {
+ bool skip = false;
+ if (!instance_extensions.vk_khr_surface) skip |= OutputExtensionError("vkCreateDirectFBSurfaceEXT", VK_KHR_SURFACE_EXTENSION_NAME);
+ if (!instance_extensions.vk_ext_directfb_surface) skip |= OutputExtensionError("vkCreateDirectFBSurfaceEXT", VK_EXT_DIRECTFB_SURFACE_EXTENSION_NAME);
+ skip |= validate_struct_type("vkCreateDirectFBSurfaceEXT", "pCreateInfo", "VK_STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT", pCreateInfo, VK_STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT, true, "VUID-vkCreateDirectFBSurfaceEXT-pCreateInfo-parameter", "VUID-VkDirectFBSurfaceCreateInfoEXT-sType-sType");
+ if (pCreateInfo != NULL)
+ {
+ skip |= validate_struct_pnext("vkCreateDirectFBSurfaceEXT", "pCreateInfo->pNext", NULL, pCreateInfo->pNext, 0, NULL, GeneratedVulkanHeaderVersion, "VUID-VkDirectFBSurfaceCreateInfoEXT-pNext-pNext", kVUIDUndefined);
+
+ skip |= validate_reserved_flags("vkCreateDirectFBSurfaceEXT", "pCreateInfo->flags", pCreateInfo->flags, "VUID-VkDirectFBSurfaceCreateInfoEXT-flags-zerobitmask");
+ }
+ if (pAllocator != NULL)
+ {
+ skip |= validate_required_pointer("vkCreateDirectFBSurfaceEXT", "pAllocator->pfnAllocation", reinterpret_cast<const void*>(pAllocator->pfnAllocation), "VUID-VkAllocationCallbacks-pfnAllocation-00632");
+
+ skip |= validate_required_pointer("vkCreateDirectFBSurfaceEXT", "pAllocator->pfnReallocation", reinterpret_cast<const void*>(pAllocator->pfnReallocation), "VUID-VkAllocationCallbacks-pfnReallocation-00633");
+
+ skip |= validate_required_pointer("vkCreateDirectFBSurfaceEXT", "pAllocator->pfnFree", reinterpret_cast<const void*>(pAllocator->pfnFree), "VUID-VkAllocationCallbacks-pfnFree-00634");
+
+ if (pAllocator->pfnInternalAllocation != NULL)
+ {
+ skip |= validate_required_pointer("vkCreateDirectFBSurfaceEXT", "pAllocator->pfnInternalFree", reinterpret_cast<const void*>(pAllocator->pfnInternalFree), "VUID-VkAllocationCallbacks-pfnInternalAllocation-00635");
+
+ }
+
+ if (pAllocator->pfnInternalFree != NULL)
+ {
+ skip |= validate_required_pointer("vkCreateDirectFBSurfaceEXT", "pAllocator->pfnInternalAllocation", reinterpret_cast<const void*>(pAllocator->pfnInternalAllocation), "VUID-VkAllocationCallbacks-pfnInternalAllocation-00635");
+
+ }
+ }
+ skip |= validate_required_pointer("vkCreateDirectFBSurfaceEXT", "pSurface", pSurface, "VUID-vkCreateDirectFBSurfaceEXT-pSurface-parameter");
+ return skip;
+}
+
+bool StatelessValidation::PreCallValidateGetPhysicalDeviceDirectFBPresentationSupportEXT(
+ VkPhysicalDevice physicalDevice,
+ uint32_t queueFamilyIndex,
+ IDirectFB* dfb) const {
+ bool skip = false;
+ if (!instance_extensions.vk_khr_surface) skip |= OutputExtensionError("vkGetPhysicalDeviceDirectFBPresentationSupportEXT", VK_KHR_SURFACE_EXTENSION_NAME);
+ if (!instance_extensions.vk_ext_directfb_surface) skip |= OutputExtensionError("vkGetPhysicalDeviceDirectFBPresentationSupportEXT", VK_EXT_DIRECTFB_SURFACE_EXTENSION_NAME);
+ skip |= validate_required_pointer("vkGetPhysicalDeviceDirectFBPresentationSupportEXT", "dfb", dfb, "VUID-vkGetPhysicalDeviceDirectFBPresentationSupportEXT-dfb-parameter");
+ return skip;
+}
+
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
+
#ifdef VK_USE_PLATFORM_FUCHSIA
bool StatelessValidation::PreCallValidateCreateBufferCollectionFUCHSIA(
@@ -11803,7 +12309,7 @@
skip |= validate_flags("vkCreateAccelerationStructureKHR", "pCreateInfo->flags", "VkBuildAccelerationStructureFlagBitsKHR", AllVkBuildAccelerationStructureFlagBitsKHR, pCreateInfo->flags, kOptionalFlags, "VUID-VkAccelerationStructureCreateInfoKHR-flags-parameter");
- skip |= validate_struct_type_array("vkCreateAccelerationStructureKHR", "pCreateInfo->maxGeometryCount", "pCreateInfo->pGeometryInfos", "VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_GEOMETRY_TYPE_INFO_KHR", pCreateInfo->maxGeometryCount, pCreateInfo->pGeometryInfos, VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_GEOMETRY_TYPE_INFO_KHR, true, true, "VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-sType-sType", "VUID-VkAccelerationStructureCreateInfoKHR-pGeometryInfos-parameter", "VUID-VkAccelerationStructureCreateInfoKHR-maxGeometryCount-arraylength");
+ skip |= validate_struct_type_array("vkCreateAccelerationStructureKHR", "pCreateInfo->maxGeometryCount", "pCreateInfo->pGeometryInfos", "VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_GEOMETRY_TYPE_INFO_KHR", pCreateInfo->maxGeometryCount, pCreateInfo->pGeometryInfos, VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_GEOMETRY_TYPE_INFO_KHR, false, true, "VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-sType-sType", "VUID-VkAccelerationStructureCreateInfoKHR-pGeometryInfos-parameter", kVUIDUndefined);
if (pCreateInfo->pGeometryInfos != NULL)
{
@@ -11922,6 +12428,7 @@
// No xml-driven validation
}
}
+ if (!skip) skip |= manual_PreCallValidateCmdBuildAccelerationStructureKHR(commandBuffer, infoCount, pInfos, ppOffsetInfos);
return skip;
}
@@ -11959,6 +12466,7 @@
// No xml-driven validation
}
skip |= validate_required_handle("vkCmdBuildAccelerationStructureIndirectKHR", "indirectBuffer", indirectBuffer);
+ if (!skip) skip |= manual_PreCallValidateCmdBuildAccelerationStructureIndirectKHR(commandBuffer, pInfo, indirectBuffer, indirectOffset, indirectStride);
return skip;
}
@@ -12005,6 +12513,7 @@
// No xml-driven validation
}
}
+ if (!skip) skip |= manual_PreCallValidateBuildAccelerationStructureKHR(device, infoCount, pInfos, ppOffsetInfos);
return skip;
}
@@ -12032,6 +12541,7 @@
skip |= validate_ranged_enum("vkCopyAccelerationStructureKHR", "pInfo->mode", "VkCopyAccelerationStructureModeKHR", AllVkCopyAccelerationStructureModeKHREnums, pInfo->mode, "VUID-VkCopyAccelerationStructureInfoKHR-mode-parameter");
}
+ if (!skip) skip |= manual_PreCallValidateCopyAccelerationStructureKHR(device, pInfo);
return skip;
}
@@ -12059,6 +12569,7 @@
skip |= validate_ranged_enum("vkCopyAccelerationStructureToMemoryKHR", "pInfo->mode", "VkCopyAccelerationStructureModeKHR", AllVkCopyAccelerationStructureModeKHREnums, pInfo->mode, "VUID-VkCopyAccelerationStructureToMemoryInfoKHR-mode-parameter");
}
+ if (!skip) skip |= manual_PreCallValidateCopyAccelerationStructureToMemoryKHR(device, pInfo);
return skip;
}
@@ -12086,6 +12597,7 @@
skip |= validate_ranged_enum("vkCopyMemoryToAccelerationStructureKHR", "pInfo->mode", "VkCopyAccelerationStructureModeKHR", AllVkCopyAccelerationStructureModeKHREnums, pInfo->mode, "VUID-VkCopyMemoryToAccelerationStructureInfoKHR-mode-parameter");
}
+ if (!skip) skip |= manual_PreCallValidateCopyMemoryToAccelerationStructureKHR(device, pInfo);
return skip;
}
@@ -12108,6 +12620,7 @@
skip |= validate_handle_array("vkWriteAccelerationStructuresPropertiesKHR", "accelerationStructureCount", "pAccelerationStructures", accelerationStructureCount, pAccelerationStructures, true, true);
skip |= validate_ranged_enum("vkWriteAccelerationStructuresPropertiesKHR", "queryType", "VkQueryType", AllVkQueryTypeEnums, queryType, "VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-parameter");
skip |= validate_array("vkWriteAccelerationStructuresPropertiesKHR", "dataSize", "pData", dataSize, &pData, true, true, "VUID-vkWriteAccelerationStructuresPropertiesKHR-dataSize-arraylength", "VUID-vkWriteAccelerationStructuresPropertiesKHR-pData-parameter");
+ if (!skip) skip |= manual_PreCallValidateWriteAccelerationStructuresPropertiesKHR(device, accelerationStructureCount, pAccelerationStructures, queryType, dataSize, pData, stride);
return skip;
}
@@ -12135,6 +12648,7 @@
skip |= validate_ranged_enum("vkCmdCopyAccelerationStructureKHR", "pInfo->mode", "VkCopyAccelerationStructureModeKHR", AllVkCopyAccelerationStructureModeKHREnums, pInfo->mode, "VUID-VkCopyAccelerationStructureInfoKHR-mode-parameter");
}
+ if (!skip) skip |= manual_PreCallValidateCmdCopyAccelerationStructureKHR(commandBuffer, pInfo);
return skip;
}
@@ -12162,6 +12676,7 @@
skip |= validate_ranged_enum("vkCmdCopyAccelerationStructureToMemoryKHR", "pInfo->mode", "VkCopyAccelerationStructureModeKHR", AllVkCopyAccelerationStructureModeKHREnums, pInfo->mode, "VUID-VkCopyAccelerationStructureToMemoryInfoKHR-mode-parameter");
}
+ if (!skip) skip |= manual_PreCallValidateCmdCopyAccelerationStructureToMemoryKHR(commandBuffer, pInfo);
return skip;
}
@@ -12189,6 +12704,7 @@
skip |= validate_ranged_enum("vkCmdCopyMemoryToAccelerationStructureKHR", "pInfo->mode", "VkCopyAccelerationStructureModeKHR", AllVkCopyAccelerationStructureModeKHREnums, pInfo->mode, "VUID-VkCopyMemoryToAccelerationStructureInfoKHR-mode-parameter");
}
+ if (!skip) skip |= manual_PreCallValidateCmdCopyMemoryToAccelerationStructureKHR(commandBuffer, pInfo);
return skip;
}
@@ -12229,6 +12745,7 @@
{
// No xml-driven validation
}
+ if (!skip) skip |= manual_PreCallValidateCmdTraceRaysKHR(commandBuffer, pRaygenShaderBindingTable, pMissShaderBindingTable, pHitShaderBindingTable, pCallableShaderBindingTable, width, height, depth);
return skip;
}
@@ -12384,6 +12901,7 @@
if (!device_extensions.vk_khr_ray_tracing) skip |= OutputExtensionError("vkGetRayTracingCaptureReplayShaderGroupHandlesKHR", VK_KHR_RAY_TRACING_EXTENSION_NAME);
skip |= validate_required_handle("vkGetRayTracingCaptureReplayShaderGroupHandlesKHR", "pipeline", pipeline);
skip |= validate_array("vkGetRayTracingCaptureReplayShaderGroupHandlesKHR", "dataSize", "pData", dataSize, &pData, true, true, "VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-dataSize-arraylength", "VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pData-parameter");
+ if (!skip) skip |= manual_PreCallValidateGetRayTracingCaptureReplayShaderGroupHandlesKHR(device, pipeline, firstGroup, groupCount, dataSize, pData);
return skip;
}
@@ -12424,6 +12942,7 @@
// No xml-driven validation
}
skip |= validate_required_handle("vkCmdTraceRaysIndirectKHR", "buffer", buffer);
+ if (!skip) skip |= manual_PreCallValidateCmdTraceRaysIndirectKHR(commandBuffer, pRaygenShaderBindingTable, pMissShaderBindingTable, pHitShaderBindingTable, pCallableShaderBindingTable, buffer, offset);
return skip;
}
@@ -12445,6 +12964,7 @@
skip |= validate_required_pointer("vkGetDeviceAccelerationStructureCompatibilityKHR", "version->versionData", version->versionData, "VUID-VkAccelerationStructureVersionKHR-versionData-parameter");
}
+ if (!skip) skip |= manual_PreCallValidateGetDeviceAccelerationStructureCompatibilityKHR(device, version);
return skip;
}
diff --git a/layers/generated/parameter_validation.h b/layers/generated/parameter_validation.h
index 990f0d8..178b9fd 100644
--- a/layers/generated/parameter_validation.h
+++ b/layers/generated/parameter_validation.h
@@ -1389,6 +1389,10 @@
bool PreCallValidateGetImageViewHandleNVX(
VkDevice device,
const VkImageViewHandleInfoNVX* pInfo) const;
+bool PreCallValidateGetImageViewAddressNVX(
+ VkDevice device,
+ VkImageView imageView,
+ VkImageViewAddressPropertiesNVX* pProperties) const;
bool PreCallValidateCmdDrawIndirectCountAMD(
VkCommandBuffer commandBuffer,
VkBuffer buffer,
@@ -1860,6 +1864,53 @@
VkQueryPool queryPool,
uint32_t firstQuery,
uint32_t queryCount) const;
+bool PreCallValidateCmdSetCullModeEXT(
+ VkCommandBuffer commandBuffer,
+ VkCullModeFlags cullMode) const;
+bool PreCallValidateCmdSetFrontFaceEXT(
+ VkCommandBuffer commandBuffer,
+ VkFrontFace frontFace) const;
+bool PreCallValidateCmdSetPrimitiveTopologyEXT(
+ VkCommandBuffer commandBuffer,
+ VkPrimitiveTopology primitiveTopology) const;
+bool PreCallValidateCmdSetViewportWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t viewportCount,
+ const VkViewport* pViewports) const;
+bool PreCallValidateCmdSetScissorWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t scissorCount,
+ const VkRect2D* pScissors) const;
+bool PreCallValidateCmdBindVertexBuffers2EXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t firstBinding,
+ uint32_t bindingCount,
+ const VkBuffer* pBuffers,
+ const VkDeviceSize* pOffsets,
+ const VkDeviceSize* pSizes,
+ const VkDeviceSize* pStrides) const;
+bool PreCallValidateCmdSetDepthTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthTestEnable) const;
+bool PreCallValidateCmdSetDepthWriteEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthWriteEnable) const;
+bool PreCallValidateCmdSetDepthCompareOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkCompareOp depthCompareOp) const;
+bool PreCallValidateCmdSetDepthBoundsTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthBoundsTestEnable) const;
+bool PreCallValidateCmdSetStencilTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 stencilTestEnable) const;
+bool PreCallValidateCmdSetStencilOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkStencilFaceFlags faceMask,
+ VkStencilOp failOp,
+ VkStencilOp passOp,
+ VkStencilOp depthFailOp,
+ VkCompareOp compareOp) const;
bool PreCallValidateGetGeneratedCommandsMemoryRequirementsNV(
VkDevice device,
const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo,
@@ -1885,6 +1936,40 @@
VkDevice device,
VkIndirectCommandsLayoutNV indirectCommandsLayout,
const VkAllocationCallbacks* pAllocator) const;
+bool PreCallValidateCreatePrivateDataSlotEXT(
+ VkDevice device,
+ const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkPrivateDataSlotEXT* pPrivateDataSlot) const;
+bool PreCallValidateDestroyPrivateDataSlotEXT(
+ VkDevice device,
+ VkPrivateDataSlotEXT privateDataSlot,
+ const VkAllocationCallbacks* pAllocator) const;
+bool PreCallValidateSetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t data) const;
+bool PreCallValidateGetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t* pData) const;
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+bool PreCallValidateCreateDirectFBSurfaceEXT(
+ VkInstance instance,
+ const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkSurfaceKHR* pSurface) const;
+#endif
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+bool PreCallValidateGetPhysicalDeviceDirectFBPresentationSupportEXT(
+ VkPhysicalDevice physicalDevice,
+ uint32_t queueFamilyIndex,
+ IDirectFB* dfb) const;
+#endif
#ifdef VK_USE_PLATFORM_FUCHSIA
bool PreCallValidateCreateBufferCollectionFUCHSIA(
VkDevice device,
diff --git a/layers/generated/spirv_tools_commit_id.h b/layers/generated/spirv_tools_commit_id.h
index 5d9f07e..fe74dae 100644
--- a/layers/generated/spirv_tools_commit_id.h
+++ b/layers/generated/spirv_tools_commit_id.h
@@ -26,4 +26,4 @@
****************************************************************************/
#pragma once
-#define SPIRV_TOOLS_COMMIT_ID "e157435c1e777aa1052f446dafed162b4a722e03"
+#define SPIRV_TOOLS_COMMIT_ID "3ee5f2f1d3316e228916788b300d786bb574d337"
diff --git a/layers/generated/synchronization_validation_types.h b/layers/generated/synchronization_validation_types.h
new file mode 100644
index 0000000..6581b07
--- /dev/null
+++ b/layers/generated/synchronization_validation_types.h
@@ -0,0 +1,1407 @@
+// *** THIS FILE IS GENERATED - DO NOT EDIT ***
+// See helper_file_generator.py for modifications
+
+
+/***************************************************************************
+ *
+ * Copyright (c) 2015-2020 The Khronos Group Inc.
+ * Copyright (c) 2015-2020 Valve Corporation
+ * Copyright (c) 2015-2020 LunarG, Inc.
+ * Copyright (c) 2015-2020 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Author: Mark Lobodzinski <mark@lunarg.com>
+ * Author: Courtney Goeltzenleuchter <courtneygo@google.com>
+ * Author: Tobin Ehlis <tobine@google.com>
+ * Author: Chris Forbes <chrisforbes@google.com>
+ * Author: John Zulauf<jzulauf@lunarg.com>
+ *
+ ****************************************************************************/
+
+#pragma once
+
+#include <array>
+#include <map>
+#include <stdint.h>
+#include <vulkan/vulkan.h>
+
+// clang-format off
+
+using SyncStageAccessFlags = uint64_t;
+
+// Unique number for each stage/access combination
+enum SyncStageAccessIndex {
+ SYNC_DRAW_INDIRECT_INDIRECT_COMMAND_READ = 0,
+ SYNC_DRAW_INDIRECT_TRANSFORM_FEEDBACK_COUNTER_READ_EXT = 1,
+ SYNC_VERTEX_INPUT_INDEX_READ = 2,
+ SYNC_VERTEX_INPUT_VERTEX_ATTRIBUTE_READ = 3,
+ SYNC_VERTEX_SHADER_SHADER_READ = 4,
+ SYNC_VERTEX_SHADER_SHADER_WRITE = 5,
+ SYNC_VERTEX_SHADER_UNIFORM_READ = 6,
+ SYNC_TESSELLATION_CONTROL_SHADER_SHADER_READ = 7,
+ SYNC_TESSELLATION_CONTROL_SHADER_SHADER_WRITE = 8,
+ SYNC_TESSELLATION_CONTROL_SHADER_UNIFORM_READ = 9,
+ SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_READ = 10,
+ SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_WRITE = 11,
+ SYNC_TESSELLATION_EVALUATION_SHADER_UNIFORM_READ = 12,
+ SYNC_GEOMETRY_SHADER_SHADER_READ = 13,
+ SYNC_GEOMETRY_SHADER_SHADER_WRITE = 14,
+ SYNC_GEOMETRY_SHADER_UNIFORM_READ = 15,
+ SYNC_TRANSFORM_FEEDBACK_EXT_TRANSFORM_FEEDBACK_COUNTER_WRITE_EXT = 16,
+ SYNC_TRANSFORM_FEEDBACK_EXT_TRANSFORM_FEEDBACK_WRITE_EXT = 17,
+ SYNC_FRAGMENT_DENSITY_PROCESS_EXT_FRAGMENT_DENSITY_MAP_READ_EXT = 18,
+ SYNC_TASK_SHADER_NV_SHADER_READ = 19,
+ SYNC_TASK_SHADER_NV_SHADER_WRITE = 20,
+ SYNC_TASK_SHADER_NV_UNIFORM_READ = 21,
+ SYNC_MESH_SHADER_NV_SHADER_READ = 22,
+ SYNC_MESH_SHADER_NV_SHADER_WRITE = 23,
+ SYNC_MESH_SHADER_NV_UNIFORM_READ = 24,
+ SYNC_SHADING_RATE_IMAGE_NV_SHADING_RATE_IMAGE_READ_NV = 25,
+ SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ = 26,
+ SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE = 27,
+ SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ = 28,
+ SYNC_FRAGMENT_SHADER_SHADER_READ = 29,
+ SYNC_FRAGMENT_SHADER_SHADER_WRITE = 30,
+ SYNC_FRAGMENT_SHADER_UNIFORM_READ = 31,
+ SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ = 32,
+ SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE = 33,
+ SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ = 34,
+ SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ_NONCOHERENT_EXT = 35,
+ SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE = 36,
+ SYNC_COMPUTE_SHADER_SHADER_READ = 37,
+ SYNC_COMPUTE_SHADER_SHADER_WRITE = 38,
+ SYNC_COMPUTE_SHADER_UNIFORM_READ = 39,
+ SYNC_TRANSFER_TRANSFER_READ = 40,
+ SYNC_TRANSFER_TRANSFER_WRITE = 41,
+ SYNC_COMMAND_PREPROCESS_NV_COMMAND_PREPROCESS_READ_NV = 42,
+ SYNC_COMMAND_PREPROCESS_NV_COMMAND_PREPROCESS_WRITE_NV = 43,
+ SYNC_CONDITIONAL_RENDERING_EXT_CONDITIONAL_RENDERING_READ_EXT = 44,
+ SYNC_RAY_TRACING_SHADER_KHR_ACCELERATION_STRUCTURE_READ_KHR = 45,
+ SYNC_RAY_TRACING_SHADER_KHR_SHADER_READ = 46,
+ SYNC_RAY_TRACING_SHADER_KHR_SHADER_WRITE = 47,
+ SYNC_RAY_TRACING_SHADER_KHR_UNIFORM_READ = 48,
+ SYNC_ACCELERATION_STRUCTURE_BUILD_KHR_ACCELERATION_STRUCTURE_READ_KHR = 49,
+ SYNC_ACCELERATION_STRUCTURE_BUILD_KHR_ACCELERATION_STRUCTURE_WRITE_KHR = 50,
+ SYNC_HOST_HOST_READ = 51,
+ SYNC_HOST_HOST_WRITE = 52,
+ SYNC_IMAGE_LAYOUT_TRANSITION = 53,
+ SYNC_QUEUE_FAMILY_OWNERSHIP_TRANSFER = 54,
+};
+
+// Unique bit for each stage/access combination
+enum SyncStageAccessFlagBits : SyncStageAccessFlags {
+ SYNC_DRAW_INDIRECT_INDIRECT_COMMAND_READ_BIT = SyncStageAccessFlags(1) << SYNC_DRAW_INDIRECT_INDIRECT_COMMAND_READ,
+ SYNC_DRAW_INDIRECT_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT = SyncStageAccessFlags(1) << SYNC_DRAW_INDIRECT_TRANSFORM_FEEDBACK_COUNTER_READ_EXT,
+ SYNC_VERTEX_INPUT_INDEX_READ_BIT = SyncStageAccessFlags(1) << SYNC_VERTEX_INPUT_INDEX_READ,
+ SYNC_VERTEX_INPUT_VERTEX_ATTRIBUTE_READ_BIT = SyncStageAccessFlags(1) << SYNC_VERTEX_INPUT_VERTEX_ATTRIBUTE_READ,
+ SYNC_VERTEX_SHADER_SHADER_READ_BIT = SyncStageAccessFlags(1) << SYNC_VERTEX_SHADER_SHADER_READ,
+ SYNC_VERTEX_SHADER_SHADER_WRITE_BIT = SyncStageAccessFlags(1) << SYNC_VERTEX_SHADER_SHADER_WRITE,
+ SYNC_VERTEX_SHADER_UNIFORM_READ_BIT = SyncStageAccessFlags(1) << SYNC_VERTEX_SHADER_UNIFORM_READ,
+ SYNC_TESSELLATION_CONTROL_SHADER_SHADER_READ_BIT = SyncStageAccessFlags(1) << SYNC_TESSELLATION_CONTROL_SHADER_SHADER_READ,
+ SYNC_TESSELLATION_CONTROL_SHADER_SHADER_WRITE_BIT = SyncStageAccessFlags(1) << SYNC_TESSELLATION_CONTROL_SHADER_SHADER_WRITE,
+ SYNC_TESSELLATION_CONTROL_SHADER_UNIFORM_READ_BIT = SyncStageAccessFlags(1) << SYNC_TESSELLATION_CONTROL_SHADER_UNIFORM_READ,
+ SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_READ_BIT = SyncStageAccessFlags(1) << SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_READ,
+ SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_WRITE_BIT = SyncStageAccessFlags(1) << SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_WRITE,
+ SYNC_TESSELLATION_EVALUATION_SHADER_UNIFORM_READ_BIT = SyncStageAccessFlags(1) << SYNC_TESSELLATION_EVALUATION_SHADER_UNIFORM_READ,
+ SYNC_GEOMETRY_SHADER_SHADER_READ_BIT = SyncStageAccessFlags(1) << SYNC_GEOMETRY_SHADER_SHADER_READ,
+ SYNC_GEOMETRY_SHADER_SHADER_WRITE_BIT = SyncStageAccessFlags(1) << SYNC_GEOMETRY_SHADER_SHADER_WRITE,
+ SYNC_GEOMETRY_SHADER_UNIFORM_READ_BIT = SyncStageAccessFlags(1) << SYNC_GEOMETRY_SHADER_UNIFORM_READ,
+ SYNC_TRANSFORM_FEEDBACK_BIT_EXT_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT = SyncStageAccessFlags(1) << SYNC_TRANSFORM_FEEDBACK_EXT_TRANSFORM_FEEDBACK_COUNTER_WRITE_EXT,
+ SYNC_TRANSFORM_FEEDBACK_BIT_EXT_TRANSFORM_FEEDBACK_WRITE_BIT_EXT = SyncStageAccessFlags(1) << SYNC_TRANSFORM_FEEDBACK_EXT_TRANSFORM_FEEDBACK_WRITE_EXT,
+ SYNC_FRAGMENT_DENSITY_PROCESS_BIT_EXT_FRAGMENT_DENSITY_MAP_READ_BIT_EXT = SyncStageAccessFlags(1) << SYNC_FRAGMENT_DENSITY_PROCESS_EXT_FRAGMENT_DENSITY_MAP_READ_EXT,
+ SYNC_TASK_SHADER_NV_SHADER_READ_BIT = SyncStageAccessFlags(1) << SYNC_TASK_SHADER_NV_SHADER_READ,
+ SYNC_TASK_SHADER_NV_SHADER_WRITE_BIT = SyncStageAccessFlags(1) << SYNC_TASK_SHADER_NV_SHADER_WRITE,
+ SYNC_TASK_SHADER_NV_UNIFORM_READ_BIT = SyncStageAccessFlags(1) << SYNC_TASK_SHADER_NV_UNIFORM_READ,
+ SYNC_MESH_SHADER_NV_SHADER_READ_BIT = SyncStageAccessFlags(1) << SYNC_MESH_SHADER_NV_SHADER_READ,
+ SYNC_MESH_SHADER_NV_SHADER_WRITE_BIT = SyncStageAccessFlags(1) << SYNC_MESH_SHADER_NV_SHADER_WRITE,
+ SYNC_MESH_SHADER_NV_UNIFORM_READ_BIT = SyncStageAccessFlags(1) << SYNC_MESH_SHADER_NV_UNIFORM_READ,
+ SYNC_SHADING_RATE_IMAGE_BIT_NV_SHADING_RATE_IMAGE_READ_BIT_NV = SyncStageAccessFlags(1) << SYNC_SHADING_RATE_IMAGE_NV_SHADING_RATE_IMAGE_READ_NV,
+ SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ_BIT = SyncStageAccessFlags(1) << SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ,
+ SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT = SyncStageAccessFlags(1) << SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE,
+ SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ_BIT = SyncStageAccessFlags(1) << SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ,
+ SYNC_FRAGMENT_SHADER_SHADER_READ_BIT = SyncStageAccessFlags(1) << SYNC_FRAGMENT_SHADER_SHADER_READ,
+ SYNC_FRAGMENT_SHADER_SHADER_WRITE_BIT = SyncStageAccessFlags(1) << SYNC_FRAGMENT_SHADER_SHADER_WRITE,
+ SYNC_FRAGMENT_SHADER_UNIFORM_READ_BIT = SyncStageAccessFlags(1) << SYNC_FRAGMENT_SHADER_UNIFORM_READ,
+ SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ_BIT = SyncStageAccessFlags(1) << SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ,
+ SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT = SyncStageAccessFlags(1) << SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE,
+ SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ_BIT = SyncStageAccessFlags(1) << SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ,
+ SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT = SyncStageAccessFlags(1) << SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ_NONCOHERENT_EXT,
+ SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE_BIT = SyncStageAccessFlags(1) << SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE,
+ SYNC_COMPUTE_SHADER_SHADER_READ_BIT = SyncStageAccessFlags(1) << SYNC_COMPUTE_SHADER_SHADER_READ,
+ SYNC_COMPUTE_SHADER_SHADER_WRITE_BIT = SyncStageAccessFlags(1) << SYNC_COMPUTE_SHADER_SHADER_WRITE,
+ SYNC_COMPUTE_SHADER_UNIFORM_READ_BIT = SyncStageAccessFlags(1) << SYNC_COMPUTE_SHADER_UNIFORM_READ,
+ SYNC_TRANSFER_TRANSFER_READ_BIT = SyncStageAccessFlags(1) << SYNC_TRANSFER_TRANSFER_READ,
+ SYNC_TRANSFER_TRANSFER_WRITE_BIT = SyncStageAccessFlags(1) << SYNC_TRANSFER_TRANSFER_WRITE,
+ SYNC_COMMAND_PREPROCESS_BIT_NV_COMMAND_PREPROCESS_READ_BIT_NV = SyncStageAccessFlags(1) << SYNC_COMMAND_PREPROCESS_NV_COMMAND_PREPROCESS_READ_NV,
+ SYNC_COMMAND_PREPROCESS_BIT_NV_COMMAND_PREPROCESS_WRITE_BIT_NV = SyncStageAccessFlags(1) << SYNC_COMMAND_PREPROCESS_NV_COMMAND_PREPROCESS_WRITE_NV,
+ SYNC_CONDITIONAL_RENDERING_BIT_EXT_CONDITIONAL_RENDERING_READ_BIT_EXT = SyncStageAccessFlags(1) << SYNC_CONDITIONAL_RENDERING_EXT_CONDITIONAL_RENDERING_READ_EXT,
+ SYNC_RAY_TRACING_SHADER_BIT_KHR_ACCELERATION_STRUCTURE_READ_BIT_KHR = SyncStageAccessFlags(1) << SYNC_RAY_TRACING_SHADER_KHR_ACCELERATION_STRUCTURE_READ_KHR,
+ SYNC_RAY_TRACING_SHADER_KHR_SHADER_READ_BIT = SyncStageAccessFlags(1) << SYNC_RAY_TRACING_SHADER_KHR_SHADER_READ,
+ SYNC_RAY_TRACING_SHADER_KHR_SHADER_WRITE_BIT = SyncStageAccessFlags(1) << SYNC_RAY_TRACING_SHADER_KHR_SHADER_WRITE,
+ SYNC_RAY_TRACING_SHADER_KHR_UNIFORM_READ_BIT = SyncStageAccessFlags(1) << SYNC_RAY_TRACING_SHADER_KHR_UNIFORM_READ,
+ SYNC_ACCELERATION_STRUCTURE_BUILD_BIT_KHR_ACCELERATION_STRUCTURE_READ_BIT_KHR = SyncStageAccessFlags(1) << SYNC_ACCELERATION_STRUCTURE_BUILD_KHR_ACCELERATION_STRUCTURE_READ_KHR,
+ SYNC_ACCELERATION_STRUCTURE_BUILD_BIT_KHR_ACCELERATION_STRUCTURE_WRITE_BIT_KHR = SyncStageAccessFlags(1) << SYNC_ACCELERATION_STRUCTURE_BUILD_KHR_ACCELERATION_STRUCTURE_WRITE_KHR,
+ SYNC_HOST_HOST_READ_BIT = SyncStageAccessFlags(1) << SYNC_HOST_HOST_READ,
+ SYNC_HOST_HOST_WRITE_BIT = SyncStageAccessFlags(1) << SYNC_HOST_HOST_WRITE,
+ SYNC_IMAGE_LAYOUT_TRANSITION_BIT = SyncStageAccessFlags(1) << SYNC_IMAGE_LAYOUT_TRANSITION,
+ SYNC_QUEUE_FAMILY_OWNERSHIP_TRANSFER_BIT = SyncStageAccessFlags(1) << SYNC_QUEUE_FAMILY_OWNERSHIP_TRANSFER,
+};
+
+// Map of the StageAccessIndices from the StageAccess Bit
+static std::map<SyncStageAccessFlags, SyncStageAccessIndex> syncStageAccessIndexByStageAccessBit = {
+ { SYNC_DRAW_INDIRECT_INDIRECT_COMMAND_READ_BIT, SYNC_DRAW_INDIRECT_INDIRECT_COMMAND_READ },
+ { SYNC_DRAW_INDIRECT_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT, SYNC_DRAW_INDIRECT_TRANSFORM_FEEDBACK_COUNTER_READ_EXT },
+ { SYNC_VERTEX_INPUT_INDEX_READ_BIT, SYNC_VERTEX_INPUT_INDEX_READ },
+ { SYNC_VERTEX_INPUT_VERTEX_ATTRIBUTE_READ_BIT, SYNC_VERTEX_INPUT_VERTEX_ATTRIBUTE_READ },
+ { SYNC_VERTEX_SHADER_SHADER_READ_BIT, SYNC_VERTEX_SHADER_SHADER_READ },
+ { SYNC_VERTEX_SHADER_SHADER_WRITE_BIT, SYNC_VERTEX_SHADER_SHADER_WRITE },
+ { SYNC_VERTEX_SHADER_UNIFORM_READ_BIT, SYNC_VERTEX_SHADER_UNIFORM_READ },
+ { SYNC_TESSELLATION_CONTROL_SHADER_SHADER_READ_BIT, SYNC_TESSELLATION_CONTROL_SHADER_SHADER_READ },
+ { SYNC_TESSELLATION_CONTROL_SHADER_SHADER_WRITE_BIT, SYNC_TESSELLATION_CONTROL_SHADER_SHADER_WRITE },
+ { SYNC_TESSELLATION_CONTROL_SHADER_UNIFORM_READ_BIT, SYNC_TESSELLATION_CONTROL_SHADER_UNIFORM_READ },
+ { SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_READ_BIT, SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_READ },
+ { SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_WRITE_BIT, SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_WRITE },
+ { SYNC_TESSELLATION_EVALUATION_SHADER_UNIFORM_READ_BIT, SYNC_TESSELLATION_EVALUATION_SHADER_UNIFORM_READ },
+ { SYNC_GEOMETRY_SHADER_SHADER_READ_BIT, SYNC_GEOMETRY_SHADER_SHADER_READ },
+ { SYNC_GEOMETRY_SHADER_SHADER_WRITE_BIT, SYNC_GEOMETRY_SHADER_SHADER_WRITE },
+ { SYNC_GEOMETRY_SHADER_UNIFORM_READ_BIT, SYNC_GEOMETRY_SHADER_UNIFORM_READ },
+ { SYNC_TRANSFORM_FEEDBACK_BIT_EXT_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT, SYNC_TRANSFORM_FEEDBACK_EXT_TRANSFORM_FEEDBACK_COUNTER_WRITE_EXT },
+ { SYNC_TRANSFORM_FEEDBACK_BIT_EXT_TRANSFORM_FEEDBACK_WRITE_BIT_EXT, SYNC_TRANSFORM_FEEDBACK_EXT_TRANSFORM_FEEDBACK_WRITE_EXT },
+ { SYNC_FRAGMENT_DENSITY_PROCESS_BIT_EXT_FRAGMENT_DENSITY_MAP_READ_BIT_EXT, SYNC_FRAGMENT_DENSITY_PROCESS_EXT_FRAGMENT_DENSITY_MAP_READ_EXT },
+ { SYNC_TASK_SHADER_NV_SHADER_READ_BIT, SYNC_TASK_SHADER_NV_SHADER_READ },
+ { SYNC_TASK_SHADER_NV_SHADER_WRITE_BIT, SYNC_TASK_SHADER_NV_SHADER_WRITE },
+ { SYNC_TASK_SHADER_NV_UNIFORM_READ_BIT, SYNC_TASK_SHADER_NV_UNIFORM_READ },
+ { SYNC_MESH_SHADER_NV_SHADER_READ_BIT, SYNC_MESH_SHADER_NV_SHADER_READ },
+ { SYNC_MESH_SHADER_NV_SHADER_WRITE_BIT, SYNC_MESH_SHADER_NV_SHADER_WRITE },
+ { SYNC_MESH_SHADER_NV_UNIFORM_READ_BIT, SYNC_MESH_SHADER_NV_UNIFORM_READ },
+ { SYNC_SHADING_RATE_IMAGE_BIT_NV_SHADING_RATE_IMAGE_READ_BIT_NV, SYNC_SHADING_RATE_IMAGE_NV_SHADING_RATE_IMAGE_READ_NV },
+ { SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ_BIT, SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ },
+ { SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE },
+ { SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ_BIT, SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ },
+ { SYNC_FRAGMENT_SHADER_SHADER_READ_BIT, SYNC_FRAGMENT_SHADER_SHADER_READ },
+ { SYNC_FRAGMENT_SHADER_SHADER_WRITE_BIT, SYNC_FRAGMENT_SHADER_SHADER_WRITE },
+ { SYNC_FRAGMENT_SHADER_UNIFORM_READ_BIT, SYNC_FRAGMENT_SHADER_UNIFORM_READ },
+ { SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ_BIT, SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ },
+ { SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE },
+ { SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ_BIT, SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ },
+ { SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT, SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ_NONCOHERENT_EXT },
+ { SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE_BIT, SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE },
+ { SYNC_COMPUTE_SHADER_SHADER_READ_BIT, SYNC_COMPUTE_SHADER_SHADER_READ },
+ { SYNC_COMPUTE_SHADER_SHADER_WRITE_BIT, SYNC_COMPUTE_SHADER_SHADER_WRITE },
+ { SYNC_COMPUTE_SHADER_UNIFORM_READ_BIT, SYNC_COMPUTE_SHADER_UNIFORM_READ },
+ { SYNC_TRANSFER_TRANSFER_READ_BIT, SYNC_TRANSFER_TRANSFER_READ },
+ { SYNC_TRANSFER_TRANSFER_WRITE_BIT, SYNC_TRANSFER_TRANSFER_WRITE },
+ { SYNC_COMMAND_PREPROCESS_BIT_NV_COMMAND_PREPROCESS_READ_BIT_NV, SYNC_COMMAND_PREPROCESS_NV_COMMAND_PREPROCESS_READ_NV },
+ { SYNC_COMMAND_PREPROCESS_BIT_NV_COMMAND_PREPROCESS_WRITE_BIT_NV, SYNC_COMMAND_PREPROCESS_NV_COMMAND_PREPROCESS_WRITE_NV },
+ { SYNC_CONDITIONAL_RENDERING_BIT_EXT_CONDITIONAL_RENDERING_READ_BIT_EXT, SYNC_CONDITIONAL_RENDERING_EXT_CONDITIONAL_RENDERING_READ_EXT },
+ { SYNC_RAY_TRACING_SHADER_BIT_KHR_ACCELERATION_STRUCTURE_READ_BIT_KHR, SYNC_RAY_TRACING_SHADER_KHR_ACCELERATION_STRUCTURE_READ_KHR },
+ { SYNC_RAY_TRACING_SHADER_KHR_SHADER_READ_BIT, SYNC_RAY_TRACING_SHADER_KHR_SHADER_READ },
+ { SYNC_RAY_TRACING_SHADER_KHR_SHADER_WRITE_BIT, SYNC_RAY_TRACING_SHADER_KHR_SHADER_WRITE },
+ { SYNC_RAY_TRACING_SHADER_KHR_UNIFORM_READ_BIT, SYNC_RAY_TRACING_SHADER_KHR_UNIFORM_READ },
+ { SYNC_ACCELERATION_STRUCTURE_BUILD_BIT_KHR_ACCELERATION_STRUCTURE_READ_BIT_KHR, SYNC_ACCELERATION_STRUCTURE_BUILD_KHR_ACCELERATION_STRUCTURE_READ_KHR },
+ { SYNC_ACCELERATION_STRUCTURE_BUILD_BIT_KHR_ACCELERATION_STRUCTURE_WRITE_BIT_KHR, SYNC_ACCELERATION_STRUCTURE_BUILD_KHR_ACCELERATION_STRUCTURE_WRITE_KHR },
+ { SYNC_HOST_HOST_READ_BIT, SYNC_HOST_HOST_READ },
+ { SYNC_HOST_HOST_WRITE_BIT, SYNC_HOST_HOST_WRITE },
+ { SYNC_IMAGE_LAYOUT_TRANSITION_BIT, SYNC_IMAGE_LAYOUT_TRANSITION },
+ { SYNC_QUEUE_FAMILY_OWNERSHIP_TRANSFER_BIT, SYNC_QUEUE_FAMILY_OWNERSHIP_TRANSFER },
+};
+
+struct SyncStageAccessInfoType {
+ const char *name;
+ VkPipelineStageFlagBits stage_mask;
+ VkAccessFlagBits access_mask;
+ SyncStageAccessIndex stage_access_index;
+ SyncStageAccessFlagBits stage_access_bit;
+};
+
+// Array of text names and component masks for each stage/access index
+static std::array<SyncStageAccessInfoType, 55> syncStageAccessInfoByStageAccessIndex = { {
+ {
+ "SYNC_DRAW_INDIRECT_INDIRECT_COMMAND_READ",
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT,
+ VK_ACCESS_INDIRECT_COMMAND_READ_BIT,
+ SYNC_DRAW_INDIRECT_INDIRECT_COMMAND_READ,
+ SYNC_DRAW_INDIRECT_INDIRECT_COMMAND_READ_BIT
+
+ },
+ {
+ "SYNC_DRAW_INDIRECT_TRANSFORM_FEEDBACK_COUNTER_READ_EXT",
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT,
+ VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT,
+ SYNC_DRAW_INDIRECT_TRANSFORM_FEEDBACK_COUNTER_READ_EXT,
+ SYNC_DRAW_INDIRECT_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT
+
+ },
+ {
+ "SYNC_VERTEX_INPUT_INDEX_READ",
+ VK_PIPELINE_STAGE_VERTEX_INPUT_BIT,
+ VK_ACCESS_INDEX_READ_BIT,
+ SYNC_VERTEX_INPUT_INDEX_READ,
+ SYNC_VERTEX_INPUT_INDEX_READ_BIT
+
+ },
+ {
+ "SYNC_VERTEX_INPUT_VERTEX_ATTRIBUTE_READ",
+ VK_PIPELINE_STAGE_VERTEX_INPUT_BIT,
+ VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT,
+ SYNC_VERTEX_INPUT_VERTEX_ATTRIBUTE_READ,
+ SYNC_VERTEX_INPUT_VERTEX_ATTRIBUTE_READ_BIT
+
+ },
+ {
+ "SYNC_VERTEX_SHADER_SHADER_READ",
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
+ VK_ACCESS_SHADER_READ_BIT,
+ SYNC_VERTEX_SHADER_SHADER_READ,
+ SYNC_VERTEX_SHADER_SHADER_READ_BIT
+
+ },
+ {
+ "SYNC_VERTEX_SHADER_SHADER_WRITE",
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
+ VK_ACCESS_SHADER_WRITE_BIT,
+ SYNC_VERTEX_SHADER_SHADER_WRITE,
+ SYNC_VERTEX_SHADER_SHADER_WRITE_BIT
+
+ },
+ {
+ "SYNC_VERTEX_SHADER_UNIFORM_READ",
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
+ VK_ACCESS_UNIFORM_READ_BIT,
+ SYNC_VERTEX_SHADER_UNIFORM_READ,
+ SYNC_VERTEX_SHADER_UNIFORM_READ_BIT
+
+ },
+ {
+ "SYNC_TESSELLATION_CONTROL_SHADER_SHADER_READ",
+ VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT,
+ VK_ACCESS_SHADER_READ_BIT,
+ SYNC_TESSELLATION_CONTROL_SHADER_SHADER_READ,
+ SYNC_TESSELLATION_CONTROL_SHADER_SHADER_READ_BIT
+
+ },
+ {
+ "SYNC_TESSELLATION_CONTROL_SHADER_SHADER_WRITE",
+ VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT,
+ VK_ACCESS_SHADER_WRITE_BIT,
+ SYNC_TESSELLATION_CONTROL_SHADER_SHADER_WRITE,
+ SYNC_TESSELLATION_CONTROL_SHADER_SHADER_WRITE_BIT
+
+ },
+ {
+ "SYNC_TESSELLATION_CONTROL_SHADER_UNIFORM_READ",
+ VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT,
+ VK_ACCESS_UNIFORM_READ_BIT,
+ SYNC_TESSELLATION_CONTROL_SHADER_UNIFORM_READ,
+ SYNC_TESSELLATION_CONTROL_SHADER_UNIFORM_READ_BIT
+
+ },
+ {
+ "SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_READ",
+ VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT,
+ VK_ACCESS_SHADER_READ_BIT,
+ SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_READ,
+ SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_READ_BIT
+
+ },
+ {
+ "SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_WRITE",
+ VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT,
+ VK_ACCESS_SHADER_WRITE_BIT,
+ SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_WRITE,
+ SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_WRITE_BIT
+
+ },
+ {
+ "SYNC_TESSELLATION_EVALUATION_SHADER_UNIFORM_READ",
+ VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT,
+ VK_ACCESS_UNIFORM_READ_BIT,
+ SYNC_TESSELLATION_EVALUATION_SHADER_UNIFORM_READ,
+ SYNC_TESSELLATION_EVALUATION_SHADER_UNIFORM_READ_BIT
+
+ },
+ {
+ "SYNC_GEOMETRY_SHADER_SHADER_READ",
+ VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT,
+ VK_ACCESS_SHADER_READ_BIT,
+ SYNC_GEOMETRY_SHADER_SHADER_READ,
+ SYNC_GEOMETRY_SHADER_SHADER_READ_BIT
+
+ },
+ {
+ "SYNC_GEOMETRY_SHADER_SHADER_WRITE",
+ VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT,
+ VK_ACCESS_SHADER_WRITE_BIT,
+ SYNC_GEOMETRY_SHADER_SHADER_WRITE,
+ SYNC_GEOMETRY_SHADER_SHADER_WRITE_BIT
+
+ },
+ {
+ "SYNC_GEOMETRY_SHADER_UNIFORM_READ",
+ VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT,
+ VK_ACCESS_UNIFORM_READ_BIT,
+ SYNC_GEOMETRY_SHADER_UNIFORM_READ,
+ SYNC_GEOMETRY_SHADER_UNIFORM_READ_BIT
+
+ },
+ {
+ "SYNC_TRANSFORM_FEEDBACK_EXT_TRANSFORM_FEEDBACK_COUNTER_WRITE_EXT",
+ VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT,
+ VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT,
+ SYNC_TRANSFORM_FEEDBACK_EXT_TRANSFORM_FEEDBACK_COUNTER_WRITE_EXT,
+ SYNC_TRANSFORM_FEEDBACK_BIT_EXT_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT
+
+ },
+ {
+ "SYNC_TRANSFORM_FEEDBACK_EXT_TRANSFORM_FEEDBACK_WRITE_EXT",
+ VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT,
+ VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT,
+ SYNC_TRANSFORM_FEEDBACK_EXT_TRANSFORM_FEEDBACK_WRITE_EXT,
+ SYNC_TRANSFORM_FEEDBACK_BIT_EXT_TRANSFORM_FEEDBACK_WRITE_BIT_EXT
+
+ },
+ {
+ "SYNC_FRAGMENT_DENSITY_PROCESS_EXT_FRAGMENT_DENSITY_MAP_READ_EXT",
+ VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT,
+ VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT,
+ SYNC_FRAGMENT_DENSITY_PROCESS_EXT_FRAGMENT_DENSITY_MAP_READ_EXT,
+ SYNC_FRAGMENT_DENSITY_PROCESS_BIT_EXT_FRAGMENT_DENSITY_MAP_READ_BIT_EXT
+
+ },
+ {
+ "SYNC_TASK_SHADER_NV_SHADER_READ",
+ VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV,
+ VK_ACCESS_SHADER_READ_BIT,
+ SYNC_TASK_SHADER_NV_SHADER_READ,
+ SYNC_TASK_SHADER_NV_SHADER_READ_BIT
+
+ },
+ {
+ "SYNC_TASK_SHADER_NV_SHADER_WRITE",
+ VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV,
+ VK_ACCESS_SHADER_WRITE_BIT,
+ SYNC_TASK_SHADER_NV_SHADER_WRITE,
+ SYNC_TASK_SHADER_NV_SHADER_WRITE_BIT
+
+ },
+ {
+ "SYNC_TASK_SHADER_NV_UNIFORM_READ",
+ VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV,
+ VK_ACCESS_UNIFORM_READ_BIT,
+ SYNC_TASK_SHADER_NV_UNIFORM_READ,
+ SYNC_TASK_SHADER_NV_UNIFORM_READ_BIT
+
+ },
+ {
+ "SYNC_MESH_SHADER_NV_SHADER_READ",
+ VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
+ VK_ACCESS_SHADER_READ_BIT,
+ SYNC_MESH_SHADER_NV_SHADER_READ,
+ SYNC_MESH_SHADER_NV_SHADER_READ_BIT
+
+ },
+ {
+ "SYNC_MESH_SHADER_NV_SHADER_WRITE",
+ VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
+ VK_ACCESS_SHADER_WRITE_BIT,
+ SYNC_MESH_SHADER_NV_SHADER_WRITE,
+ SYNC_MESH_SHADER_NV_SHADER_WRITE_BIT
+
+ },
+ {
+ "SYNC_MESH_SHADER_NV_UNIFORM_READ",
+ VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
+ VK_ACCESS_UNIFORM_READ_BIT,
+ SYNC_MESH_SHADER_NV_UNIFORM_READ,
+ SYNC_MESH_SHADER_NV_UNIFORM_READ_BIT
+
+ },
+ {
+ "SYNC_SHADING_RATE_IMAGE_NV_SHADING_RATE_IMAGE_READ_NV",
+ VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV,
+ VK_ACCESS_SHADING_RATE_IMAGE_READ_BIT_NV,
+ SYNC_SHADING_RATE_IMAGE_NV_SHADING_RATE_IMAGE_READ_NV,
+ SYNC_SHADING_RATE_IMAGE_BIT_NV_SHADING_RATE_IMAGE_READ_BIT_NV
+
+ },
+ {
+ "SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ",
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT,
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT,
+ SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ,
+ SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ_BIT
+
+ },
+ {
+ "SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE",
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT,
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
+ SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE,
+ SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT
+
+ },
+ {
+ "SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ",
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
+ VK_ACCESS_INPUT_ATTACHMENT_READ_BIT,
+ SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ,
+ SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ_BIT
+
+ },
+ {
+ "SYNC_FRAGMENT_SHADER_SHADER_READ",
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
+ VK_ACCESS_SHADER_READ_BIT,
+ SYNC_FRAGMENT_SHADER_SHADER_READ,
+ SYNC_FRAGMENT_SHADER_SHADER_READ_BIT
+
+ },
+ {
+ "SYNC_FRAGMENT_SHADER_SHADER_WRITE",
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
+ VK_ACCESS_SHADER_WRITE_BIT,
+ SYNC_FRAGMENT_SHADER_SHADER_WRITE,
+ SYNC_FRAGMENT_SHADER_SHADER_WRITE_BIT
+
+ },
+ {
+ "SYNC_FRAGMENT_SHADER_UNIFORM_READ",
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
+ VK_ACCESS_UNIFORM_READ_BIT,
+ SYNC_FRAGMENT_SHADER_UNIFORM_READ,
+ SYNC_FRAGMENT_SHADER_UNIFORM_READ_BIT
+
+ },
+ {
+ "SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ",
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT,
+ SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ,
+ SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ_BIT
+
+ },
+ {
+ "SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE",
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT,
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
+ SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE,
+ SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT
+
+ },
+ {
+ "SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ",
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
+ VK_ACCESS_COLOR_ATTACHMENT_READ_BIT,
+ SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ,
+ SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ_BIT
+
+ },
+ {
+ "SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ_NONCOHERENT_EXT",
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
+ VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT,
+ SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ_NONCOHERENT_EXT,
+ SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT
+
+ },
+ {
+ "SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE",
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+ SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE,
+ SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE_BIT
+
+ },
+ {
+ "SYNC_COMPUTE_SHADER_SHADER_READ",
+ VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
+ VK_ACCESS_SHADER_READ_BIT,
+ SYNC_COMPUTE_SHADER_SHADER_READ,
+ SYNC_COMPUTE_SHADER_SHADER_READ_BIT
+
+ },
+ {
+ "SYNC_COMPUTE_SHADER_SHADER_WRITE",
+ VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
+ VK_ACCESS_SHADER_WRITE_BIT,
+ SYNC_COMPUTE_SHADER_SHADER_WRITE,
+ SYNC_COMPUTE_SHADER_SHADER_WRITE_BIT
+
+ },
+ {
+ "SYNC_COMPUTE_SHADER_UNIFORM_READ",
+ VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
+ VK_ACCESS_UNIFORM_READ_BIT,
+ SYNC_COMPUTE_SHADER_UNIFORM_READ,
+ SYNC_COMPUTE_SHADER_UNIFORM_READ_BIT
+
+ },
+ {
+ "SYNC_TRANSFER_TRANSFER_READ",
+ VK_PIPELINE_STAGE_TRANSFER_BIT,
+ VK_ACCESS_TRANSFER_READ_BIT,
+ SYNC_TRANSFER_TRANSFER_READ,
+ SYNC_TRANSFER_TRANSFER_READ_BIT
+
+ },
+ {
+ "SYNC_TRANSFER_TRANSFER_WRITE",
+ VK_PIPELINE_STAGE_TRANSFER_BIT,
+ VK_ACCESS_TRANSFER_WRITE_BIT,
+ SYNC_TRANSFER_TRANSFER_WRITE,
+ SYNC_TRANSFER_TRANSFER_WRITE_BIT
+
+ },
+ {
+ "SYNC_COMMAND_PREPROCESS_NV_COMMAND_PREPROCESS_READ_NV",
+ VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV,
+ VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV,
+ SYNC_COMMAND_PREPROCESS_NV_COMMAND_PREPROCESS_READ_NV,
+ SYNC_COMMAND_PREPROCESS_BIT_NV_COMMAND_PREPROCESS_READ_BIT_NV
+
+ },
+ {
+ "SYNC_COMMAND_PREPROCESS_NV_COMMAND_PREPROCESS_WRITE_NV",
+ VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV,
+ VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV,
+ SYNC_COMMAND_PREPROCESS_NV_COMMAND_PREPROCESS_WRITE_NV,
+ SYNC_COMMAND_PREPROCESS_BIT_NV_COMMAND_PREPROCESS_WRITE_BIT_NV
+
+ },
+ {
+ "SYNC_CONDITIONAL_RENDERING_EXT_CONDITIONAL_RENDERING_READ_EXT",
+ VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT,
+ VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT,
+ SYNC_CONDITIONAL_RENDERING_EXT_CONDITIONAL_RENDERING_READ_EXT,
+ SYNC_CONDITIONAL_RENDERING_BIT_EXT_CONDITIONAL_RENDERING_READ_BIT_EXT
+
+ },
+ {
+ "SYNC_RAY_TRACING_SHADER_KHR_ACCELERATION_STRUCTURE_READ_KHR",
+ VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR,
+ VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR,
+ SYNC_RAY_TRACING_SHADER_KHR_ACCELERATION_STRUCTURE_READ_KHR,
+ SYNC_RAY_TRACING_SHADER_BIT_KHR_ACCELERATION_STRUCTURE_READ_BIT_KHR
+
+ },
+ {
+ "SYNC_RAY_TRACING_SHADER_KHR_SHADER_READ",
+ VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR,
+ VK_ACCESS_SHADER_READ_BIT,
+ SYNC_RAY_TRACING_SHADER_KHR_SHADER_READ,
+ SYNC_RAY_TRACING_SHADER_KHR_SHADER_READ_BIT
+
+ },
+ {
+ "SYNC_RAY_TRACING_SHADER_KHR_SHADER_WRITE",
+ VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR,
+ VK_ACCESS_SHADER_WRITE_BIT,
+ SYNC_RAY_TRACING_SHADER_KHR_SHADER_WRITE,
+ SYNC_RAY_TRACING_SHADER_KHR_SHADER_WRITE_BIT
+
+ },
+ {
+ "SYNC_RAY_TRACING_SHADER_KHR_UNIFORM_READ",
+ VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR,
+ VK_ACCESS_UNIFORM_READ_BIT,
+ SYNC_RAY_TRACING_SHADER_KHR_UNIFORM_READ,
+ SYNC_RAY_TRACING_SHADER_KHR_UNIFORM_READ_BIT
+
+ },
+ {
+ "SYNC_ACCELERATION_STRUCTURE_BUILD_KHR_ACCELERATION_STRUCTURE_READ_KHR",
+ VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR,
+ VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR,
+ SYNC_ACCELERATION_STRUCTURE_BUILD_KHR_ACCELERATION_STRUCTURE_READ_KHR,
+ SYNC_ACCELERATION_STRUCTURE_BUILD_BIT_KHR_ACCELERATION_STRUCTURE_READ_BIT_KHR
+
+ },
+ {
+ "SYNC_ACCELERATION_STRUCTURE_BUILD_KHR_ACCELERATION_STRUCTURE_WRITE_KHR",
+ VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR,
+ VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR,
+ SYNC_ACCELERATION_STRUCTURE_BUILD_KHR_ACCELERATION_STRUCTURE_WRITE_KHR,
+ SYNC_ACCELERATION_STRUCTURE_BUILD_BIT_KHR_ACCELERATION_STRUCTURE_WRITE_BIT_KHR
+
+ },
+ {
+ "SYNC_HOST_HOST_READ",
+ VK_PIPELINE_STAGE_HOST_BIT,
+ VK_ACCESS_HOST_READ_BIT,
+ SYNC_HOST_HOST_READ,
+ SYNC_HOST_HOST_READ_BIT
+
+ },
+ {
+ "SYNC_HOST_HOST_WRITE",
+ VK_PIPELINE_STAGE_HOST_BIT,
+ VK_ACCESS_HOST_WRITE_BIT,
+ SYNC_HOST_HOST_WRITE,
+ SYNC_HOST_HOST_WRITE_BIT
+
+ },
+ {
+ "SYNC_IMAGE_LAYOUT_TRANSITION",
+ VK_PIPELINE_STAGE_FLAG_BITS_MAX_ENUM,
+ VK_ACCESS_FLAG_BITS_MAX_ENUM,
+ SYNC_IMAGE_LAYOUT_TRANSITION,
+ SYNC_IMAGE_LAYOUT_TRANSITION_BIT
+
+ },
+ {
+ "SYNC_QUEUE_FAMILY_OWNERSHIP_TRANSFER",
+ VK_PIPELINE_STAGE_FLAG_BITS_MAX_ENUM,
+ VK_ACCESS_FLAG_BITS_MAX_ENUM,
+ SYNC_QUEUE_FAMILY_OWNERSHIP_TRANSFER,
+ SYNC_QUEUE_FAMILY_OWNERSHIP_TRANSFER_BIT
+
+ },
+} };
+
+// Constants defining the mask of all read and write stage_access states
+static SyncStageAccessFlags syncStageAccessReadMask = ( // Mask of all read StageAccess bits
+ SYNC_DRAW_INDIRECT_INDIRECT_COMMAND_READ_BIT |
+ SYNC_DRAW_INDIRECT_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT |
+ SYNC_VERTEX_INPUT_INDEX_READ_BIT |
+ SYNC_VERTEX_INPUT_VERTEX_ATTRIBUTE_READ_BIT |
+ SYNC_VERTEX_SHADER_SHADER_READ_BIT |
+ SYNC_VERTEX_SHADER_UNIFORM_READ_BIT |
+ SYNC_TESSELLATION_CONTROL_SHADER_SHADER_READ_BIT |
+ SYNC_TESSELLATION_CONTROL_SHADER_UNIFORM_READ_BIT |
+ SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_READ_BIT |
+ SYNC_TESSELLATION_EVALUATION_SHADER_UNIFORM_READ_BIT |
+ SYNC_GEOMETRY_SHADER_SHADER_READ_BIT |
+ SYNC_GEOMETRY_SHADER_UNIFORM_READ_BIT |
+ SYNC_FRAGMENT_DENSITY_PROCESS_BIT_EXT_FRAGMENT_DENSITY_MAP_READ_BIT_EXT |
+ SYNC_TASK_SHADER_NV_SHADER_READ_BIT |
+ SYNC_TASK_SHADER_NV_UNIFORM_READ_BIT |
+ SYNC_MESH_SHADER_NV_SHADER_READ_BIT |
+ SYNC_MESH_SHADER_NV_UNIFORM_READ_BIT |
+ SYNC_SHADING_RATE_IMAGE_BIT_NV_SHADING_RATE_IMAGE_READ_BIT_NV |
+ SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
+ SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ_BIT |
+ SYNC_FRAGMENT_SHADER_SHADER_READ_BIT |
+ SYNC_FRAGMENT_SHADER_UNIFORM_READ_BIT |
+ SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
+ SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ_BIT |
+ SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT |
+ SYNC_COMPUTE_SHADER_SHADER_READ_BIT |
+ SYNC_COMPUTE_SHADER_UNIFORM_READ_BIT |
+ SYNC_TRANSFER_TRANSFER_READ_BIT |
+ SYNC_COMMAND_PREPROCESS_BIT_NV_COMMAND_PREPROCESS_READ_BIT_NV |
+ SYNC_CONDITIONAL_RENDERING_BIT_EXT_CONDITIONAL_RENDERING_READ_BIT_EXT |
+ SYNC_RAY_TRACING_SHADER_BIT_KHR_ACCELERATION_STRUCTURE_READ_BIT_KHR |
+ SYNC_RAY_TRACING_SHADER_KHR_SHADER_READ_BIT |
+ SYNC_RAY_TRACING_SHADER_KHR_UNIFORM_READ_BIT |
+ SYNC_ACCELERATION_STRUCTURE_BUILD_BIT_KHR_ACCELERATION_STRUCTURE_READ_BIT_KHR |
+ SYNC_HOST_HOST_READ_BIT
+);
+
+static SyncStageAccessFlags syncStageAccessWriteMask = ( // Mask of all write StageAccess bits
+ SYNC_VERTEX_SHADER_SHADER_WRITE_BIT |
+ SYNC_TESSELLATION_CONTROL_SHADER_SHADER_WRITE_BIT |
+ SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_WRITE_BIT |
+ SYNC_GEOMETRY_SHADER_SHADER_WRITE_BIT |
+ SYNC_TRANSFORM_FEEDBACK_BIT_EXT_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT |
+ SYNC_TRANSFORM_FEEDBACK_BIT_EXT_TRANSFORM_FEEDBACK_WRITE_BIT_EXT |
+ SYNC_TASK_SHADER_NV_SHADER_WRITE_BIT |
+ SYNC_MESH_SHADER_NV_SHADER_WRITE_BIT |
+ SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
+ SYNC_FRAGMENT_SHADER_SHADER_WRITE_BIT |
+ SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
+ SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE_BIT |
+ SYNC_COMPUTE_SHADER_SHADER_WRITE_BIT |
+ SYNC_TRANSFER_TRANSFER_WRITE_BIT |
+ SYNC_COMMAND_PREPROCESS_BIT_NV_COMMAND_PREPROCESS_WRITE_BIT_NV |
+ SYNC_RAY_TRACING_SHADER_KHR_SHADER_WRITE_BIT |
+ SYNC_ACCELERATION_STRUCTURE_BUILD_BIT_KHR_ACCELERATION_STRUCTURE_WRITE_BIT_KHR |
+ SYNC_HOST_HOST_WRITE_BIT |
+ SYNC_IMAGE_LAYOUT_TRANSITION_BIT |
+ SYNC_QUEUE_FAMILY_OWNERSHIP_TRANSFER_BIT
+);
+
+// Bit order mask of stage_access bit for each stage
+static std::map<VkPipelineStageFlags, SyncStageAccessFlags> syncStageAccessMaskByStageBit = {
+ { VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, (
+ SYNC_DRAW_INDIRECT_INDIRECT_COMMAND_READ_BIT |
+ SYNC_DRAW_INDIRECT_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT
+ )},
+ { VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, (
+ SYNC_VERTEX_INPUT_INDEX_READ_BIT |
+ SYNC_VERTEX_INPUT_VERTEX_ATTRIBUTE_READ_BIT
+ )},
+ { VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, (
+ SYNC_VERTEX_SHADER_SHADER_READ_BIT |
+ SYNC_VERTEX_SHADER_SHADER_WRITE_BIT |
+ SYNC_VERTEX_SHADER_UNIFORM_READ_BIT
+ )},
+ { VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT, (
+ SYNC_TESSELLATION_CONTROL_SHADER_SHADER_READ_BIT |
+ SYNC_TESSELLATION_CONTROL_SHADER_SHADER_WRITE_BIT |
+ SYNC_TESSELLATION_CONTROL_SHADER_UNIFORM_READ_BIT
+ )},
+ { VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT, (
+ SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_READ_BIT |
+ SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_WRITE_BIT |
+ SYNC_TESSELLATION_EVALUATION_SHADER_UNIFORM_READ_BIT
+ )},
+ { VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT, (
+ SYNC_GEOMETRY_SHADER_SHADER_READ_BIT |
+ SYNC_GEOMETRY_SHADER_SHADER_WRITE_BIT |
+ SYNC_GEOMETRY_SHADER_UNIFORM_READ_BIT
+ )},
+ { VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, (
+ SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ_BIT |
+ SYNC_FRAGMENT_SHADER_SHADER_READ_BIT |
+ SYNC_FRAGMENT_SHADER_SHADER_WRITE_BIT |
+ SYNC_FRAGMENT_SHADER_UNIFORM_READ_BIT
+ )},
+ { VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, (
+ SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
+ SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT
+ )},
+ { VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, (
+ SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
+ SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT
+ )},
+ { VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, (
+ SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ_BIT |
+ SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT |
+ SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE_BIT
+ )},
+ { VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, (
+ SYNC_COMPUTE_SHADER_SHADER_READ_BIT |
+ SYNC_COMPUTE_SHADER_SHADER_WRITE_BIT |
+ SYNC_COMPUTE_SHADER_UNIFORM_READ_BIT
+ )},
+ { VK_PIPELINE_STAGE_TRANSFER_BIT, (
+ SYNC_TRANSFER_TRANSFER_READ_BIT |
+ SYNC_TRANSFER_TRANSFER_WRITE_BIT
+ )},
+ { VK_PIPELINE_STAGE_HOST_BIT, (
+ SYNC_HOST_HOST_READ_BIT |
+ SYNC_HOST_HOST_WRITE_BIT
+ )},
+ { VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV, (
+ SYNC_COMMAND_PREPROCESS_BIT_NV_COMMAND_PREPROCESS_READ_BIT_NV |
+ SYNC_COMMAND_PREPROCESS_BIT_NV_COMMAND_PREPROCESS_WRITE_BIT_NV
+ )},
+ { VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT, SYNC_CONDITIONAL_RENDERING_BIT_EXT_CONDITIONAL_RENDERING_READ_BIT_EXT},
+ { VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, (
+ SYNC_TASK_SHADER_NV_SHADER_READ_BIT |
+ SYNC_TASK_SHADER_NV_SHADER_WRITE_BIT |
+ SYNC_TASK_SHADER_NV_UNIFORM_READ_BIT
+ )},
+ { VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, (
+ SYNC_MESH_SHADER_NV_SHADER_READ_BIT |
+ SYNC_MESH_SHADER_NV_SHADER_WRITE_BIT |
+ SYNC_MESH_SHADER_NV_UNIFORM_READ_BIT
+ )},
+ { VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, (
+ SYNC_RAY_TRACING_SHADER_BIT_KHR_ACCELERATION_STRUCTURE_READ_BIT_KHR |
+ SYNC_RAY_TRACING_SHADER_KHR_SHADER_READ_BIT |
+ SYNC_RAY_TRACING_SHADER_KHR_SHADER_WRITE_BIT |
+ SYNC_RAY_TRACING_SHADER_KHR_UNIFORM_READ_BIT
+ )},
+ { VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV, SYNC_SHADING_RATE_IMAGE_BIT_NV_SHADING_RATE_IMAGE_READ_BIT_NV},
+ { VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT, SYNC_FRAGMENT_DENSITY_PROCESS_BIT_EXT_FRAGMENT_DENSITY_MAP_READ_BIT_EXT},
+ { VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT, (
+ SYNC_TRANSFORM_FEEDBACK_BIT_EXT_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT |
+ SYNC_TRANSFORM_FEEDBACK_BIT_EXT_TRANSFORM_FEEDBACK_WRITE_BIT_EXT
+ )},
+ { VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, (
+ SYNC_ACCELERATION_STRUCTURE_BUILD_BIT_KHR_ACCELERATION_STRUCTURE_READ_BIT_KHR |
+ SYNC_ACCELERATION_STRUCTURE_BUILD_BIT_KHR_ACCELERATION_STRUCTURE_WRITE_BIT_KHR
+ )},
+};
+
+// Bit order mask of stage_access bit for each access
+static std::map<VkAccessFlags, SyncStageAccessFlags> syncStageAccessMaskByAccessBit = {
+ { VK_ACCESS_INDIRECT_COMMAND_READ_BIT, SYNC_DRAW_INDIRECT_INDIRECT_COMMAND_READ_BIT},
+ { VK_ACCESS_INDEX_READ_BIT, SYNC_VERTEX_INPUT_INDEX_READ_BIT},
+ { VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, SYNC_VERTEX_INPUT_VERTEX_ATTRIBUTE_READ_BIT},
+ { VK_ACCESS_UNIFORM_READ_BIT, (
+ SYNC_VERTEX_SHADER_UNIFORM_READ_BIT |
+ SYNC_TESSELLATION_CONTROL_SHADER_UNIFORM_READ_BIT |
+ SYNC_TESSELLATION_EVALUATION_SHADER_UNIFORM_READ_BIT |
+ SYNC_GEOMETRY_SHADER_UNIFORM_READ_BIT |
+ SYNC_TASK_SHADER_NV_UNIFORM_READ_BIT |
+ SYNC_MESH_SHADER_NV_UNIFORM_READ_BIT |
+ SYNC_FRAGMENT_SHADER_UNIFORM_READ_BIT |
+ SYNC_COMPUTE_SHADER_UNIFORM_READ_BIT |
+ SYNC_RAY_TRACING_SHADER_KHR_UNIFORM_READ_BIT
+ )},
+ { VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ_BIT},
+ { VK_ACCESS_SHADER_READ_BIT, (
+ SYNC_VERTEX_SHADER_SHADER_READ_BIT |
+ SYNC_TESSELLATION_CONTROL_SHADER_SHADER_READ_BIT |
+ SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_READ_BIT |
+ SYNC_GEOMETRY_SHADER_SHADER_READ_BIT |
+ SYNC_TASK_SHADER_NV_SHADER_READ_BIT |
+ SYNC_MESH_SHADER_NV_SHADER_READ_BIT |
+ SYNC_FRAGMENT_SHADER_SHADER_READ_BIT |
+ SYNC_COMPUTE_SHADER_SHADER_READ_BIT |
+ SYNC_RAY_TRACING_SHADER_KHR_SHADER_READ_BIT
+ )},
+ { VK_ACCESS_SHADER_WRITE_BIT, (
+ SYNC_VERTEX_SHADER_SHADER_WRITE_BIT |
+ SYNC_TESSELLATION_CONTROL_SHADER_SHADER_WRITE_BIT |
+ SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_WRITE_BIT |
+ SYNC_GEOMETRY_SHADER_SHADER_WRITE_BIT |
+ SYNC_TASK_SHADER_NV_SHADER_WRITE_BIT |
+ SYNC_MESH_SHADER_NV_SHADER_WRITE_BIT |
+ SYNC_FRAGMENT_SHADER_SHADER_WRITE_BIT |
+ SYNC_COMPUTE_SHADER_SHADER_WRITE_BIT |
+ SYNC_RAY_TRACING_SHADER_KHR_SHADER_WRITE_BIT
+ )},
+ { VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ_BIT},
+ { VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE_BIT},
+ { VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT, (
+ SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
+ SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ_BIT
+ )},
+ { VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, (
+ SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
+ SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT
+ )},
+ { VK_ACCESS_TRANSFER_READ_BIT, SYNC_TRANSFER_TRANSFER_READ_BIT},
+ { VK_ACCESS_TRANSFER_WRITE_BIT, SYNC_TRANSFER_TRANSFER_WRITE_BIT},
+ { VK_ACCESS_HOST_READ_BIT, SYNC_HOST_HOST_READ_BIT},
+ { VK_ACCESS_HOST_WRITE_BIT, SYNC_HOST_HOST_WRITE_BIT},
+ { VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV, SYNC_COMMAND_PREPROCESS_BIT_NV_COMMAND_PREPROCESS_READ_BIT_NV},
+ { VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV, SYNC_COMMAND_PREPROCESS_BIT_NV_COMMAND_PREPROCESS_WRITE_BIT_NV},
+ { VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT, SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT},
+ { VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT, SYNC_CONDITIONAL_RENDERING_BIT_EXT_CONDITIONAL_RENDERING_READ_BIT_EXT},
+ { VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR, (
+ SYNC_RAY_TRACING_SHADER_BIT_KHR_ACCELERATION_STRUCTURE_READ_BIT_KHR |
+ SYNC_ACCELERATION_STRUCTURE_BUILD_BIT_KHR_ACCELERATION_STRUCTURE_READ_BIT_KHR
+ )},
+ { VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR, SYNC_ACCELERATION_STRUCTURE_BUILD_BIT_KHR_ACCELERATION_STRUCTURE_WRITE_BIT_KHR},
+ { VK_ACCESS_SHADING_RATE_IMAGE_READ_BIT_NV, SYNC_SHADING_RATE_IMAGE_BIT_NV_SHADING_RATE_IMAGE_READ_BIT_NV},
+ { VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT, SYNC_FRAGMENT_DENSITY_PROCESS_BIT_EXT_FRAGMENT_DENSITY_MAP_READ_BIT_EXT},
+ { VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT, SYNC_TRANSFORM_FEEDBACK_BIT_EXT_TRANSFORM_FEEDBACK_WRITE_BIT_EXT},
+ { VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT, SYNC_DRAW_INDIRECT_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT},
+ { VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT, SYNC_TRANSFORM_FEEDBACK_BIT_EXT_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT},
+ { VK_ACCESS_MEMORY_READ_BIT, syncStageAccessReadMask},
+ { VK_ACCESS_MEMORY_WRITE_BIT, syncStageAccessWriteMask},
+};
+
+// stage_access index for each stage and access
+static std::map<VkPipelineStageFlags, std::map<VkAccessFlags, SyncStageAccessIndex>> syncStageAccessIndexByStageAndAccess = {
+ { VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, {
+ { VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR, SYNC_ACCELERATION_STRUCTURE_BUILD_KHR_ACCELERATION_STRUCTURE_READ_KHR },
+ { VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR, SYNC_ACCELERATION_STRUCTURE_BUILD_KHR_ACCELERATION_STRUCTURE_WRITE_KHR }
+ } },
+ { VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, {
+ { VK_ACCESS_COLOR_ATTACHMENT_READ_BIT, SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ },
+ { VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT, SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ_NONCOHERENT_EXT },
+ { VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE }
+ } },
+ { VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV, {
+ { VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV, SYNC_COMMAND_PREPROCESS_NV_COMMAND_PREPROCESS_READ_NV },
+ { VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV, SYNC_COMMAND_PREPROCESS_NV_COMMAND_PREPROCESS_WRITE_NV }
+ } },
+ { VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, {
+ { VK_ACCESS_SHADER_READ_BIT, SYNC_COMPUTE_SHADER_SHADER_READ },
+ { VK_ACCESS_SHADER_WRITE_BIT, SYNC_COMPUTE_SHADER_SHADER_WRITE },
+ { VK_ACCESS_UNIFORM_READ_BIT, SYNC_COMPUTE_SHADER_UNIFORM_READ }
+ } },
+ { VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT, {
+ { VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT, SYNC_CONDITIONAL_RENDERING_EXT_CONDITIONAL_RENDERING_READ_EXT }
+ } },
+ { VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, {
+ { VK_ACCESS_INDIRECT_COMMAND_READ_BIT, SYNC_DRAW_INDIRECT_INDIRECT_COMMAND_READ },
+ { VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT, SYNC_DRAW_INDIRECT_TRANSFORM_FEEDBACK_COUNTER_READ_EXT }
+ } },
+ { VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, {
+ { VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT, SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ },
+ { VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE }
+ } },
+ { VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT, {
+ { VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT, SYNC_FRAGMENT_DENSITY_PROCESS_EXT_FRAGMENT_DENSITY_MAP_READ_EXT }
+ } },
+ { VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, {
+ { VK_ACCESS_INPUT_ATTACHMENT_READ_BIT, SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ },
+ { VK_ACCESS_SHADER_READ_BIT, SYNC_FRAGMENT_SHADER_SHADER_READ },
+ { VK_ACCESS_SHADER_WRITE_BIT, SYNC_FRAGMENT_SHADER_SHADER_WRITE },
+ { VK_ACCESS_UNIFORM_READ_BIT, SYNC_FRAGMENT_SHADER_UNIFORM_READ }
+ } },
+ { VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT, {
+ { VK_ACCESS_SHADER_READ_BIT, SYNC_GEOMETRY_SHADER_SHADER_READ },
+ { VK_ACCESS_SHADER_WRITE_BIT, SYNC_GEOMETRY_SHADER_SHADER_WRITE },
+ { VK_ACCESS_UNIFORM_READ_BIT, SYNC_GEOMETRY_SHADER_UNIFORM_READ }
+ } },
+ { VK_PIPELINE_STAGE_HOST_BIT, {
+ { VK_ACCESS_HOST_READ_BIT, SYNC_HOST_HOST_READ },
+ { VK_ACCESS_HOST_WRITE_BIT, SYNC_HOST_HOST_WRITE }
+ } },
+ { VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, {
+ { VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT, SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ },
+ { VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT, SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE }
+ } },
+ { VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, {
+ { VK_ACCESS_SHADER_READ_BIT, SYNC_MESH_SHADER_NV_SHADER_READ },
+ { VK_ACCESS_SHADER_WRITE_BIT, SYNC_MESH_SHADER_NV_SHADER_WRITE },
+ { VK_ACCESS_UNIFORM_READ_BIT, SYNC_MESH_SHADER_NV_UNIFORM_READ }
+ } },
+ { VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, {
+ { VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR, SYNC_RAY_TRACING_SHADER_KHR_ACCELERATION_STRUCTURE_READ_KHR },
+ { VK_ACCESS_SHADER_READ_BIT, SYNC_RAY_TRACING_SHADER_KHR_SHADER_READ },
+ { VK_ACCESS_SHADER_WRITE_BIT, SYNC_RAY_TRACING_SHADER_KHR_SHADER_WRITE },
+ { VK_ACCESS_UNIFORM_READ_BIT, SYNC_RAY_TRACING_SHADER_KHR_UNIFORM_READ }
+ } },
+ { VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV, {
+ { VK_ACCESS_SHADING_RATE_IMAGE_READ_BIT_NV, SYNC_SHADING_RATE_IMAGE_NV_SHADING_RATE_IMAGE_READ_NV }
+ } },
+ { VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, {
+ { VK_ACCESS_SHADER_READ_BIT, SYNC_TASK_SHADER_NV_SHADER_READ },
+ { VK_ACCESS_SHADER_WRITE_BIT, SYNC_TASK_SHADER_NV_SHADER_WRITE },
+ { VK_ACCESS_UNIFORM_READ_BIT, SYNC_TASK_SHADER_NV_UNIFORM_READ }
+ } },
+ { VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT, {
+ { VK_ACCESS_SHADER_READ_BIT, SYNC_TESSELLATION_CONTROL_SHADER_SHADER_READ },
+ { VK_ACCESS_SHADER_WRITE_BIT, SYNC_TESSELLATION_CONTROL_SHADER_SHADER_WRITE },
+ { VK_ACCESS_UNIFORM_READ_BIT, SYNC_TESSELLATION_CONTROL_SHADER_UNIFORM_READ }
+ } },
+ { VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT, {
+ { VK_ACCESS_SHADER_READ_BIT, SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_READ },
+ { VK_ACCESS_SHADER_WRITE_BIT, SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_WRITE },
+ { VK_ACCESS_UNIFORM_READ_BIT, SYNC_TESSELLATION_EVALUATION_SHADER_UNIFORM_READ }
+ } },
+ { VK_PIPELINE_STAGE_TRANSFER_BIT, {
+ { VK_ACCESS_TRANSFER_READ_BIT, SYNC_TRANSFER_TRANSFER_READ },
+ { VK_ACCESS_TRANSFER_WRITE_BIT, SYNC_TRANSFER_TRANSFER_WRITE }
+ } },
+ { VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT, {
+ { VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT, SYNC_TRANSFORM_FEEDBACK_EXT_TRANSFORM_FEEDBACK_COUNTER_WRITE_EXT },
+ { VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT, SYNC_TRANSFORM_FEEDBACK_EXT_TRANSFORM_FEEDBACK_WRITE_EXT }
+ } },
+ { VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, {
+ { VK_ACCESS_INDEX_READ_BIT, SYNC_VERTEX_INPUT_INDEX_READ },
+ { VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT, SYNC_VERTEX_INPUT_VERTEX_ATTRIBUTE_READ }
+ } },
+ { VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, {
+ { VK_ACCESS_SHADER_READ_BIT, SYNC_VERTEX_SHADER_SHADER_READ },
+ { VK_ACCESS_SHADER_WRITE_BIT, SYNC_VERTEX_SHADER_SHADER_WRITE },
+ { VK_ACCESS_UNIFORM_READ_BIT, SYNC_VERTEX_SHADER_UNIFORM_READ }
+ } },
+};
+
+// Pipeline stages corresponding to VK_PIPELINE_STAGE_ALL_COMMANDS_BIT for each VkQueueFlagBits
+static std::map<VkQueueFlagBits, VkPipelineStageFlags> syncAllCommandStagesByQueueFlags = {
+ { VK_QUEUE_COMPUTE_BIT, (
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT |
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
+ VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
+ VK_PIPELINE_STAGE_TRANSFER_BIT |
+ VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV |
+ VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT |
+ VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR |
+ VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR |
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT |
+ VK_PIPELINE_STAGE_HOST_BIT
+ )},
+ { VK_QUEUE_GRAPHICS_BIT, (
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT |
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
+ VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |
+ VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT |
+ VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT |
+ VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV |
+ VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV |
+ VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV |
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
+ VK_PIPELINE_STAGE_TRANSFER_BIT |
+ VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV |
+ VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT |
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT |
+ VK_PIPELINE_STAGE_HOST_BIT
+ )},
+ { VK_QUEUE_TRANSFER_BIT, (
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT |
+ VK_PIPELINE_STAGE_TRANSFER_BIT |
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT |
+ VK_PIPELINE_STAGE_HOST_BIT
+ )},
+};
+
+// Masks of logically earlier stage flags for a given stage flag
+static std::map<VkPipelineStageFlagBits, VkPipelineStageFlags> syncLogicallyEarlierStages = {
+ { VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT},
+ { VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT},
+ { VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, (
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT |
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
+ )},
+ { VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, (
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT |
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
+ )},
+ { VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT, (
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT |
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
+ )},
+ { VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT, (
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT |
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT
+ )},
+ { VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT, (
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT |
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
+ )},
+ { VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT, (
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT |
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
+ VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
+ )},
+ { VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT},
+ { VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, (
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT |
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
+ )},
+ { VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, (
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT |
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
+ VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV
+ )},
+ { VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV, (
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT |
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
+ VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |
+ VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT |
+ VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV |
+ VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV
+ )},
+ { VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, (
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT |
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
+ VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |
+ VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT |
+ VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT |
+ VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV |
+ VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV |
+ VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV
+ )},
+ { VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, (
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT |
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
+ VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |
+ VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT |
+ VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT |
+ VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV |
+ VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV |
+ VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV |
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
+ )},
+ { VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, (
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT |
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
+ VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |
+ VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT |
+ VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT |
+ VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV |
+ VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV |
+ VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV |
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
+ )},
+ { VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, (
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT |
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
+ VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |
+ VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT |
+ VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT |
+ VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV |
+ VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV |
+ VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV |
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
+ )},
+ { VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, (
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT |
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
+ )},
+ { VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT},
+ { VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT},
+ { VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT},
+ { VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT},
+ { VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT},
+ { VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, (
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT |
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
+ VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |
+ VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT |
+ VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT |
+ VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV |
+ VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV |
+ VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV |
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
+ VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
+ VK_PIPELINE_STAGE_TRANSFER_BIT |
+ VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV |
+ VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT |
+ VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR |
+ VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR |
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
+ )},
+};
+
+// Masks of logically later stage flags for a given stage flag
+static std::map<VkPipelineStageFlagBits, VkPipelineStageFlags> syncLogicallyLaterStages = {
+ { VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, (
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT |
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
+ VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |
+ VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT |
+ VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT |
+ VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV |
+ VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV |
+ VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV |
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
+ VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
+ VK_PIPELINE_STAGE_TRANSFER_BIT |
+ VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV |
+ VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT |
+ VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR |
+ VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR |
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
+ )},
+ { VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT, (
+ VK_PIPELINE_STAGE_VERTEX_INPUT_BIT |
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
+ VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |
+ VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT |
+ VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV |
+ VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV |
+ VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV |
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
+ VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
+ )},
+ { VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, (
+ VK_PIPELINE_STAGE_VERTEX_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
+ VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |
+ VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT |
+ VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV |
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
+ )},
+ { VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, (
+ VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT |
+ VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
+ VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |
+ VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT |
+ VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV |
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
+ )},
+ { VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT, (
+ VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT |
+ VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |
+ VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT |
+ VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV |
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
+ )},
+ { VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT, (
+ VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT |
+ VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT |
+ VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV |
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
+ )},
+ { VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT, (
+ VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT |
+ VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV |
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
+ )},
+ { VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT, (
+ VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV |
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
+ )},
+ { VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT, (
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
+ )},
+ { VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, (
+ VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV |
+ VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV |
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
+ )},
+ { VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, (
+ VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV |
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
+ )},
+ { VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV, (
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
+ )},
+ { VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, (
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT |
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
+ )},
+ { VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, (
+ VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT |
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
+ )},
+ { VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, (
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT |
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
+ )},
+ { VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT},
+ { VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT},
+ { VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT},
+ { VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT},
+ { VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT},
+ { VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT},
+ { VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT},
+ { VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT},
+};
+
+struct SyncShaderStageAccess {
+ SyncStageAccessIndex shader_read;
+ SyncStageAccessIndex shader_write;
+ SyncStageAccessIndex uniform_read;
+};
+
+static std::map<VkShaderStageFlagBits, SyncShaderStageAccess> syncStageAccessMaskByShaderStage = {
+ {VK_SHADER_STAGE_VERTEX_BIT, {
+ SYNC_VERTEX_SHADER_SHADER_READ, SYNC_VERTEX_SHADER_SHADER_WRITE, SYNC_VERTEX_SHADER_UNIFORM_READ}},
+ {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, {
+ SYNC_TESSELLATION_CONTROL_SHADER_SHADER_READ, SYNC_TESSELLATION_CONTROL_SHADER_SHADER_WRITE, SYNC_TESSELLATION_CONTROL_SHADER_UNIFORM_READ}},
+ {VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, {
+ SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_READ, SYNC_TESSELLATION_EVALUATION_SHADER_SHADER_WRITE, SYNC_TESSELLATION_EVALUATION_SHADER_UNIFORM_READ}},
+ {VK_SHADER_STAGE_GEOMETRY_BIT, {
+ SYNC_GEOMETRY_SHADER_SHADER_READ, SYNC_GEOMETRY_SHADER_SHADER_WRITE, SYNC_GEOMETRY_SHADER_UNIFORM_READ}},
+ {VK_SHADER_STAGE_FRAGMENT_BIT, {
+ SYNC_FRAGMENT_SHADER_SHADER_READ, SYNC_FRAGMENT_SHADER_SHADER_WRITE, SYNC_FRAGMENT_SHADER_UNIFORM_READ}},
+ {VK_SHADER_STAGE_COMPUTE_BIT, {
+ SYNC_COMPUTE_SHADER_SHADER_READ, SYNC_COMPUTE_SHADER_SHADER_WRITE, SYNC_COMPUTE_SHADER_UNIFORM_READ}},
+ {VK_SHADER_STAGE_RAYGEN_BIT_KHR, {
+ SYNC_RAY_TRACING_SHADER_KHR_SHADER_READ, SYNC_RAY_TRACING_SHADER_KHR_SHADER_WRITE, SYNC_RAY_TRACING_SHADER_KHR_UNIFORM_READ}},
+ {VK_SHADER_STAGE_ANY_HIT_BIT_KHR, {
+ SYNC_RAY_TRACING_SHADER_KHR_SHADER_READ, SYNC_RAY_TRACING_SHADER_KHR_SHADER_WRITE, SYNC_RAY_TRACING_SHADER_KHR_UNIFORM_READ}},
+ {VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR, {
+ SYNC_RAY_TRACING_SHADER_KHR_SHADER_READ, SYNC_RAY_TRACING_SHADER_KHR_SHADER_WRITE, SYNC_RAY_TRACING_SHADER_KHR_UNIFORM_READ}},
+ {VK_SHADER_STAGE_MISS_BIT_KHR, {
+ SYNC_RAY_TRACING_SHADER_KHR_SHADER_READ, SYNC_RAY_TRACING_SHADER_KHR_SHADER_WRITE, SYNC_RAY_TRACING_SHADER_KHR_UNIFORM_READ}},
+ {VK_SHADER_STAGE_INTERSECTION_BIT_KHR, {
+ SYNC_RAY_TRACING_SHADER_KHR_SHADER_READ, SYNC_RAY_TRACING_SHADER_KHR_SHADER_WRITE, SYNC_RAY_TRACING_SHADER_KHR_UNIFORM_READ}},
+ {VK_SHADER_STAGE_CALLABLE_BIT_KHR, {
+ SYNC_RAY_TRACING_SHADER_KHR_SHADER_READ, SYNC_RAY_TRACING_SHADER_KHR_SHADER_WRITE, SYNC_RAY_TRACING_SHADER_KHR_UNIFORM_READ}},
+ {VK_SHADER_STAGE_TASK_BIT_NV, {
+ SYNC_TASK_SHADER_NV_SHADER_READ, SYNC_TASK_SHADER_NV_SHADER_WRITE, SYNC_TASK_SHADER_NV_UNIFORM_READ}},
+ {VK_SHADER_STAGE_MESH_BIT_NV, {
+ SYNC_MESH_SHADER_NV_SHADER_READ, SYNC_MESH_SHADER_NV_SHADER_WRITE, SYNC_MESH_SHADER_NV_UNIFORM_READ}},
+};
diff --git a/layers/generated/thread_safety.cpp b/layers/generated/thread_safety.cpp
index f13486a..f8bdc3d 100644
--- a/layers/generated/thread_safety.cpp
+++ b/layers/generated/thread_safety.cpp
@@ -596,6 +596,104 @@
}
}
+void ThreadSafety::PreCallRecordGetDisplayPlaneSupportedDisplaysKHR(
+ VkPhysicalDevice physicalDevice,
+ uint32_t planeIndex,
+ uint32_t* pDisplayCount,
+ VkDisplayKHR* pDisplays) {
+ // Nothing to do for this pre-call function
+}
+
+void ThreadSafety::PostCallRecordGetDisplayPlaneSupportedDisplaysKHR(
+ VkPhysicalDevice physicalDevice,
+ uint32_t planeIndex,
+ uint32_t* pDisplayCount,
+ VkDisplayKHR* pDisplays,
+ VkResult result) {
+ if ((result != VK_SUCCESS) && (result != VK_INCOMPLETE)) return;
+ if (pDisplays) {
+ for (uint32_t index = 0; index < *pDisplayCount; index++) {
+ CreateObject(pDisplays[index]);
+ }
+ }
+}
+
+void ThreadSafety::PreCallRecordGetDisplayModePropertiesKHR(
+ VkPhysicalDevice physicalDevice,
+ VkDisplayKHR display,
+ uint32_t* pPropertyCount,
+ VkDisplayModePropertiesKHR* pProperties) {
+ StartReadObject(display, "vkGetDisplayModePropertiesKHR");
+}
+
+void ThreadSafety::PostCallRecordGetDisplayModePropertiesKHR(
+ VkPhysicalDevice physicalDevice,
+ VkDisplayKHR display,
+ uint32_t* pPropertyCount,
+ VkDisplayModePropertiesKHR* pProperties,
+ VkResult result) {
+ FinishReadObject(display, "vkGetDisplayModePropertiesKHR");
+ if ((result != VK_SUCCESS) && (result != VK_INCOMPLETE)) return;
+ if (pProperties != nullptr) {
+ for (uint32_t index = 0; index < *pPropertyCount; index++) {
+ CreateObject(pProperties[index].displayMode);
+ }
+ }
+}
+
+void ThreadSafety::PreCallRecordGetDisplayModeProperties2KHR(
+ VkPhysicalDevice physicalDevice,
+ VkDisplayKHR display,
+ uint32_t* pPropertyCount,
+ VkDisplayModeProperties2KHR* pProperties) {
+ StartReadObject(display, "vkGetDisplayModeProperties2KHR");
+}
+
+void ThreadSafety::PostCallRecordGetDisplayModeProperties2KHR(
+ VkPhysicalDevice physicalDevice,
+ VkDisplayKHR display,
+ uint32_t* pPropertyCount,
+ VkDisplayModeProperties2KHR* pProperties,
+ VkResult result) {
+ FinishReadObject(display, "vkGetDisplayModeProperties2KHR");
+ if ((result != VK_SUCCESS) && (result != VK_INCOMPLETE)) return;
+ if (pProperties != nullptr) {
+ for (uint32_t index = 0; index < *pPropertyCount; index++) {
+ CreateObject(pProperties[index].displayModeProperties.displayMode);
+ }
+ }
+}
+
+void ThreadSafety::PreCallRecordGetDisplayPlaneCapabilities2KHR(
+ VkPhysicalDevice physicalDevice,
+ const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo,
+ VkDisplayPlaneCapabilities2KHR* pCapabilities) {
+ StartWriteObject(pDisplayPlaneInfo->mode, "vkGetDisplayPlaneCapabilities2KHR");
+}
+
+void ThreadSafety::PostCallRecordGetDisplayPlaneCapabilities2KHR(
+ VkPhysicalDevice physicalDevice,
+ const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo,
+ VkDisplayPlaneCapabilities2KHR* pCapabilities,
+ VkResult result) {
+ FinishWriteObject(pDisplayPlaneInfo->mode, "vkGetDisplayPlaneCapabilities2KHR");
+}
+
+#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
+
+void ThreadSafety::PostCallRecordGetRandROutputDisplayEXT(
+ VkPhysicalDevice physicalDevice,
+ Display* dpy,
+ RROutput rrOutput,
+ VkDisplayKHR* pDisplay,
+ VkResult result) {
+ if ((result != VK_SUCCESS) || (pDisplay == nullptr)) return;
+ CreateObject(*pDisplay);
+}
+
+#endif // VK_USE_PLATFORM_XLIB_XRANDR_EXT
+
+
void ThreadSafety::PreCallRecordCreateInstance(
@@ -620,6 +718,7 @@
const VkAllocationCallbacks* pAllocator) {
StartWriteObjectParentInstance(instance, "vkDestroyInstance");
// Host access to instance must be externally synchronized
+ // all sname:VkPhysicalDevice objects enumerated from pname:instance must be externally synchronized between host accesses
}
void ThreadSafety::PostCallRecordDestroyInstance(
@@ -628,6 +727,7 @@
FinishWriteObjectParentInstance(instance, "vkDestroyInstance");
DestroyObjectParentInstance(instance);
// Host access to instance must be externally synchronized
+ // all sname:VkPhysicalDevice objects enumerated from pname:instance must be externally synchronized between host accesses
}
void ThreadSafety::PreCallRecordEnumeratePhysicalDevices(
@@ -3488,7 +3588,7 @@
StartReadObjectParentInstance(device, "vkCreateSwapchainKHR");
StartWriteObjectParentInstance(pCreateInfo->surface, "vkCreateSwapchainKHR");
StartWriteObject(pCreateInfo->oldSwapchain, "vkCreateSwapchainKHR");
- // Host access to pCreateInfo.surface,pCreateInfo.oldSwapchain must be externally synchronized
+ // Host access to pCreateInfo->surface,pCreateInfo->oldSwapchain must be externally synchronized
}
void ThreadSafety::PostCallRecordCreateSwapchainKHR(
@@ -3503,7 +3603,7 @@
if (result == VK_SUCCESS) {
CreateObject(*pSwapchain);
}
- // Host access to pCreateInfo.surface,pCreateInfo.oldSwapchain must be externally synchronized
+ // Host access to pCreateInfo->surface,pCreateInfo->oldSwapchain must be externally synchronized
}
void ThreadSafety::PreCallRecordAcquireNextImageKHR(
@@ -3605,48 +3705,6 @@
FinishReadObjectParentInstance(device, "vkAcquireNextImage2KHR");
}
-void ThreadSafety::PreCallRecordGetDisplayPlaneSupportedDisplaysKHR(
- VkPhysicalDevice physicalDevice,
- uint32_t planeIndex,
- uint32_t* pDisplayCount,
- VkDisplayKHR* pDisplays) {
- if (pDisplays) {
- for (uint32_t index = 0; index < *pDisplayCount; index++) {
- StartReadObject(pDisplays[index], "vkGetDisplayPlaneSupportedDisplaysKHR");
- }
- }
-}
-
-void ThreadSafety::PostCallRecordGetDisplayPlaneSupportedDisplaysKHR(
- VkPhysicalDevice physicalDevice,
- uint32_t planeIndex,
- uint32_t* pDisplayCount,
- VkDisplayKHR* pDisplays,
- VkResult result) {
- if (pDisplays) {
- for (uint32_t index = 0; index < *pDisplayCount; index++) {
- FinishReadObject(pDisplays[index], "vkGetDisplayPlaneSupportedDisplaysKHR");
- }
- }
-}
-
-void ThreadSafety::PreCallRecordGetDisplayModePropertiesKHR(
- VkPhysicalDevice physicalDevice,
- VkDisplayKHR display,
- uint32_t* pPropertyCount,
- VkDisplayModePropertiesKHR* pProperties) {
- StartReadObject(display, "vkGetDisplayModePropertiesKHR");
-}
-
-void ThreadSafety::PostCallRecordGetDisplayModePropertiesKHR(
- VkPhysicalDevice physicalDevice,
- VkDisplayKHR display,
- uint32_t* pPropertyCount,
- VkDisplayModePropertiesKHR* pProperties,
- VkResult result) {
- FinishReadObject(display, "vkGetDisplayModePropertiesKHR");
-}
-
void ThreadSafety::PreCallRecordCreateDisplayModeKHR(
VkPhysicalDevice physicalDevice,
VkDisplayKHR display,
@@ -4340,23 +4398,6 @@
FinishReadObjectParentInstance(device, "vkReleaseProfilingLockKHR");
}
-void ThreadSafety::PreCallRecordGetDisplayModeProperties2KHR(
- VkPhysicalDevice physicalDevice,
- VkDisplayKHR display,
- uint32_t* pPropertyCount,
- VkDisplayModeProperties2KHR* pProperties) {
- StartReadObject(display, "vkGetDisplayModeProperties2KHR");
-}
-
-void ThreadSafety::PostCallRecordGetDisplayModeProperties2KHR(
- VkPhysicalDevice physicalDevice,
- VkDisplayKHR display,
- uint32_t* pPropertyCount,
- VkDisplayModeProperties2KHR* pProperties,
- VkResult result) {
- FinishReadObject(display, "vkGetDisplayModeProperties2KHR");
-}
-
void ThreadSafety::PreCallRecordGetImageMemoryRequirements2KHR(
VkDevice device,
const VkImageMemoryRequirementsInfo2* pInfo,
@@ -4647,7 +4688,8 @@
VkDeferredOperationKHR operation,
const VkAllocationCallbacks* pAllocator) {
StartReadObjectParentInstance(device, "vkDestroyDeferredOperationKHR");
- StartReadObject(operation, "vkDestroyDeferredOperationKHR");
+ StartWriteObject(operation, "vkDestroyDeferredOperationKHR");
+ // Host access to operation must be externally synchronized
}
void ThreadSafety::PostCallRecordDestroyDeferredOperationKHR(
@@ -4655,7 +4697,9 @@
VkDeferredOperationKHR operation,
const VkAllocationCallbacks* pAllocator) {
FinishReadObjectParentInstance(device, "vkDestroyDeferredOperationKHR");
- FinishReadObject(operation, "vkDestroyDeferredOperationKHR");
+ FinishWriteObject(operation, "vkDestroyDeferredOperationKHR");
+ DestroyObject(operation);
+ // Host access to operation must be externally synchronized
}
void ThreadSafety::PreCallRecordGetDeferredOperationMaxConcurrencyKHR(
@@ -4997,6 +5041,23 @@
FinishReadObjectParentInstance(device, "vkGetImageViewHandleNVX");
}
+void ThreadSafety::PreCallRecordGetImageViewAddressNVX(
+ VkDevice device,
+ VkImageView imageView,
+ VkImageViewAddressPropertiesNVX* pProperties) {
+ StartReadObjectParentInstance(device, "vkGetImageViewAddressNVX");
+ StartReadObject(imageView, "vkGetImageViewAddressNVX");
+}
+
+void ThreadSafety::PostCallRecordGetImageViewAddressNVX(
+ VkDevice device,
+ VkImageView imageView,
+ VkImageViewAddressPropertiesNVX* pProperties,
+ VkResult result) {
+ FinishReadObjectParentInstance(device, "vkGetImageViewAddressNVX");
+ FinishReadObject(imageView, "vkGetImageViewAddressNVX");
+}
+
void ThreadSafety::PreCallRecordCmdDrawIndirectCountAMD(
VkCommandBuffer commandBuffer,
VkBuffer buffer,
@@ -5480,35 +5541,41 @@
void ThreadSafety::PreCallRecordCmdBeginDebugUtilsLabelEXT(
VkCommandBuffer commandBuffer,
const VkDebugUtilsLabelEXT* pLabelInfo) {
- StartReadObject(commandBuffer, "vkCmdBeginDebugUtilsLabelEXT");
+ StartWriteObject(commandBuffer, "vkCmdBeginDebugUtilsLabelEXT");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PostCallRecordCmdBeginDebugUtilsLabelEXT(
VkCommandBuffer commandBuffer,
const VkDebugUtilsLabelEXT* pLabelInfo) {
- FinishReadObject(commandBuffer, "vkCmdBeginDebugUtilsLabelEXT");
+ FinishWriteObject(commandBuffer, "vkCmdBeginDebugUtilsLabelEXT");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PreCallRecordCmdEndDebugUtilsLabelEXT(
VkCommandBuffer commandBuffer) {
- StartReadObject(commandBuffer, "vkCmdEndDebugUtilsLabelEXT");
+ StartWriteObject(commandBuffer, "vkCmdEndDebugUtilsLabelEXT");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PostCallRecordCmdEndDebugUtilsLabelEXT(
VkCommandBuffer commandBuffer) {
- FinishReadObject(commandBuffer, "vkCmdEndDebugUtilsLabelEXT");
+ FinishWriteObject(commandBuffer, "vkCmdEndDebugUtilsLabelEXT");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PreCallRecordCmdInsertDebugUtilsLabelEXT(
VkCommandBuffer commandBuffer,
const VkDebugUtilsLabelEXT* pLabelInfo) {
- StartReadObject(commandBuffer, "vkCmdInsertDebugUtilsLabelEXT");
+ StartWriteObject(commandBuffer, "vkCmdInsertDebugUtilsLabelEXT");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PostCallRecordCmdInsertDebugUtilsLabelEXT(
VkCommandBuffer commandBuffer,
const VkDebugUtilsLabelEXT* pLabelInfo) {
- FinishReadObject(commandBuffer, "vkCmdInsertDebugUtilsLabelEXT");
+ FinishWriteObject(commandBuffer, "vkCmdInsertDebugUtilsLabelEXT");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PreCallRecordCreateDebugUtilsMessengerEXT(
@@ -5798,7 +5865,8 @@
VkAccelerationStructureKHR accelerationStructure,
const VkAllocationCallbacks* pAllocator) {
StartReadObjectParentInstance(device, "vkDestroyAccelerationStructureKHR");
- StartReadObject(accelerationStructure, "vkDestroyAccelerationStructureKHR");
+ StartWriteObject(accelerationStructure, "vkDestroyAccelerationStructureKHR");
+ // Host access to accelerationStructure must be externally synchronized
}
void ThreadSafety::PostCallRecordDestroyAccelerationStructureKHR(
@@ -5806,7 +5874,9 @@
VkAccelerationStructureKHR accelerationStructure,
const VkAllocationCallbacks* pAllocator) {
FinishReadObjectParentInstance(device, "vkDestroyAccelerationStructureKHR");
- FinishReadObject(accelerationStructure, "vkDestroyAccelerationStructureKHR");
+ FinishWriteObject(accelerationStructure, "vkDestroyAccelerationStructureKHR");
+ DestroyObject(accelerationStructure);
+ // Host access to accelerationStructure must be externally synchronized
}
void ThreadSafety::PreCallRecordDestroyAccelerationStructureNV(
@@ -5814,7 +5884,8 @@
VkAccelerationStructureKHR accelerationStructure,
const VkAllocationCallbacks* pAllocator) {
StartReadObjectParentInstance(device, "vkDestroyAccelerationStructureNV");
- StartReadObject(accelerationStructure, "vkDestroyAccelerationStructureNV");
+ StartWriteObject(accelerationStructure, "vkDestroyAccelerationStructureNV");
+ // Host access to accelerationStructure must be externally synchronized
}
void ThreadSafety::PostCallRecordDestroyAccelerationStructureNV(
@@ -5822,7 +5893,9 @@
VkAccelerationStructureKHR accelerationStructure,
const VkAllocationCallbacks* pAllocator) {
FinishReadObjectParentInstance(device, "vkDestroyAccelerationStructureNV");
- FinishReadObject(accelerationStructure, "vkDestroyAccelerationStructureNV");
+ FinishWriteObject(accelerationStructure, "vkDestroyAccelerationStructureNV");
+ DestroyObject(accelerationStructure);
+ // Host access to accelerationStructure must be externally synchronized
}
void ThreadSafety::PreCallRecordGetAccelerationStructureMemoryRequirementsNV(
@@ -5879,11 +5952,12 @@
VkAccelerationStructureKHR src,
VkBuffer scratch,
VkDeviceSize scratchOffset) {
- StartReadObject(commandBuffer, "vkCmdBuildAccelerationStructureNV");
+ StartWriteObject(commandBuffer, "vkCmdBuildAccelerationStructureNV");
StartReadObject(instanceData, "vkCmdBuildAccelerationStructureNV");
StartReadObject(dst, "vkCmdBuildAccelerationStructureNV");
StartReadObject(src, "vkCmdBuildAccelerationStructureNV");
StartReadObject(scratch, "vkCmdBuildAccelerationStructureNV");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PostCallRecordCmdBuildAccelerationStructureNV(
@@ -5896,11 +5970,12 @@
VkAccelerationStructureKHR src,
VkBuffer scratch,
VkDeviceSize scratchOffset) {
- FinishReadObject(commandBuffer, "vkCmdBuildAccelerationStructureNV");
+ FinishWriteObject(commandBuffer, "vkCmdBuildAccelerationStructureNV");
FinishReadObject(instanceData, "vkCmdBuildAccelerationStructureNV");
FinishReadObject(dst, "vkCmdBuildAccelerationStructureNV");
FinishReadObject(src, "vkCmdBuildAccelerationStructureNV");
FinishReadObject(scratch, "vkCmdBuildAccelerationStructureNV");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PreCallRecordCmdCopyAccelerationStructureNV(
@@ -5908,9 +5983,10 @@
VkAccelerationStructureKHR dst,
VkAccelerationStructureKHR src,
VkCopyAccelerationStructureModeKHR mode) {
- StartReadObject(commandBuffer, "vkCmdCopyAccelerationStructureNV");
+ StartWriteObject(commandBuffer, "vkCmdCopyAccelerationStructureNV");
StartReadObject(dst, "vkCmdCopyAccelerationStructureNV");
StartReadObject(src, "vkCmdCopyAccelerationStructureNV");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PostCallRecordCmdCopyAccelerationStructureNV(
@@ -5918,9 +5994,10 @@
VkAccelerationStructureKHR dst,
VkAccelerationStructureKHR src,
VkCopyAccelerationStructureModeKHR mode) {
- FinishReadObject(commandBuffer, "vkCmdCopyAccelerationStructureNV");
+ FinishWriteObject(commandBuffer, "vkCmdCopyAccelerationStructureNV");
FinishReadObject(dst, "vkCmdCopyAccelerationStructureNV");
FinishReadObject(src, "vkCmdCopyAccelerationStructureNV");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PreCallRecordCmdTraceRaysNV(
@@ -5939,11 +6016,12 @@
uint32_t width,
uint32_t height,
uint32_t depth) {
- StartReadObject(commandBuffer, "vkCmdTraceRaysNV");
+ StartWriteObject(commandBuffer, "vkCmdTraceRaysNV");
StartReadObject(raygenShaderBindingTableBuffer, "vkCmdTraceRaysNV");
StartReadObject(missShaderBindingTableBuffer, "vkCmdTraceRaysNV");
StartReadObject(hitShaderBindingTableBuffer, "vkCmdTraceRaysNV");
StartReadObject(callableShaderBindingTableBuffer, "vkCmdTraceRaysNV");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PostCallRecordCmdTraceRaysNV(
@@ -5962,11 +6040,12 @@
uint32_t width,
uint32_t height,
uint32_t depth) {
- FinishReadObject(commandBuffer, "vkCmdTraceRaysNV");
+ FinishWriteObject(commandBuffer, "vkCmdTraceRaysNV");
FinishReadObject(raygenShaderBindingTableBuffer, "vkCmdTraceRaysNV");
FinishReadObject(missShaderBindingTableBuffer, "vkCmdTraceRaysNV");
FinishReadObject(hitShaderBindingTableBuffer, "vkCmdTraceRaysNV");
FinishReadObject(callableShaderBindingTableBuffer, "vkCmdTraceRaysNV");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PreCallRecordCreateRayTracingPipelinesNV(
@@ -6070,13 +6149,14 @@
VkQueryType queryType,
VkQueryPool queryPool,
uint32_t firstQuery) {
- StartReadObject(commandBuffer, "vkCmdWriteAccelerationStructuresPropertiesKHR");
+ StartWriteObject(commandBuffer, "vkCmdWriteAccelerationStructuresPropertiesKHR");
if (pAccelerationStructures) {
for (uint32_t index = 0; index < accelerationStructureCount; index++) {
StartReadObject(pAccelerationStructures[index], "vkCmdWriteAccelerationStructuresPropertiesKHR");
}
}
StartReadObject(queryPool, "vkCmdWriteAccelerationStructuresPropertiesKHR");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PostCallRecordCmdWriteAccelerationStructuresPropertiesKHR(
@@ -6086,13 +6166,14 @@
VkQueryType queryType,
VkQueryPool queryPool,
uint32_t firstQuery) {
- FinishReadObject(commandBuffer, "vkCmdWriteAccelerationStructuresPropertiesKHR");
+ FinishWriteObject(commandBuffer, "vkCmdWriteAccelerationStructuresPropertiesKHR");
if (pAccelerationStructures) {
for (uint32_t index = 0; index < accelerationStructureCount; index++) {
FinishReadObject(pAccelerationStructures[index], "vkCmdWriteAccelerationStructuresPropertiesKHR");
}
}
FinishReadObject(queryPool, "vkCmdWriteAccelerationStructuresPropertiesKHR");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PreCallRecordCmdWriteAccelerationStructuresPropertiesNV(
@@ -6102,13 +6183,14 @@
VkQueryType queryType,
VkQueryPool queryPool,
uint32_t firstQuery) {
- StartReadObject(commandBuffer, "vkCmdWriteAccelerationStructuresPropertiesNV");
+ StartWriteObject(commandBuffer, "vkCmdWriteAccelerationStructuresPropertiesNV");
if (pAccelerationStructures) {
for (uint32_t index = 0; index < accelerationStructureCount; index++) {
StartReadObject(pAccelerationStructures[index], "vkCmdWriteAccelerationStructuresPropertiesNV");
}
}
StartReadObject(queryPool, "vkCmdWriteAccelerationStructuresPropertiesNV");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PostCallRecordCmdWriteAccelerationStructuresPropertiesNV(
@@ -6118,13 +6200,14 @@
VkQueryType queryType,
VkQueryPool queryPool,
uint32_t firstQuery) {
- FinishReadObject(commandBuffer, "vkCmdWriteAccelerationStructuresPropertiesNV");
+ FinishWriteObject(commandBuffer, "vkCmdWriteAccelerationStructuresPropertiesNV");
if (pAccelerationStructures) {
for (uint32_t index = 0; index < accelerationStructureCount; index++) {
FinishReadObject(pAccelerationStructures[index], "vkCmdWriteAccelerationStructuresPropertiesNV");
}
}
FinishReadObject(queryPool, "vkCmdWriteAccelerationStructuresPropertiesNV");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PreCallRecordCompileDeferredNV(
@@ -6292,13 +6375,15 @@
void ThreadSafety::PreCallRecordCmdSetCheckpointNV(
VkCommandBuffer commandBuffer,
const void* pCheckpointMarker) {
- StartReadObject(commandBuffer, "vkCmdSetCheckpointNV");
+ StartWriteObject(commandBuffer, "vkCmdSetCheckpointNV");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PostCallRecordCmdSetCheckpointNV(
VkCommandBuffer commandBuffer,
const void* pCheckpointMarker) {
- FinishReadObject(commandBuffer, "vkCmdSetCheckpointNV");
+ FinishWriteObject(commandBuffer, "vkCmdSetCheckpointNV");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PreCallRecordGetQueueCheckpointDataNV(
@@ -6341,40 +6426,46 @@
void ThreadSafety::PreCallRecordCmdSetPerformanceMarkerINTEL(
VkCommandBuffer commandBuffer,
const VkPerformanceMarkerInfoINTEL* pMarkerInfo) {
- StartReadObject(commandBuffer, "vkCmdSetPerformanceMarkerINTEL");
+ StartWriteObject(commandBuffer, "vkCmdSetPerformanceMarkerINTEL");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PostCallRecordCmdSetPerformanceMarkerINTEL(
VkCommandBuffer commandBuffer,
const VkPerformanceMarkerInfoINTEL* pMarkerInfo,
VkResult result) {
- FinishReadObject(commandBuffer, "vkCmdSetPerformanceMarkerINTEL");
+ FinishWriteObject(commandBuffer, "vkCmdSetPerformanceMarkerINTEL");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PreCallRecordCmdSetPerformanceStreamMarkerINTEL(
VkCommandBuffer commandBuffer,
const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo) {
- StartReadObject(commandBuffer, "vkCmdSetPerformanceStreamMarkerINTEL");
+ StartWriteObject(commandBuffer, "vkCmdSetPerformanceStreamMarkerINTEL");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PostCallRecordCmdSetPerformanceStreamMarkerINTEL(
VkCommandBuffer commandBuffer,
const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo,
VkResult result) {
- FinishReadObject(commandBuffer, "vkCmdSetPerformanceStreamMarkerINTEL");
+ FinishWriteObject(commandBuffer, "vkCmdSetPerformanceStreamMarkerINTEL");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PreCallRecordCmdSetPerformanceOverrideINTEL(
VkCommandBuffer commandBuffer,
const VkPerformanceOverrideInfoINTEL* pOverrideInfo) {
- StartReadObject(commandBuffer, "vkCmdSetPerformanceOverrideINTEL");
+ StartWriteObject(commandBuffer, "vkCmdSetPerformanceOverrideINTEL");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PostCallRecordCmdSetPerformanceOverrideINTEL(
VkCommandBuffer commandBuffer,
const VkPerformanceOverrideInfoINTEL* pOverrideInfo,
VkResult result) {
- FinishReadObject(commandBuffer, "vkCmdSetPerformanceOverrideINTEL");
+ FinishWriteObject(commandBuffer, "vkCmdSetPerformanceOverrideINTEL");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PreCallRecordAcquirePerformanceConfigurationINTEL(
@@ -6614,6 +6705,206 @@
FinishReadObject(queryPool, "vkResetQueryPoolEXT");
}
+void ThreadSafety::PreCallRecordCmdSetCullModeEXT(
+ VkCommandBuffer commandBuffer,
+ VkCullModeFlags cullMode) {
+ StartWriteObject(commandBuffer, "vkCmdSetCullModeEXT");
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PostCallRecordCmdSetCullModeEXT(
+ VkCommandBuffer commandBuffer,
+ VkCullModeFlags cullMode) {
+ FinishWriteObject(commandBuffer, "vkCmdSetCullModeEXT");
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PreCallRecordCmdSetFrontFaceEXT(
+ VkCommandBuffer commandBuffer,
+ VkFrontFace frontFace) {
+ StartWriteObject(commandBuffer, "vkCmdSetFrontFaceEXT");
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PostCallRecordCmdSetFrontFaceEXT(
+ VkCommandBuffer commandBuffer,
+ VkFrontFace frontFace) {
+ FinishWriteObject(commandBuffer, "vkCmdSetFrontFaceEXT");
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PreCallRecordCmdSetPrimitiveTopologyEXT(
+ VkCommandBuffer commandBuffer,
+ VkPrimitiveTopology primitiveTopology) {
+ StartWriteObject(commandBuffer, "vkCmdSetPrimitiveTopologyEXT");
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PostCallRecordCmdSetPrimitiveTopologyEXT(
+ VkCommandBuffer commandBuffer,
+ VkPrimitiveTopology primitiveTopology) {
+ FinishWriteObject(commandBuffer, "vkCmdSetPrimitiveTopologyEXT");
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PreCallRecordCmdSetViewportWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t viewportCount,
+ const VkViewport* pViewports) {
+ StartWriteObject(commandBuffer, "vkCmdSetViewportWithCountEXT");
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PostCallRecordCmdSetViewportWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t viewportCount,
+ const VkViewport* pViewports) {
+ FinishWriteObject(commandBuffer, "vkCmdSetViewportWithCountEXT");
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PreCallRecordCmdSetScissorWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t scissorCount,
+ const VkRect2D* pScissors) {
+ StartWriteObject(commandBuffer, "vkCmdSetScissorWithCountEXT");
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PostCallRecordCmdSetScissorWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t scissorCount,
+ const VkRect2D* pScissors) {
+ FinishWriteObject(commandBuffer, "vkCmdSetScissorWithCountEXT");
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PreCallRecordCmdBindVertexBuffers2EXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t firstBinding,
+ uint32_t bindingCount,
+ const VkBuffer* pBuffers,
+ const VkDeviceSize* pOffsets,
+ const VkDeviceSize* pSizes,
+ const VkDeviceSize* pStrides) {
+ StartWriteObject(commandBuffer, "vkCmdBindVertexBuffers2EXT");
+ if (pBuffers) {
+ for (uint32_t index = 0; index < bindingCount; index++) {
+ StartReadObject(pBuffers[index], "vkCmdBindVertexBuffers2EXT");
+ }
+ }
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PostCallRecordCmdBindVertexBuffers2EXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t firstBinding,
+ uint32_t bindingCount,
+ const VkBuffer* pBuffers,
+ const VkDeviceSize* pOffsets,
+ const VkDeviceSize* pSizes,
+ const VkDeviceSize* pStrides) {
+ FinishWriteObject(commandBuffer, "vkCmdBindVertexBuffers2EXT");
+ if (pBuffers) {
+ for (uint32_t index = 0; index < bindingCount; index++) {
+ FinishReadObject(pBuffers[index], "vkCmdBindVertexBuffers2EXT");
+ }
+ }
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PreCallRecordCmdSetDepthTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthTestEnable) {
+ StartWriteObject(commandBuffer, "vkCmdSetDepthTestEnableEXT");
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PostCallRecordCmdSetDepthTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthTestEnable) {
+ FinishWriteObject(commandBuffer, "vkCmdSetDepthTestEnableEXT");
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PreCallRecordCmdSetDepthWriteEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthWriteEnable) {
+ StartWriteObject(commandBuffer, "vkCmdSetDepthWriteEnableEXT");
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PostCallRecordCmdSetDepthWriteEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthWriteEnable) {
+ FinishWriteObject(commandBuffer, "vkCmdSetDepthWriteEnableEXT");
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PreCallRecordCmdSetDepthCompareOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkCompareOp depthCompareOp) {
+ StartWriteObject(commandBuffer, "vkCmdSetDepthCompareOpEXT");
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PostCallRecordCmdSetDepthCompareOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkCompareOp depthCompareOp) {
+ FinishWriteObject(commandBuffer, "vkCmdSetDepthCompareOpEXT");
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PreCallRecordCmdSetDepthBoundsTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthBoundsTestEnable) {
+ StartWriteObject(commandBuffer, "vkCmdSetDepthBoundsTestEnableEXT");
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PostCallRecordCmdSetDepthBoundsTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthBoundsTestEnable) {
+ FinishWriteObject(commandBuffer, "vkCmdSetDepthBoundsTestEnableEXT");
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PreCallRecordCmdSetStencilTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 stencilTestEnable) {
+ StartWriteObject(commandBuffer, "vkCmdSetStencilTestEnableEXT");
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PostCallRecordCmdSetStencilTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 stencilTestEnable) {
+ FinishWriteObject(commandBuffer, "vkCmdSetStencilTestEnableEXT");
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PreCallRecordCmdSetStencilOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkStencilFaceFlags faceMask,
+ VkStencilOp failOp,
+ VkStencilOp passOp,
+ VkStencilOp depthFailOp,
+ VkCompareOp compareOp) {
+ StartWriteObject(commandBuffer, "vkCmdSetStencilOpEXT");
+ // Host access to commandBuffer must be externally synchronized
+}
+
+void ThreadSafety::PostCallRecordCmdSetStencilOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkStencilFaceFlags faceMask,
+ VkStencilOp failOp,
+ VkStencilOp passOp,
+ VkStencilOp depthFailOp,
+ VkCompareOp compareOp) {
+ FinishWriteObject(commandBuffer, "vkCmdSetStencilOpEXT");
+ // Host access to commandBuffer must be externally synchronized
+}
+
void ThreadSafety::PreCallRecordGetGeneratedCommandsMemoryRequirementsNV(
VkDevice device,
const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo,
@@ -6703,7 +6994,8 @@
VkIndirectCommandsLayoutNV indirectCommandsLayout,
const VkAllocationCallbacks* pAllocator) {
StartReadObjectParentInstance(device, "vkDestroyIndirectCommandsLayoutNV");
- StartReadObject(indirectCommandsLayout, "vkDestroyIndirectCommandsLayoutNV");
+ StartWriteObject(indirectCommandsLayout, "vkDestroyIndirectCommandsLayoutNV");
+ // Host access to indirectCommandsLayout must be externally synchronized
}
void ThreadSafety::PostCallRecordDestroyIndirectCommandsLayoutNV(
@@ -6711,9 +7003,114 @@
VkIndirectCommandsLayoutNV indirectCommandsLayout,
const VkAllocationCallbacks* pAllocator) {
FinishReadObjectParentInstance(device, "vkDestroyIndirectCommandsLayoutNV");
- FinishReadObject(indirectCommandsLayout, "vkDestroyIndirectCommandsLayoutNV");
+ FinishWriteObject(indirectCommandsLayout, "vkDestroyIndirectCommandsLayoutNV");
+ DestroyObject(indirectCommandsLayout);
+ // Host access to indirectCommandsLayout must be externally synchronized
}
+void ThreadSafety::PreCallRecordCreatePrivateDataSlotEXT(
+ VkDevice device,
+ const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkPrivateDataSlotEXT* pPrivateDataSlot) {
+ StartReadObjectParentInstance(device, "vkCreatePrivateDataSlotEXT");
+}
+
+void ThreadSafety::PostCallRecordCreatePrivateDataSlotEXT(
+ VkDevice device,
+ const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkPrivateDataSlotEXT* pPrivateDataSlot,
+ VkResult result) {
+ FinishReadObjectParentInstance(device, "vkCreatePrivateDataSlotEXT");
+ if (result == VK_SUCCESS) {
+ CreateObject(*pPrivateDataSlot);
+ }
+}
+
+void ThreadSafety::PreCallRecordDestroyPrivateDataSlotEXT(
+ VkDevice device,
+ VkPrivateDataSlotEXT privateDataSlot,
+ const VkAllocationCallbacks* pAllocator) {
+ StartReadObjectParentInstance(device, "vkDestroyPrivateDataSlotEXT");
+ StartWriteObject(privateDataSlot, "vkDestroyPrivateDataSlotEXT");
+ // Host access to privateDataSlot must be externally synchronized
+}
+
+void ThreadSafety::PostCallRecordDestroyPrivateDataSlotEXT(
+ VkDevice device,
+ VkPrivateDataSlotEXT privateDataSlot,
+ const VkAllocationCallbacks* pAllocator) {
+ FinishReadObjectParentInstance(device, "vkDestroyPrivateDataSlotEXT");
+ FinishWriteObject(privateDataSlot, "vkDestroyPrivateDataSlotEXT");
+ DestroyObject(privateDataSlot);
+ // Host access to privateDataSlot must be externally synchronized
+}
+
+void ThreadSafety::PreCallRecordSetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t data) {
+ StartReadObjectParentInstance(device, "vkSetPrivateDataEXT");
+ StartReadObject(privateDataSlot, "vkSetPrivateDataEXT");
+}
+
+void ThreadSafety::PostCallRecordSetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t data,
+ VkResult result) {
+ FinishReadObjectParentInstance(device, "vkSetPrivateDataEXT");
+ FinishReadObject(privateDataSlot, "vkSetPrivateDataEXT");
+}
+
+void ThreadSafety::PreCallRecordGetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t* pData) {
+ StartReadObjectParentInstance(device, "vkGetPrivateDataEXT");
+ StartReadObject(privateDataSlot, "vkGetPrivateDataEXT");
+}
+
+void ThreadSafety::PostCallRecordGetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t* pData) {
+ FinishReadObjectParentInstance(device, "vkGetPrivateDataEXT");
+ FinishReadObject(privateDataSlot, "vkGetPrivateDataEXT");
+}
+
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+
+void ThreadSafety::PreCallRecordCreateDirectFBSurfaceEXT(
+ VkInstance instance,
+ const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkSurfaceKHR* pSurface) {
+ StartReadObjectParentInstance(instance, "vkCreateDirectFBSurfaceEXT");
+}
+
+void ThreadSafety::PostCallRecordCreateDirectFBSurfaceEXT(
+ VkInstance instance,
+ const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkSurfaceKHR* pSurface,
+ VkResult result) {
+ FinishReadObjectParentInstance(instance, "vkCreateDirectFBSurfaceEXT");
+ if (result == VK_SUCCESS) {
+ CreateObjectParentInstance(*pSurface);
+ }
+}
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
+
#ifdef VK_USE_PLATFORM_FUCHSIA
void ThreadSafety::PreCallRecordCreateBufferCollectionFUCHSIA(
@@ -6911,7 +7308,8 @@
uint32_t infoCount,
const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
const VkAccelerationStructureBuildOffsetInfoKHR* const* ppOffsetInfos) {
- StartReadObject(commandBuffer, "vkCmdBuildAccelerationStructureKHR");
+ StartWriteObject(commandBuffer, "vkCmdBuildAccelerationStructureKHR");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PostCallRecordCmdBuildAccelerationStructureKHR(
@@ -6919,7 +7317,8 @@
uint32_t infoCount,
const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
const VkAccelerationStructureBuildOffsetInfoKHR* const* ppOffsetInfos) {
- FinishReadObject(commandBuffer, "vkCmdBuildAccelerationStructureKHR");
+ FinishWriteObject(commandBuffer, "vkCmdBuildAccelerationStructureKHR");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PreCallRecordCmdBuildAccelerationStructureIndirectKHR(
@@ -6928,8 +7327,9 @@
VkBuffer indirectBuffer,
VkDeviceSize indirectOffset,
uint32_t indirectStride) {
- StartReadObject(commandBuffer, "vkCmdBuildAccelerationStructureIndirectKHR");
+ StartWriteObject(commandBuffer, "vkCmdBuildAccelerationStructureIndirectKHR");
StartReadObject(indirectBuffer, "vkCmdBuildAccelerationStructureIndirectKHR");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PostCallRecordCmdBuildAccelerationStructureIndirectKHR(
@@ -6938,8 +7338,9 @@
VkBuffer indirectBuffer,
VkDeviceSize indirectOffset,
uint32_t indirectStride) {
- FinishReadObject(commandBuffer, "vkCmdBuildAccelerationStructureIndirectKHR");
+ FinishWriteObject(commandBuffer, "vkCmdBuildAccelerationStructureIndirectKHR");
FinishReadObject(indirectBuffer, "vkCmdBuildAccelerationStructureIndirectKHR");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PreCallRecordBuildAccelerationStructureKHR(
@@ -7034,37 +7435,43 @@
void ThreadSafety::PreCallRecordCmdCopyAccelerationStructureKHR(
VkCommandBuffer commandBuffer,
const VkCopyAccelerationStructureInfoKHR* pInfo) {
- StartReadObject(commandBuffer, "vkCmdCopyAccelerationStructureKHR");
+ StartWriteObject(commandBuffer, "vkCmdCopyAccelerationStructureKHR");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PostCallRecordCmdCopyAccelerationStructureKHR(
VkCommandBuffer commandBuffer,
const VkCopyAccelerationStructureInfoKHR* pInfo) {
- FinishReadObject(commandBuffer, "vkCmdCopyAccelerationStructureKHR");
+ FinishWriteObject(commandBuffer, "vkCmdCopyAccelerationStructureKHR");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PreCallRecordCmdCopyAccelerationStructureToMemoryKHR(
VkCommandBuffer commandBuffer,
const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo) {
- StartReadObject(commandBuffer, "vkCmdCopyAccelerationStructureToMemoryKHR");
+ StartWriteObject(commandBuffer, "vkCmdCopyAccelerationStructureToMemoryKHR");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PostCallRecordCmdCopyAccelerationStructureToMemoryKHR(
VkCommandBuffer commandBuffer,
const VkCopyAccelerationStructureToMemoryInfoKHR* pInfo) {
- FinishReadObject(commandBuffer, "vkCmdCopyAccelerationStructureToMemoryKHR");
+ FinishWriteObject(commandBuffer, "vkCmdCopyAccelerationStructureToMemoryKHR");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PreCallRecordCmdCopyMemoryToAccelerationStructureKHR(
VkCommandBuffer commandBuffer,
const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo) {
- StartReadObject(commandBuffer, "vkCmdCopyMemoryToAccelerationStructureKHR");
+ StartWriteObject(commandBuffer, "vkCmdCopyMemoryToAccelerationStructureKHR");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PostCallRecordCmdCopyMemoryToAccelerationStructureKHR(
VkCommandBuffer commandBuffer,
const VkCopyMemoryToAccelerationStructureInfoKHR* pInfo) {
- FinishReadObject(commandBuffer, "vkCmdCopyMemoryToAccelerationStructureKHR");
+ FinishWriteObject(commandBuffer, "vkCmdCopyMemoryToAccelerationStructureKHR");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PreCallRecordCmdTraceRaysKHR(
@@ -7076,7 +7483,8 @@
uint32_t width,
uint32_t height,
uint32_t depth) {
- StartReadObject(commandBuffer, "vkCmdTraceRaysKHR");
+ StartWriteObject(commandBuffer, "vkCmdTraceRaysKHR");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PostCallRecordCmdTraceRaysKHR(
@@ -7088,7 +7496,8 @@
uint32_t width,
uint32_t height,
uint32_t depth) {
- FinishReadObject(commandBuffer, "vkCmdTraceRaysKHR");
+ FinishWriteObject(commandBuffer, "vkCmdTraceRaysKHR");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PreCallRecordCreateRayTracingPipelinesKHR(
@@ -7164,8 +7573,9 @@
const VkStridedBufferRegionKHR* pCallableShaderBindingTable,
VkBuffer buffer,
VkDeviceSize offset) {
- StartReadObject(commandBuffer, "vkCmdTraceRaysIndirectKHR");
+ StartWriteObject(commandBuffer, "vkCmdTraceRaysIndirectKHR");
StartReadObject(buffer, "vkCmdTraceRaysIndirectKHR");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PostCallRecordCmdTraceRaysIndirectKHR(
@@ -7176,8 +7586,9 @@
const VkStridedBufferRegionKHR* pCallableShaderBindingTable,
VkBuffer buffer,
VkDeviceSize offset) {
- FinishReadObject(commandBuffer, "vkCmdTraceRaysIndirectKHR");
+ FinishWriteObject(commandBuffer, "vkCmdTraceRaysIndirectKHR");
FinishReadObject(buffer, "vkCmdTraceRaysIndirectKHR");
+ // Host access to commandBuffer must be externally synchronized
}
void ThreadSafety::PreCallRecordGetDeviceAccelerationStructureCompatibilityKHR(
diff --git a/layers/generated/thread_safety.h b/layers/generated/thread_safety.h
index 20894af..e29b750 100644
--- a/layers/generated/thread_safety.h
+++ b/layers/generated/thread_safety.h
@@ -131,7 +131,7 @@
vl_concurrent_unordered_map<T, std::shared_ptr<ObjectUseData>, 6> object_table;
void CreateObject(T object) {
- object_table.insert_or_assign(object, std::make_shared<ObjectUseData>());
+ object_table.insert(object, std::make_shared<ObjectUseData>());
}
void DestroyObject(T object) {
@@ -349,6 +349,7 @@
counter<VkPipeline> c_VkPipeline;
counter<VkPipelineCache> c_VkPipelineCache;
counter<VkPipelineLayout> c_VkPipelineLayout;
+ counter<VkPrivateDataSlotEXT> c_VkPrivateDataSlotEXT;
counter<VkQueryPool> c_VkQueryPool;
counter<VkRenderPass> c_VkRenderPass;
counter<VkSampler> c_VkSampler;
@@ -401,6 +402,7 @@
c_VkPipeline("VkPipeline", kVulkanObjectTypePipeline, this),
c_VkPipelineCache("VkPipelineCache", kVulkanObjectTypePipelineCache, this),
c_VkPipelineLayout("VkPipelineLayout", kVulkanObjectTypePipelineLayout, this),
+ c_VkPrivateDataSlotEXT("VkPrivateDataSlotEXT", kVulkanObjectTypePrivateDataSlotEXT, this),
c_VkQueryPool("VkQueryPool", kVulkanObjectTypeQueryPool, this),
c_VkRenderPass("VkRenderPass", kVulkanObjectTypeRenderPass, this),
c_VkSampler("VkSampler", kVulkanObjectTypeSampler, this),
@@ -415,7 +417,9 @@
#else // DISTINCT_NONDISPATCHABLE_HANDLES
c_uint64_t("NON_DISPATCHABLE_HANDLE", kVulkanObjectTypeUnknown, this)
#endif // DISTINCT_NONDISPATCHABLE_HANDLES
- {};
+ {
+ container_type = LayerObjectTypeThreading;
+ };
#define WRAPPER(type) \
void StartWriteObject(type object, const char *api_name) { \
@@ -487,6 +491,7 @@
WRAPPER(VkPipeline)
WRAPPER(VkPipelineCache)
WRAPPER(VkPipelineLayout)
+WRAPPER(VkPrivateDataSlotEXT)
WRAPPER(VkQueryPool)
WRAPPER(VkRenderPass)
WRAPPER(VkSampler)
@@ -563,6 +568,28 @@
VkDisplayProperties2KHR* pProperties,
VkResult result);
+void PreCallRecordGetDisplayPlaneCapabilities2KHR(
+ VkPhysicalDevice physicalDevice,
+ const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo,
+ VkDisplayPlaneCapabilities2KHR* pCapabilities);
+
+void PostCallRecordGetDisplayPlaneCapabilities2KHR(
+ VkPhysicalDevice physicalDevice,
+ const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo,
+ VkDisplayPlaneCapabilities2KHR* pCapabilities,
+ VkResult result);
+
+#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
+
+void PostCallRecordGetRandROutputDisplayEXT(
+ VkPhysicalDevice physicalDevice,
+ Display* dpy,
+ RROutput rrOutput,
+ VkDisplayKHR* pDisplay,
+ VkResult result);
+
+#endif // VK_USE_PLATFORM_XLIB_XRANDR_EXT
+
void PreCallRecordCreateInstance(
const VkInstanceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
@@ -3500,6 +3527,17 @@
VkDevice device,
const VkImageViewHandleInfoNVX* pInfo);
+void PreCallRecordGetImageViewAddressNVX(
+ VkDevice device,
+ VkImageView imageView,
+ VkImageViewAddressPropertiesNVX* pProperties);
+
+void PostCallRecordGetImageViewAddressNVX(
+ VkDevice device,
+ VkImageView imageView,
+ VkImageViewAddressPropertiesNVX* pProperties,
+ VkResult result);
+
void PreCallRecordCmdDrawIndirectCountAMD(
VkCommandBuffer commandBuffer,
VkBuffer buffer,
@@ -4561,6 +4599,124 @@
uint32_t firstQuery,
uint32_t queryCount);
+void PreCallRecordCmdSetCullModeEXT(
+ VkCommandBuffer commandBuffer,
+ VkCullModeFlags cullMode);
+
+void PostCallRecordCmdSetCullModeEXT(
+ VkCommandBuffer commandBuffer,
+ VkCullModeFlags cullMode);
+
+void PreCallRecordCmdSetFrontFaceEXT(
+ VkCommandBuffer commandBuffer,
+ VkFrontFace frontFace);
+
+void PostCallRecordCmdSetFrontFaceEXT(
+ VkCommandBuffer commandBuffer,
+ VkFrontFace frontFace);
+
+void PreCallRecordCmdSetPrimitiveTopologyEXT(
+ VkCommandBuffer commandBuffer,
+ VkPrimitiveTopology primitiveTopology);
+
+void PostCallRecordCmdSetPrimitiveTopologyEXT(
+ VkCommandBuffer commandBuffer,
+ VkPrimitiveTopology primitiveTopology);
+
+void PreCallRecordCmdSetViewportWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t viewportCount,
+ const VkViewport* pViewports);
+
+void PostCallRecordCmdSetViewportWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t viewportCount,
+ const VkViewport* pViewports);
+
+void PreCallRecordCmdSetScissorWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t scissorCount,
+ const VkRect2D* pScissors);
+
+void PostCallRecordCmdSetScissorWithCountEXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t scissorCount,
+ const VkRect2D* pScissors);
+
+void PreCallRecordCmdBindVertexBuffers2EXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t firstBinding,
+ uint32_t bindingCount,
+ const VkBuffer* pBuffers,
+ const VkDeviceSize* pOffsets,
+ const VkDeviceSize* pSizes,
+ const VkDeviceSize* pStrides);
+
+void PostCallRecordCmdBindVertexBuffers2EXT(
+ VkCommandBuffer commandBuffer,
+ uint32_t firstBinding,
+ uint32_t bindingCount,
+ const VkBuffer* pBuffers,
+ const VkDeviceSize* pOffsets,
+ const VkDeviceSize* pSizes,
+ const VkDeviceSize* pStrides);
+
+void PreCallRecordCmdSetDepthTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthTestEnable);
+
+void PostCallRecordCmdSetDepthTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthTestEnable);
+
+void PreCallRecordCmdSetDepthWriteEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthWriteEnable);
+
+void PostCallRecordCmdSetDepthWriteEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthWriteEnable);
+
+void PreCallRecordCmdSetDepthCompareOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkCompareOp depthCompareOp);
+
+void PostCallRecordCmdSetDepthCompareOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkCompareOp depthCompareOp);
+
+void PreCallRecordCmdSetDepthBoundsTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthBoundsTestEnable);
+
+void PostCallRecordCmdSetDepthBoundsTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 depthBoundsTestEnable);
+
+void PreCallRecordCmdSetStencilTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 stencilTestEnable);
+
+void PostCallRecordCmdSetStencilTestEnableEXT(
+ VkCommandBuffer commandBuffer,
+ VkBool32 stencilTestEnable);
+
+void PreCallRecordCmdSetStencilOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkStencilFaceFlags faceMask,
+ VkStencilOp failOp,
+ VkStencilOp passOp,
+ VkStencilOp depthFailOp,
+ VkCompareOp compareOp);
+
+void PostCallRecordCmdSetStencilOpEXT(
+ VkCommandBuffer commandBuffer,
+ VkStencilFaceFlags faceMask,
+ VkStencilOp failOp,
+ VkStencilOp passOp,
+ VkStencilOp depthFailOp,
+ VkCompareOp compareOp);
+
void PreCallRecordGetGeneratedCommandsMemoryRequirementsNV(
VkDevice device,
const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo,
@@ -4624,6 +4780,74 @@
VkIndirectCommandsLayoutNV indirectCommandsLayout,
const VkAllocationCallbacks* pAllocator);
+void PreCallRecordCreatePrivateDataSlotEXT(
+ VkDevice device,
+ const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkPrivateDataSlotEXT* pPrivateDataSlot);
+
+void PostCallRecordCreatePrivateDataSlotEXT(
+ VkDevice device,
+ const VkPrivateDataSlotCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkPrivateDataSlotEXT* pPrivateDataSlot,
+ VkResult result);
+
+void PreCallRecordDestroyPrivateDataSlotEXT(
+ VkDevice device,
+ VkPrivateDataSlotEXT privateDataSlot,
+ const VkAllocationCallbacks* pAllocator);
+
+void PostCallRecordDestroyPrivateDataSlotEXT(
+ VkDevice device,
+ VkPrivateDataSlotEXT privateDataSlot,
+ const VkAllocationCallbacks* pAllocator);
+
+void PreCallRecordSetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t data);
+
+void PostCallRecordSetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t data,
+ VkResult result);
+
+void PreCallRecordGetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t* pData);
+
+void PostCallRecordGetPrivateDataEXT(
+ VkDevice device,
+ VkObjectType objectType,
+ uint64_t objectHandle,
+ VkPrivateDataSlotEXT privateDataSlot,
+ uint64_t* pData);
+
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+
+void PreCallRecordCreateDirectFBSurfaceEXT(
+ VkInstance instance,
+ const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkSurfaceKHR* pSurface);
+
+void PostCallRecordCreateDirectFBSurfaceEXT(
+ VkInstance instance,
+ const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkSurfaceKHR* pSurface,
+ VkResult result);
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
+
#ifdef VK_USE_PLATFORM_FUCHSIA
void PreCallRecordCreateBufferCollectionFUCHSIA(
diff --git a/layers/generated/vk_dispatch_table_helper.h b/layers/generated/vk_dispatch_table_helper.h
index f226dd8..b2cc5a6 100644
--- a/layers/generated/vk_dispatch_table_helper.h
+++ b/layers/generated/vk_dispatch_table_helper.h
@@ -230,6 +230,7 @@
static VKAPI_ATTR void VKAPI_CALL StubCmdEndQueryIndexedEXT(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t query, uint32_t index) { };
static VKAPI_ATTR void VKAPI_CALL StubCmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer, uint32_t instanceCount, uint32_t firstInstance, VkBuffer counterBuffer, VkDeviceSize counterBufferOffset, uint32_t counterOffset, uint32_t vertexStride) { };
static VKAPI_ATTR uint32_t VKAPI_CALL StubGetImageViewHandleNVX(VkDevice device, const VkImageViewHandleInfoNVX* pInfo) { return 0; };
+static VKAPI_ATTR VkResult VKAPI_CALL StubGetImageViewAddressNVX(VkDevice device, VkImageView imageView, VkImageViewAddressPropertiesNVX* pProperties) { return VK_SUCCESS; };
static VKAPI_ATTR void VKAPI_CALL StubCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride) { };
static VKAPI_ATTR void VKAPI_CALL StubCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride) { };
static VKAPI_ATTR VkResult VKAPI_CALL StubGetShaderInfoAMD(VkDevice device, VkPipeline pipeline, VkShaderStageFlagBits shaderStage, VkShaderInfoTypeAMD infoType, size_t* pInfoSize, void* pInfo) { return VK_SUCCESS; };
@@ -356,12 +357,34 @@
static VKAPI_ATTR VkResult VKAPI_CALL StubCreateHeadlessSurfaceEXT(VkInstance instance, const VkHeadlessSurfaceCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) { return VK_SUCCESS; };
static VKAPI_ATTR void VKAPI_CALL StubCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor, uint16_t lineStipplePattern) { };
static VKAPI_ATTR void VKAPI_CALL StubResetQueryPoolEXT(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) { };
+static VKAPI_ATTR void VKAPI_CALL StubCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) { };
+static VKAPI_ATTR void VKAPI_CALL StubCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace) { };
+static VKAPI_ATTR void VKAPI_CALL StubCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer, VkPrimitiveTopology primitiveTopology) { };
+static VKAPI_ATTR void VKAPI_CALL StubCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount, const VkViewport* pViewports) { };
+static VKAPI_ATTR void VKAPI_CALL StubCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount, const VkRect2D* pScissors) { };
+static VKAPI_ATTR void VKAPI_CALL StubCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount, const VkBuffer* pBuffers, const VkDeviceSize* pOffsets, const VkDeviceSize* pSizes, const VkDeviceSize* pStrides) { };
+static VKAPI_ATTR void VKAPI_CALL StubCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) { };
+static VKAPI_ATTR void VKAPI_CALL StubCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) { };
+static VKAPI_ATTR void VKAPI_CALL StubCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) { };
+static VKAPI_ATTR void VKAPI_CALL StubCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthBoundsTestEnable) { };
+static VKAPI_ATTR void VKAPI_CALL StubCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) { };
+static VKAPI_ATTR void VKAPI_CALL StubCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp, VkCompareOp compareOp) { };
static VKAPI_ATTR void VKAPI_CALL StubGetGeneratedCommandsMemoryRequirementsNV(VkDevice device, const VkGeneratedCommandsMemoryRequirementsInfoNV* pInfo, VkMemoryRequirements2* pMemoryRequirements) { };
static VKAPI_ATTR void VKAPI_CALL StubCmdPreprocessGeneratedCommandsNV(VkCommandBuffer commandBuffer, const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo) { };
static VKAPI_ATTR void VKAPI_CALL StubCmdExecuteGeneratedCommandsNV(VkCommandBuffer commandBuffer, VkBool32 isPreprocessed, const VkGeneratedCommandsInfoNV* pGeneratedCommandsInfo) { };
static VKAPI_ATTR void VKAPI_CALL StubCmdBindPipelineShaderGroupNV(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint, VkPipeline pipeline, uint32_t groupIndex) { };
static VKAPI_ATTR VkResult VKAPI_CALL StubCreateIndirectCommandsLayoutNV(VkDevice device, const VkIndirectCommandsLayoutCreateInfoNV* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkIndirectCommandsLayoutNV* pIndirectCommandsLayout) { return VK_SUCCESS; };
static VKAPI_ATTR void VKAPI_CALL StubDestroyIndirectCommandsLayoutNV(VkDevice device, VkIndirectCommandsLayoutNV indirectCommandsLayout, const VkAllocationCallbacks* pAllocator) { };
+static VKAPI_ATTR VkResult VKAPI_CALL StubCreatePrivateDataSlotEXT(VkDevice device, const VkPrivateDataSlotCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkPrivateDataSlotEXT* pPrivateDataSlot) { return VK_SUCCESS; };
+static VKAPI_ATTR void VKAPI_CALL StubDestroyPrivateDataSlotEXT(VkDevice device, VkPrivateDataSlotEXT privateDataSlot, const VkAllocationCallbacks* pAllocator) { };
+static VKAPI_ATTR VkResult VKAPI_CALL StubSetPrivateDataEXT(VkDevice device, VkObjectType objectType, uint64_t objectHandle, VkPrivateDataSlotEXT privateDataSlot, uint64_t data) { return VK_SUCCESS; };
+static VKAPI_ATTR void VKAPI_CALL StubGetPrivateDataEXT(VkDevice device, VkObjectType objectType, uint64_t objectHandle, VkPrivateDataSlotEXT privateDataSlot, uint64_t* pData) { };
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+static VKAPI_ATTR VkResult VKAPI_CALL StubCreateDirectFBSurfaceEXT(VkInstance instance, const VkDirectFBSurfaceCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface) { return VK_SUCCESS; };
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+static VKAPI_ATTR VkBool32 VKAPI_CALL StubGetPhysicalDeviceDirectFBPresentationSupportEXT(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, IDirectFB* dfb) { return VK_FALSE; };
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
#ifdef VK_USE_PLATFORM_FUCHSIA
static VKAPI_ATTR VkResult VKAPI_CALL StubCreateBufferCollectionFUCHSIA(VkDevice device, const VkBufferCollectionCreateInfoFUCHSIA* pImportInfo, const VkAllocationCallbacks* pAllocator, VkBufferCollectionFUCHSIA* pCollection) { return VK_SUCCESS; };
#endif // VK_USE_PLATFORM_FUCHSIA
@@ -399,7 +422,7 @@
static VKAPI_ATTR void VKAPI_CALL StubCmdBuildAccelerationStructureKHR(VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR* pInfos, const VkAccelerationStructureBuildOffsetInfoKHR* const* ppOffsetInfos) { };
#endif // VK_ENABLE_BETA_EXTENSIONS
#ifdef VK_ENABLE_BETA_EXTENSIONS
-static VKAPI_ATTR void VKAPI_CALL StubCmdBuildAccelerationStructureIndirectKHR(VkCommandBuffer commandBuffer, const VkAccelerationStructureBuildGeometryInfoKHR* pInfo, VkBuffer indirectBuffer, VkDeviceSize indirectOffset, uint32_t indirectStride) { };
+static VKAPI_ATTR void VKAPI_CALL StubCmdBuildAccelerationStructureIndirectKHR(VkCommandBuffer commandBuffer, const VkAccelerationStructureBuildGeometryInfoKHR* pInfo, VkBuffer indirectBuffer, VkDeviceSize indirectOffset, uint32_t indirectStride) { };
#endif // VK_ENABLE_BETA_EXTENSIONS
#ifdef VK_ENABLE_BETA_EXTENSIONS
static VKAPI_ATTR VkResult VKAPI_CALL StubBuildAccelerationStructureKHR(VkDevice device, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR* pInfos, const VkAccelerationStructureBuildOffsetInfoKHR* const* ppOffsetInfos) { return VK_SUCCESS; };
@@ -469,6 +492,7 @@
{"vkCmdBindPipelineShaderGroupNV", "VK_NV_device_generated_commands"},
{"vkCmdBindShadingRateImageNV", "VK_NV_shading_rate_image"},
{"vkCmdBindTransformFeedbackBuffersEXT", "VK_EXT_transform_feedback"},
+ {"vkCmdBindVertexBuffers2EXT", "VK_EXT_extended_dynamic_state"},
{"vkCmdBuildAccelerationStructureIndirectKHR", "VK_KHR_ray_tracing"},
{"vkCmdBuildAccelerationStructureKHR", "VK_KHR_ray_tracing"},
{"vkCmdBuildAccelerationStructureNV", "VK_NV_ray_tracing"},
@@ -506,17 +530,28 @@
{"vkCmdPushDescriptorSetWithTemplateKHR", "VK_KHR_push_descriptor"},
{"vkCmdSetCheckpointNV", "VK_NV_device_diagnostic_checkpoints"},
{"vkCmdSetCoarseSampleOrderNV", "VK_NV_shading_rate_image"},
+ {"vkCmdSetCullModeEXT", "VK_EXT_extended_dynamic_state"},
+ {"vkCmdSetDepthBoundsTestEnableEXT", "VK_EXT_extended_dynamic_state"},
+ {"vkCmdSetDepthCompareOpEXT", "VK_EXT_extended_dynamic_state"},
+ {"vkCmdSetDepthTestEnableEXT", "VK_EXT_extended_dynamic_state"},
+ {"vkCmdSetDepthWriteEnableEXT", "VK_EXT_extended_dynamic_state"},
{"vkCmdSetDeviceMask", "VK_VERSION_1_1"},
{"vkCmdSetDeviceMaskKHR", "VK_KHR_device_group"},
{"vkCmdSetDiscardRectangleEXT", "VK_EXT_discard_rectangles"},
{"vkCmdSetExclusiveScissorNV", "VK_NV_scissor_exclusive"},
+ {"vkCmdSetFrontFaceEXT", "VK_EXT_extended_dynamic_state"},
{"vkCmdSetLineStippleEXT", "VK_EXT_line_rasterization"},
{"vkCmdSetPerformanceMarkerINTEL", "VK_INTEL_performance_query"},
{"vkCmdSetPerformanceOverrideINTEL", "VK_INTEL_performance_query"},
{"vkCmdSetPerformanceStreamMarkerINTEL", "VK_INTEL_performance_query"},
+ {"vkCmdSetPrimitiveTopologyEXT", "VK_EXT_extended_dynamic_state"},
{"vkCmdSetSampleLocationsEXT", "VK_EXT_sample_locations"},
+ {"vkCmdSetScissorWithCountEXT", "VK_EXT_extended_dynamic_state"},
+ {"vkCmdSetStencilOpEXT", "VK_EXT_extended_dynamic_state"},
+ {"vkCmdSetStencilTestEnableEXT", "VK_EXT_extended_dynamic_state"},
{"vkCmdSetViewportShadingRatePaletteNV", "VK_NV_shading_rate_image"},
{"vkCmdSetViewportWScalingNV", "VK_NV_clip_space_w_scaling"},
+ {"vkCmdSetViewportWithCountEXT", "VK_EXT_extended_dynamic_state"},
{"vkCmdTraceRaysIndirectKHR", "VK_KHR_ray_tracing"},
{"vkCmdTraceRaysKHR", "VK_KHR_ray_tracing"},
{"vkCmdTraceRaysNV", "VK_NV_ray_tracing"},
@@ -534,6 +569,7 @@
{"vkCreateDescriptorUpdateTemplate", "VK_VERSION_1_1"},
{"vkCreateDescriptorUpdateTemplateKHR", "VK_KHR_descriptor_update_template"},
{"vkCreateIndirectCommandsLayoutNV", "VK_NV_device_generated_commands"},
+ {"vkCreatePrivateDataSlotEXT", "VK_EXT_private_data"},
{"vkCreateRayTracingPipelinesKHR", "VK_KHR_ray_tracing"},
{"vkCreateRayTracingPipelinesNV", "VK_NV_ray_tracing"},
{"vkCreateRenderPass2", "VK_VERSION_1_2"},
@@ -553,6 +589,7 @@
{"vkDestroyDescriptorUpdateTemplate", "VK_VERSION_1_1"},
{"vkDestroyDescriptorUpdateTemplateKHR", "VK_KHR_descriptor_update_template"},
{"vkDestroyIndirectCommandsLayoutNV", "VK_NV_device_generated_commands"},
+ {"vkDestroyPrivateDataSlotEXT", "VK_EXT_private_data"},
{"vkDestroySamplerYcbcrConversion", "VK_VERSION_1_1"},
{"vkDestroySamplerYcbcrConversionKHR", "VK_KHR_sampler_ycbcr_conversion"},
{"vkDestroySwapchainKHR", "VK_KHR_swapchain"},
@@ -593,6 +630,7 @@
{"vkGetImageMemoryRequirements2KHR", "VK_KHR_get_memory_requirements2"},
{"vkGetImageSparseMemoryRequirements2", "VK_VERSION_1_1"},
{"vkGetImageSparseMemoryRequirements2KHR", "VK_KHR_get_memory_requirements2"},
+ {"vkGetImageViewAddressNVX", "VK_NVX_image_view_handle"},
{"vkGetImageViewHandleNVX", "VK_NVX_image_view_handle"},
{"vkGetMemoryAndroidHardwareBufferANDROID", "VK_ANDROID_external_memory_android_hardware_buffer"},
{"vkGetMemoryFdKHR", "VK_KHR_external_memory_fd"},
@@ -608,6 +646,7 @@
{"vkGetPipelineExecutableInternalRepresentationsKHR", "VK_KHR_pipeline_executable_properties"},
{"vkGetPipelineExecutablePropertiesKHR", "VK_KHR_pipeline_executable_properties"},
{"vkGetPipelineExecutableStatisticsKHR", "VK_KHR_pipeline_executable_properties"},
+ {"vkGetPrivateDataEXT", "VK_EXT_private_data"},
{"vkGetQueueCheckpointDataNV", "VK_NV_device_diagnostic_checkpoints"},
{"vkGetRayTracingCaptureReplayShaderGroupHandlesKHR", "VK_KHR_ray_tracing"},
{"vkGetRayTracingShaderGroupHandlesKHR", "VK_KHR_ray_tracing"},
@@ -651,6 +690,7 @@
{"vkSetDebugUtilsObjectTagEXT", "VK_EXT_debug_utils"},
{"vkSetHdrMetadataEXT", "VK_EXT_hdr_metadata"},
{"vkSetLocalDimmingAMD", "VK_AMD_display_native_hdr"},
+ {"vkSetPrivateDataEXT", "VK_EXT_private_data"},
{"vkSignalSemaphore", "VK_VERSION_1_2"},
{"vkSignalSemaphoreKHR", "VK_KHR_timeline_semaphore"},
{"vkTrimCommandPool", "VK_VERSION_1_1"},
@@ -1032,6 +1072,8 @@
if (table->CmdDrawIndirectByteCountEXT == nullptr) { table->CmdDrawIndirectByteCountEXT = (PFN_vkCmdDrawIndirectByteCountEXT)StubCmdDrawIndirectByteCountEXT; }
table->GetImageViewHandleNVX = (PFN_vkGetImageViewHandleNVX) gpa(device, "vkGetImageViewHandleNVX");
if (table->GetImageViewHandleNVX == nullptr) { table->GetImageViewHandleNVX = (PFN_vkGetImageViewHandleNVX)StubGetImageViewHandleNVX; }
+ table->GetImageViewAddressNVX = (PFN_vkGetImageViewAddressNVX) gpa(device, "vkGetImageViewAddressNVX");
+ if (table->GetImageViewAddressNVX == nullptr) { table->GetImageViewAddressNVX = (PFN_vkGetImageViewAddressNVX)StubGetImageViewAddressNVX; }
table->CmdDrawIndirectCountAMD = (PFN_vkCmdDrawIndirectCountAMD) gpa(device, "vkCmdDrawIndirectCountAMD");
if (table->CmdDrawIndirectCountAMD == nullptr) { table->CmdDrawIndirectCountAMD = (PFN_vkCmdDrawIndirectCountAMD)StubCmdDrawIndirectCountAMD; }
table->CmdDrawIndexedIndirectCountAMD = (PFN_vkCmdDrawIndexedIndirectCountAMD) gpa(device, "vkCmdDrawIndexedIndirectCountAMD");
@@ -1194,6 +1236,30 @@
if (table->CmdSetLineStippleEXT == nullptr) { table->CmdSetLineStippleEXT = (PFN_vkCmdSetLineStippleEXT)StubCmdSetLineStippleEXT; }
table->ResetQueryPoolEXT = (PFN_vkResetQueryPoolEXT) gpa(device, "vkResetQueryPoolEXT");
if (table->ResetQueryPoolEXT == nullptr) { table->ResetQueryPoolEXT = (PFN_vkResetQueryPoolEXT)StubResetQueryPoolEXT; }
+ table->CmdSetCullModeEXT = (PFN_vkCmdSetCullModeEXT) gpa(device, "vkCmdSetCullModeEXT");
+ if (table->CmdSetCullModeEXT == nullptr) { table->CmdSetCullModeEXT = (PFN_vkCmdSetCullModeEXT)StubCmdSetCullModeEXT; }
+ table->CmdSetFrontFaceEXT = (PFN_vkCmdSetFrontFaceEXT) gpa(device, "vkCmdSetFrontFaceEXT");
+ if (table->CmdSetFrontFaceEXT == nullptr) { table->CmdSetFrontFaceEXT = (PFN_vkCmdSetFrontFaceEXT)StubCmdSetFrontFaceEXT; }
+ table->CmdSetPrimitiveTopologyEXT = (PFN_vkCmdSetPrimitiveTopologyEXT) gpa(device, "vkCmdSetPrimitiveTopologyEXT");
+ if (table->CmdSetPrimitiveTopologyEXT == nullptr) { table->CmdSetPrimitiveTopologyEXT = (PFN_vkCmdSetPrimitiveTopologyEXT)StubCmdSetPrimitiveTopologyEXT; }
+ table->CmdSetViewportWithCountEXT = (PFN_vkCmdSetViewportWithCountEXT) gpa(device, "vkCmdSetViewportWithCountEXT");
+ if (table->CmdSetViewportWithCountEXT == nullptr) { table->CmdSetViewportWithCountEXT = (PFN_vkCmdSetViewportWithCountEXT)StubCmdSetViewportWithCountEXT; }
+ table->CmdSetScissorWithCountEXT = (PFN_vkCmdSetScissorWithCountEXT) gpa(device, "vkCmdSetScissorWithCountEXT");
+ if (table->CmdSetScissorWithCountEXT == nullptr) { table->CmdSetScissorWithCountEXT = (PFN_vkCmdSetScissorWithCountEXT)StubCmdSetScissorWithCountEXT; }
+ table->CmdBindVertexBuffers2EXT = (PFN_vkCmdBindVertexBuffers2EXT) gpa(device, "vkCmdBindVertexBuffers2EXT");
+ if (table->CmdBindVertexBuffers2EXT == nullptr) { table->CmdBindVertexBuffers2EXT = (PFN_vkCmdBindVertexBuffers2EXT)StubCmdBindVertexBuffers2EXT; }
+ table->CmdSetDepthTestEnableEXT = (PFN_vkCmdSetDepthTestEnableEXT) gpa(device, "vkCmdSetDepthTestEnableEXT");
+ if (table->CmdSetDepthTestEnableEXT == nullptr) { table->CmdSetDepthTestEnableEXT = (PFN_vkCmdSetDepthTestEnableEXT)StubCmdSetDepthTestEnableEXT; }
+ table->CmdSetDepthWriteEnableEXT = (PFN_vkCmdSetDepthWriteEnableEXT) gpa(device, "vkCmdSetDepthWriteEnableEXT");
+ if (table->CmdSetDepthWriteEnableEXT == nullptr) { table->CmdSetDepthWriteEnableEXT = (PFN_vkCmdSetDepthWriteEnableEXT)StubCmdSetDepthWriteEnableEXT; }
+ table->CmdSetDepthCompareOpEXT = (PFN_vkCmdSetDepthCompareOpEXT) gpa(device, "vkCmdSetDepthCompareOpEXT");
+ if (table->CmdSetDepthCompareOpEXT == nullptr) { table->CmdSetDepthCompareOpEXT = (PFN_vkCmdSetDepthCompareOpEXT)StubCmdSetDepthCompareOpEXT; }
+ table->CmdSetDepthBoundsTestEnableEXT = (PFN_vkCmdSetDepthBoundsTestEnableEXT) gpa(device, "vkCmdSetDepthBoundsTestEnableEXT");
+ if (table->CmdSetDepthBoundsTestEnableEXT == nullptr) { table->CmdSetDepthBoundsTestEnableEXT = (PFN_vkCmdSetDepthBoundsTestEnableEXT)StubCmdSetDepthBoundsTestEnableEXT; }
+ table->CmdSetStencilTestEnableEXT = (PFN_vkCmdSetStencilTestEnableEXT) gpa(device, "vkCmdSetStencilTestEnableEXT");
+ if (table->CmdSetStencilTestEnableEXT == nullptr) { table->CmdSetStencilTestEnableEXT = (PFN_vkCmdSetStencilTestEnableEXT)StubCmdSetStencilTestEnableEXT; }
+ table->CmdSetStencilOpEXT = (PFN_vkCmdSetStencilOpEXT) gpa(device, "vkCmdSetStencilOpEXT");
+ if (table->CmdSetStencilOpEXT == nullptr) { table->CmdSetStencilOpEXT = (PFN_vkCmdSetStencilOpEXT)StubCmdSetStencilOpEXT; }
table->GetGeneratedCommandsMemoryRequirementsNV = (PFN_vkGetGeneratedCommandsMemoryRequirementsNV) gpa(device, "vkGetGeneratedCommandsMemoryRequirementsNV");
if (table->GetGeneratedCommandsMemoryRequirementsNV == nullptr) { table->GetGeneratedCommandsMemoryRequirementsNV = (PFN_vkGetGeneratedCommandsMemoryRequirementsNV)StubGetGeneratedCommandsMemoryRequirementsNV; }
table->CmdPreprocessGeneratedCommandsNV = (PFN_vkCmdPreprocessGeneratedCommandsNV) gpa(device, "vkCmdPreprocessGeneratedCommandsNV");
@@ -1206,6 +1272,14 @@
if (table->CreateIndirectCommandsLayoutNV == nullptr) { table->CreateIndirectCommandsLayoutNV = (PFN_vkCreateIndirectCommandsLayoutNV)StubCreateIndirectCommandsLayoutNV; }
table->DestroyIndirectCommandsLayoutNV = (PFN_vkDestroyIndirectCommandsLayoutNV) gpa(device, "vkDestroyIndirectCommandsLayoutNV");
if (table->DestroyIndirectCommandsLayoutNV == nullptr) { table->DestroyIndirectCommandsLayoutNV = (PFN_vkDestroyIndirectCommandsLayoutNV)StubDestroyIndirectCommandsLayoutNV; }
+ table->CreatePrivateDataSlotEXT = (PFN_vkCreatePrivateDataSlotEXT) gpa(device, "vkCreatePrivateDataSlotEXT");
+ if (table->CreatePrivateDataSlotEXT == nullptr) { table->CreatePrivateDataSlotEXT = (PFN_vkCreatePrivateDataSlotEXT)StubCreatePrivateDataSlotEXT; }
+ table->DestroyPrivateDataSlotEXT = (PFN_vkDestroyPrivateDataSlotEXT) gpa(device, "vkDestroyPrivateDataSlotEXT");
+ if (table->DestroyPrivateDataSlotEXT == nullptr) { table->DestroyPrivateDataSlotEXT = (PFN_vkDestroyPrivateDataSlotEXT)StubDestroyPrivateDataSlotEXT; }
+ table->SetPrivateDataEXT = (PFN_vkSetPrivateDataEXT) gpa(device, "vkSetPrivateDataEXT");
+ if (table->SetPrivateDataEXT == nullptr) { table->SetPrivateDataEXT = (PFN_vkSetPrivateDataEXT)StubSetPrivateDataEXT; }
+ table->GetPrivateDataEXT = (PFN_vkGetPrivateDataEXT) gpa(device, "vkGetPrivateDataEXT");
+ if (table->GetPrivateDataEXT == nullptr) { table->GetPrivateDataEXT = (PFN_vkGetPrivateDataEXT)StubGetPrivateDataEXT; }
#ifdef VK_USE_PLATFORM_FUCHSIA
table->CreateBufferCollectionFUCHSIA = (PFN_vkCreateBufferCollectionFUCHSIA) gpa(device, "vkCreateBufferCollectionFUCHSIA");
if (table->CreateBufferCollectionFUCHSIA == nullptr) { table->CreateBufferCollectionFUCHSIA = (PFN_vkCreateBufferCollectionFUCHSIA)StubCreateBufferCollectionFUCHSIA; }
@@ -1520,4 +1594,12 @@
#endif // VK_USE_PLATFORM_WIN32_KHR
table->CreateHeadlessSurfaceEXT = (PFN_vkCreateHeadlessSurfaceEXT) gpa(instance, "vkCreateHeadlessSurfaceEXT");
if (table->CreateHeadlessSurfaceEXT == nullptr) { table->CreateHeadlessSurfaceEXT = (PFN_vkCreateHeadlessSurfaceEXT)StubCreateHeadlessSurfaceEXT; }
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+ table->CreateDirectFBSurfaceEXT = (PFN_vkCreateDirectFBSurfaceEXT) gpa(instance, "vkCreateDirectFBSurfaceEXT");
+ if (table->CreateDirectFBSurfaceEXT == nullptr) { table->CreateDirectFBSurfaceEXT = (PFN_vkCreateDirectFBSurfaceEXT)StubCreateDirectFBSurfaceEXT; }
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+ table->GetPhysicalDeviceDirectFBPresentationSupportEXT = (PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT) gpa(instance, "vkGetPhysicalDeviceDirectFBPresentationSupportEXT");
+ if (table->GetPhysicalDeviceDirectFBPresentationSupportEXT == nullptr) { table->GetPhysicalDeviceDirectFBPresentationSupportEXT = (PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT)StubGetPhysicalDeviceDirectFBPresentationSupportEXT; }
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
}
diff --git a/layers/generated/vk_enum_string_helper.h b/layers/generated/vk_enum_string_helper.h
index ecc0e92..d745b05 100644
--- a/layers/generated/vk_enum_string_helper.h
+++ b/layers/generated/vk_enum_string_helper.h
@@ -31,7 +31,7 @@
#pragma once
-#ifdef _WIN32
+#ifdef _MSC_VER
#pragma warning( disable : 4065 )
#endif
@@ -39,17 +39,6 @@
#include <vulkan/vulkan.h>
-static inline const char* string_VkPipelineCacheHeaderVersion(VkPipelineCacheHeaderVersion input_value)
-{
- switch ((VkPipelineCacheHeaderVersion)input_value)
- {
- case VK_PIPELINE_CACHE_HEADER_VERSION_ONE:
- return "VK_PIPELINE_CACHE_HEADER_VERSION_ONE";
- default:
- return "Unhandled VkPipelineCacheHeaderVersion";
- }
-}
-
static inline const char* string_VkResult(VkResult input_value)
{
switch ((VkResult)input_value)
@@ -100,8 +89,6 @@
return "VK_ERROR_OUT_OF_HOST_MEMORY";
case VK_ERROR_OUT_OF_POOL_MEMORY:
return "VK_ERROR_OUT_OF_POOL_MEMORY";
- case VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT:
- return "VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT";
case VK_ERROR_SURFACE_LOST_KHR:
return "VK_ERROR_SURFACE_LOST_KHR";
case VK_ERROR_TOO_MANY_OBJECTS:
@@ -122,6 +109,8 @@
return "VK_OPERATION_DEFERRED_KHR";
case VK_OPERATION_NOT_DEFERRED_KHR:
return "VK_OPERATION_NOT_DEFERRED_KHR";
+ case VK_PIPELINE_COMPILE_REQUIRED_EXT:
+ return "VK_PIPELINE_COMPILE_REQUIRED_EXT";
case VK_SUBOPTIMAL_KHR:
return "VK_SUBOPTIMAL_KHR";
case VK_SUCCESS:
@@ -159,8 +148,6 @@
return "VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR";
case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR:
return "VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR";
- case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_KHR:
- return "VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_KHR";
case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV:
return "VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV";
case VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_KHR:
@@ -333,12 +320,16 @@
return "VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO";
case VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD:
return "VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD";
+ case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT:
+ return "VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT";
case VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO:
return "VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO";
case VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT:
return "VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT";
case VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2:
return "VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2";
+ case VK_STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT:
+ return "VK_STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT";
case VK_STRUCTURE_TYPE_DISPLAY_EVENT_INFO_EXT:
return "VK_STRUCTURE_TYPE_DISPLAY_EVENT_INFO_EXT";
case VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR:
@@ -465,6 +456,8 @@
return "VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO";
case VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR:
return "VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR";
+ case VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX:
+ return "VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX";
case VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT:
return "VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT";
case VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO:
@@ -587,6 +580,10 @@
return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV:
return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT:
+ return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT:
+ return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV:
return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT:
@@ -609,6 +606,8 @@
return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV:
return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT:
+ return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO:
return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO:
@@ -623,6 +622,10 @@
return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES:
return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT:
+ return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT:
+ return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT:
return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT:
@@ -643,6 +646,8 @@
return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2:
return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT:
+ return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT:
return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT:
@@ -685,6 +690,8 @@
return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES:
return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT:
+ return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2:
return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES:
@@ -701,6 +708,10 @@
return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV:
return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT:
+ return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT:
+ return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES:
return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES:
@@ -711,6 +722,8 @@
return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES:
return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES";
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT:
+ return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES:
return "VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES";
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR:
@@ -873,14 +886,16 @@
return "VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR";
case VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE:
return "VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE";
+ case VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO_EXT:
+ return "VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO_EXT";
case VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO:
return "VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO";
case VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO:
return "VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO";
- case VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL:
- return "VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL";
case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR:
return "VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR";
+ case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL:
+ return "VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL";
case VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV:
return "VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV";
case VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2:
@@ -915,6 +930,8 @@
return "VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM";
case VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO:
return "VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO";
+ case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT:
+ return "VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT";
case VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO:
return "VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO";
case VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO:
@@ -1026,6 +1043,302 @@
}
}
+static inline const char* string_VkAccessFlagBits(VkAccessFlagBits input_value)
+{
+ switch ((VkAccessFlagBits)input_value)
+ {
+ case VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR:
+ return "VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR";
+ case VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR:
+ return "VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR";
+ case VK_ACCESS_COLOR_ATTACHMENT_READ_BIT:
+ return "VK_ACCESS_COLOR_ATTACHMENT_READ_BIT";
+ case VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT:
+ return "VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT";
+ case VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT:
+ return "VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT";
+ case VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV:
+ return "VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV";
+ case VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV:
+ return "VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV";
+ case VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT:
+ return "VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT";
+ case VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT:
+ return "VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT";
+ case VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT:
+ return "VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT";
+ case VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT:
+ return "VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT";
+ case VK_ACCESS_HOST_READ_BIT:
+ return "VK_ACCESS_HOST_READ_BIT";
+ case VK_ACCESS_HOST_WRITE_BIT:
+ return "VK_ACCESS_HOST_WRITE_BIT";
+ case VK_ACCESS_INDEX_READ_BIT:
+ return "VK_ACCESS_INDEX_READ_BIT";
+ case VK_ACCESS_INDIRECT_COMMAND_READ_BIT:
+ return "VK_ACCESS_INDIRECT_COMMAND_READ_BIT";
+ case VK_ACCESS_INPUT_ATTACHMENT_READ_BIT:
+ return "VK_ACCESS_INPUT_ATTACHMENT_READ_BIT";
+ case VK_ACCESS_MEMORY_READ_BIT:
+ return "VK_ACCESS_MEMORY_READ_BIT";
+ case VK_ACCESS_MEMORY_WRITE_BIT:
+ return "VK_ACCESS_MEMORY_WRITE_BIT";
+ case VK_ACCESS_SHADER_READ_BIT:
+ return "VK_ACCESS_SHADER_READ_BIT";
+ case VK_ACCESS_SHADER_WRITE_BIT:
+ return "VK_ACCESS_SHADER_WRITE_BIT";
+ case VK_ACCESS_SHADING_RATE_IMAGE_READ_BIT_NV:
+ return "VK_ACCESS_SHADING_RATE_IMAGE_READ_BIT_NV";
+ case VK_ACCESS_TRANSFER_READ_BIT:
+ return "VK_ACCESS_TRANSFER_READ_BIT";
+ case VK_ACCESS_TRANSFER_WRITE_BIT:
+ return "VK_ACCESS_TRANSFER_WRITE_BIT";
+ case VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT:
+ return "VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT";
+ case VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT:
+ return "VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT";
+ case VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT:
+ return "VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT";
+ case VK_ACCESS_UNIFORM_READ_BIT:
+ return "VK_ACCESS_UNIFORM_READ_BIT";
+ case VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT:
+ return "VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT";
+ default:
+ return "Unhandled VkAccessFlagBits";
+ }
+}
+
+static inline std::string string_VkAccessFlags(VkAccessFlags input_value)
+{
+ std::string ret;
+ int index = 0;
+ while(input_value) {
+ if (input_value & 1) {
+ if( !ret.empty()) ret.append("|");
+ ret.append(string_VkAccessFlagBits(static_cast<VkAccessFlagBits>(1 << index)));
+ }
+ ++index;
+ input_value >>= 1;
+ }
+ if( ret.empty()) ret.append(string_VkAccessFlagBits(static_cast<VkAccessFlagBits>(0)));
+ return ret;
+}
+
+static inline const char* string_VkImageLayout(VkImageLayout input_value)
+{
+ switch ((VkImageLayout)input_value)
+ {
+ case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
+ return "VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL";
+ case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL:
+ return "VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL";
+ case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL:
+ return "VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL";
+ case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL:
+ return "VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL";
+ case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL:
+ return "VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL";
+ case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
+ return "VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL";
+ case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
+ return "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL";
+ case VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT:
+ return "VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT";
+ case VK_IMAGE_LAYOUT_GENERAL:
+ return "VK_IMAGE_LAYOUT_GENERAL";
+ case VK_IMAGE_LAYOUT_PREINITIALIZED:
+ return "VK_IMAGE_LAYOUT_PREINITIALIZED";
+ case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR:
+ return "VK_IMAGE_LAYOUT_PRESENT_SRC_KHR";
+ case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
+ return "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL";
+ case VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV:
+ return "VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV";
+ case VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR:
+ return "VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR";
+ case VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL:
+ return "VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL";
+ case VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL:
+ return "VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL";
+ case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
+ return "VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL";
+ case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
+ return "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL";
+ case VK_IMAGE_LAYOUT_UNDEFINED:
+ return "VK_IMAGE_LAYOUT_UNDEFINED";
+ default:
+ return "Unhandled VkImageLayout";
+ }
+}
+
+static inline const char* string_VkImageAspectFlagBits(VkImageAspectFlagBits input_value)
+{
+ switch ((VkImageAspectFlagBits)input_value)
+ {
+ case VK_IMAGE_ASPECT_COLOR_BIT:
+ return "VK_IMAGE_ASPECT_COLOR_BIT";
+ case VK_IMAGE_ASPECT_DEPTH_BIT:
+ return "VK_IMAGE_ASPECT_DEPTH_BIT";
+ case VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT:
+ return "VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT";
+ case VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT:
+ return "VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT";
+ case VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT:
+ return "VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT";
+ case VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT:
+ return "VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT";
+ case VK_IMAGE_ASPECT_METADATA_BIT:
+ return "VK_IMAGE_ASPECT_METADATA_BIT";
+ case VK_IMAGE_ASPECT_PLANE_0_BIT:
+ return "VK_IMAGE_ASPECT_PLANE_0_BIT";
+ case VK_IMAGE_ASPECT_PLANE_1_BIT:
+ return "VK_IMAGE_ASPECT_PLANE_1_BIT";
+ case VK_IMAGE_ASPECT_PLANE_2_BIT:
+ return "VK_IMAGE_ASPECT_PLANE_2_BIT";
+ case VK_IMAGE_ASPECT_STENCIL_BIT:
+ return "VK_IMAGE_ASPECT_STENCIL_BIT";
+ default:
+ return "Unhandled VkImageAspectFlagBits";
+ }
+}
+
+static inline std::string string_VkImageAspectFlags(VkImageAspectFlags input_value)
+{
+ std::string ret;
+ int index = 0;
+ while(input_value) {
+ if (input_value & 1) {
+ if( !ret.empty()) ret.append("|");
+ ret.append(string_VkImageAspectFlagBits(static_cast<VkImageAspectFlagBits>(1 << index)));
+ }
+ ++index;
+ input_value >>= 1;
+ }
+ if( ret.empty()) ret.append(string_VkImageAspectFlagBits(static_cast<VkImageAspectFlagBits>(0)));
+ return ret;
+}
+
+static inline const char* string_VkObjectType(VkObjectType input_value)
+{
+ switch ((VkObjectType)input_value)
+ {
+ case VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR:
+ return "VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR";
+ case VK_OBJECT_TYPE_BUFFER:
+ return "VK_OBJECT_TYPE_BUFFER";
+ case VK_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA:
+ return "VK_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA";
+ case VK_OBJECT_TYPE_BUFFER_VIEW:
+ return "VK_OBJECT_TYPE_BUFFER_VIEW";
+ case VK_OBJECT_TYPE_COMMAND_BUFFER:
+ return "VK_OBJECT_TYPE_COMMAND_BUFFER";
+ case VK_OBJECT_TYPE_COMMAND_POOL:
+ return "VK_OBJECT_TYPE_COMMAND_POOL";
+ case VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT:
+ return "VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT";
+ case VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT:
+ return "VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT";
+ case VK_OBJECT_TYPE_DEFERRED_OPERATION_KHR:
+ return "VK_OBJECT_TYPE_DEFERRED_OPERATION_KHR";
+ case VK_OBJECT_TYPE_DESCRIPTOR_POOL:
+ return "VK_OBJECT_TYPE_DESCRIPTOR_POOL";
+ case VK_OBJECT_TYPE_DESCRIPTOR_SET:
+ return "VK_OBJECT_TYPE_DESCRIPTOR_SET";
+ case VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT:
+ return "VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT";
+ case VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE:
+ return "VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE";
+ case VK_OBJECT_TYPE_DEVICE:
+ return "VK_OBJECT_TYPE_DEVICE";
+ case VK_OBJECT_TYPE_DEVICE_MEMORY:
+ return "VK_OBJECT_TYPE_DEVICE_MEMORY";
+ case VK_OBJECT_TYPE_DISPLAY_KHR:
+ return "VK_OBJECT_TYPE_DISPLAY_KHR";
+ case VK_OBJECT_TYPE_DISPLAY_MODE_KHR:
+ return "VK_OBJECT_TYPE_DISPLAY_MODE_KHR";
+ case VK_OBJECT_TYPE_EVENT:
+ return "VK_OBJECT_TYPE_EVENT";
+ case VK_OBJECT_TYPE_FENCE:
+ return "VK_OBJECT_TYPE_FENCE";
+ case VK_OBJECT_TYPE_FRAMEBUFFER:
+ return "VK_OBJECT_TYPE_FRAMEBUFFER";
+ case VK_OBJECT_TYPE_IMAGE:
+ return "VK_OBJECT_TYPE_IMAGE";
+ case VK_OBJECT_TYPE_IMAGE_VIEW:
+ return "VK_OBJECT_TYPE_IMAGE_VIEW";
+ case VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV:
+ return "VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV";
+ case VK_OBJECT_TYPE_INSTANCE:
+ return "VK_OBJECT_TYPE_INSTANCE";
+ case VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL:
+ return "VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL";
+ case VK_OBJECT_TYPE_PHYSICAL_DEVICE:
+ return "VK_OBJECT_TYPE_PHYSICAL_DEVICE";
+ case VK_OBJECT_TYPE_PIPELINE:
+ return "VK_OBJECT_TYPE_PIPELINE";
+ case VK_OBJECT_TYPE_PIPELINE_CACHE:
+ return "VK_OBJECT_TYPE_PIPELINE_CACHE";
+ case VK_OBJECT_TYPE_PIPELINE_LAYOUT:
+ return "VK_OBJECT_TYPE_PIPELINE_LAYOUT";
+ case VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT:
+ return "VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT";
+ case VK_OBJECT_TYPE_QUERY_POOL:
+ return "VK_OBJECT_TYPE_QUERY_POOL";
+ case VK_OBJECT_TYPE_QUEUE:
+ return "VK_OBJECT_TYPE_QUEUE";
+ case VK_OBJECT_TYPE_RENDER_PASS:
+ return "VK_OBJECT_TYPE_RENDER_PASS";
+ case VK_OBJECT_TYPE_SAMPLER:
+ return "VK_OBJECT_TYPE_SAMPLER";
+ case VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION:
+ return "VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION";
+ case VK_OBJECT_TYPE_SEMAPHORE:
+ return "VK_OBJECT_TYPE_SEMAPHORE";
+ case VK_OBJECT_TYPE_SHADER_MODULE:
+ return "VK_OBJECT_TYPE_SHADER_MODULE";
+ case VK_OBJECT_TYPE_SURFACE_KHR:
+ return "VK_OBJECT_TYPE_SURFACE_KHR";
+ case VK_OBJECT_TYPE_SWAPCHAIN_KHR:
+ return "VK_OBJECT_TYPE_SWAPCHAIN_KHR";
+ case VK_OBJECT_TYPE_UNKNOWN:
+ return "VK_OBJECT_TYPE_UNKNOWN";
+ case VK_OBJECT_TYPE_VALIDATION_CACHE_EXT:
+ return "VK_OBJECT_TYPE_VALIDATION_CACHE_EXT";
+ default:
+ return "Unhandled VkObjectType";
+ }
+}
+
+static inline const char* string_VkVendorId(VkVendorId input_value)
+{
+ switch ((VkVendorId)input_value)
+ {
+ case VK_VENDOR_ID_CODEPLAY:
+ return "VK_VENDOR_ID_CODEPLAY";
+ case VK_VENDOR_ID_KAZAN:
+ return "VK_VENDOR_ID_KAZAN";
+ case VK_VENDOR_ID_MESA:
+ return "VK_VENDOR_ID_MESA";
+ case VK_VENDOR_ID_VIV:
+ return "VK_VENDOR_ID_VIV";
+ case VK_VENDOR_ID_VSI:
+ return "VK_VENDOR_ID_VSI";
+ default:
+ return "Unhandled VkVendorId";
+ }
+}
+
+static inline const char* string_VkPipelineCacheHeaderVersion(VkPipelineCacheHeaderVersion input_value)
+{
+ switch ((VkPipelineCacheHeaderVersion)input_value)
+ {
+ case VK_PIPELINE_CACHE_HEADER_VERSION_ONE:
+ return "VK_PIPELINE_CACHE_HEADER_VERSION_ONE";
+ default:
+ return "Unhandled VkPipelineCacheHeaderVersion";
+ }
+}
+
static inline const char* string_VkSystemAllocationScope(VkSystemAllocationScope input_value)
{
switch ((VkSystemAllocationScope)input_value)
@@ -1624,81 +1937,6 @@
return ret;
}
-static inline const char* string_VkImageType(VkImageType input_value)
-{
- switch ((VkImageType)input_value)
- {
- case VK_IMAGE_TYPE_1D:
- return "VK_IMAGE_TYPE_1D";
- case VK_IMAGE_TYPE_2D:
- return "VK_IMAGE_TYPE_2D";
- case VK_IMAGE_TYPE_3D:
- return "VK_IMAGE_TYPE_3D";
- default:
- return "Unhandled VkImageType";
- }
-}
-
-static inline const char* string_VkImageTiling(VkImageTiling input_value)
-{
- switch ((VkImageTiling)input_value)
- {
- case VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT:
- return "VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT";
- case VK_IMAGE_TILING_LINEAR:
- return "VK_IMAGE_TILING_LINEAR";
- case VK_IMAGE_TILING_OPTIMAL:
- return "VK_IMAGE_TILING_OPTIMAL";
- default:
- return "Unhandled VkImageTiling";
- }
-}
-
-static inline const char* string_VkImageUsageFlagBits(VkImageUsageFlagBits input_value)
-{
- switch ((VkImageUsageFlagBits)input_value)
- {
- case VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT:
- return "VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT";
- case VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT:
- return "VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT";
- case VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT:
- return "VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT";
- case VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT:
- return "VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT";
- case VK_IMAGE_USAGE_SAMPLED_BIT:
- return "VK_IMAGE_USAGE_SAMPLED_BIT";
- case VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV:
- return "VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV";
- case VK_IMAGE_USAGE_STORAGE_BIT:
- return "VK_IMAGE_USAGE_STORAGE_BIT";
- case VK_IMAGE_USAGE_TRANSFER_DST_BIT:
- return "VK_IMAGE_USAGE_TRANSFER_DST_BIT";
- case VK_IMAGE_USAGE_TRANSFER_SRC_BIT:
- return "VK_IMAGE_USAGE_TRANSFER_SRC_BIT";
- case VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT:
- return "VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT";
- default:
- return "Unhandled VkImageUsageFlagBits";
- }
-}
-
-static inline std::string string_VkImageUsageFlags(VkImageUsageFlags input_value)
-{
- std::string ret;
- int index = 0;
- while(input_value) {
- if (input_value & 1) {
- if( !ret.empty()) ret.append("|");
- ret.append(string_VkImageUsageFlagBits(static_cast<VkImageUsageFlagBits>(1 << index)));
- }
- ++index;
- input_value >>= 1;
- }
- if( ret.empty()) ret.append(string_VkImageUsageFlagBits(static_cast<VkImageUsageFlagBits>(0)));
- return ret;
-}
-
static inline const char* string_VkImageCreateFlagBits(VkImageCreateFlagBits input_value)
{
switch ((VkImageCreateFlagBits)input_value)
@@ -1793,6 +2031,151 @@
return ret;
}
+static inline const char* string_VkImageTiling(VkImageTiling input_value)
+{
+ switch ((VkImageTiling)input_value)
+ {
+ case VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT:
+ return "VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT";
+ case VK_IMAGE_TILING_LINEAR:
+ return "VK_IMAGE_TILING_LINEAR";
+ case VK_IMAGE_TILING_OPTIMAL:
+ return "VK_IMAGE_TILING_OPTIMAL";
+ default:
+ return "Unhandled VkImageTiling";
+ }
+}
+
+static inline const char* string_VkImageType(VkImageType input_value)
+{
+ switch ((VkImageType)input_value)
+ {
+ case VK_IMAGE_TYPE_1D:
+ return "VK_IMAGE_TYPE_1D";
+ case VK_IMAGE_TYPE_2D:
+ return "VK_IMAGE_TYPE_2D";
+ case VK_IMAGE_TYPE_3D:
+ return "VK_IMAGE_TYPE_3D";
+ default:
+ return "Unhandled VkImageType";
+ }
+}
+
+static inline const char* string_VkImageUsageFlagBits(VkImageUsageFlagBits input_value)
+{
+ switch ((VkImageUsageFlagBits)input_value)
+ {
+ case VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT:
+ return "VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT";
+ case VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT:
+ return "VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT";
+ case VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT:
+ return "VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT";
+ case VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT:
+ return "VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT";
+ case VK_IMAGE_USAGE_SAMPLED_BIT:
+ return "VK_IMAGE_USAGE_SAMPLED_BIT";
+ case VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV:
+ return "VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV";
+ case VK_IMAGE_USAGE_STORAGE_BIT:
+ return "VK_IMAGE_USAGE_STORAGE_BIT";
+ case VK_IMAGE_USAGE_TRANSFER_DST_BIT:
+ return "VK_IMAGE_USAGE_TRANSFER_DST_BIT";
+ case VK_IMAGE_USAGE_TRANSFER_SRC_BIT:
+ return "VK_IMAGE_USAGE_TRANSFER_SRC_BIT";
+ case VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT:
+ return "VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT";
+ default:
+ return "Unhandled VkImageUsageFlagBits";
+ }
+}
+
+static inline std::string string_VkImageUsageFlags(VkImageUsageFlags input_value)
+{
+ std::string ret;
+ int index = 0;
+ while(input_value) {
+ if (input_value & 1) {
+ if( !ret.empty()) ret.append("|");
+ ret.append(string_VkImageUsageFlagBits(static_cast<VkImageUsageFlagBits>(1 << index)));
+ }
+ ++index;
+ input_value >>= 1;
+ }
+ if( ret.empty()) ret.append(string_VkImageUsageFlagBits(static_cast<VkImageUsageFlagBits>(0)));
+ return ret;
+}
+
+static inline const char* string_VkMemoryHeapFlagBits(VkMemoryHeapFlagBits input_value)
+{
+ switch ((VkMemoryHeapFlagBits)input_value)
+ {
+ case VK_MEMORY_HEAP_DEVICE_LOCAL_BIT:
+ return "VK_MEMORY_HEAP_DEVICE_LOCAL_BIT";
+ case VK_MEMORY_HEAP_MULTI_INSTANCE_BIT:
+ return "VK_MEMORY_HEAP_MULTI_INSTANCE_BIT";
+ default:
+ return "Unhandled VkMemoryHeapFlagBits";
+ }
+}
+
+static inline std::string string_VkMemoryHeapFlags(VkMemoryHeapFlags input_value)
+{
+ std::string ret;
+ int index = 0;
+ while(input_value) {
+ if (input_value & 1) {
+ if( !ret.empty()) ret.append("|");
+ ret.append(string_VkMemoryHeapFlagBits(static_cast<VkMemoryHeapFlagBits>(1 << index)));
+ }
+ ++index;
+ input_value >>= 1;
+ }
+ if( ret.empty()) ret.append(string_VkMemoryHeapFlagBits(static_cast<VkMemoryHeapFlagBits>(0)));
+ return ret;
+}
+
+static inline const char* string_VkMemoryPropertyFlagBits(VkMemoryPropertyFlagBits input_value)
+{
+ switch ((VkMemoryPropertyFlagBits)input_value)
+ {
+ case VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD:
+ return "VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD";
+ case VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT:
+ return "VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT";
+ case VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD:
+ return "VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD";
+ case VK_MEMORY_PROPERTY_HOST_CACHED_BIT:
+ return "VK_MEMORY_PROPERTY_HOST_CACHED_BIT";
+ case VK_MEMORY_PROPERTY_HOST_COHERENT_BIT:
+ return "VK_MEMORY_PROPERTY_HOST_COHERENT_BIT";
+ case VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT:
+ return "VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT";
+ case VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT:
+ return "VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT";
+ case VK_MEMORY_PROPERTY_PROTECTED_BIT:
+ return "VK_MEMORY_PROPERTY_PROTECTED_BIT";
+ default:
+ return "Unhandled VkMemoryPropertyFlagBits";
+ }
+}
+
+static inline std::string string_VkMemoryPropertyFlags(VkMemoryPropertyFlags input_value)
+{
+ std::string ret;
+ int index = 0;
+ while(input_value) {
+ if (input_value & 1) {
+ if( !ret.empty()) ret.append("|");
+ ret.append(string_VkMemoryPropertyFlagBits(static_cast<VkMemoryPropertyFlagBits>(1 << index)));
+ }
+ ++index;
+ input_value >>= 1;
+ }
+ if( ret.empty()) ret.append(string_VkMemoryPropertyFlagBits(static_cast<VkMemoryPropertyFlagBits>(0)));
+ return ret;
+}
+
static inline const char* string_VkPhysicalDeviceType(VkPhysicalDeviceType input_value)
{
switch ((VkPhysicalDeviceType)input_value)
@@ -1847,76 +2230,6 @@
return ret;
}
-static inline const char* string_VkMemoryPropertyFlagBits(VkMemoryPropertyFlagBits input_value)
-{
- switch ((VkMemoryPropertyFlagBits)input_value)
- {
- case VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD:
- return "VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD";
- case VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT:
- return "VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT";
- case VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD:
- return "VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD";
- case VK_MEMORY_PROPERTY_HOST_CACHED_BIT:
- return "VK_MEMORY_PROPERTY_HOST_CACHED_BIT";
- case VK_MEMORY_PROPERTY_HOST_COHERENT_BIT:
- return "VK_MEMORY_PROPERTY_HOST_COHERENT_BIT";
- case VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT:
- return "VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT";
- case VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT:
- return "VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT";
- case VK_MEMORY_PROPERTY_PROTECTED_BIT:
- return "VK_MEMORY_PROPERTY_PROTECTED_BIT";
- default:
- return "Unhandled VkMemoryPropertyFlagBits";
- }
-}
-
-static inline std::string string_VkMemoryPropertyFlags(VkMemoryPropertyFlags input_value)
-{
- std::string ret;
- int index = 0;
- while(input_value) {
- if (input_value & 1) {
- if( !ret.empty()) ret.append("|");
- ret.append(string_VkMemoryPropertyFlagBits(static_cast<VkMemoryPropertyFlagBits>(1 << index)));
- }
- ++index;
- input_value >>= 1;
- }
- if( ret.empty()) ret.append(string_VkMemoryPropertyFlagBits(static_cast<VkMemoryPropertyFlagBits>(0)));
- return ret;
-}
-
-static inline const char* string_VkMemoryHeapFlagBits(VkMemoryHeapFlagBits input_value)
-{
- switch ((VkMemoryHeapFlagBits)input_value)
- {
- case VK_MEMORY_HEAP_DEVICE_LOCAL_BIT:
- return "VK_MEMORY_HEAP_DEVICE_LOCAL_BIT";
- case VK_MEMORY_HEAP_MULTI_INSTANCE_BIT:
- return "VK_MEMORY_HEAP_MULTI_INSTANCE_BIT";
- default:
- return "Unhandled VkMemoryHeapFlagBits";
- }
-}
-
-static inline std::string string_VkMemoryHeapFlags(VkMemoryHeapFlags input_value)
-{
- std::string ret;
- int index = 0;
- while(input_value) {
- if (input_value & 1) {
- if( !ret.empty()) ret.append("|");
- ret.append(string_VkMemoryHeapFlagBits(static_cast<VkMemoryHeapFlagBits>(1 << index)));
- }
- ++index;
- input_value >>= 1;
- }
- if( ret.empty()) ret.append(string_VkMemoryHeapFlagBits(static_cast<VkMemoryHeapFlagBits>(0)));
- return ret;
-}
-
static inline const char* string_VkDeviceQueueCreateFlagBits(VkDeviceQueueCreateFlagBits input_value)
{
switch ((VkDeviceQueueCreateFlagBits)input_value)
@@ -2021,50 +2334,30 @@
return ret;
}
-static inline const char* string_VkImageAspectFlagBits(VkImageAspectFlagBits input_value)
+static inline const char* string_VkSparseMemoryBindFlagBits(VkSparseMemoryBindFlagBits input_value)
{
- switch ((VkImageAspectFlagBits)input_value)
+ switch ((VkSparseMemoryBindFlagBits)input_value)
{
- case VK_IMAGE_ASPECT_COLOR_BIT:
- return "VK_IMAGE_ASPECT_COLOR_BIT";
- case VK_IMAGE_ASPECT_DEPTH_BIT:
- return "VK_IMAGE_ASPECT_DEPTH_BIT";
- case VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT:
- return "VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT";
- case VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT:
- return "VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT";
- case VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT:
- return "VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT";
- case VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT:
- return "VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT";
- case VK_IMAGE_ASPECT_METADATA_BIT:
- return "VK_IMAGE_ASPECT_METADATA_BIT";
- case VK_IMAGE_ASPECT_PLANE_0_BIT:
- return "VK_IMAGE_ASPECT_PLANE_0_BIT";
- case VK_IMAGE_ASPECT_PLANE_1_BIT:
- return "VK_IMAGE_ASPECT_PLANE_1_BIT";
- case VK_IMAGE_ASPECT_PLANE_2_BIT:
- return "VK_IMAGE_ASPECT_PLANE_2_BIT";
- case VK_IMAGE_ASPECT_STENCIL_BIT:
- return "VK_IMAGE_ASPECT_STENCIL_BIT";
+ case VK_SPARSE_MEMORY_BIND_METADATA_BIT:
+ return "VK_SPARSE_MEMORY_BIND_METADATA_BIT";
default:
- return "Unhandled VkImageAspectFlagBits";
+ return "Unhandled VkSparseMemoryBindFlagBits";
}
}
-static inline std::string string_VkImageAspectFlags(VkImageAspectFlags input_value)
+static inline std::string string_VkSparseMemoryBindFlags(VkSparseMemoryBindFlags input_value)
{
std::string ret;
int index = 0;
while(input_value) {
if (input_value & 1) {
if( !ret.empty()) ret.append("|");
- ret.append(string_VkImageAspectFlagBits(static_cast<VkImageAspectFlagBits>(1 << index)));
+ ret.append(string_VkSparseMemoryBindFlagBits(static_cast<VkSparseMemoryBindFlagBits>(1 << index)));
}
++index;
input_value >>= 1;
}
- if( ret.empty()) ret.append(string_VkImageAspectFlagBits(static_cast<VkImageAspectFlagBits>(0)));
+ if( ret.empty()) ret.append(string_VkSparseMemoryBindFlagBits(static_cast<VkSparseMemoryBindFlagBits>(0)));
return ret;
}
@@ -2099,33 +2392,6 @@
return ret;
}
-static inline const char* string_VkSparseMemoryBindFlagBits(VkSparseMemoryBindFlagBits input_value)
-{
- switch ((VkSparseMemoryBindFlagBits)input_value)
- {
- case VK_SPARSE_MEMORY_BIND_METADATA_BIT:
- return "VK_SPARSE_MEMORY_BIND_METADATA_BIT";
- default:
- return "Unhandled VkSparseMemoryBindFlagBits";
- }
-}
-
-static inline std::string string_VkSparseMemoryBindFlags(VkSparseMemoryBindFlags input_value)
-{
- std::string ret;
- int index = 0;
- while(input_value) {
- if (input_value & 1) {
- if( !ret.empty()) ret.append("|");
- ret.append(string_VkSparseMemoryBindFlagBits(static_cast<VkSparseMemoryBindFlagBits>(1 << index)));
- }
- ++index;
- input_value >>= 1;
- }
- if( ret.empty()) ret.append(string_VkSparseMemoryBindFlagBits(static_cast<VkSparseMemoryBindFlagBits>(0)));
- return ret;
-}
-
static inline const char* string_VkFenceCreateFlagBits(VkFenceCreateFlagBits input_value)
{
switch ((VkFenceCreateFlagBits)input_value)
@@ -2153,31 +2419,6 @@
return ret;
}
-static inline const char* string_VkQueryType(VkQueryType input_value)
-{
- switch ((VkQueryType)input_value)
- {
- case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR:
- return "VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR";
- case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR:
- return "VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR";
- case VK_QUERY_TYPE_OCCLUSION:
- return "VK_QUERY_TYPE_OCCLUSION";
- case VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL:
- return "VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL";
- case VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR:
- return "VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR";
- case VK_QUERY_TYPE_PIPELINE_STATISTICS:
- return "VK_QUERY_TYPE_PIPELINE_STATISTICS";
- case VK_QUERY_TYPE_TIMESTAMP:
- return "VK_QUERY_TYPE_TIMESTAMP";
- case VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT:
- return "VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT";
- default:
- return "Unhandled VkQueryType";
- }
-}
-
static inline const char* string_VkQueryPipelineStatisticFlagBits(VkQueryPipelineStatisticFlagBits input_value)
{
switch ((VkQueryPipelineStatisticFlagBits)input_value)
@@ -2225,6 +2466,31 @@
return ret;
}
+static inline const char* string_VkQueryType(VkQueryType input_value)
+{
+ switch ((VkQueryType)input_value)
+ {
+ case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR:
+ return "VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR";
+ case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR:
+ return "VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR";
+ case VK_QUERY_TYPE_OCCLUSION:
+ return "VK_QUERY_TYPE_OCCLUSION";
+ case VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL:
+ return "VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL";
+ case VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR:
+ return "VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR";
+ case VK_QUERY_TYPE_PIPELINE_STATISTICS:
+ return "VK_QUERY_TYPE_PIPELINE_STATISTICS";
+ case VK_QUERY_TYPE_TIMESTAMP:
+ return "VK_QUERY_TYPE_TIMESTAMP";
+ case VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT:
+ return "VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT";
+ default:
+ return "Unhandled VkQueryType";
+ }
+}
+
static inline const char* string_VkQueryResultFlagBits(VkQueryResultFlagBits input_value)
{
switch ((VkQueryResultFlagBits)input_value)
@@ -2359,50 +2625,26 @@
}
}
-static inline const char* string_VkImageLayout(VkImageLayout input_value)
+static inline const char* string_VkComponentSwizzle(VkComponentSwizzle input_value)
{
- switch ((VkImageLayout)input_value)
+ switch ((VkComponentSwizzle)input_value)
{
- case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
- return "VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL";
- case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL:
- return "VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL";
- case VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL:
- return "VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL";
- case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL:
- return "VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL";
- case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL:
- return "VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL";
- case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
- return "VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL";
- case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
- return "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL";
- case VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT:
- return "VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT";
- case VK_IMAGE_LAYOUT_GENERAL:
- return "VK_IMAGE_LAYOUT_GENERAL";
- case VK_IMAGE_LAYOUT_PREINITIALIZED:
- return "VK_IMAGE_LAYOUT_PREINITIALIZED";
- case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR:
- return "VK_IMAGE_LAYOUT_PRESENT_SRC_KHR";
- case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
- return "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL";
- case VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV:
- return "VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV";
- case VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR:
- return "VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR";
- case VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL:
- return "VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL";
- case VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL:
- return "VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL";
- case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
- return "VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL";
- case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
- return "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL";
- case VK_IMAGE_LAYOUT_UNDEFINED:
- return "VK_IMAGE_LAYOUT_UNDEFINED";
+ case VK_COMPONENT_SWIZZLE_A:
+ return "VK_COMPONENT_SWIZZLE_A";
+ case VK_COMPONENT_SWIZZLE_B:
+ return "VK_COMPONENT_SWIZZLE_B";
+ case VK_COMPONENT_SWIZZLE_G:
+ return "VK_COMPONENT_SWIZZLE_G";
+ case VK_COMPONENT_SWIZZLE_IDENTITY:
+ return "VK_COMPONENT_SWIZZLE_IDENTITY";
+ case VK_COMPONENT_SWIZZLE_ONE:
+ return "VK_COMPONENT_SWIZZLE_ONE";
+ case VK_COMPONENT_SWIZZLE_R:
+ return "VK_COMPONENT_SWIZZLE_R";
+ case VK_COMPONENT_SWIZZLE_ZERO:
+ return "VK_COMPONENT_SWIZZLE_ZERO";
default:
- return "Unhandled VkImageLayout";
+ return "Unhandled VkComponentSwizzle";
}
}
@@ -2410,6 +2652,8 @@
{
switch ((VkImageViewCreateFlagBits)input_value)
{
+ case VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT:
+ return "VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT";
case VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT:
return "VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT";
default:
@@ -2456,29 +2700,6 @@
}
}
-static inline const char* string_VkComponentSwizzle(VkComponentSwizzle input_value)
-{
- switch ((VkComponentSwizzle)input_value)
- {
- case VK_COMPONENT_SWIZZLE_A:
- return "VK_COMPONENT_SWIZZLE_A";
- case VK_COMPONENT_SWIZZLE_B:
- return "VK_COMPONENT_SWIZZLE_B";
- case VK_COMPONENT_SWIZZLE_G:
- return "VK_COMPONENT_SWIZZLE_G";
- case VK_COMPONENT_SWIZZLE_IDENTITY:
- return "VK_COMPONENT_SWIZZLE_IDENTITY";
- case VK_COMPONENT_SWIZZLE_ONE:
- return "VK_COMPONENT_SWIZZLE_ONE";
- case VK_COMPONENT_SWIZZLE_R:
- return "VK_COMPONENT_SWIZZLE_R";
- case VK_COMPONENT_SWIZZLE_ZERO:
- return "VK_COMPONENT_SWIZZLE_ZERO";
- default:
- return "Unhandled VkComponentSwizzle";
- }
-}
-
static inline const char* string_VkPipelineCacheCreateFlagBits(VkPipelineCacheCreateFlagBits input_value)
{
switch ((VkPipelineCacheCreateFlagBits)input_value)
@@ -2506,351 +2727,6 @@
return ret;
}
-static inline const char* string_VkPipelineCreateFlagBits(VkPipelineCreateFlagBits input_value)
-{
- switch ((VkPipelineCreateFlagBits)input_value)
- {
- case VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT:
- return "VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT";
- case VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR:
- return "VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR";
- case VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR:
- return "VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR";
- case VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV:
- return "VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV";
- case VK_PIPELINE_CREATE_DERIVATIVE_BIT:
- return "VK_PIPELINE_CREATE_DERIVATIVE_BIT";
- case VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT:
- return "VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT";
- case VK_PIPELINE_CREATE_DISPATCH_BASE_BIT:
- return "VK_PIPELINE_CREATE_DISPATCH_BASE_BIT";
- case VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT:
- return "VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT";
- case VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT:
- return "VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT";
- case VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV:
- return "VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV";
- case VK_PIPELINE_CREATE_LIBRARY_BIT_KHR:
- return "VK_PIPELINE_CREATE_LIBRARY_BIT_KHR";
- case VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR:
- return "VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR";
- case VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR:
- return "VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR";
- case VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR:
- return "VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR";
- case VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR:
- return "VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR";
- case VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR:
- return "VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR";
- case VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR:
- return "VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR";
- case VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT:
- return "VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT";
- default:
- return "Unhandled VkPipelineCreateFlagBits";
- }
-}
-
-static inline std::string string_VkPipelineCreateFlags(VkPipelineCreateFlags input_value)
-{
- std::string ret;
- int index = 0;
- while(input_value) {
- if (input_value & 1) {
- if( !ret.empty()) ret.append("|");
- ret.append(string_VkPipelineCreateFlagBits(static_cast<VkPipelineCreateFlagBits>(1 << index)));
- }
- ++index;
- input_value >>= 1;
- }
- if( ret.empty()) ret.append(string_VkPipelineCreateFlagBits(static_cast<VkPipelineCreateFlagBits>(0)));
- return ret;
-}
-
-static inline const char* string_VkPipelineShaderStageCreateFlagBits(VkPipelineShaderStageCreateFlagBits input_value)
-{
- switch ((VkPipelineShaderStageCreateFlagBits)input_value)
- {
- case VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT:
- return "VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT";
- case VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT:
- return "VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT";
- default:
- return "Unhandled VkPipelineShaderStageCreateFlagBits";
- }
-}
-
-static inline std::string string_VkPipelineShaderStageCreateFlags(VkPipelineShaderStageCreateFlags input_value)
-{
- std::string ret;
- int index = 0;
- while(input_value) {
- if (input_value & 1) {
- if( !ret.empty()) ret.append("|");
- ret.append(string_VkPipelineShaderStageCreateFlagBits(static_cast<VkPipelineShaderStageCreateFlagBits>(1 << index)));
- }
- ++index;
- input_value >>= 1;
- }
- if( ret.empty()) ret.append(string_VkPipelineShaderStageCreateFlagBits(static_cast<VkPipelineShaderStageCreateFlagBits>(0)));
- return ret;
-}
-
-static inline const char* string_VkShaderStageFlagBits(VkShaderStageFlagBits input_value)
-{
- switch ((VkShaderStageFlagBits)input_value)
- {
- case VK_SHADER_STAGE_ALL:
- return "VK_SHADER_STAGE_ALL";
- case VK_SHADER_STAGE_ALL_GRAPHICS:
- return "VK_SHADER_STAGE_ALL_GRAPHICS";
- case VK_SHADER_STAGE_ANY_HIT_BIT_KHR:
- return "VK_SHADER_STAGE_ANY_HIT_BIT_KHR";
- case VK_SHADER_STAGE_CALLABLE_BIT_KHR:
- return "VK_SHADER_STAGE_CALLABLE_BIT_KHR";
- case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR:
- return "VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR";
- case VK_SHADER_STAGE_COMPUTE_BIT:
- return "VK_SHADER_STAGE_COMPUTE_BIT";
- case VK_SHADER_STAGE_FRAGMENT_BIT:
- return "VK_SHADER_STAGE_FRAGMENT_BIT";
- case VK_SHADER_STAGE_GEOMETRY_BIT:
- return "VK_SHADER_STAGE_GEOMETRY_BIT";
- case VK_SHADER_STAGE_INTERSECTION_BIT_KHR:
- return "VK_SHADER_STAGE_INTERSECTION_BIT_KHR";
- case VK_SHADER_STAGE_MESH_BIT_NV:
- return "VK_SHADER_STAGE_MESH_BIT_NV";
- case VK_SHADER_STAGE_MISS_BIT_KHR:
- return "VK_SHADER_STAGE_MISS_BIT_KHR";
- case VK_SHADER_STAGE_RAYGEN_BIT_KHR:
- return "VK_SHADER_STAGE_RAYGEN_BIT_KHR";
- case VK_SHADER_STAGE_TASK_BIT_NV:
- return "VK_SHADER_STAGE_TASK_BIT_NV";
- case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
- return "VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT";
- case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
- return "VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT";
- case VK_SHADER_STAGE_VERTEX_BIT:
- return "VK_SHADER_STAGE_VERTEX_BIT";
- default:
- return "Unhandled VkShaderStageFlagBits";
- }
-}
-
-static inline std::string string_VkShaderStageFlags(VkShaderStageFlags input_value)
-{
- std::string ret;
- int index = 0;
- while(input_value) {
- if (input_value & 1) {
- if( !ret.empty()) ret.append("|");
- ret.append(string_VkShaderStageFlagBits(static_cast<VkShaderStageFlagBits>(1 << index)));
- }
- ++index;
- input_value >>= 1;
- }
- if( ret.empty()) ret.append(string_VkShaderStageFlagBits(static_cast<VkShaderStageFlagBits>(0)));
- return ret;
-}
-
-static inline const char* string_VkVertexInputRate(VkVertexInputRate input_value)
-{
- switch ((VkVertexInputRate)input_value)
- {
- case VK_VERTEX_INPUT_RATE_INSTANCE:
- return "VK_VERTEX_INPUT_RATE_INSTANCE";
- case VK_VERTEX_INPUT_RATE_VERTEX:
- return "VK_VERTEX_INPUT_RATE_VERTEX";
- default:
- return "Unhandled VkVertexInputRate";
- }
-}
-
-static inline const char* string_VkPrimitiveTopology(VkPrimitiveTopology input_value)
-{
- switch ((VkPrimitiveTopology)input_value)
- {
- case VK_PRIMITIVE_TOPOLOGY_LINE_LIST:
- return "VK_PRIMITIVE_TOPOLOGY_LINE_LIST";
- case VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY:
- return "VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY";
- case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP:
- return "VK_PRIMITIVE_TOPOLOGY_LINE_STRIP";
- case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY:
- return "VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY";
- case VK_PRIMITIVE_TOPOLOGY_PATCH_LIST:
- return "VK_PRIMITIVE_TOPOLOGY_PATCH_LIST";
- case VK_PRIMITIVE_TOPOLOGY_POINT_LIST:
- return "VK_PRIMITIVE_TOPOLOGY_POINT_LIST";
- case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN:
- return "VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN";
- case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
- return "VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST";
- case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY:
- return "VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY";
- case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
- return "VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP";
- case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY:
- return "VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY";
- default:
- return "Unhandled VkPrimitiveTopology";
- }
-}
-
-static inline const char* string_VkPolygonMode(VkPolygonMode input_value)
-{
- switch ((VkPolygonMode)input_value)
- {
- case VK_POLYGON_MODE_FILL:
- return "VK_POLYGON_MODE_FILL";
- case VK_POLYGON_MODE_FILL_RECTANGLE_NV:
- return "VK_POLYGON_MODE_FILL_RECTANGLE_NV";
- case VK_POLYGON_MODE_LINE:
- return "VK_POLYGON_MODE_LINE";
- case VK_POLYGON_MODE_POINT:
- return "VK_POLYGON_MODE_POINT";
- default:
- return "Unhandled VkPolygonMode";
- }
-}
-
-static inline const char* string_VkCullModeFlagBits(VkCullModeFlagBits input_value)
-{
- switch ((VkCullModeFlagBits)input_value)
- {
- case VK_CULL_MODE_BACK_BIT:
- return "VK_CULL_MODE_BACK_BIT";
- case VK_CULL_MODE_FRONT_AND_BACK:
- return "VK_CULL_MODE_FRONT_AND_BACK";
- case VK_CULL_MODE_FRONT_BIT:
- return "VK_CULL_MODE_FRONT_BIT";
- case VK_CULL_MODE_NONE:
- return "VK_CULL_MODE_NONE";
- default:
- return "Unhandled VkCullModeFlagBits";
- }
-}
-
-static inline std::string string_VkCullModeFlags(VkCullModeFlags input_value)
-{
- std::string ret;
- int index = 0;
- while(input_value) {
- if (input_value & 1) {
- if( !ret.empty()) ret.append("|");
- ret.append(string_VkCullModeFlagBits(static_cast<VkCullModeFlagBits>(1 << index)));
- }
- ++index;
- input_value >>= 1;
- }
- if( ret.empty()) ret.append(string_VkCullModeFlagBits(static_cast<VkCullModeFlagBits>(0)));
- return ret;
-}
-
-static inline const char* string_VkFrontFace(VkFrontFace input_value)
-{
- switch ((VkFrontFace)input_value)
- {
- case VK_FRONT_FACE_CLOCKWISE:
- return "VK_FRONT_FACE_CLOCKWISE";
- case VK_FRONT_FACE_COUNTER_CLOCKWISE:
- return "VK_FRONT_FACE_COUNTER_CLOCKWISE";
- default:
- return "Unhandled VkFrontFace";
- }
-}
-
-static inline const char* string_VkCompareOp(VkCompareOp input_value)
-{
- switch ((VkCompareOp)input_value)
- {
- case VK_COMPARE_OP_ALWAYS:
- return "VK_COMPARE_OP_ALWAYS";
- case VK_COMPARE_OP_EQUAL:
- return "VK_COMPARE_OP_EQUAL";
- case VK_COMPARE_OP_GREATER:
- return "VK_COMPARE_OP_GREATER";
- case VK_COMPARE_OP_GREATER_OR_EQUAL:
- return "VK_COMPARE_OP_GREATER_OR_EQUAL";
- case VK_COMPARE_OP_LESS:
- return "VK_COMPARE_OP_LESS";
- case VK_COMPARE_OP_LESS_OR_EQUAL:
- return "VK_COMPARE_OP_LESS_OR_EQUAL";
- case VK_COMPARE_OP_NEVER:
- return "VK_COMPARE_OP_NEVER";
- case VK_COMPARE_OP_NOT_EQUAL:
- return "VK_COMPARE_OP_NOT_EQUAL";
- default:
- return "Unhandled VkCompareOp";
- }
-}
-
-static inline const char* string_VkStencilOp(VkStencilOp input_value)
-{
- switch ((VkStencilOp)input_value)
- {
- case VK_STENCIL_OP_DECREMENT_AND_CLAMP:
- return "VK_STENCIL_OP_DECREMENT_AND_CLAMP";
- case VK_STENCIL_OP_DECREMENT_AND_WRAP:
- return "VK_STENCIL_OP_DECREMENT_AND_WRAP";
- case VK_STENCIL_OP_INCREMENT_AND_CLAMP:
- return "VK_STENCIL_OP_INCREMENT_AND_CLAMP";
- case VK_STENCIL_OP_INCREMENT_AND_WRAP:
- return "VK_STENCIL_OP_INCREMENT_AND_WRAP";
- case VK_STENCIL_OP_INVERT:
- return "VK_STENCIL_OP_INVERT";
- case VK_STENCIL_OP_KEEP:
- return "VK_STENCIL_OP_KEEP";
- case VK_STENCIL_OP_REPLACE:
- return "VK_STENCIL_OP_REPLACE";
- case VK_STENCIL_OP_ZERO:
- return "VK_STENCIL_OP_ZERO";
- default:
- return "Unhandled VkStencilOp";
- }
-}
-
-static inline const char* string_VkLogicOp(VkLogicOp input_value)
-{
- switch ((VkLogicOp)input_value)
- {
- case VK_LOGIC_OP_AND:
- return "VK_LOGIC_OP_AND";
- case VK_LOGIC_OP_AND_INVERTED:
- return "VK_LOGIC_OP_AND_INVERTED";
- case VK_LOGIC_OP_AND_REVERSE:
- return "VK_LOGIC_OP_AND_REVERSE";
- case VK_LOGIC_OP_CLEAR:
- return "VK_LOGIC_OP_CLEAR";
- case VK_LOGIC_OP_COPY:
- return "VK_LOGIC_OP_COPY";
- case VK_LOGIC_OP_COPY_INVERTED:
- return "VK_LOGIC_OP_COPY_INVERTED";
- case VK_LOGIC_OP_EQUIVALENT:
- return "VK_LOGIC_OP_EQUIVALENT";
- case VK_LOGIC_OP_INVERT:
- return "VK_LOGIC_OP_INVERT";
- case VK_LOGIC_OP_NAND:
- return "VK_LOGIC_OP_NAND";
- case VK_LOGIC_OP_NOR:
- return "VK_LOGIC_OP_NOR";
- case VK_LOGIC_OP_NO_OP:
- return "VK_LOGIC_OP_NO_OP";
- case VK_LOGIC_OP_OR:
- return "VK_LOGIC_OP_OR";
- case VK_LOGIC_OP_OR_INVERTED:
- return "VK_LOGIC_OP_OR_INVERTED";
- case VK_LOGIC_OP_OR_REVERSE:
- return "VK_LOGIC_OP_OR_REVERSE";
- case VK_LOGIC_OP_SET:
- return "VK_LOGIC_OP_SET";
- case VK_LOGIC_OP_XOR:
- return "VK_LOGIC_OP_XOR";
- default:
- return "Unhandled VkLogicOp";
- }
-}
-
static inline const char* string_VkBlendFactor(VkBlendFactor input_value)
{
switch ((VkBlendFactor)input_value)
@@ -3042,40 +2918,269 @@
return ret;
}
+static inline const char* string_VkCompareOp(VkCompareOp input_value)
+{
+ switch ((VkCompareOp)input_value)
+ {
+ case VK_COMPARE_OP_ALWAYS:
+ return "VK_COMPARE_OP_ALWAYS";
+ case VK_COMPARE_OP_EQUAL:
+ return "VK_COMPARE_OP_EQUAL";
+ case VK_COMPARE_OP_GREATER:
+ return "VK_COMPARE_OP_GREATER";
+ case VK_COMPARE_OP_GREATER_OR_EQUAL:
+ return "VK_COMPARE_OP_GREATER_OR_EQUAL";
+ case VK_COMPARE_OP_LESS:
+ return "VK_COMPARE_OP_LESS";
+ case VK_COMPARE_OP_LESS_OR_EQUAL:
+ return "VK_COMPARE_OP_LESS_OR_EQUAL";
+ case VK_COMPARE_OP_NEVER:
+ return "VK_COMPARE_OP_NEVER";
+ case VK_COMPARE_OP_NOT_EQUAL:
+ return "VK_COMPARE_OP_NOT_EQUAL";
+ default:
+ return "Unhandled VkCompareOp";
+ }
+}
+
+static inline const char* string_VkPipelineCreateFlagBits(VkPipelineCreateFlagBits input_value)
+{
+ switch ((VkPipelineCreateFlagBits)input_value)
+ {
+ case VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT:
+ return "VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT";
+ case VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR:
+ return "VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR";
+ case VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR:
+ return "VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR";
+ case VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV:
+ return "VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV";
+ case VK_PIPELINE_CREATE_DERIVATIVE_BIT:
+ return "VK_PIPELINE_CREATE_DERIVATIVE_BIT";
+ case VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT:
+ return "VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT";
+ case VK_PIPELINE_CREATE_DISPATCH_BASE_BIT:
+ return "VK_PIPELINE_CREATE_DISPATCH_BASE_BIT";
+ case VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT:
+ return "VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT";
+ case VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT:
+ return "VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT";
+ case VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV:
+ return "VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV";
+ case VK_PIPELINE_CREATE_LIBRARY_BIT_KHR:
+ return "VK_PIPELINE_CREATE_LIBRARY_BIT_KHR";
+ case VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR:
+ return "VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR";
+ case VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR:
+ return "VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR";
+ case VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR:
+ return "VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR";
+ case VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR:
+ return "VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR";
+ case VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR:
+ return "VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR";
+ case VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR:
+ return "VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR";
+ case VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT:
+ return "VK_PIPELINE_CREATE_VIEW_INDEX_FROM_DEVICE_INDEX_BIT";
+ default:
+ return "Unhandled VkPipelineCreateFlagBits";
+ }
+}
+
+static inline std::string string_VkPipelineCreateFlags(VkPipelineCreateFlags input_value)
+{
+ std::string ret;
+ int index = 0;
+ while(input_value) {
+ if (input_value & 1) {
+ if( !ret.empty()) ret.append("|");
+ ret.append(string_VkPipelineCreateFlagBits(static_cast<VkPipelineCreateFlagBits>(1 << index)));
+ }
+ ++index;
+ input_value >>= 1;
+ }
+ if( ret.empty()) ret.append(string_VkPipelineCreateFlagBits(static_cast<VkPipelineCreateFlagBits>(0)));
+ return ret;
+}
+
+static inline const char* string_VkPipelineShaderStageCreateFlagBits(VkPipelineShaderStageCreateFlagBits input_value)
+{
+ switch ((VkPipelineShaderStageCreateFlagBits)input_value)
+ {
+ case VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT:
+ return "VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT";
+ case VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT:
+ return "VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT";
+ default:
+ return "Unhandled VkPipelineShaderStageCreateFlagBits";
+ }
+}
+
+static inline std::string string_VkPipelineShaderStageCreateFlags(VkPipelineShaderStageCreateFlags input_value)
+{
+ std::string ret;
+ int index = 0;
+ while(input_value) {
+ if (input_value & 1) {
+ if( !ret.empty()) ret.append("|");
+ ret.append(string_VkPipelineShaderStageCreateFlagBits(static_cast<VkPipelineShaderStageCreateFlagBits>(1 << index)));
+ }
+ ++index;
+ input_value >>= 1;
+ }
+ if( ret.empty()) ret.append(string_VkPipelineShaderStageCreateFlagBits(static_cast<VkPipelineShaderStageCreateFlagBits>(0)));
+ return ret;
+}
+
+static inline const char* string_VkShaderStageFlagBits(VkShaderStageFlagBits input_value)
+{
+ switch ((VkShaderStageFlagBits)input_value)
+ {
+ case VK_SHADER_STAGE_ALL:
+ return "VK_SHADER_STAGE_ALL";
+ case VK_SHADER_STAGE_ALL_GRAPHICS:
+ return "VK_SHADER_STAGE_ALL_GRAPHICS";
+ case VK_SHADER_STAGE_ANY_HIT_BIT_KHR:
+ return "VK_SHADER_STAGE_ANY_HIT_BIT_KHR";
+ case VK_SHADER_STAGE_CALLABLE_BIT_KHR:
+ return "VK_SHADER_STAGE_CALLABLE_BIT_KHR";
+ case VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR:
+ return "VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR";
+ case VK_SHADER_STAGE_COMPUTE_BIT:
+ return "VK_SHADER_STAGE_COMPUTE_BIT";
+ case VK_SHADER_STAGE_FRAGMENT_BIT:
+ return "VK_SHADER_STAGE_FRAGMENT_BIT";
+ case VK_SHADER_STAGE_GEOMETRY_BIT:
+ return "VK_SHADER_STAGE_GEOMETRY_BIT";
+ case VK_SHADER_STAGE_INTERSECTION_BIT_KHR:
+ return "VK_SHADER_STAGE_INTERSECTION_BIT_KHR";
+ case VK_SHADER_STAGE_MESH_BIT_NV:
+ return "VK_SHADER_STAGE_MESH_BIT_NV";
+ case VK_SHADER_STAGE_MISS_BIT_KHR:
+ return "VK_SHADER_STAGE_MISS_BIT_KHR";
+ case VK_SHADER_STAGE_RAYGEN_BIT_KHR:
+ return "VK_SHADER_STAGE_RAYGEN_BIT_KHR";
+ case VK_SHADER_STAGE_TASK_BIT_NV:
+ return "VK_SHADER_STAGE_TASK_BIT_NV";
+ case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT:
+ return "VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT";
+ case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT:
+ return "VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT";
+ case VK_SHADER_STAGE_VERTEX_BIT:
+ return "VK_SHADER_STAGE_VERTEX_BIT";
+ default:
+ return "Unhandled VkShaderStageFlagBits";
+ }
+}
+
+static inline std::string string_VkShaderStageFlags(VkShaderStageFlags input_value)
+{
+ std::string ret;
+ int index = 0;
+ while(input_value) {
+ if (input_value & 1) {
+ if( !ret.empty()) ret.append("|");
+ ret.append(string_VkShaderStageFlagBits(static_cast<VkShaderStageFlagBits>(1 << index)));
+ }
+ ++index;
+ input_value >>= 1;
+ }
+ if( ret.empty()) ret.append(string_VkShaderStageFlagBits(static_cast<VkShaderStageFlagBits>(0)));
+ return ret;
+}
+
+static inline const char* string_VkCullModeFlagBits(VkCullModeFlagBits input_value)
+{
+ switch ((VkCullModeFlagBits)input_value)
+ {
+ case VK_CULL_MODE_BACK_BIT:
+ return "VK_CULL_MODE_BACK_BIT";
+ case VK_CULL_MODE_FRONT_AND_BACK:
+ return "VK_CULL_MODE_FRONT_AND_BACK";
+ case VK_CULL_MODE_FRONT_BIT:
+ return "VK_CULL_MODE_FRONT_BIT";
+ case VK_CULL_MODE_NONE:
+ return "VK_CULL_MODE_NONE";
+ default:
+ return "Unhandled VkCullModeFlagBits";
+ }
+}
+
+static inline std::string string_VkCullModeFlags(VkCullModeFlags input_value)
+{
+ std::string ret;
+ int index = 0;
+ while(input_value) {
+ if (input_value & 1) {
+ if( !ret.empty()) ret.append("|");
+ ret.append(string_VkCullModeFlagBits(static_cast<VkCullModeFlagBits>(1 << index)));
+ }
+ ++index;
+ input_value >>= 1;
+ }
+ if( ret.empty()) ret.append(string_VkCullModeFlagBits(static_cast<VkCullModeFlagBits>(0)));
+ return ret;
+}
+
static inline const char* string_VkDynamicState(VkDynamicState input_value)
{
switch ((VkDynamicState)input_value)
{
case VK_DYNAMIC_STATE_BLEND_CONSTANTS:
return "VK_DYNAMIC_STATE_BLEND_CONSTANTS";
+ case VK_DYNAMIC_STATE_CULL_MODE_EXT:
+ return "VK_DYNAMIC_STATE_CULL_MODE_EXT";
case VK_DYNAMIC_STATE_DEPTH_BIAS:
return "VK_DYNAMIC_STATE_DEPTH_BIAS";
case VK_DYNAMIC_STATE_DEPTH_BOUNDS:
return "VK_DYNAMIC_STATE_DEPTH_BOUNDS";
+ case VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT:
+ return "VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT";
+ case VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT:
+ return "VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT";
+ case VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT:
+ return "VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT";
+ case VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT:
+ return "VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT";
case VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT:
return "VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT";
case VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV:
return "VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV";
+ case VK_DYNAMIC_STATE_FRONT_FACE_EXT:
+ return "VK_DYNAMIC_STATE_FRONT_FACE_EXT";
case VK_DYNAMIC_STATE_LINE_STIPPLE_EXT:
return "VK_DYNAMIC_STATE_LINE_STIPPLE_EXT";
case VK_DYNAMIC_STATE_LINE_WIDTH:
return "VK_DYNAMIC_STATE_LINE_WIDTH";
+ case VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT:
+ return "VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT";
case VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT:
return "VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT";
case VK_DYNAMIC_STATE_SCISSOR:
return "VK_DYNAMIC_STATE_SCISSOR";
+ case VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT:
+ return "VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT";
case VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK:
return "VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK";
+ case VK_DYNAMIC_STATE_STENCIL_OP_EXT:
+ return "VK_DYNAMIC_STATE_STENCIL_OP_EXT";
case VK_DYNAMIC_STATE_STENCIL_REFERENCE:
return "VK_DYNAMIC_STATE_STENCIL_REFERENCE";
+ case VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT:
+ return "VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT";
case VK_DYNAMIC_STATE_STENCIL_WRITE_MASK:
return "VK_DYNAMIC_STATE_STENCIL_WRITE_MASK";
+ case VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT:
+ return "VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT";
case VK_DYNAMIC_STATE_VIEWPORT:
return "VK_DYNAMIC_STATE_VIEWPORT";
case VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV:
return "VK_DYNAMIC_STATE_VIEWPORT_COARSE_SAMPLE_ORDER_NV";
case VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV:
return "VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV";
+ case VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT:
+ return "VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT";
case VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV:
return "VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV";
default:
@@ -3083,6 +3188,205 @@
}
}
+static inline const char* string_VkFrontFace(VkFrontFace input_value)
+{
+ switch ((VkFrontFace)input_value)
+ {
+ case VK_FRONT_FACE_CLOCKWISE:
+ return "VK_FRONT_FACE_CLOCKWISE";
+ case VK_FRONT_FACE_COUNTER_CLOCKWISE:
+ return "VK_FRONT_FACE_COUNTER_CLOCKWISE";
+ default:
+ return "Unhandled VkFrontFace";
+ }
+}
+
+static inline const char* string_VkVertexInputRate(VkVertexInputRate input_value)
+{
+ switch ((VkVertexInputRate)input_value)
+ {
+ case VK_VERTEX_INPUT_RATE_INSTANCE:
+ return "VK_VERTEX_INPUT_RATE_INSTANCE";
+ case VK_VERTEX_INPUT_RATE_VERTEX:
+ return "VK_VERTEX_INPUT_RATE_VERTEX";
+ default:
+ return "Unhandled VkVertexInputRate";
+ }
+}
+
+static inline const char* string_VkPrimitiveTopology(VkPrimitiveTopology input_value)
+{
+ switch ((VkPrimitiveTopology)input_value)
+ {
+ case VK_PRIMITIVE_TOPOLOGY_LINE_LIST:
+ return "VK_PRIMITIVE_TOPOLOGY_LINE_LIST";
+ case VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY:
+ return "VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY";
+ case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP:
+ return "VK_PRIMITIVE_TOPOLOGY_LINE_STRIP";
+ case VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY:
+ return "VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY";
+ case VK_PRIMITIVE_TOPOLOGY_PATCH_LIST:
+ return "VK_PRIMITIVE_TOPOLOGY_PATCH_LIST";
+ case VK_PRIMITIVE_TOPOLOGY_POINT_LIST:
+ return "VK_PRIMITIVE_TOPOLOGY_POINT_LIST";
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN:
+ return "VK_PRIMITIVE_TOPOLOGY_TRIANGLE_FAN";
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST:
+ return "VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST";
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY:
+ return "VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY";
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:
+ return "VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP";
+ case VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY:
+ return "VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY";
+ default:
+ return "Unhandled VkPrimitiveTopology";
+ }
+}
+
+static inline const char* string_VkPolygonMode(VkPolygonMode input_value)
+{
+ switch ((VkPolygonMode)input_value)
+ {
+ case VK_POLYGON_MODE_FILL:
+ return "VK_POLYGON_MODE_FILL";
+ case VK_POLYGON_MODE_FILL_RECTANGLE_NV:
+ return "VK_POLYGON_MODE_FILL_RECTANGLE_NV";
+ case VK_POLYGON_MODE_LINE:
+ return "VK_POLYGON_MODE_LINE";
+ case VK_POLYGON_MODE_POINT:
+ return "VK_POLYGON_MODE_POINT";
+ default:
+ return "Unhandled VkPolygonMode";
+ }
+}
+
+static inline const char* string_VkStencilOp(VkStencilOp input_value)
+{
+ switch ((VkStencilOp)input_value)
+ {
+ case VK_STENCIL_OP_DECREMENT_AND_CLAMP:
+ return "VK_STENCIL_OP_DECREMENT_AND_CLAMP";
+ case VK_STENCIL_OP_DECREMENT_AND_WRAP:
+ return "VK_STENCIL_OP_DECREMENT_AND_WRAP";
+ case VK_STENCIL_OP_INCREMENT_AND_CLAMP:
+ return "VK_STENCIL_OP_INCREMENT_AND_CLAMP";
+ case VK_STENCIL_OP_INCREMENT_AND_WRAP:
+ return "VK_STENCIL_OP_INCREMENT_AND_WRAP";
+ case VK_STENCIL_OP_INVERT:
+ return "VK_STENCIL_OP_INVERT";
+ case VK_STENCIL_OP_KEEP:
+ return "VK_STENCIL_OP_KEEP";
+ case VK_STENCIL_OP_REPLACE:
+ return "VK_STENCIL_OP_REPLACE";
+ case VK_STENCIL_OP_ZERO:
+ return "VK_STENCIL_OP_ZERO";
+ default:
+ return "Unhandled VkStencilOp";
+ }
+}
+
+static inline const char* string_VkLogicOp(VkLogicOp input_value)
+{
+ switch ((VkLogicOp)input_value)
+ {
+ case VK_LOGIC_OP_AND:
+ return "VK_LOGIC_OP_AND";
+ case VK_LOGIC_OP_AND_INVERTED:
+ return "VK_LOGIC_OP_AND_INVERTED";
+ case VK_LOGIC_OP_AND_REVERSE:
+ return "VK_LOGIC_OP_AND_REVERSE";
+ case VK_LOGIC_OP_CLEAR:
+ return "VK_LOGIC_OP_CLEAR";
+ case VK_LOGIC_OP_COPY:
+ return "VK_LOGIC_OP_COPY";
+ case VK_LOGIC_OP_COPY_INVERTED:
+ return "VK_LOGIC_OP_COPY_INVERTED";
+ case VK_LOGIC_OP_EQUIVALENT:
+ return "VK_LOGIC_OP_EQUIVALENT";
+ case VK_LOGIC_OP_INVERT:
+ return "VK_LOGIC_OP_INVERT";
+ case VK_LOGIC_OP_NAND:
+ return "VK_LOGIC_OP_NAND";
+ case VK_LOGIC_OP_NOR:
+ return "VK_LOGIC_OP_NOR";
+ case VK_LOGIC_OP_NO_OP:
+ return "VK_LOGIC_OP_NO_OP";
+ case VK_LOGIC_OP_OR:
+ return "VK_LOGIC_OP_OR";
+ case VK_LOGIC_OP_OR_INVERTED:
+ return "VK_LOGIC_OP_OR_INVERTED";
+ case VK_LOGIC_OP_OR_REVERSE:
+ return "VK_LOGIC_OP_OR_REVERSE";
+ case VK_LOGIC_OP_SET:
+ return "VK_LOGIC_OP_SET";
+ case VK_LOGIC_OP_XOR:
+ return "VK_LOGIC_OP_XOR";
+ default:
+ return "Unhandled VkLogicOp";
+ }
+}
+
+static inline const char* string_VkBorderColor(VkBorderColor input_value)
+{
+ switch ((VkBorderColor)input_value)
+ {
+ case VK_BORDER_COLOR_FLOAT_CUSTOM_EXT:
+ return "VK_BORDER_COLOR_FLOAT_CUSTOM_EXT";
+ case VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK:
+ return "VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK";
+ case VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE:
+ return "VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE";
+ case VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK:
+ return "VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK";
+ case VK_BORDER_COLOR_INT_CUSTOM_EXT:
+ return "VK_BORDER_COLOR_INT_CUSTOM_EXT";
+ case VK_BORDER_COLOR_INT_OPAQUE_BLACK:
+ return "VK_BORDER_COLOR_INT_OPAQUE_BLACK";
+ case VK_BORDER_COLOR_INT_OPAQUE_WHITE:
+ return "VK_BORDER_COLOR_INT_OPAQUE_WHITE";
+ case VK_BORDER_COLOR_INT_TRANSPARENT_BLACK:
+ return "VK_BORDER_COLOR_INT_TRANSPARENT_BLACK";
+ default:
+ return "Unhandled VkBorderColor";
+ }
+}
+
+static inline const char* string_VkFilter(VkFilter input_value)
+{
+ switch ((VkFilter)input_value)
+ {
+ case VK_FILTER_CUBIC_IMG:
+ return "VK_FILTER_CUBIC_IMG";
+ case VK_FILTER_LINEAR:
+ return "VK_FILTER_LINEAR";
+ case VK_FILTER_NEAREST:
+ return "VK_FILTER_NEAREST";
+ default:
+ return "Unhandled VkFilter";
+ }
+}
+
+static inline const char* string_VkSamplerAddressMode(VkSamplerAddressMode input_value)
+{
+ switch ((VkSamplerAddressMode)input_value)
+ {
+ case VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER:
+ return "VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER";
+ case VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE:
+ return "VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE";
+ case VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT:
+ return "VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT";
+ case VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE:
+ return "VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE";
+ case VK_SAMPLER_ADDRESS_MODE_REPEAT:
+ return "VK_SAMPLER_ADDRESS_MODE_REPEAT";
+ default:
+ return "Unhandled VkSamplerAddressMode";
+ }
+}
+
static inline const char* string_VkSamplerCreateFlagBits(VkSamplerCreateFlagBits input_value)
{
switch ((VkSamplerCreateFlagBits)input_value)
@@ -3112,21 +3416,6 @@
return ret;
}
-static inline const char* string_VkFilter(VkFilter input_value)
-{
- switch ((VkFilter)input_value)
- {
- case VK_FILTER_CUBIC_IMG:
- return "VK_FILTER_CUBIC_IMG";
- case VK_FILTER_LINEAR:
- return "VK_FILTER_LINEAR";
- case VK_FILTER_NEAREST:
- return "VK_FILTER_NEAREST";
- default:
- return "Unhandled VkFilter";
- }
-}
-
static inline const char* string_VkSamplerMipmapMode(VkSamplerMipmapMode input_value)
{
switch ((VkSamplerMipmapMode)input_value)
@@ -3140,72 +3429,32 @@
}
}
-static inline const char* string_VkSamplerAddressMode(VkSamplerAddressMode input_value)
+static inline const char* string_VkDescriptorPoolCreateFlagBits(VkDescriptorPoolCreateFlagBits input_value)
{
- switch ((VkSamplerAddressMode)input_value)
+ switch ((VkDescriptorPoolCreateFlagBits)input_value)
{
- case VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER:
- return "VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER";
- case VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE:
- return "VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE";
- case VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT:
- return "VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT";
- case VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE:
- return "VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE";
- case VK_SAMPLER_ADDRESS_MODE_REPEAT:
- return "VK_SAMPLER_ADDRESS_MODE_REPEAT";
+ case VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT:
+ return "VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT";
+ case VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT:
+ return "VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT";
default:
- return "Unhandled VkSamplerAddressMode";
+ return "Unhandled VkDescriptorPoolCreateFlagBits";
}
}
-static inline const char* string_VkBorderColor(VkBorderColor input_value)
-{
- switch ((VkBorderColor)input_value)
- {
- case VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK:
- return "VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK";
- case VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE:
- return "VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE";
- case VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK:
- return "VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK";
- case VK_BORDER_COLOR_INT_OPAQUE_BLACK:
- return "VK_BORDER_COLOR_INT_OPAQUE_BLACK";
- case VK_BORDER_COLOR_INT_OPAQUE_WHITE:
- return "VK_BORDER_COLOR_INT_OPAQUE_WHITE";
- case VK_BORDER_COLOR_INT_TRANSPARENT_BLACK:
- return "VK_BORDER_COLOR_INT_TRANSPARENT_BLACK";
- default:
- return "Unhandled VkBorderColor";
- }
-}
-
-static inline const char* string_VkDescriptorSetLayoutCreateFlagBits(VkDescriptorSetLayoutCreateFlagBits input_value)
-{
- switch ((VkDescriptorSetLayoutCreateFlagBits)input_value)
- {
- case VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR:
- return "VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR";
- case VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT:
- return "VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT";
- default:
- return "Unhandled VkDescriptorSetLayoutCreateFlagBits";
- }
-}
-
-static inline std::string string_VkDescriptorSetLayoutCreateFlags(VkDescriptorSetLayoutCreateFlags input_value)
+static inline std::string string_VkDescriptorPoolCreateFlags(VkDescriptorPoolCreateFlags input_value)
{
std::string ret;
int index = 0;
while(input_value) {
if (input_value & 1) {
if( !ret.empty()) ret.append("|");
- ret.append(string_VkDescriptorSetLayoutCreateFlagBits(static_cast<VkDescriptorSetLayoutCreateFlagBits>(1 << index)));
+ ret.append(string_VkDescriptorPoolCreateFlagBits(static_cast<VkDescriptorPoolCreateFlagBits>(1 << index)));
}
++index;
input_value >>= 1;
}
- if( ret.empty()) ret.append(string_VkDescriptorSetLayoutCreateFlagBits(static_cast<VkDescriptorSetLayoutCreateFlagBits>(0)));
+ if( ret.empty()) ret.append(string_VkDescriptorPoolCreateFlagBits(static_cast<VkDescriptorPoolCreateFlagBits>(0)));
return ret;
}
@@ -3244,86 +3493,32 @@
}
}
-static inline const char* string_VkDescriptorPoolCreateFlagBits(VkDescriptorPoolCreateFlagBits input_value)
+static inline const char* string_VkDescriptorSetLayoutCreateFlagBits(VkDescriptorSetLayoutCreateFlagBits input_value)
{
- switch ((VkDescriptorPoolCreateFlagBits)input_value)
+ switch ((VkDescriptorSetLayoutCreateFlagBits)input_value)
{
- case VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT:
- return "VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT";
- case VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT:
- return "VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT";
+ case VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR:
+ return "VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR";
+ case VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT:
+ return "VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT";
default:
- return "Unhandled VkDescriptorPoolCreateFlagBits";
+ return "Unhandled VkDescriptorSetLayoutCreateFlagBits";
}
}
-static inline std::string string_VkDescriptorPoolCreateFlags(VkDescriptorPoolCreateFlags input_value)
+static inline std::string string_VkDescriptorSetLayoutCreateFlags(VkDescriptorSetLayoutCreateFlags input_value)
{
std::string ret;
int index = 0;
while(input_value) {
if (input_value & 1) {
if( !ret.empty()) ret.append("|");
- ret.append(string_VkDescriptorPoolCreateFlagBits(static_cast<VkDescriptorPoolCreateFlagBits>(1 << index)));
+ ret.append(string_VkDescriptorSetLayoutCreateFlagBits(static_cast<VkDescriptorSetLayoutCreateFlagBits>(1 << index)));
}
++index;
input_value >>= 1;
}
- if( ret.empty()) ret.append(string_VkDescriptorPoolCreateFlagBits(static_cast<VkDescriptorPoolCreateFlagBits>(0)));
- return ret;
-}
-
-static inline const char* string_VkFramebufferCreateFlagBits(VkFramebufferCreateFlagBits input_value)
-{
- switch ((VkFramebufferCreateFlagBits)input_value)
- {
- case VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT:
- return "VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT";
- default:
- return "Unhandled VkFramebufferCreateFlagBits";
- }
-}
-
-static inline std::string string_VkFramebufferCreateFlags(VkFramebufferCreateFlags input_value)
-{
- std::string ret;
- int index = 0;
- while(input_value) {
- if (input_value & 1) {
- if( !ret.empty()) ret.append("|");
- ret.append(string_VkFramebufferCreateFlagBits(static_cast<VkFramebufferCreateFlagBits>(1 << index)));
- }
- ++index;
- input_value >>= 1;
- }
- if( ret.empty()) ret.append(string_VkFramebufferCreateFlagBits(static_cast<VkFramebufferCreateFlagBits>(0)));
- return ret;
-}
-
-static inline const char* string_VkRenderPassCreateFlagBits(VkRenderPassCreateFlagBits input_value)
-{
- switch ((VkRenderPassCreateFlagBits)input_value)
- {
- case VK_RENDER_PASS_CREATE_TRANSFORM_BIT_QCOM:
- return "VK_RENDER_PASS_CREATE_TRANSFORM_BIT_QCOM";
- default:
- return "Unhandled VkRenderPassCreateFlagBits";
- }
-}
-
-static inline std::string string_VkRenderPassCreateFlags(VkRenderPassCreateFlags input_value)
-{
- std::string ret;
- int index = 0;
- while(input_value) {
- if (input_value & 1) {
- if( !ret.empty()) ret.append("|");
- ret.append(string_VkRenderPassCreateFlagBits(static_cast<VkRenderPassCreateFlagBits>(1 << index)));
- }
- ++index;
- input_value >>= 1;
- }
- if( ret.empty()) ret.append(string_VkRenderPassCreateFlagBits(static_cast<VkRenderPassCreateFlagBits>(0)));
+ if( ret.empty()) ret.append(string_VkDescriptorSetLayoutCreateFlagBits(static_cast<VkDescriptorSetLayoutCreateFlagBits>(0)));
return ret;
}
@@ -3375,6 +3570,8 @@
{
case VK_ATTACHMENT_STORE_OP_DONT_CARE:
return "VK_ATTACHMENT_STORE_OP_DONT_CARE";
+ case VK_ATTACHMENT_STORE_OP_NONE_QCOM:
+ return "VK_ATTACHMENT_STORE_OP_NONE_QCOM";
case VK_ATTACHMENT_STORE_OP_STORE:
return "VK_ATTACHMENT_STORE_OP_STORE";
default:
@@ -3382,131 +3579,6 @@
}
}
-static inline const char* string_VkSubpassDescriptionFlagBits(VkSubpassDescriptionFlagBits input_value)
-{
- switch ((VkSubpassDescriptionFlagBits)input_value)
- {
- case VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX:
- return "VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX";
- case VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX:
- return "VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX";
- default:
- return "Unhandled VkSubpassDescriptionFlagBits";
- }
-}
-
-static inline std::string string_VkSubpassDescriptionFlags(VkSubpassDescriptionFlags input_value)
-{
- std::string ret;
- int index = 0;
- while(input_value) {
- if (input_value & 1) {
- if( !ret.empty()) ret.append("|");
- ret.append(string_VkSubpassDescriptionFlagBits(static_cast<VkSubpassDescriptionFlagBits>(1 << index)));
- }
- ++index;
- input_value >>= 1;
- }
- if( ret.empty()) ret.append(string_VkSubpassDescriptionFlagBits(static_cast<VkSubpassDescriptionFlagBits>(0)));
- return ret;
-}
-
-static inline const char* string_VkPipelineBindPoint(VkPipelineBindPoint input_value)
-{
- switch ((VkPipelineBindPoint)input_value)
- {
- case VK_PIPELINE_BIND_POINT_COMPUTE:
- return "VK_PIPELINE_BIND_POINT_COMPUTE";
- case VK_PIPELINE_BIND_POINT_GRAPHICS:
- return "VK_PIPELINE_BIND_POINT_GRAPHICS";
- case VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR:
- return "VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR";
- default:
- return "Unhandled VkPipelineBindPoint";
- }
-}
-
-static inline const char* string_VkAccessFlagBits(VkAccessFlagBits input_value)
-{
- switch ((VkAccessFlagBits)input_value)
- {
- case VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR:
- return "VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR";
- case VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR:
- return "VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR";
- case VK_ACCESS_COLOR_ATTACHMENT_READ_BIT:
- return "VK_ACCESS_COLOR_ATTACHMENT_READ_BIT";
- case VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT:
- return "VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT";
- case VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT:
- return "VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT";
- case VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV:
- return "VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV";
- case VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV:
- return "VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV";
- case VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT:
- return "VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT";
- case VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT:
- return "VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT";
- case VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT:
- return "VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT";
- case VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT:
- return "VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT";
- case VK_ACCESS_HOST_READ_BIT:
- return "VK_ACCESS_HOST_READ_BIT";
- case VK_ACCESS_HOST_WRITE_BIT:
- return "VK_ACCESS_HOST_WRITE_BIT";
- case VK_ACCESS_INDEX_READ_BIT:
- return "VK_ACCESS_INDEX_READ_BIT";
- case VK_ACCESS_INDIRECT_COMMAND_READ_BIT:
- return "VK_ACCESS_INDIRECT_COMMAND_READ_BIT";
- case VK_ACCESS_INPUT_ATTACHMENT_READ_BIT:
- return "VK_ACCESS_INPUT_ATTACHMENT_READ_BIT";
- case VK_ACCESS_MEMORY_READ_BIT:
- return "VK_ACCESS_MEMORY_READ_BIT";
- case VK_ACCESS_MEMORY_WRITE_BIT:
- return "VK_ACCESS_MEMORY_WRITE_BIT";
- case VK_ACCESS_SHADER_READ_BIT:
- return "VK_ACCESS_SHADER_READ_BIT";
- case VK_ACCESS_SHADER_WRITE_BIT:
- return "VK_ACCESS_SHADER_WRITE_BIT";
- case VK_ACCESS_SHADING_RATE_IMAGE_READ_BIT_NV:
- return "VK_ACCESS_SHADING_RATE_IMAGE_READ_BIT_NV";
- case VK_ACCESS_TRANSFER_READ_BIT:
- return "VK_ACCESS_TRANSFER_READ_BIT";
- case VK_ACCESS_TRANSFER_WRITE_BIT:
- return "VK_ACCESS_TRANSFER_WRITE_BIT";
- case VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT:
- return "VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT";
- case VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT:
- return "VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT";
- case VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT:
- return "VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT";
- case VK_ACCESS_UNIFORM_READ_BIT:
- return "VK_ACCESS_UNIFORM_READ_BIT";
- case VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT:
- return "VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT";
- default:
- return "Unhandled VkAccessFlagBits";
- }
-}
-
-static inline std::string string_VkAccessFlags(VkAccessFlags input_value)
-{
- std::string ret;
- int index = 0;
- while(input_value) {
- if (input_value & 1) {
- if( !ret.empty()) ret.append("|");
- ret.append(string_VkAccessFlagBits(static_cast<VkAccessFlagBits>(1 << index)));
- }
- ++index;
- input_value >>= 1;
- }
- if( ret.empty()) ret.append(string_VkAccessFlagBits(static_cast<VkAccessFlagBits>(0)));
- return ret;
-}
-
static inline const char* string_VkDependencyFlagBits(VkDependencyFlagBits input_value)
{
switch ((VkDependencyFlagBits)input_value)
@@ -3538,6 +3610,108 @@
return ret;
}
+static inline const char* string_VkFramebufferCreateFlagBits(VkFramebufferCreateFlagBits input_value)
+{
+ switch ((VkFramebufferCreateFlagBits)input_value)
+ {
+ case VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT:
+ return "VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT";
+ default:
+ return "Unhandled VkFramebufferCreateFlagBits";
+ }
+}
+
+static inline std::string string_VkFramebufferCreateFlags(VkFramebufferCreateFlags input_value)
+{
+ std::string ret;
+ int index = 0;
+ while(input_value) {
+ if (input_value & 1) {
+ if( !ret.empty()) ret.append("|");
+ ret.append(string_VkFramebufferCreateFlagBits(static_cast<VkFramebufferCreateFlagBits>(1 << index)));
+ }
+ ++index;
+ input_value >>= 1;
+ }
+ if( ret.empty()) ret.append(string_VkFramebufferCreateFlagBits(static_cast<VkFramebufferCreateFlagBits>(0)));
+ return ret;
+}
+
+static inline const char* string_VkPipelineBindPoint(VkPipelineBindPoint input_value)
+{
+ switch ((VkPipelineBindPoint)input_value)
+ {
+ case VK_PIPELINE_BIND_POINT_COMPUTE:
+ return "VK_PIPELINE_BIND_POINT_COMPUTE";
+ case VK_PIPELINE_BIND_POINT_GRAPHICS:
+ return "VK_PIPELINE_BIND_POINT_GRAPHICS";
+ case VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR:
+ return "VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR";
+ default:
+ return "Unhandled VkPipelineBindPoint";
+ }
+}
+
+static inline const char* string_VkRenderPassCreateFlagBits(VkRenderPassCreateFlagBits input_value)
+{
+ switch ((VkRenderPassCreateFlagBits)input_value)
+ {
+ case VK_RENDER_PASS_CREATE_TRANSFORM_BIT_QCOM:
+ return "VK_RENDER_PASS_CREATE_TRANSFORM_BIT_QCOM";
+ default:
+ return "Unhandled VkRenderPassCreateFlagBits";
+ }
+}
+
+static inline std::string string_VkRenderPassCreateFlags(VkRenderPassCreateFlags input_value)
+{
+ std::string ret;
+ int index = 0;
+ while(input_value) {
+ if (input_value & 1) {
+ if( !ret.empty()) ret.append("|");
+ ret.append(string_VkRenderPassCreateFlagBits(static_cast<VkRenderPassCreateFlagBits>(1 << index)));
+ }
+ ++index;
+ input_value >>= 1;
+ }
+ if( ret.empty()) ret.append(string_VkRenderPassCreateFlagBits(static_cast<VkRenderPassCreateFlagBits>(0)));
+ return ret;
+}
+
+static inline const char* string_VkSubpassDescriptionFlagBits(VkSubpassDescriptionFlagBits input_value)
+{
+ switch ((VkSubpassDescriptionFlagBits)input_value)
+ {
+ case VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM:
+ return "VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM";
+ case VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX:
+ return "VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX";
+ case VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX:
+ return "VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX";
+ case VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM:
+ return "VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM";
+ default:
+ return "Unhandled VkSubpassDescriptionFlagBits";
+ }
+}
+
+static inline std::string string_VkSubpassDescriptionFlags(VkSubpassDescriptionFlags input_value)
+{
+ std::string ret;
+ int index = 0;
+ while(input_value) {
+ if (input_value & 1) {
+ if( !ret.empty()) ret.append("|");
+ ret.append(string_VkSubpassDescriptionFlagBits(static_cast<VkSubpassDescriptionFlagBits>(1 << index)));
+ }
+ ++index;
+ input_value >>= 1;
+ }
+ if( ret.empty()) ret.append(string_VkSubpassDescriptionFlagBits(static_cast<VkSubpassDescriptionFlagBits>(0)));
+ return ret;
+}
+
static inline const char* string_VkCommandPoolCreateFlagBits(VkCommandPoolCreateFlagBits input_value)
{
switch ((VkCommandPoolCreateFlagBits)input_value)
@@ -3694,6 +3868,23 @@
return ret;
}
+static inline const char* string_VkIndexType(VkIndexType input_value)
+{
+ switch ((VkIndexType)input_value)
+ {
+ case VK_INDEX_TYPE_NONE_KHR:
+ return "VK_INDEX_TYPE_NONE_KHR";
+ case VK_INDEX_TYPE_UINT16:
+ return "VK_INDEX_TYPE_UINT16";
+ case VK_INDEX_TYPE_UINT32:
+ return "VK_INDEX_TYPE_UINT32";
+ case VK_INDEX_TYPE_UINT8_EXT:
+ return "VK_INDEX_TYPE_UINT8_EXT";
+ default:
+ return "Unhandled VkIndexType";
+ }
+}
+
static inline const char* string_VkStencilFaceFlagBits(VkStencilFaceFlagBits input_value)
{
switch ((VkStencilFaceFlagBits)input_value)
@@ -3725,23 +3916,6 @@
return ret;
}
-static inline const char* string_VkIndexType(VkIndexType input_value)
-{
- switch ((VkIndexType)input_value)
- {
- case VK_INDEX_TYPE_NONE_KHR:
- return "VK_INDEX_TYPE_NONE_KHR";
- case VK_INDEX_TYPE_UINT16:
- return "VK_INDEX_TYPE_UINT16";
- case VK_INDEX_TYPE_UINT32:
- return "VK_INDEX_TYPE_UINT32";
- case VK_INDEX_TYPE_UINT8_EXT:
- return "VK_INDEX_TYPE_UINT8_EXT";
- default:
- return "Unhandled VkIndexType";
- }
-}
-
static inline const char* string_VkSubpassContents(VkSubpassContents input_value)
{
switch ((VkSubpassContents)input_value)
@@ -3755,112 +3929,6 @@
}
}
-static inline const char* string_VkObjectType(VkObjectType input_value)
-{
- switch ((VkObjectType)input_value)
- {
- case VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR:
- return "VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR";
- case VK_OBJECT_TYPE_BUFFER:
- return "VK_OBJECT_TYPE_BUFFER";
- case VK_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA:
- return "VK_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA";
- case VK_OBJECT_TYPE_BUFFER_VIEW:
- return "VK_OBJECT_TYPE_BUFFER_VIEW";
- case VK_OBJECT_TYPE_COMMAND_BUFFER:
- return "VK_OBJECT_TYPE_COMMAND_BUFFER";
- case VK_OBJECT_TYPE_COMMAND_POOL:
- return "VK_OBJECT_TYPE_COMMAND_POOL";
- case VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT:
- return "VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT";
- case VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT:
- return "VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT";
- case VK_OBJECT_TYPE_DEFERRED_OPERATION_KHR:
- return "VK_OBJECT_TYPE_DEFERRED_OPERATION_KHR";
- case VK_OBJECT_TYPE_DESCRIPTOR_POOL:
- return "VK_OBJECT_TYPE_DESCRIPTOR_POOL";
- case VK_OBJECT_TYPE_DESCRIPTOR_SET:
- return "VK_OBJECT_TYPE_DESCRIPTOR_SET";
- case VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT:
- return "VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT";
- case VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE:
- return "VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE";
- case VK_OBJECT_TYPE_DEVICE:
- return "VK_OBJECT_TYPE_DEVICE";
- case VK_OBJECT_TYPE_DEVICE_MEMORY:
- return "VK_OBJECT_TYPE_DEVICE_MEMORY";
- case VK_OBJECT_TYPE_DISPLAY_KHR:
- return "VK_OBJECT_TYPE_DISPLAY_KHR";
- case VK_OBJECT_TYPE_DISPLAY_MODE_KHR:
- return "VK_OBJECT_TYPE_DISPLAY_MODE_KHR";
- case VK_OBJECT_TYPE_EVENT:
- return "VK_OBJECT_TYPE_EVENT";
- case VK_OBJECT_TYPE_FENCE:
- return "VK_OBJECT_TYPE_FENCE";
- case VK_OBJECT_TYPE_FRAMEBUFFER:
- return "VK_OBJECT_TYPE_FRAMEBUFFER";
- case VK_OBJECT_TYPE_IMAGE:
- return "VK_OBJECT_TYPE_IMAGE";
- case VK_OBJECT_TYPE_IMAGE_VIEW:
- return "VK_OBJECT_TYPE_IMAGE_VIEW";
- case VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV:
- return "VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV";
- case VK_OBJECT_TYPE_INSTANCE:
- return "VK_OBJECT_TYPE_INSTANCE";
- case VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL:
- return "VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL";
- case VK_OBJECT_TYPE_PHYSICAL_DEVICE:
- return "VK_OBJECT_TYPE_PHYSICAL_DEVICE";
- case VK_OBJECT_TYPE_PIPELINE:
- return "VK_OBJECT_TYPE_PIPELINE";
- case VK_OBJECT_TYPE_PIPELINE_CACHE:
- return "VK_OBJECT_TYPE_PIPELINE_CACHE";
- case VK_OBJECT_TYPE_PIPELINE_LAYOUT:
- return "VK_OBJECT_TYPE_PIPELINE_LAYOUT";
- case VK_OBJECT_TYPE_QUERY_POOL:
- return "VK_OBJECT_TYPE_QUERY_POOL";
- case VK_OBJECT_TYPE_QUEUE:
- return "VK_OBJECT_TYPE_QUEUE";
- case VK_OBJECT_TYPE_RENDER_PASS:
- return "VK_OBJECT_TYPE_RENDER_PASS";
- case VK_OBJECT_TYPE_SAMPLER:
- return "VK_OBJECT_TYPE_SAMPLER";
- case VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION:
- return "VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION";
- case VK_OBJECT_TYPE_SEMAPHORE:
- return "VK_OBJECT_TYPE_SEMAPHORE";
- case VK_OBJECT_TYPE_SHADER_MODULE:
- return "VK_OBJECT_TYPE_SHADER_MODULE";
- case VK_OBJECT_TYPE_SURFACE_KHR:
- return "VK_OBJECT_TYPE_SURFACE_KHR";
- case VK_OBJECT_TYPE_SWAPCHAIN_KHR:
- return "VK_OBJECT_TYPE_SWAPCHAIN_KHR";
- case VK_OBJECT_TYPE_UNKNOWN:
- return "VK_OBJECT_TYPE_UNKNOWN";
- case VK_OBJECT_TYPE_VALIDATION_CACHE_EXT:
- return "VK_OBJECT_TYPE_VALIDATION_CACHE_EXT";
- default:
- return "Unhandled VkObjectType";
- }
-}
-
-static inline const char* string_VkVendorId(VkVendorId input_value)
-{
- switch ((VkVendorId)input_value)
- {
- case VK_VENDOR_ID_CODEPLAY:
- return "VK_VENDOR_ID_CODEPLAY";
- case VK_VENDOR_ID_KAZAN:
- return "VK_VENDOR_ID_KAZAN";
- case VK_VENDOR_ID_VIV:
- return "VK_VENDOR_ID_VIV";
- case VK_VENDOR_ID_VSI:
- return "VK_VENDOR_ID_VSI";
- default:
- return "Unhandled VkVendorId";
- }
-}
-
static inline const char* string_VkSubgroupFeatureFlagBits(VkSubgroupFeatureFlagBits input_value)
{
switch ((VkSubgroupFeatureFlagBits)input_value)
@@ -4336,8 +4404,12 @@
return "VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA";
case VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS:
return "VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS";
+ case VK_DRIVER_ID_MESA_LLVMPIPE:
+ return "VK_DRIVER_ID_MESA_LLVMPIPE";
case VK_DRIVER_ID_MESA_RADV:
return "VK_DRIVER_ID_MESA_RADV";
+ case VK_DRIVER_ID_MOLTENVK:
+ return "VK_DRIVER_ID_MOLTENVK";
case VK_DRIVER_ID_NVIDIA_PROPRIETARY:
return "VK_DRIVER_ID_NVIDIA_PROPRIETARY";
case VK_DRIVER_ID_QUALCOMM_PROPRIETARY:
@@ -4528,39 +4600,27 @@
return ret;
}
-static inline const char* string_VkCompositeAlphaFlagBitsKHR(VkCompositeAlphaFlagBitsKHR input_value)
+static inline const char* string_VkPresentModeKHR(VkPresentModeKHR input_value)
{
- switch ((VkCompositeAlphaFlagBitsKHR)input_value)
+ switch ((VkPresentModeKHR)input_value)
{
- case VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR:
- return "VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR";
- case VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR:
- return "VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR";
- case VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR:
- return "VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR";
- case VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR:
- return "VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR";
+ case VK_PRESENT_MODE_FIFO_KHR:
+ return "VK_PRESENT_MODE_FIFO_KHR";
+ case VK_PRESENT_MODE_FIFO_RELAXED_KHR:
+ return "VK_PRESENT_MODE_FIFO_RELAXED_KHR";
+ case VK_PRESENT_MODE_IMMEDIATE_KHR:
+ return "VK_PRESENT_MODE_IMMEDIATE_KHR";
+ case VK_PRESENT_MODE_MAILBOX_KHR:
+ return "VK_PRESENT_MODE_MAILBOX_KHR";
+ case VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR:
+ return "VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR";
+ case VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR:
+ return "VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR";
default:
- return "Unhandled VkCompositeAlphaFlagBitsKHR";
+ return "Unhandled VkPresentModeKHR";
}
}
-static inline std::string string_VkCompositeAlphaFlagsKHR(VkCompositeAlphaFlagsKHR input_value)
-{
- std::string ret;
- int index = 0;
- while(input_value) {
- if (input_value & 1) {
- if( !ret.empty()) ret.append("|");
- ret.append(string_VkCompositeAlphaFlagBitsKHR(static_cast<VkCompositeAlphaFlagBitsKHR>(1 << index)));
- }
- ++index;
- input_value >>= 1;
- }
- if( ret.empty()) ret.append(string_VkCompositeAlphaFlagBitsKHR(static_cast<VkCompositeAlphaFlagBitsKHR>(0)));
- return ret;
-}
-
static inline const char* string_VkColorSpaceKHR(VkColorSpaceKHR input_value)
{
switch ((VkColorSpaceKHR)input_value)
@@ -4602,27 +4662,39 @@
}
}
-static inline const char* string_VkPresentModeKHR(VkPresentModeKHR input_value)
+static inline const char* string_VkCompositeAlphaFlagBitsKHR(VkCompositeAlphaFlagBitsKHR input_value)
{
- switch ((VkPresentModeKHR)input_value)
+ switch ((VkCompositeAlphaFlagBitsKHR)input_value)
{
- case VK_PRESENT_MODE_FIFO_KHR:
- return "VK_PRESENT_MODE_FIFO_KHR";
- case VK_PRESENT_MODE_FIFO_RELAXED_KHR:
- return "VK_PRESENT_MODE_FIFO_RELAXED_KHR";
- case VK_PRESENT_MODE_IMMEDIATE_KHR:
- return "VK_PRESENT_MODE_IMMEDIATE_KHR";
- case VK_PRESENT_MODE_MAILBOX_KHR:
- return "VK_PRESENT_MODE_MAILBOX_KHR";
- case VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR:
- return "VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR";
- case VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR:
- return "VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR";
+ case VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR:
+ return "VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR";
+ case VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR:
+ return "VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR";
+ case VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR:
+ return "VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR";
+ case VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR:
+ return "VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR";
default:
- return "Unhandled VkPresentModeKHR";
+ return "Unhandled VkCompositeAlphaFlagBitsKHR";
}
}
+static inline std::string string_VkCompositeAlphaFlagsKHR(VkCompositeAlphaFlagsKHR input_value)
+{
+ std::string ret;
+ int index = 0;
+ while(input_value) {
+ if (input_value & 1) {
+ if( !ret.empty()) ret.append("|");
+ ret.append(string_VkCompositeAlphaFlagBitsKHR(static_cast<VkCompositeAlphaFlagBitsKHR>(1 << index)));
+ }
+ ++index;
+ input_value >>= 1;
+ }
+ if( ret.empty()) ret.append(string_VkCompositeAlphaFlagBitsKHR(static_cast<VkCompositeAlphaFlagBitsKHR>(0)));
+ return ret;
+}
+
static inline const char* string_VkSwapchainCreateFlagBitsKHR(VkSwapchainCreateFlagBitsKHR input_value)
{
switch ((VkSwapchainCreateFlagBitsKHR)input_value)
@@ -5248,8 +5320,12 @@
return "VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA";
case VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS:
return "VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS";
+ case VK_DRIVER_ID_MESA_LLVMPIPE:
+ return "VK_DRIVER_ID_MESA_LLVMPIPE";
case VK_DRIVER_ID_MESA_RADV:
return "VK_DRIVER_ID_MESA_RADV";
+ case VK_DRIVER_ID_MOLTENVK:
+ return "VK_DRIVER_ID_MOLTENVK";
case VK_DRIVER_ID_NVIDIA_PROPRIETARY:
return "VK_DRIVER_ID_NVIDIA_PROPRIETARY";
case VK_DRIVER_ID_QUALCOMM_PROPRIETARY:
@@ -5366,6 +5442,41 @@
}
}
+static inline const char* string_VkDebugReportFlagBitsEXT(VkDebugReportFlagBitsEXT input_value)
+{
+ switch ((VkDebugReportFlagBitsEXT)input_value)
+ {
+ case VK_DEBUG_REPORT_DEBUG_BIT_EXT:
+ return "VK_DEBUG_REPORT_DEBUG_BIT_EXT";
+ case VK_DEBUG_REPORT_ERROR_BIT_EXT:
+ return "VK_DEBUG_REPORT_ERROR_BIT_EXT";
+ case VK_DEBUG_REPORT_INFORMATION_BIT_EXT:
+ return "VK_DEBUG_REPORT_INFORMATION_BIT_EXT";
+ case VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT:
+ return "VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT";
+ case VK_DEBUG_REPORT_WARNING_BIT_EXT:
+ return "VK_DEBUG_REPORT_WARNING_BIT_EXT";
+ default:
+ return "Unhandled VkDebugReportFlagBitsEXT";
+ }
+}
+
+static inline std::string string_VkDebugReportFlagsEXT(VkDebugReportFlagsEXT input_value)
+{
+ std::string ret;
+ int index = 0;
+ while(input_value) {
+ if (input_value & 1) {
+ if( !ret.empty()) ret.append("|");
+ ret.append(string_VkDebugReportFlagBitsEXT(static_cast<VkDebugReportFlagBitsEXT>(1 << index)));
+ }
+ ++index;
+ input_value >>= 1;
+ }
+ if( ret.empty()) ret.append(string_VkDebugReportFlagBitsEXT(static_cast<VkDebugReportFlagBitsEXT>(0)));
+ return ret;
+}
+
static inline const char* string_VkDebugReportObjectTypeEXT(VkDebugReportObjectTypeEXT input_value)
{
switch ((VkDebugReportObjectTypeEXT)input_value)
@@ -5447,41 +5558,6 @@
}
}
-static inline const char* string_VkDebugReportFlagBitsEXT(VkDebugReportFlagBitsEXT input_value)
-{
- switch ((VkDebugReportFlagBitsEXT)input_value)
- {
- case VK_DEBUG_REPORT_DEBUG_BIT_EXT:
- return "VK_DEBUG_REPORT_DEBUG_BIT_EXT";
- case VK_DEBUG_REPORT_ERROR_BIT_EXT:
- return "VK_DEBUG_REPORT_ERROR_BIT_EXT";
- case VK_DEBUG_REPORT_INFORMATION_BIT_EXT:
- return "VK_DEBUG_REPORT_INFORMATION_BIT_EXT";
- case VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT:
- return "VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT";
- case VK_DEBUG_REPORT_WARNING_BIT_EXT:
- return "VK_DEBUG_REPORT_WARNING_BIT_EXT";
- default:
- return "Unhandled VkDebugReportFlagBitsEXT";
- }
-}
-
-static inline std::string string_VkDebugReportFlagsEXT(VkDebugReportFlagsEXT input_value)
-{
- std::string ret;
- int index = 0;
- while(input_value) {
- if (input_value & 1) {
- if( !ret.empty()) ret.append("|");
- ret.append(string_VkDebugReportFlagBitsEXT(static_cast<VkDebugReportFlagBitsEXT>(1 << index)));
- }
- ++index;
- input_value >>= 1;
- }
- if( ret.empty()) ret.append(string_VkDebugReportFlagBitsEXT(static_cast<VkDebugReportFlagBitsEXT>(0)));
- return ret;
-}
-
static inline const char* string_VkRasterizationOrderAMD(VkRasterizationOrderAMD input_value)
{
switch ((VkRasterizationOrderAMD)input_value)
diff --git a/layers/generated/vk_extension_helper.h b/layers/generated/vk_extension_helper.h
index fcabdd9..2d47931 100644
--- a/layers/generated/vk_extension_helper.h
+++ b/layers/generated/vk_extension_helper.h
@@ -70,6 +70,7 @@
ExtEnabled vk_ext_debug_report{kNotEnabled};
ExtEnabled vk_ext_debug_utils{kNotEnabled};
ExtEnabled vk_ext_direct_mode_display{kNotEnabled};
+ ExtEnabled vk_ext_directfb_surface{kNotEnabled};
ExtEnabled vk_ext_display_surface_counter{kNotEnabled};
ExtEnabled vk_ext_headless_surface{kNotEnabled};
ExtEnabled vk_ext_metal_surface{kNotEnabled};
@@ -104,9 +105,9 @@
};
typedef std::vector<InstanceReq> InstanceReqVec;
struct InstanceInfo {
- InstanceInfo(ExtEnabled InstanceExtensions::* state_, const InstanceReqVec requires_): state(state_), requires(requires_) {}
+ InstanceInfo(ExtEnabled InstanceExtensions::* state_, const InstanceReqVec requirements_): state(state_), requirements(requirements_) {}
ExtEnabled InstanceExtensions::* state;
- InstanceReqVec requires;
+ InstanceReqVec requirements;
};
typedef std::unordered_map<std::string,InstanceInfo> InstanceInfoMap;
@@ -122,6 +123,10 @@
std::make_pair(VK_EXT_DEBUG_UTILS_EXTENSION_NAME, InstanceInfo(&InstanceExtensions::vk_ext_debug_utils, {})),
std::make_pair(VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME, InstanceInfo(&InstanceExtensions::vk_ext_direct_mode_display, {{
{&InstanceExtensions::vk_khr_display, VK_KHR_DISPLAY_EXTENSION_NAME}}})),
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+ std::make_pair(VK_EXT_DIRECTFB_SURFACE_EXTENSION_NAME, InstanceInfo(&InstanceExtensions::vk_ext_directfb_surface, {{
+ {&InstanceExtensions::vk_khr_surface, VK_KHR_SURFACE_EXTENSION_NAME}}})),
+#endif
std::make_pair(VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME, InstanceInfo(&InstanceExtensions::vk_ext_display_surface_counter, {{
{&InstanceExtensions::vk_khr_display, VK_KHR_DISPLAY_EXTENSION_NAME}}})),
std::make_pair(VK_EXT_HEADLESS_SURFACE_EXTENSION_NAME, InstanceInfo(&InstanceExtensions::vk_ext_headless_surface, {{
@@ -263,6 +268,9 @@
VK_EXT_DEBUG_REPORT_EXTENSION_NAME,
VK_EXT_DEBUG_UTILS_EXTENSION_NAME,
VK_EXT_DIRECT_MODE_DISPLAY_EXTENSION_NAME,
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+ VK_EXT_DIRECTFB_SURFACE_EXTENSION_NAME,
+#endif
VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME,
VK_EXT_HEADLESS_SURFACE_EXTENSION_NAME,
#ifdef VK_USE_PLATFORM_METAL_EXT
@@ -345,22 +353,26 @@
ExtEnabled vk_ext_calibrated_timestamps{kNotEnabled};
ExtEnabled vk_ext_conditional_rendering{kNotEnabled};
ExtEnabled vk_ext_conservative_rasterization{kNotEnabled};
+ ExtEnabled vk_ext_custom_border_color{kNotEnabled};
ExtEnabled vk_ext_debug_marker{kNotEnabled};
ExtEnabled vk_ext_depth_clip_enable{kNotEnabled};
ExtEnabled vk_ext_depth_range_unrestricted{kNotEnabled};
ExtEnabled vk_ext_descriptor_indexing{kNotEnabled};
ExtEnabled vk_ext_discard_rectangles{kNotEnabled};
ExtEnabled vk_ext_display_control{kNotEnabled};
+ ExtEnabled vk_ext_extended_dynamic_state{kNotEnabled};
ExtEnabled vk_ext_external_memory_dma_buf{kNotEnabled};
ExtEnabled vk_ext_external_memory_host{kNotEnabled};
ExtEnabled vk_ext_filter_cubic{kNotEnabled};
ExtEnabled vk_ext_fragment_density_map{kNotEnabled};
+ ExtEnabled vk_ext_fragment_density_map_2{kNotEnabled};
ExtEnabled vk_ext_fragment_shader_interlock{kNotEnabled};
ExtEnabled vk_ext_full_screen_exclusive{kNotEnabled};
ExtEnabled vk_ext_global_priority{kNotEnabled};
ExtEnabled vk_ext_hdr_metadata{kNotEnabled};
ExtEnabled vk_ext_host_query_reset{kNotEnabled};
ExtEnabled vk_ext_image_drm_format_modifier{kNotEnabled};
+ ExtEnabled vk_ext_image_robustness{kNotEnabled};
ExtEnabled vk_ext_index_type_uint8{kNotEnabled};
ExtEnabled vk_ext_inline_uniform_block{kNotEnabled};
ExtEnabled vk_ext_line_rasterization{kNotEnabled};
@@ -370,11 +382,14 @@
ExtEnabled vk_ext_pipeline_creation_cache_control{kNotEnabled};
ExtEnabled vk_ext_pipeline_creation_feedback{kNotEnabled};
ExtEnabled vk_ext_post_depth_coverage{kNotEnabled};
+ ExtEnabled vk_ext_private_data{kNotEnabled};
ExtEnabled vk_ext_queue_family_foreign{kNotEnabled};
+ ExtEnabled vk_ext_robustness_2{kNotEnabled};
ExtEnabled vk_ext_sample_locations{kNotEnabled};
ExtEnabled vk_ext_sampler_filter_minmax{kNotEnabled};
ExtEnabled vk_ext_scalar_block_layout{kNotEnabled};
ExtEnabled vk_ext_separate_stencil_usage{kNotEnabled};
+ ExtEnabled vk_ext_shader_atomic_float{kNotEnabled};
ExtEnabled vk_ext_shader_demote_to_helper_invocation{kNotEnabled};
ExtEnabled vk_ext_shader_stencil_export{kNotEnabled};
ExtEnabled vk_ext_shader_subgroup_ballot{kNotEnabled};
@@ -488,6 +503,8 @@
ExtEnabled vk_nv_viewport_array2{kNotEnabled};
ExtEnabled vk_nv_viewport_swizzle{kNotEnabled};
ExtEnabled vk_nv_win32_keyed_mutex{kNotEnabled};
+ ExtEnabled vk_qcom_render_pass_shader_resolve{kNotEnabled};
+ ExtEnabled vk_qcom_render_pass_store_ops{kNotEnabled};
ExtEnabled vk_qcom_render_pass_transform{kNotEnabled};
struct DeviceReq {
@@ -496,9 +513,9 @@
};
typedef std::vector<DeviceReq> DeviceReqVec;
struct DeviceInfo {
- DeviceInfo(ExtEnabled DeviceExtensions::* state_, const DeviceReqVec requires_): state(state_), requires(requires_) {}
+ DeviceInfo(ExtEnabled DeviceExtensions::* state_, const DeviceReqVec requirements_): state(state_), requirements(requirements_) {}
ExtEnabled DeviceExtensions::* state;
- DeviceReqVec requires;
+ DeviceReqVec requirements;
};
typedef std::unordered_map<std::string,DeviceInfo> DeviceInfoMap;
@@ -537,7 +554,8 @@
std::make_pair(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_android_external_memory_android_hardware_buffer, {{
{&DeviceExtensions::vk_khr_sampler_ycbcr_conversion, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME},
{&DeviceExtensions::vk_khr_external_memory, VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME},
- {&DeviceExtensions::vk_ext_queue_family_foreign, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME}}})),
+ {&DeviceExtensions::vk_ext_queue_family_foreign, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME},
+ {&DeviceExtensions::vk_khr_dedicated_allocation, VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME}}})),
#endif
std::make_pair(VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_astc_decode_mode, {{
{&DeviceExtensions::vk_khr_get_physical_device_properties_2, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME}}})),
@@ -548,6 +566,7 @@
std::make_pair(VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_conditional_rendering, {})),
std::make_pair(VK_EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_conservative_rasterization, {{
{&DeviceExtensions::vk_khr_get_physical_device_properties_2, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME}}})),
+ std::make_pair(VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_custom_border_color, {})),
std::make_pair(VK_EXT_DEBUG_MARKER_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_debug_marker, {{
{&DeviceExtensions::vk_ext_debug_report, VK_EXT_DEBUG_REPORT_EXTENSION_NAME}}})),
std::make_pair(VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_depth_clip_enable, {})),
@@ -560,14 +579,17 @@
std::make_pair(VK_EXT_DISPLAY_CONTROL_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_display_control, {{
{&DeviceExtensions::vk_ext_display_surface_counter, VK_EXT_DISPLAY_SURFACE_COUNTER_EXTENSION_NAME},
{&DeviceExtensions::vk_khr_swapchain, VK_KHR_SWAPCHAIN_EXTENSION_NAME}}})),
+ std::make_pair(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_extended_dynamic_state, {{
+ {&DeviceExtensions::vk_khr_get_physical_device_properties_2, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME}}})),
std::make_pair(VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_external_memory_dma_buf, {{
{&DeviceExtensions::vk_khr_external_memory_fd, VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME}}})),
std::make_pair(VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_external_memory_host, {{
{&DeviceExtensions::vk_khr_external_memory, VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME}}})),
- std::make_pair(VK_EXT_FILTER_CUBIC_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_filter_cubic, {{
- {&DeviceExtensions::vk_img_filter_cubic, VK_IMG_FILTER_CUBIC_EXTENSION_NAME}}})),
+ std::make_pair(VK_EXT_FILTER_CUBIC_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_filter_cubic, {})),
std::make_pair(VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_fragment_density_map, {{
{&DeviceExtensions::vk_khr_get_physical_device_properties_2, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME}}})),
+ std::make_pair(VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_fragment_density_map_2, {{
+ {&DeviceExtensions::vk_ext_fragment_density_map, VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME}}})),
std::make_pair(VK_EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_fragment_shader_interlock, {{
{&DeviceExtensions::vk_khr_get_physical_device_properties_2, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME}}})),
#ifdef VK_USE_PLATFORM_WIN32_KHR
@@ -587,6 +609,8 @@
{&DeviceExtensions::vk_khr_get_physical_device_properties_2, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME},
{&DeviceExtensions::vk_khr_image_format_list, VK_KHR_IMAGE_FORMAT_LIST_EXTENSION_NAME},
{&DeviceExtensions::vk_khr_sampler_ycbcr_conversion, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME}}})),
+ std::make_pair(VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_image_robustness, {{
+ {&DeviceExtensions::vk_khr_get_physical_device_properties_2, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME}}})),
std::make_pair(VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_index_type_uint8, {})),
std::make_pair(VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_inline_uniform_block, {{
{&DeviceExtensions::vk_khr_get_physical_device_properties_2, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME},
@@ -602,8 +626,10 @@
std::make_pair(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_pipeline_creation_cache_control, {})),
std::make_pair(VK_EXT_PIPELINE_CREATION_FEEDBACK_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_pipeline_creation_feedback, {})),
std::make_pair(VK_EXT_POST_DEPTH_COVERAGE_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_post_depth_coverage, {})),
+ std::make_pair(VK_EXT_PRIVATE_DATA_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_private_data, {})),
std::make_pair(VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_queue_family_foreign, {{
{&DeviceExtensions::vk_khr_external_memory, VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME}}})),
+ std::make_pair(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_robustness_2, {})),
std::make_pair(VK_EXT_SAMPLE_LOCATIONS_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_sample_locations, {{
{&DeviceExtensions::vk_khr_get_physical_device_properties_2, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME}}})),
std::make_pair(VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_sampler_filter_minmax, {{
@@ -611,6 +637,8 @@
std::make_pair(VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_scalar_block_layout, {{
{&DeviceExtensions::vk_khr_get_physical_device_properties_2, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME}}})),
std::make_pair(VK_EXT_SEPARATE_STENCIL_USAGE_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_separate_stencil_usage, {})),
+ std::make_pair(VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_shader_atomic_float, {{
+ {&DeviceExtensions::vk_khr_get_physical_device_properties_2, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME}}})),
std::make_pair(VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_shader_demote_to_helper_invocation, {{
{&DeviceExtensions::vk_khr_get_physical_device_properties_2, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME}}})),
std::make_pair(VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_ext_shader_stencil_export, {})),
@@ -727,7 +755,8 @@
{&DeviceExtensions::vk_khr_get_physical_device_properties_2, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME}}})),
std::make_pair(VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_khr_performance_query, {{
{&DeviceExtensions::vk_khr_get_physical_device_properties_2, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME}}})),
- std::make_pair(VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_khr_pipeline_executable_properties, {})),
+ std::make_pair(VK_KHR_PIPELINE_EXECUTABLE_PROPERTIES_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_khr_pipeline_executable_properties, {{
+ {&DeviceExtensions::vk_khr_get_physical_device_properties_2, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME}}})),
#ifdef VK_ENABLE_BETA_EXTENSIONS
std::make_pair(VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_khr_pipeline_library, {})),
#endif
@@ -847,6 +876,8 @@
std::make_pair(VK_NV_WIN32_KEYED_MUTEX_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_nv_win32_keyed_mutex, {{
{&DeviceExtensions::vk_nv_external_memory_win32, VK_NV_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME}}})),
#endif
+ std::make_pair(VK_QCOM_RENDER_PASS_SHADER_RESOLVE_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_qcom_render_pass_shader_resolve, {})),
+ std::make_pair(VK_QCOM_render_pass_store_ops_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_qcom_render_pass_store_ops, {})),
std::make_pair(VK_QCOM_RENDER_PASS_TRANSFORM_EXTENSION_NAME, DeviceInfo(&DeviceExtensions::vk_qcom_render_pass_transform, {{
{&DeviceExtensions::vk_khr_swapchain, VK_KHR_SWAPCHAIN_EXTENSION_NAME},
{&DeviceExtensions::vk_khr_surface, VK_KHR_SURFACE_EXTENSION_NAME}}})),
@@ -980,16 +1011,19 @@
VK_EXT_CALIBRATED_TIMESTAMPS_EXTENSION_NAME,
VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME,
VK_EXT_CONSERVATIVE_RASTERIZATION_EXTENSION_NAME,
+ VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME,
VK_EXT_DEBUG_MARKER_EXTENSION_NAME,
VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_NAME,
VK_EXT_DEPTH_RANGE_UNRESTRICTED_EXTENSION_NAME,
VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME,
VK_EXT_DISCARD_RECTANGLES_EXTENSION_NAME,
VK_EXT_DISPLAY_CONTROL_EXTENSION_NAME,
+ VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME,
VK_EXT_EXTERNAL_MEMORY_DMA_BUF_EXTENSION_NAME,
VK_EXT_EXTERNAL_MEMORY_HOST_EXTENSION_NAME,
VK_EXT_FILTER_CUBIC_EXTENSION_NAME,
VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME,
+ VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME,
VK_EXT_FRAGMENT_SHADER_INTERLOCK_EXTENSION_NAME,
#ifdef VK_USE_PLATFORM_WIN32_KHR
VK_EXT_FULL_SCREEN_EXCLUSIVE_EXTENSION_NAME,
@@ -998,6 +1032,7 @@
VK_EXT_HDR_METADATA_EXTENSION_NAME,
VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME,
VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME,
+ VK_EXT_IMAGE_ROBUSTNESS_EXTENSION_NAME,
VK_EXT_INDEX_TYPE_UINT8_EXTENSION_NAME,
VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME,
VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME,
@@ -1007,11 +1042,14 @@
VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME,
VK_EXT_PIPELINE_CREATION_FEEDBACK_EXTENSION_NAME,
VK_EXT_POST_DEPTH_COVERAGE_EXTENSION_NAME,
+ VK_EXT_PRIVATE_DATA_EXTENSION_NAME,
VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME,
+ VK_EXT_ROBUSTNESS_2_EXTENSION_NAME,
VK_EXT_SAMPLE_LOCATIONS_EXTENSION_NAME,
VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME,
VK_EXT_SCALAR_BLOCK_LAYOUT_EXTENSION_NAME,
VK_EXT_SEPARATE_STENCIL_USAGE_EXTENSION_NAME,
+ VK_EXT_SHADER_ATOMIC_FLOAT_EXTENSION_NAME,
VK_EXT_SHADER_DEMOTE_TO_HELPER_INVOCATION_EXTENSION_NAME,
VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME,
VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME,
@@ -1151,6 +1189,8 @@
#ifdef VK_USE_PLATFORM_WIN32_KHR
VK_NV_WIN32_KEYED_MUTEX_EXTENSION_NAME,
#endif
+ VK_QCOM_RENDER_PASS_SHADER_RESOLVE_EXTENSION_NAME,
+ VK_QCOM_render_pass_store_ops_EXTENSION_NAME,
VK_QCOM_RENDER_PASS_TRANSFORM_EXTENSION_NAME,
};
diff --git a/layers/generated/vk_layer_dispatch_table.h b/layers/generated/vk_layer_dispatch_table.h
index e5e2a18..e287718 100644
--- a/layers/generated/vk_layer_dispatch_table.h
+++ b/layers/generated/vk_layer_dispatch_table.h
@@ -233,6 +233,14 @@
// ---- VK_EXT_headless_surface extension commands
PFN_vkCreateHeadlessSurfaceEXT CreateHeadlessSurfaceEXT;
+
+ // ---- VK_EXT_directfb_surface extension commands
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+ PFN_vkCreateDirectFBSurfaceEXT CreateDirectFBSurfaceEXT;
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+ PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT GetPhysicalDeviceDirectFBPresentationSupportEXT;
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
} VkLayerInstanceDispatchTable;
// Device function pointer dispatch table
@@ -542,6 +550,7 @@
// ---- VK_NVX_image_view_handle extension commands
PFN_vkGetImageViewHandleNVX GetImageViewHandleNVX;
+ PFN_vkGetImageViewAddressNVX GetImageViewAddressNVX;
// ---- VK_AMD_draw_indirect_count extension commands
PFN_vkCmdDrawIndirectCountAMD CmdDrawIndirectCountAMD;
@@ -686,6 +695,20 @@
// ---- VK_EXT_host_query_reset extension commands
PFN_vkResetQueryPoolEXT ResetQueryPoolEXT;
+ // ---- VK_EXT_extended_dynamic_state extension commands
+ PFN_vkCmdSetCullModeEXT CmdSetCullModeEXT;
+ PFN_vkCmdSetFrontFaceEXT CmdSetFrontFaceEXT;
+ PFN_vkCmdSetPrimitiveTopologyEXT CmdSetPrimitiveTopologyEXT;
+ PFN_vkCmdSetViewportWithCountEXT CmdSetViewportWithCountEXT;
+ PFN_vkCmdSetScissorWithCountEXT CmdSetScissorWithCountEXT;
+ PFN_vkCmdBindVertexBuffers2EXT CmdBindVertexBuffers2EXT;
+ PFN_vkCmdSetDepthTestEnableEXT CmdSetDepthTestEnableEXT;
+ PFN_vkCmdSetDepthWriteEnableEXT CmdSetDepthWriteEnableEXT;
+ PFN_vkCmdSetDepthCompareOpEXT CmdSetDepthCompareOpEXT;
+ PFN_vkCmdSetDepthBoundsTestEnableEXT CmdSetDepthBoundsTestEnableEXT;
+ PFN_vkCmdSetStencilTestEnableEXT CmdSetStencilTestEnableEXT;
+ PFN_vkCmdSetStencilOpEXT CmdSetStencilOpEXT;
+
// ---- VK_NV_device_generated_commands extension commands
PFN_vkGetGeneratedCommandsMemoryRequirementsNV GetGeneratedCommandsMemoryRequirementsNV;
PFN_vkCmdPreprocessGeneratedCommandsNV CmdPreprocessGeneratedCommandsNV;
@@ -694,6 +717,12 @@
PFN_vkCreateIndirectCommandsLayoutNV CreateIndirectCommandsLayoutNV;
PFN_vkDestroyIndirectCommandsLayoutNV DestroyIndirectCommandsLayoutNV;
+ // ---- VK_EXT_private_data extension commands
+ PFN_vkCreatePrivateDataSlotEXT CreatePrivateDataSlotEXT;
+ PFN_vkDestroyPrivateDataSlotEXT DestroyPrivateDataSlotEXT;
+ PFN_vkSetPrivateDataEXT SetPrivateDataEXT;
+ PFN_vkGetPrivateDataEXT GetPrivateDataEXT;
+
// ---- VK_FUCHSIA_buffer_collection extension commands
#ifdef VK_USE_PLATFORM_FUCHSIA
PFN_vkCreateBufferCollectionFUCHSIA CreateBufferCollectionFUCHSIA;
diff --git a/layers/generated/vk_object_types.h b/layers/generated/vk_object_types.h
index 2e5bc1b..8410f5d 100644
--- a/layers/generated/vk_object_types.h
+++ b/layers/generated/vk_object_types.h
@@ -37,16 +37,16 @@
// Object Type enum for validation layer internal object handling
typedef enum VulkanObjectType {
kVulkanObjectTypeUnknown = 0,
- kVulkanObjectTypeInstance = 1,
- kVulkanObjectTypePhysicalDevice = 2,
- kVulkanObjectTypeDevice = 3,
- kVulkanObjectTypeQueue = 4,
- kVulkanObjectTypeSemaphore = 5,
- kVulkanObjectTypeCommandBuffer = 6,
- kVulkanObjectTypeFence = 7,
- kVulkanObjectTypeDeviceMemory = 8,
- kVulkanObjectTypeBuffer = 9,
- kVulkanObjectTypeImage = 10,
+ kVulkanObjectTypeBuffer = 1,
+ kVulkanObjectTypeImage = 2,
+ kVulkanObjectTypeInstance = 3,
+ kVulkanObjectTypePhysicalDevice = 4,
+ kVulkanObjectTypeDevice = 5,
+ kVulkanObjectTypeQueue = 6,
+ kVulkanObjectTypeSemaphore = 7,
+ kVulkanObjectTypeCommandBuffer = 8,
+ kVulkanObjectTypeFence = 9,
+ kVulkanObjectTypeDeviceMemory = 10,
kVulkanObjectTypeEvent = 11,
kVulkanObjectTypeQueryPool = 12,
kVulkanObjectTypeBufferView = 13,
@@ -54,12 +54,12 @@
kVulkanObjectTypeShaderModule = 15,
kVulkanObjectTypePipelineCache = 16,
kVulkanObjectTypePipelineLayout = 17,
- kVulkanObjectTypeRenderPass = 18,
- kVulkanObjectTypePipeline = 19,
+ kVulkanObjectTypePipeline = 18,
+ kVulkanObjectTypeRenderPass = 19,
kVulkanObjectTypeDescriptorSetLayout = 20,
kVulkanObjectTypeSampler = 21,
- kVulkanObjectTypeDescriptorPool = 22,
- kVulkanObjectTypeDescriptorSet = 23,
+ kVulkanObjectTypeDescriptorSet = 22,
+ kVulkanObjectTypeDescriptorPool = 23,
kVulkanObjectTypeFramebuffer = 24,
kVulkanObjectTypeCommandPool = 25,
kVulkanObjectTypeSamplerYcbcrConversion = 26,
@@ -75,8 +75,9 @@
kVulkanObjectTypeAccelerationStructureKHR = 36,
kVulkanObjectTypePerformanceConfigurationINTEL = 37,
kVulkanObjectTypeIndirectCommandsLayoutNV = 38,
- kVulkanObjectTypeBufferCollectionFUCHSIA = 39,
- kVulkanObjectTypeMax = 40,
+ kVulkanObjectTypePrivateDataSlotEXT = 39,
+ kVulkanObjectTypeBufferCollectionFUCHSIA = 40,
+ kVulkanObjectTypeMax = 41,
// Aliases for backwards compatibilty of "promoted" types
kVulkanObjectTypeDescriptorUpdateTemplateKHR = kVulkanObjectTypeDescriptorUpdateTemplate,
kVulkanObjectTypeSamplerYcbcrConversionKHR = kVulkanObjectTypeSamplerYcbcrConversion,
@@ -86,6 +87,8 @@
// Array of object name strings for OBJECT_TYPE enum conversion
static const char * const object_string[kVulkanObjectTypeMax] = {
"VkNonDispatchableHandle",
+ "VkBuffer",
+ "VkImage",
"VkInstance",
"VkPhysicalDevice",
"VkDevice",
@@ -94,8 +97,6 @@
"VkCommandBuffer",
"VkFence",
"VkDeviceMemory",
- "VkBuffer",
- "VkImage",
"VkEvent",
"VkQueryPool",
"VkBufferView",
@@ -103,12 +104,12 @@
"VkShaderModule",
"VkPipelineCache",
"VkPipelineLayout",
- "VkRenderPass",
"VkPipeline",
+ "VkRenderPass",
"VkDescriptorSetLayout",
"VkSampler",
- "VkDescriptorPool",
"VkDescriptorSet",
+ "VkDescriptorPool",
"VkFramebuffer",
"VkCommandPool",
"VkSamplerYcbcrConversion",
@@ -124,12 +125,15 @@
"VkAccelerationStructureKHR",
"VkPerformanceConfigurationINTEL",
"VkIndirectCommandsLayoutNV",
+ "VkPrivateDataSlotEXT",
"VkBufferCollectionFUCHSIA",
};
// Helper array to get Vulkan VK_EXT_debug_report object type enum from the internal layers version
const VkDebugReportObjectTypeEXT get_debug_report_enum[] = {
VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, // kVulkanObjectTypeUnknown
+ VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, // kVulkanObjectTypeBuffer
+ VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, // kVulkanObjectTypeImage
VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT, // kVulkanObjectTypeInstance
VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT, // kVulkanObjectTypePhysicalDevice
VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, // kVulkanObjectTypeDevice
@@ -138,8 +142,6 @@
VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, // kVulkanObjectTypeCommandBuffer
VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, // kVulkanObjectTypeFence
VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, // kVulkanObjectTypeDeviceMemory
- VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, // kVulkanObjectTypeBuffer
- VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, // kVulkanObjectTypeImage
VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, // kVulkanObjectTypeEvent
VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, // kVulkanObjectTypeQueryPool
VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT, // kVulkanObjectTypeBufferView
@@ -147,12 +149,12 @@
VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, // kVulkanObjectTypeShaderModule
VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT, // kVulkanObjectTypePipelineCache
VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, // kVulkanObjectTypePipelineLayout
- VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, // kVulkanObjectTypeRenderPass
VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, // kVulkanObjectTypePipeline
+ VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, // kVulkanObjectTypeRenderPass
VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, // kVulkanObjectTypeDescriptorSetLayout
VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, // kVulkanObjectTypeSampler
- VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, // kVulkanObjectTypeDescriptorPool
VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, // kVulkanObjectTypeDescriptorSet
+ VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, // kVulkanObjectTypeDescriptorPool
VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, // kVulkanObjectTypeFramebuffer
VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, // kVulkanObjectTypeCommandPool
VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_EXT, // kVulkanObjectTypeSamplerYcbcrConversion
@@ -172,6 +174,7 @@
VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR_EXT, // kVulkanObjectTypeAccelerationStructureKHR
VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, // kVulkanObjectTypePerformanceConfigurationINTEL
VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, // kVulkanObjectTypeIndirectCommandsLayoutNV
+ VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, // kVulkanObjectTypePrivateDataSlotEXT
#ifdef VK_USE_PLATFORM_FUCHSIA
VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA_EXT, // kVulkanObjectTypeBufferCollectionFUCHSIA
#else
@@ -182,6 +185,8 @@
// Helper function to get Official Vulkan VkObjectType enum from the internal layers version
static inline VkObjectType ConvertVulkanObjectToCoreObject(VulkanObjectType internal_type) {
switch (internal_type) {
+ case kVulkanObjectTypeBuffer: return VK_OBJECT_TYPE_BUFFER;
+ case kVulkanObjectTypeImage: return VK_OBJECT_TYPE_IMAGE;
case kVulkanObjectTypeInstance: return VK_OBJECT_TYPE_INSTANCE;
case kVulkanObjectTypePhysicalDevice: return VK_OBJECT_TYPE_PHYSICAL_DEVICE;
case kVulkanObjectTypeDevice: return VK_OBJECT_TYPE_DEVICE;
@@ -190,8 +195,6 @@
case kVulkanObjectTypeCommandBuffer: return VK_OBJECT_TYPE_COMMAND_BUFFER;
case kVulkanObjectTypeFence: return VK_OBJECT_TYPE_FENCE;
case kVulkanObjectTypeDeviceMemory: return VK_OBJECT_TYPE_DEVICE_MEMORY;
- case kVulkanObjectTypeBuffer: return VK_OBJECT_TYPE_BUFFER;
- case kVulkanObjectTypeImage: return VK_OBJECT_TYPE_IMAGE;
case kVulkanObjectTypeEvent: return VK_OBJECT_TYPE_EVENT;
case kVulkanObjectTypeQueryPool: return VK_OBJECT_TYPE_QUERY_POOL;
case kVulkanObjectTypeBufferView: return VK_OBJECT_TYPE_BUFFER_VIEW;
@@ -199,12 +202,12 @@
case kVulkanObjectTypeShaderModule: return VK_OBJECT_TYPE_SHADER_MODULE;
case kVulkanObjectTypePipelineCache: return VK_OBJECT_TYPE_PIPELINE_CACHE;
case kVulkanObjectTypePipelineLayout: return VK_OBJECT_TYPE_PIPELINE_LAYOUT;
- case kVulkanObjectTypeRenderPass: return VK_OBJECT_TYPE_RENDER_PASS;
case kVulkanObjectTypePipeline: return VK_OBJECT_TYPE_PIPELINE;
+ case kVulkanObjectTypeRenderPass: return VK_OBJECT_TYPE_RENDER_PASS;
case kVulkanObjectTypeDescriptorSetLayout: return VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT;
case kVulkanObjectTypeSampler: return VK_OBJECT_TYPE_SAMPLER;
- case kVulkanObjectTypeDescriptorPool: return VK_OBJECT_TYPE_DESCRIPTOR_POOL;
case kVulkanObjectTypeDescriptorSet: return VK_OBJECT_TYPE_DESCRIPTOR_SET;
+ case kVulkanObjectTypeDescriptorPool: return VK_OBJECT_TYPE_DESCRIPTOR_POOL;
case kVulkanObjectTypeFramebuffer: return VK_OBJECT_TYPE_FRAMEBUFFER;
case kVulkanObjectTypeCommandPool: return VK_OBJECT_TYPE_COMMAND_POOL;
case kVulkanObjectTypeSamplerYcbcrConversion: return VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION;
@@ -220,6 +223,7 @@
case kVulkanObjectTypeAccelerationStructureKHR: return VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR;
case kVulkanObjectTypePerformanceConfigurationINTEL: return VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL;
case kVulkanObjectTypeIndirectCommandsLayoutNV: return VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV;
+ case kVulkanObjectTypePrivateDataSlotEXT: return VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT;
case kVulkanObjectTypeBufferCollectionFUCHSIA: return VK_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA;
default: return VK_OBJECT_TYPE_UNKNOWN;
}
@@ -228,6 +232,8 @@
// Helper function to get internal layers object ids from the official Vulkan VkObjectType enum
static inline VulkanObjectType ConvertCoreObjectToVulkanObject(VkObjectType vulkan_object_type) {
switch (vulkan_object_type) {
+ case VK_OBJECT_TYPE_BUFFER: return kVulkanObjectTypeBuffer;
+ case VK_OBJECT_TYPE_IMAGE: return kVulkanObjectTypeImage;
case VK_OBJECT_TYPE_INSTANCE: return kVulkanObjectTypeInstance;
case VK_OBJECT_TYPE_PHYSICAL_DEVICE: return kVulkanObjectTypePhysicalDevice;
case VK_OBJECT_TYPE_DEVICE: return kVulkanObjectTypeDevice;
@@ -236,8 +242,6 @@
case VK_OBJECT_TYPE_COMMAND_BUFFER: return kVulkanObjectTypeCommandBuffer;
case VK_OBJECT_TYPE_FENCE: return kVulkanObjectTypeFence;
case VK_OBJECT_TYPE_DEVICE_MEMORY: return kVulkanObjectTypeDeviceMemory;
- case VK_OBJECT_TYPE_BUFFER: return kVulkanObjectTypeBuffer;
- case VK_OBJECT_TYPE_IMAGE: return kVulkanObjectTypeImage;
case VK_OBJECT_TYPE_EVENT: return kVulkanObjectTypeEvent;
case VK_OBJECT_TYPE_QUERY_POOL: return kVulkanObjectTypeQueryPool;
case VK_OBJECT_TYPE_BUFFER_VIEW: return kVulkanObjectTypeBufferView;
@@ -245,12 +249,12 @@
case VK_OBJECT_TYPE_SHADER_MODULE: return kVulkanObjectTypeShaderModule;
case VK_OBJECT_TYPE_PIPELINE_CACHE: return kVulkanObjectTypePipelineCache;
case VK_OBJECT_TYPE_PIPELINE_LAYOUT: return kVulkanObjectTypePipelineLayout;
- case VK_OBJECT_TYPE_RENDER_PASS: return kVulkanObjectTypeRenderPass;
case VK_OBJECT_TYPE_PIPELINE: return kVulkanObjectTypePipeline;
+ case VK_OBJECT_TYPE_RENDER_PASS: return kVulkanObjectTypeRenderPass;
case VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT: return kVulkanObjectTypeDescriptorSetLayout;
case VK_OBJECT_TYPE_SAMPLER: return kVulkanObjectTypeSampler;
- case VK_OBJECT_TYPE_DESCRIPTOR_POOL: return kVulkanObjectTypeDescriptorPool;
case VK_OBJECT_TYPE_DESCRIPTOR_SET: return kVulkanObjectTypeDescriptorSet;
+ case VK_OBJECT_TYPE_DESCRIPTOR_POOL: return kVulkanObjectTypeDescriptorPool;
case VK_OBJECT_TYPE_FRAMEBUFFER: return kVulkanObjectTypeFramebuffer;
case VK_OBJECT_TYPE_COMMAND_POOL: return kVulkanObjectTypeCommandPool;
case VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION: return kVulkanObjectTypeSamplerYcbcrConversion;
@@ -266,6 +270,7 @@
case VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR: return kVulkanObjectTypeAccelerationStructureKHR;
case VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL: return kVulkanObjectTypePerformanceConfigurationINTEL;
case VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV: return kVulkanObjectTypeIndirectCommandsLayoutNV;
+ case VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT: return kVulkanObjectTypePrivateDataSlotEXT;
case VK_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA: return kVulkanObjectTypeBufferCollectionFUCHSIA;
default: return kVulkanObjectTypeUnknown;
}
@@ -713,6 +718,17 @@
template <> struct VulkanObjectTypeInfo<kVulkanObjectTypePipelineLayout> {
typedef VkPipelineLayout Type;
};
+template <> struct VkHandleInfo<VkPrivateDataSlotEXT> {
+ static const VulkanObjectType kVulkanObjectType = kVulkanObjectTypePrivateDataSlotEXT;
+ static const VkDebugReportObjectTypeEXT kDebugReportObjectType = VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT;
+ static const VkObjectType kVkObjectType = VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT;
+ static const char* Typename() {
+ return "VkPrivateDataSlotEXT";
+ }
+};
+template <> struct VulkanObjectTypeInfo<kVulkanObjectTypePrivateDataSlotEXT> {
+ typedef VkPrivateDataSlotEXT Type;
+};
template <> struct VkHandleInfo<VkQueryPool> {
static const VulkanObjectType kVulkanObjectType = kVulkanObjectTypeQueryPool;
static const VkDebugReportObjectTypeEXT kDebugReportObjectType = VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT;
diff --git a/layers/generated/vk_safe_struct.cpp b/layers/generated/vk_safe_struct.cpp
index 22d74f9..0717a0a 100644
--- a/layers/generated/vk_safe_struct.cpp
+++ b/layers/generated/vk_safe_struct.cpp
@@ -35,9 +35,304 @@
#include <string.h>
#include <cassert>
#include <cstring>
+#include <vector>
#include <vulkan/vk_layer.h>
+extern std::vector<std::pair<uint32_t, uint32_t>> custom_stype_info;
+
+
+safe_VkBufferMemoryBarrier::safe_VkBufferMemoryBarrier(const VkBufferMemoryBarrier* in_struct) :
+ sType(in_struct->sType),
+ srcAccessMask(in_struct->srcAccessMask),
+ dstAccessMask(in_struct->dstAccessMask),
+ srcQueueFamilyIndex(in_struct->srcQueueFamilyIndex),
+ dstQueueFamilyIndex(in_struct->dstQueueFamilyIndex),
+ buffer(in_struct->buffer),
+ offset(in_struct->offset),
+ size(in_struct->size)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+safe_VkBufferMemoryBarrier::safe_VkBufferMemoryBarrier() :
+ sType(VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER),
+ pNext(nullptr)
+{}
+
+safe_VkBufferMemoryBarrier::safe_VkBufferMemoryBarrier(const safe_VkBufferMemoryBarrier& copy_src)
+{
+ sType = copy_src.sType;
+ srcAccessMask = copy_src.srcAccessMask;
+ dstAccessMask = copy_src.dstAccessMask;
+ srcQueueFamilyIndex = copy_src.srcQueueFamilyIndex;
+ dstQueueFamilyIndex = copy_src.dstQueueFamilyIndex;
+ buffer = copy_src.buffer;
+ offset = copy_src.offset;
+ size = copy_src.size;
+ pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkBufferMemoryBarrier& safe_VkBufferMemoryBarrier::operator=(const safe_VkBufferMemoryBarrier& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ srcAccessMask = copy_src.srcAccessMask;
+ dstAccessMask = copy_src.dstAccessMask;
+ srcQueueFamilyIndex = copy_src.srcQueueFamilyIndex;
+ dstQueueFamilyIndex = copy_src.dstQueueFamilyIndex;
+ buffer = copy_src.buffer;
+ offset = copy_src.offset;
+ size = copy_src.size;
+ pNext = SafePnextCopy(copy_src.pNext);
+
+ return *this;
+}
+
+safe_VkBufferMemoryBarrier::~safe_VkBufferMemoryBarrier()
+{
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkBufferMemoryBarrier::initialize(const VkBufferMemoryBarrier* in_struct)
+{
+ sType = in_struct->sType;
+ srcAccessMask = in_struct->srcAccessMask;
+ dstAccessMask = in_struct->dstAccessMask;
+ srcQueueFamilyIndex = in_struct->srcQueueFamilyIndex;
+ dstQueueFamilyIndex = in_struct->dstQueueFamilyIndex;
+ buffer = in_struct->buffer;
+ offset = in_struct->offset;
+ size = in_struct->size;
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+void safe_VkBufferMemoryBarrier::initialize(const safe_VkBufferMemoryBarrier* copy_src)
+{
+ sType = copy_src->sType;
+ srcAccessMask = copy_src->srcAccessMask;
+ dstAccessMask = copy_src->dstAccessMask;
+ srcQueueFamilyIndex = copy_src->srcQueueFamilyIndex;
+ dstQueueFamilyIndex = copy_src->dstQueueFamilyIndex;
+ buffer = copy_src->buffer;
+ offset = copy_src->offset;
+ size = copy_src->size;
+ pNext = SafePnextCopy(copy_src->pNext);
+}
+
+safe_VkImageMemoryBarrier::safe_VkImageMemoryBarrier(const VkImageMemoryBarrier* in_struct) :
+ sType(in_struct->sType),
+ srcAccessMask(in_struct->srcAccessMask),
+ dstAccessMask(in_struct->dstAccessMask),
+ oldLayout(in_struct->oldLayout),
+ newLayout(in_struct->newLayout),
+ srcQueueFamilyIndex(in_struct->srcQueueFamilyIndex),
+ dstQueueFamilyIndex(in_struct->dstQueueFamilyIndex),
+ image(in_struct->image),
+ subresourceRange(in_struct->subresourceRange)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+safe_VkImageMemoryBarrier::safe_VkImageMemoryBarrier() :
+ sType(VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER),
+ pNext(nullptr)
+{}
+
+safe_VkImageMemoryBarrier::safe_VkImageMemoryBarrier(const safe_VkImageMemoryBarrier& copy_src)
+{
+ sType = copy_src.sType;
+ srcAccessMask = copy_src.srcAccessMask;
+ dstAccessMask = copy_src.dstAccessMask;
+ oldLayout = copy_src.oldLayout;
+ newLayout = copy_src.newLayout;
+ srcQueueFamilyIndex = copy_src.srcQueueFamilyIndex;
+ dstQueueFamilyIndex = copy_src.dstQueueFamilyIndex;
+ image = copy_src.image;
+ subresourceRange = copy_src.subresourceRange;
+ pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkImageMemoryBarrier& safe_VkImageMemoryBarrier::operator=(const safe_VkImageMemoryBarrier& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ srcAccessMask = copy_src.srcAccessMask;
+ dstAccessMask = copy_src.dstAccessMask;
+ oldLayout = copy_src.oldLayout;
+ newLayout = copy_src.newLayout;
+ srcQueueFamilyIndex = copy_src.srcQueueFamilyIndex;
+ dstQueueFamilyIndex = copy_src.dstQueueFamilyIndex;
+ image = copy_src.image;
+ subresourceRange = copy_src.subresourceRange;
+ pNext = SafePnextCopy(copy_src.pNext);
+
+ return *this;
+}
+
+safe_VkImageMemoryBarrier::~safe_VkImageMemoryBarrier()
+{
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkImageMemoryBarrier::initialize(const VkImageMemoryBarrier* in_struct)
+{
+ sType = in_struct->sType;
+ srcAccessMask = in_struct->srcAccessMask;
+ dstAccessMask = in_struct->dstAccessMask;
+ oldLayout = in_struct->oldLayout;
+ newLayout = in_struct->newLayout;
+ srcQueueFamilyIndex = in_struct->srcQueueFamilyIndex;
+ dstQueueFamilyIndex = in_struct->dstQueueFamilyIndex;
+ image = in_struct->image;
+ subresourceRange = in_struct->subresourceRange;
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+void safe_VkImageMemoryBarrier::initialize(const safe_VkImageMemoryBarrier* copy_src)
+{
+ sType = copy_src->sType;
+ srcAccessMask = copy_src->srcAccessMask;
+ dstAccessMask = copy_src->dstAccessMask;
+ oldLayout = copy_src->oldLayout;
+ newLayout = copy_src->newLayout;
+ srcQueueFamilyIndex = copy_src->srcQueueFamilyIndex;
+ dstQueueFamilyIndex = copy_src->dstQueueFamilyIndex;
+ image = copy_src->image;
+ subresourceRange = copy_src->subresourceRange;
+ pNext = SafePnextCopy(copy_src->pNext);
+}
+
+safe_VkMemoryBarrier::safe_VkMemoryBarrier(const VkMemoryBarrier* in_struct) :
+ sType(in_struct->sType),
+ srcAccessMask(in_struct->srcAccessMask),
+ dstAccessMask(in_struct->dstAccessMask)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+safe_VkMemoryBarrier::safe_VkMemoryBarrier() :
+ sType(VK_STRUCTURE_TYPE_MEMORY_BARRIER),
+ pNext(nullptr)
+{}
+
+safe_VkMemoryBarrier::safe_VkMemoryBarrier(const safe_VkMemoryBarrier& copy_src)
+{
+ sType = copy_src.sType;
+ srcAccessMask = copy_src.srcAccessMask;
+ dstAccessMask = copy_src.dstAccessMask;
+ pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkMemoryBarrier& safe_VkMemoryBarrier::operator=(const safe_VkMemoryBarrier& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ srcAccessMask = copy_src.srcAccessMask;
+ dstAccessMask = copy_src.dstAccessMask;
+ pNext = SafePnextCopy(copy_src.pNext);
+
+ return *this;
+}
+
+safe_VkMemoryBarrier::~safe_VkMemoryBarrier()
+{
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkMemoryBarrier::initialize(const VkMemoryBarrier* in_struct)
+{
+ sType = in_struct->sType;
+ srcAccessMask = in_struct->srcAccessMask;
+ dstAccessMask = in_struct->dstAccessMask;
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+void safe_VkMemoryBarrier::initialize(const safe_VkMemoryBarrier* copy_src)
+{
+ sType = copy_src->sType;
+ srcAccessMask = copy_src->srcAccessMask;
+ dstAccessMask = copy_src->dstAccessMask;
+ pNext = SafePnextCopy(copy_src->pNext);
+}
+
+safe_VkAllocationCallbacks::safe_VkAllocationCallbacks(const VkAllocationCallbacks* in_struct) :
+ pUserData(in_struct->pUserData),
+ pfnAllocation(in_struct->pfnAllocation),
+ pfnReallocation(in_struct->pfnReallocation),
+ pfnFree(in_struct->pfnFree),
+ pfnInternalAllocation(in_struct->pfnInternalAllocation),
+ pfnInternalFree(in_struct->pfnInternalFree)
+{
+}
+
+safe_VkAllocationCallbacks::safe_VkAllocationCallbacks() :
+ pUserData(nullptr)
+{}
+
+safe_VkAllocationCallbacks::safe_VkAllocationCallbacks(const safe_VkAllocationCallbacks& copy_src)
+{
+ pUserData = copy_src.pUserData;
+ pfnAllocation = copy_src.pfnAllocation;
+ pfnReallocation = copy_src.pfnReallocation;
+ pfnFree = copy_src.pfnFree;
+ pfnInternalAllocation = copy_src.pfnInternalAllocation;
+ pfnInternalFree = copy_src.pfnInternalFree;
+}
+
+safe_VkAllocationCallbacks& safe_VkAllocationCallbacks::operator=(const safe_VkAllocationCallbacks& copy_src)
+{
+ if (©_src == this) return *this;
+
+
+ pUserData = copy_src.pUserData;
+ pfnAllocation = copy_src.pfnAllocation;
+ pfnReallocation = copy_src.pfnReallocation;
+ pfnFree = copy_src.pfnFree;
+ pfnInternalAllocation = copy_src.pfnInternalAllocation;
+ pfnInternalFree = copy_src.pfnInternalFree;
+
+ return *this;
+}
+
+safe_VkAllocationCallbacks::~safe_VkAllocationCallbacks()
+{
+}
+
+void safe_VkAllocationCallbacks::initialize(const VkAllocationCallbacks* in_struct)
+{
+ pUserData = in_struct->pUserData;
+ pfnAllocation = in_struct->pfnAllocation;
+ pfnReallocation = in_struct->pfnReallocation;
+ pfnFree = in_struct->pfnFree;
+ pfnInternalAllocation = in_struct->pfnInternalAllocation;
+ pfnInternalFree = in_struct->pfnInternalFree;
+}
+
+void safe_VkAllocationCallbacks::initialize(const safe_VkAllocationCallbacks* copy_src)
+{
+ pUserData = copy_src->pUserData;
+ pfnAllocation = copy_src->pfnAllocation;
+ pfnReallocation = copy_src->pfnReallocation;
+ pfnFree = copy_src->pfnFree;
+ pfnInternalAllocation = copy_src->pfnInternalAllocation;
+ pfnInternalFree = copy_src->pfnInternalFree;
+}
safe_VkApplicationInfo::safe_VkApplicationInfo(const VkApplicationInfo* in_struct) :
sType(in_struct->sType),
@@ -277,69 +572,6 @@
pApplicationInfo = new safe_VkApplicationInfo(*copy_src->pApplicationInfo);
}
-safe_VkAllocationCallbacks::safe_VkAllocationCallbacks(const VkAllocationCallbacks* in_struct) :
- pUserData(in_struct->pUserData),
- pfnAllocation(in_struct->pfnAllocation),
- pfnReallocation(in_struct->pfnReallocation),
- pfnFree(in_struct->pfnFree),
- pfnInternalAllocation(in_struct->pfnInternalAllocation),
- pfnInternalFree(in_struct->pfnInternalFree)
-{
-}
-
-safe_VkAllocationCallbacks::safe_VkAllocationCallbacks() :
- pUserData(nullptr)
-{}
-
-safe_VkAllocationCallbacks::safe_VkAllocationCallbacks(const safe_VkAllocationCallbacks& copy_src)
-{
- pUserData = copy_src.pUserData;
- pfnAllocation = copy_src.pfnAllocation;
- pfnReallocation = copy_src.pfnReallocation;
- pfnFree = copy_src.pfnFree;
- pfnInternalAllocation = copy_src.pfnInternalAllocation;
- pfnInternalFree = copy_src.pfnInternalFree;
-}
-
-safe_VkAllocationCallbacks& safe_VkAllocationCallbacks::operator=(const safe_VkAllocationCallbacks& copy_src)
-{
- if (©_src == this) return *this;
-
-
- pUserData = copy_src.pUserData;
- pfnAllocation = copy_src.pfnAllocation;
- pfnReallocation = copy_src.pfnReallocation;
- pfnFree = copy_src.pfnFree;
- pfnInternalAllocation = copy_src.pfnInternalAllocation;
- pfnInternalFree = copy_src.pfnInternalFree;
-
- return *this;
-}
-
-safe_VkAllocationCallbacks::~safe_VkAllocationCallbacks()
-{
-}
-
-void safe_VkAllocationCallbacks::initialize(const VkAllocationCallbacks* in_struct)
-{
- pUserData = in_struct->pUserData;
- pfnAllocation = in_struct->pfnAllocation;
- pfnReallocation = in_struct->pfnReallocation;
- pfnFree = in_struct->pfnFree;
- pfnInternalAllocation = in_struct->pfnInternalAllocation;
- pfnInternalFree = in_struct->pfnInternalFree;
-}
-
-void safe_VkAllocationCallbacks::initialize(const safe_VkAllocationCallbacks* copy_src)
-{
- pUserData = copy_src->pUserData;
- pfnAllocation = copy_src->pfnAllocation;
- pfnReallocation = copy_src->pfnReallocation;
- pfnFree = copy_src->pfnFree;
- pfnInternalAllocation = copy_src->pfnInternalAllocation;
- pfnInternalFree = copy_src->pfnInternalFree;
-}
-
safe_VkDeviceQueueCreateInfo::safe_VkDeviceQueueCreateInfo(const VkDeviceQueueCreateInfo* in_struct) :
sType(in_struct->sType),
flags(in_struct->flags),
@@ -845,64 +1077,6 @@
}
}
-safe_VkMemoryAllocateInfo::safe_VkMemoryAllocateInfo(const VkMemoryAllocateInfo* in_struct) :
- sType(in_struct->sType),
- allocationSize(in_struct->allocationSize),
- memoryTypeIndex(in_struct->memoryTypeIndex)
-{
- pNext = SafePnextCopy(in_struct->pNext);
-}
-
-safe_VkMemoryAllocateInfo::safe_VkMemoryAllocateInfo() :
- sType(VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO),
- pNext(nullptr)
-{}
-
-safe_VkMemoryAllocateInfo::safe_VkMemoryAllocateInfo(const safe_VkMemoryAllocateInfo& copy_src)
-{
- sType = copy_src.sType;
- allocationSize = copy_src.allocationSize;
- memoryTypeIndex = copy_src.memoryTypeIndex;
- pNext = SafePnextCopy(copy_src.pNext);
-}
-
-safe_VkMemoryAllocateInfo& safe_VkMemoryAllocateInfo::operator=(const safe_VkMemoryAllocateInfo& copy_src)
-{
- if (©_src == this) return *this;
-
- if (pNext)
- FreePnextChain(pNext);
-
- sType = copy_src.sType;
- allocationSize = copy_src.allocationSize;
- memoryTypeIndex = copy_src.memoryTypeIndex;
- pNext = SafePnextCopy(copy_src.pNext);
-
- return *this;
-}
-
-safe_VkMemoryAllocateInfo::~safe_VkMemoryAllocateInfo()
-{
- if (pNext)
- FreePnextChain(pNext);
-}
-
-void safe_VkMemoryAllocateInfo::initialize(const VkMemoryAllocateInfo* in_struct)
-{
- sType = in_struct->sType;
- allocationSize = in_struct->allocationSize;
- memoryTypeIndex = in_struct->memoryTypeIndex;
- pNext = SafePnextCopy(in_struct->pNext);
-}
-
-void safe_VkMemoryAllocateInfo::initialize(const safe_VkMemoryAllocateInfo* copy_src)
-{
- sType = copy_src->sType;
- allocationSize = copy_src->allocationSize;
- memoryTypeIndex = copy_src->memoryTypeIndex;
- pNext = SafePnextCopy(copy_src->pNext);
-}
-
safe_VkMappedMemoryRange::safe_VkMappedMemoryRange(const VkMappedMemoryRange* in_struct) :
sType(in_struct->sType),
memory(in_struct->memory),
@@ -966,6 +1140,64 @@
pNext = SafePnextCopy(copy_src->pNext);
}
+safe_VkMemoryAllocateInfo::safe_VkMemoryAllocateInfo(const VkMemoryAllocateInfo* in_struct) :
+ sType(in_struct->sType),
+ allocationSize(in_struct->allocationSize),
+ memoryTypeIndex(in_struct->memoryTypeIndex)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+safe_VkMemoryAllocateInfo::safe_VkMemoryAllocateInfo() :
+ sType(VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO),
+ pNext(nullptr)
+{}
+
+safe_VkMemoryAllocateInfo::safe_VkMemoryAllocateInfo(const safe_VkMemoryAllocateInfo& copy_src)
+{
+ sType = copy_src.sType;
+ allocationSize = copy_src.allocationSize;
+ memoryTypeIndex = copy_src.memoryTypeIndex;
+ pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkMemoryAllocateInfo& safe_VkMemoryAllocateInfo::operator=(const safe_VkMemoryAllocateInfo& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ allocationSize = copy_src.allocationSize;
+ memoryTypeIndex = copy_src.memoryTypeIndex;
+ pNext = SafePnextCopy(copy_src.pNext);
+
+ return *this;
+}
+
+safe_VkMemoryAllocateInfo::~safe_VkMemoryAllocateInfo()
+{
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkMemoryAllocateInfo::initialize(const VkMemoryAllocateInfo* in_struct)
+{
+ sType = in_struct->sType;
+ allocationSize = in_struct->allocationSize;
+ memoryTypeIndex = in_struct->memoryTypeIndex;
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+void safe_VkMemoryAllocateInfo::initialize(const safe_VkMemoryAllocateInfo* copy_src)
+{
+ sType = copy_src->sType;
+ allocationSize = copy_src->allocationSize;
+ memoryTypeIndex = copy_src->memoryTypeIndex;
+ pNext = SafePnextCopy(copy_src->pNext);
+}
+
safe_VkSparseBufferMemoryBindInfo::safe_VkSparseBufferMemoryBindInfo(const VkSparseBufferMemoryBindInfo* in_struct) :
buffer(in_struct->buffer),
bindCount(in_struct->bindCount),
@@ -1722,7 +1954,7 @@
pQueueFamilyIndices(nullptr)
{
pNext = SafePnextCopy(in_struct->pNext);
- if (in_struct->pQueueFamilyIndices) {
+ if ((in_struct->sharingMode == VK_SHARING_MODE_CONCURRENT) && in_struct->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[in_struct->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)in_struct->pQueueFamilyIndices, sizeof(uint32_t)*in_struct->queueFamilyIndexCount);
}
@@ -1744,7 +1976,7 @@
queueFamilyIndexCount = copy_src.queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
pNext = SafePnextCopy(copy_src.pNext);
- if (copy_src.pQueueFamilyIndices) {
+ if ((copy_src.sharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src.pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src.queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src.pQueueFamilyIndices, sizeof(uint32_t)*copy_src.queueFamilyIndexCount);
}
@@ -1767,7 +1999,7 @@
queueFamilyIndexCount = copy_src.queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
pNext = SafePnextCopy(copy_src.pNext);
- if (copy_src.pQueueFamilyIndices) {
+ if ((copy_src.sharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src.pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src.queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src.pQueueFamilyIndices, sizeof(uint32_t)*copy_src.queueFamilyIndexCount);
}
@@ -1793,7 +2025,7 @@
queueFamilyIndexCount = in_struct->queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
pNext = SafePnextCopy(in_struct->pNext);
- if (in_struct->pQueueFamilyIndices) {
+ if ((in_struct->sharingMode == VK_SHARING_MODE_CONCURRENT) && in_struct->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[in_struct->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)in_struct->pQueueFamilyIndices, sizeof(uint32_t)*in_struct->queueFamilyIndexCount);
}
@@ -1809,7 +2041,7 @@
queueFamilyIndexCount = copy_src->queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
pNext = SafePnextCopy(copy_src->pNext);
- if (copy_src->pQueueFamilyIndices) {
+ if ((copy_src->sharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src->pQueueFamilyIndices, sizeof(uint32_t)*copy_src->queueFamilyIndexCount);
}
@@ -1905,7 +2137,7 @@
initialLayout(in_struct->initialLayout)
{
pNext = SafePnextCopy(in_struct->pNext);
- if (in_struct->pQueueFamilyIndices) {
+ if ((in_struct->sharingMode == VK_SHARING_MODE_CONCURRENT) && in_struct->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[in_struct->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)in_struct->pQueueFamilyIndices, sizeof(uint32_t)*in_struct->queueFamilyIndexCount);
}
@@ -1934,7 +2166,7 @@
pQueueFamilyIndices = nullptr;
initialLayout = copy_src.initialLayout;
pNext = SafePnextCopy(copy_src.pNext);
- if (copy_src.pQueueFamilyIndices) {
+ if ((copy_src.sharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src.pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src.queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src.pQueueFamilyIndices, sizeof(uint32_t)*copy_src.queueFamilyIndexCount);
}
@@ -1964,7 +2196,7 @@
pQueueFamilyIndices = nullptr;
initialLayout = copy_src.initialLayout;
pNext = SafePnextCopy(copy_src.pNext);
- if (copy_src.pQueueFamilyIndices) {
+ if ((copy_src.sharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src.pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src.queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src.pQueueFamilyIndices, sizeof(uint32_t)*copy_src.queueFamilyIndexCount);
}
@@ -1997,7 +2229,7 @@
pQueueFamilyIndices = nullptr;
initialLayout = in_struct->initialLayout;
pNext = SafePnextCopy(in_struct->pNext);
- if (in_struct->pQueueFamilyIndices) {
+ if ((in_struct->sharingMode == VK_SHARING_MODE_CONCURRENT) && in_struct->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[in_struct->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)in_struct->pQueueFamilyIndices, sizeof(uint32_t)*in_struct->queueFamilyIndexCount);
}
@@ -2020,7 +2252,7 @@
pQueueFamilyIndices = nullptr;
initialLayout = copy_src->initialLayout;
pNext = SafePnextCopy(copy_src->pNext);
- if (copy_src->pQueueFamilyIndices) {
+ if ((copy_src->sharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src->pQueueFamilyIndices, sizeof(uint32_t)*copy_src->queueFamilyIndexCount);
}
@@ -2425,6 +2657,79 @@
pSpecializationInfo = new safe_VkSpecializationInfo(*copy_src->pSpecializationInfo);
}
+safe_VkComputePipelineCreateInfo::safe_VkComputePipelineCreateInfo(const VkComputePipelineCreateInfo* in_struct) :
+ sType(in_struct->sType),
+ flags(in_struct->flags),
+ stage(&in_struct->stage),
+ layout(in_struct->layout),
+ basePipelineHandle(in_struct->basePipelineHandle),
+ basePipelineIndex(in_struct->basePipelineIndex)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+safe_VkComputePipelineCreateInfo::safe_VkComputePipelineCreateInfo() :
+ sType(VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO),
+ pNext(nullptr)
+{}
+
+safe_VkComputePipelineCreateInfo::safe_VkComputePipelineCreateInfo(const safe_VkComputePipelineCreateInfo& copy_src)
+{
+ sType = copy_src.sType;
+ flags = copy_src.flags;
+ stage.initialize(©_src.stage);
+ layout = copy_src.layout;
+ basePipelineHandle = copy_src.basePipelineHandle;
+ basePipelineIndex = copy_src.basePipelineIndex;
+ pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkComputePipelineCreateInfo& safe_VkComputePipelineCreateInfo::operator=(const safe_VkComputePipelineCreateInfo& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ flags = copy_src.flags;
+ stage.initialize(©_src.stage);
+ layout = copy_src.layout;
+ basePipelineHandle = copy_src.basePipelineHandle;
+ basePipelineIndex = copy_src.basePipelineIndex;
+ pNext = SafePnextCopy(copy_src.pNext);
+
+ return *this;
+}
+
+safe_VkComputePipelineCreateInfo::~safe_VkComputePipelineCreateInfo()
+{
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkComputePipelineCreateInfo::initialize(const VkComputePipelineCreateInfo* in_struct)
+{
+ sType = in_struct->sType;
+ flags = in_struct->flags;
+ stage.initialize(&in_struct->stage);
+ layout = in_struct->layout;
+ basePipelineHandle = in_struct->basePipelineHandle;
+ basePipelineIndex = in_struct->basePipelineIndex;
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+void safe_VkComputePipelineCreateInfo::initialize(const safe_VkComputePipelineCreateInfo* copy_src)
+{
+ sType = copy_src->sType;
+ flags = copy_src->flags;
+ stage.initialize(©_src->stage);
+ layout = copy_src->layout;
+ basePipelineHandle = copy_src->basePipelineHandle;
+ basePipelineIndex = copy_src->basePipelineIndex;
+ pNext = SafePnextCopy(copy_src->pNext);
+}
+
safe_VkPipelineVertexInputStateCreateInfo::safe_VkPipelineVertexInputStateCreateInfo(const VkPipelineVertexInputStateCreateInfo* in_struct) :
sType(in_struct->sType),
flags(in_struct->flags),
@@ -3764,79 +4069,6 @@
pDynamicState = NULL;
}
-safe_VkComputePipelineCreateInfo::safe_VkComputePipelineCreateInfo(const VkComputePipelineCreateInfo* in_struct) :
- sType(in_struct->sType),
- flags(in_struct->flags),
- stage(&in_struct->stage),
- layout(in_struct->layout),
- basePipelineHandle(in_struct->basePipelineHandle),
- basePipelineIndex(in_struct->basePipelineIndex)
-{
- pNext = SafePnextCopy(in_struct->pNext);
-}
-
-safe_VkComputePipelineCreateInfo::safe_VkComputePipelineCreateInfo() :
- sType(VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO),
- pNext(nullptr)
-{}
-
-safe_VkComputePipelineCreateInfo::safe_VkComputePipelineCreateInfo(const safe_VkComputePipelineCreateInfo& copy_src)
-{
- sType = copy_src.sType;
- flags = copy_src.flags;
- stage.initialize(©_src.stage);
- layout = copy_src.layout;
- basePipelineHandle = copy_src.basePipelineHandle;
- basePipelineIndex = copy_src.basePipelineIndex;
- pNext = SafePnextCopy(copy_src.pNext);
-}
-
-safe_VkComputePipelineCreateInfo& safe_VkComputePipelineCreateInfo::operator=(const safe_VkComputePipelineCreateInfo& copy_src)
-{
- if (©_src == this) return *this;
-
- if (pNext)
- FreePnextChain(pNext);
-
- sType = copy_src.sType;
- flags = copy_src.flags;
- stage.initialize(©_src.stage);
- layout = copy_src.layout;
- basePipelineHandle = copy_src.basePipelineHandle;
- basePipelineIndex = copy_src.basePipelineIndex;
- pNext = SafePnextCopy(copy_src.pNext);
-
- return *this;
-}
-
-safe_VkComputePipelineCreateInfo::~safe_VkComputePipelineCreateInfo()
-{
- if (pNext)
- FreePnextChain(pNext);
-}
-
-void safe_VkComputePipelineCreateInfo::initialize(const VkComputePipelineCreateInfo* in_struct)
-{
- sType = in_struct->sType;
- flags = in_struct->flags;
- stage.initialize(&in_struct->stage);
- layout = in_struct->layout;
- basePipelineHandle = in_struct->basePipelineHandle;
- basePipelineIndex = in_struct->basePipelineIndex;
- pNext = SafePnextCopy(in_struct->pNext);
-}
-
-void safe_VkComputePipelineCreateInfo::initialize(const safe_VkComputePipelineCreateInfo* copy_src)
-{
- sType = copy_src->sType;
- flags = copy_src->flags;
- stage.initialize(©_src->stage);
- layout = copy_src->layout;
- basePipelineHandle = copy_src->basePipelineHandle;
- basePipelineIndex = copy_src->basePipelineIndex;
- pNext = SafePnextCopy(copy_src->pNext);
-}
-
safe_VkPipelineLayoutCreateInfo::safe_VkPipelineLayoutCreateInfo(const VkPipelineLayoutCreateInfo* in_struct) :
sType(in_struct->sType),
flags(in_struct->flags),
@@ -4098,6 +4330,280 @@
pNext = SafePnextCopy(copy_src->pNext);
}
+safe_VkCopyDescriptorSet::safe_VkCopyDescriptorSet(const VkCopyDescriptorSet* in_struct) :
+ sType(in_struct->sType),
+ srcSet(in_struct->srcSet),
+ srcBinding(in_struct->srcBinding),
+ srcArrayElement(in_struct->srcArrayElement),
+ dstSet(in_struct->dstSet),
+ dstBinding(in_struct->dstBinding),
+ dstArrayElement(in_struct->dstArrayElement),
+ descriptorCount(in_struct->descriptorCount)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+safe_VkCopyDescriptorSet::safe_VkCopyDescriptorSet() :
+ sType(VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET),
+ pNext(nullptr)
+{}
+
+safe_VkCopyDescriptorSet::safe_VkCopyDescriptorSet(const safe_VkCopyDescriptorSet& copy_src)
+{
+ sType = copy_src.sType;
+ srcSet = copy_src.srcSet;
+ srcBinding = copy_src.srcBinding;
+ srcArrayElement = copy_src.srcArrayElement;
+ dstSet = copy_src.dstSet;
+ dstBinding = copy_src.dstBinding;
+ dstArrayElement = copy_src.dstArrayElement;
+ descriptorCount = copy_src.descriptorCount;
+ pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkCopyDescriptorSet& safe_VkCopyDescriptorSet::operator=(const safe_VkCopyDescriptorSet& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ srcSet = copy_src.srcSet;
+ srcBinding = copy_src.srcBinding;
+ srcArrayElement = copy_src.srcArrayElement;
+ dstSet = copy_src.dstSet;
+ dstBinding = copy_src.dstBinding;
+ dstArrayElement = copy_src.dstArrayElement;
+ descriptorCount = copy_src.descriptorCount;
+ pNext = SafePnextCopy(copy_src.pNext);
+
+ return *this;
+}
+
+safe_VkCopyDescriptorSet::~safe_VkCopyDescriptorSet()
+{
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkCopyDescriptorSet::initialize(const VkCopyDescriptorSet* in_struct)
+{
+ sType = in_struct->sType;
+ srcSet = in_struct->srcSet;
+ srcBinding = in_struct->srcBinding;
+ srcArrayElement = in_struct->srcArrayElement;
+ dstSet = in_struct->dstSet;
+ dstBinding = in_struct->dstBinding;
+ dstArrayElement = in_struct->dstArrayElement;
+ descriptorCount = in_struct->descriptorCount;
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+void safe_VkCopyDescriptorSet::initialize(const safe_VkCopyDescriptorSet* copy_src)
+{
+ sType = copy_src->sType;
+ srcSet = copy_src->srcSet;
+ srcBinding = copy_src->srcBinding;
+ srcArrayElement = copy_src->srcArrayElement;
+ dstSet = copy_src->dstSet;
+ dstBinding = copy_src->dstBinding;
+ dstArrayElement = copy_src->dstArrayElement;
+ descriptorCount = copy_src->descriptorCount;
+ pNext = SafePnextCopy(copy_src->pNext);
+}
+
+safe_VkDescriptorPoolCreateInfo::safe_VkDescriptorPoolCreateInfo(const VkDescriptorPoolCreateInfo* in_struct) :
+ sType(in_struct->sType),
+ flags(in_struct->flags),
+ maxSets(in_struct->maxSets),
+ poolSizeCount(in_struct->poolSizeCount),
+ pPoolSizes(nullptr)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+ if (in_struct->pPoolSizes) {
+ pPoolSizes = new VkDescriptorPoolSize[in_struct->poolSizeCount];
+ memcpy ((void *)pPoolSizes, (void *)in_struct->pPoolSizes, sizeof(VkDescriptorPoolSize)*in_struct->poolSizeCount);
+ }
+}
+
+safe_VkDescriptorPoolCreateInfo::safe_VkDescriptorPoolCreateInfo() :
+ sType(VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO),
+ pNext(nullptr),
+ pPoolSizes(nullptr)
+{}
+
+safe_VkDescriptorPoolCreateInfo::safe_VkDescriptorPoolCreateInfo(const safe_VkDescriptorPoolCreateInfo& copy_src)
+{
+ sType = copy_src.sType;
+ flags = copy_src.flags;
+ maxSets = copy_src.maxSets;
+ poolSizeCount = copy_src.poolSizeCount;
+ pPoolSizes = nullptr;
+ pNext = SafePnextCopy(copy_src.pNext);
+ if (copy_src.pPoolSizes) {
+ pPoolSizes = new VkDescriptorPoolSize[copy_src.poolSizeCount];
+ memcpy ((void *)pPoolSizes, (void *)copy_src.pPoolSizes, sizeof(VkDescriptorPoolSize)*copy_src.poolSizeCount);
+ }
+}
+
+safe_VkDescriptorPoolCreateInfo& safe_VkDescriptorPoolCreateInfo::operator=(const safe_VkDescriptorPoolCreateInfo& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pPoolSizes)
+ delete[] pPoolSizes;
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ flags = copy_src.flags;
+ maxSets = copy_src.maxSets;
+ poolSizeCount = copy_src.poolSizeCount;
+ pPoolSizes = nullptr;
+ pNext = SafePnextCopy(copy_src.pNext);
+ if (copy_src.pPoolSizes) {
+ pPoolSizes = new VkDescriptorPoolSize[copy_src.poolSizeCount];
+ memcpy ((void *)pPoolSizes, (void *)copy_src.pPoolSizes, sizeof(VkDescriptorPoolSize)*copy_src.poolSizeCount);
+ }
+
+ return *this;
+}
+
+safe_VkDescriptorPoolCreateInfo::~safe_VkDescriptorPoolCreateInfo()
+{
+ if (pPoolSizes)
+ delete[] pPoolSizes;
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkDescriptorPoolCreateInfo::initialize(const VkDescriptorPoolCreateInfo* in_struct)
+{
+ sType = in_struct->sType;
+ flags = in_struct->flags;
+ maxSets = in_struct->maxSets;
+ poolSizeCount = in_struct->poolSizeCount;
+ pPoolSizes = nullptr;
+ pNext = SafePnextCopy(in_struct->pNext);
+ if (in_struct->pPoolSizes) {
+ pPoolSizes = new VkDescriptorPoolSize[in_struct->poolSizeCount];
+ memcpy ((void *)pPoolSizes, (void *)in_struct->pPoolSizes, sizeof(VkDescriptorPoolSize)*in_struct->poolSizeCount);
+ }
+}
+
+void safe_VkDescriptorPoolCreateInfo::initialize(const safe_VkDescriptorPoolCreateInfo* copy_src)
+{
+ sType = copy_src->sType;
+ flags = copy_src->flags;
+ maxSets = copy_src->maxSets;
+ poolSizeCount = copy_src->poolSizeCount;
+ pPoolSizes = nullptr;
+ pNext = SafePnextCopy(copy_src->pNext);
+ if (copy_src->pPoolSizes) {
+ pPoolSizes = new VkDescriptorPoolSize[copy_src->poolSizeCount];
+ memcpy ((void *)pPoolSizes, (void *)copy_src->pPoolSizes, sizeof(VkDescriptorPoolSize)*copy_src->poolSizeCount);
+ }
+}
+
+safe_VkDescriptorSetAllocateInfo::safe_VkDescriptorSetAllocateInfo(const VkDescriptorSetAllocateInfo* in_struct) :
+ sType(in_struct->sType),
+ descriptorPool(in_struct->descriptorPool),
+ descriptorSetCount(in_struct->descriptorSetCount),
+ pSetLayouts(nullptr)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+ if (descriptorSetCount && in_struct->pSetLayouts) {
+ pSetLayouts = new VkDescriptorSetLayout[descriptorSetCount];
+ for (uint32_t i = 0; i < descriptorSetCount; ++i) {
+ pSetLayouts[i] = in_struct->pSetLayouts[i];
+ }
+ }
+}
+
+safe_VkDescriptorSetAllocateInfo::safe_VkDescriptorSetAllocateInfo() :
+ sType(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO),
+ pNext(nullptr),
+ pSetLayouts(nullptr)
+{}
+
+safe_VkDescriptorSetAllocateInfo::safe_VkDescriptorSetAllocateInfo(const safe_VkDescriptorSetAllocateInfo& copy_src)
+{
+ sType = copy_src.sType;
+ descriptorPool = copy_src.descriptorPool;
+ descriptorSetCount = copy_src.descriptorSetCount;
+ pSetLayouts = nullptr;
+ pNext = SafePnextCopy(copy_src.pNext);
+ if (descriptorSetCount && copy_src.pSetLayouts) {
+ pSetLayouts = new VkDescriptorSetLayout[descriptorSetCount];
+ for (uint32_t i = 0; i < descriptorSetCount; ++i) {
+ pSetLayouts[i] = copy_src.pSetLayouts[i];
+ }
+ }
+}
+
+safe_VkDescriptorSetAllocateInfo& safe_VkDescriptorSetAllocateInfo::operator=(const safe_VkDescriptorSetAllocateInfo& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pSetLayouts)
+ delete[] pSetLayouts;
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ descriptorPool = copy_src.descriptorPool;
+ descriptorSetCount = copy_src.descriptorSetCount;
+ pSetLayouts = nullptr;
+ pNext = SafePnextCopy(copy_src.pNext);
+ if (descriptorSetCount && copy_src.pSetLayouts) {
+ pSetLayouts = new VkDescriptorSetLayout[descriptorSetCount];
+ for (uint32_t i = 0; i < descriptorSetCount; ++i) {
+ pSetLayouts[i] = copy_src.pSetLayouts[i];
+ }
+ }
+
+ return *this;
+}
+
+safe_VkDescriptorSetAllocateInfo::~safe_VkDescriptorSetAllocateInfo()
+{
+ if (pSetLayouts)
+ delete[] pSetLayouts;
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkDescriptorSetAllocateInfo::initialize(const VkDescriptorSetAllocateInfo* in_struct)
+{
+ sType = in_struct->sType;
+ descriptorPool = in_struct->descriptorPool;
+ descriptorSetCount = in_struct->descriptorSetCount;
+ pSetLayouts = nullptr;
+ pNext = SafePnextCopy(in_struct->pNext);
+ if (descriptorSetCount && in_struct->pSetLayouts) {
+ pSetLayouts = new VkDescriptorSetLayout[descriptorSetCount];
+ for (uint32_t i = 0; i < descriptorSetCount; ++i) {
+ pSetLayouts[i] = in_struct->pSetLayouts[i];
+ }
+ }
+}
+
+void safe_VkDescriptorSetAllocateInfo::initialize(const safe_VkDescriptorSetAllocateInfo* copy_src)
+{
+ sType = copy_src->sType;
+ descriptorPool = copy_src->descriptorPool;
+ descriptorSetCount = copy_src->descriptorSetCount;
+ pSetLayouts = nullptr;
+ pNext = SafePnextCopy(copy_src->pNext);
+ if (descriptorSetCount && copy_src->pSetLayouts) {
+ pSetLayouts = new VkDescriptorSetLayout[descriptorSetCount];
+ for (uint32_t i = 0; i < descriptorSetCount; ++i) {
+ pSetLayouts[i] = copy_src->pSetLayouts[i];
+ }
+ }
+}
+
safe_VkDescriptorSetLayoutBinding::safe_VkDescriptorSetLayoutBinding(const VkDescriptorSetLayoutBinding* in_struct) :
binding(in_struct->binding),
descriptorType(in_struct->descriptorType),
@@ -4293,197 +4799,6 @@
}
}
-safe_VkDescriptorPoolCreateInfo::safe_VkDescriptorPoolCreateInfo(const VkDescriptorPoolCreateInfo* in_struct) :
- sType(in_struct->sType),
- flags(in_struct->flags),
- maxSets(in_struct->maxSets),
- poolSizeCount(in_struct->poolSizeCount),
- pPoolSizes(nullptr)
-{
- pNext = SafePnextCopy(in_struct->pNext);
- if (in_struct->pPoolSizes) {
- pPoolSizes = new VkDescriptorPoolSize[in_struct->poolSizeCount];
- memcpy ((void *)pPoolSizes, (void *)in_struct->pPoolSizes, sizeof(VkDescriptorPoolSize)*in_struct->poolSizeCount);
- }
-}
-
-safe_VkDescriptorPoolCreateInfo::safe_VkDescriptorPoolCreateInfo() :
- sType(VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO),
- pNext(nullptr),
- pPoolSizes(nullptr)
-{}
-
-safe_VkDescriptorPoolCreateInfo::safe_VkDescriptorPoolCreateInfo(const safe_VkDescriptorPoolCreateInfo& copy_src)
-{
- sType = copy_src.sType;
- flags = copy_src.flags;
- maxSets = copy_src.maxSets;
- poolSizeCount = copy_src.poolSizeCount;
- pPoolSizes = nullptr;
- pNext = SafePnextCopy(copy_src.pNext);
- if (copy_src.pPoolSizes) {
- pPoolSizes = new VkDescriptorPoolSize[copy_src.poolSizeCount];
- memcpy ((void *)pPoolSizes, (void *)copy_src.pPoolSizes, sizeof(VkDescriptorPoolSize)*copy_src.poolSizeCount);
- }
-}
-
-safe_VkDescriptorPoolCreateInfo& safe_VkDescriptorPoolCreateInfo::operator=(const safe_VkDescriptorPoolCreateInfo& copy_src)
-{
- if (©_src == this) return *this;
-
- if (pPoolSizes)
- delete[] pPoolSizes;
- if (pNext)
- FreePnextChain(pNext);
-
- sType = copy_src.sType;
- flags = copy_src.flags;
- maxSets = copy_src.maxSets;
- poolSizeCount = copy_src.poolSizeCount;
- pPoolSizes = nullptr;
- pNext = SafePnextCopy(copy_src.pNext);
- if (copy_src.pPoolSizes) {
- pPoolSizes = new VkDescriptorPoolSize[copy_src.poolSizeCount];
- memcpy ((void *)pPoolSizes, (void *)copy_src.pPoolSizes, sizeof(VkDescriptorPoolSize)*copy_src.poolSizeCount);
- }
-
- return *this;
-}
-
-safe_VkDescriptorPoolCreateInfo::~safe_VkDescriptorPoolCreateInfo()
-{
- if (pPoolSizes)
- delete[] pPoolSizes;
- if (pNext)
- FreePnextChain(pNext);
-}
-
-void safe_VkDescriptorPoolCreateInfo::initialize(const VkDescriptorPoolCreateInfo* in_struct)
-{
- sType = in_struct->sType;
- flags = in_struct->flags;
- maxSets = in_struct->maxSets;
- poolSizeCount = in_struct->poolSizeCount;
- pPoolSizes = nullptr;
- pNext = SafePnextCopy(in_struct->pNext);
- if (in_struct->pPoolSizes) {
- pPoolSizes = new VkDescriptorPoolSize[in_struct->poolSizeCount];
- memcpy ((void *)pPoolSizes, (void *)in_struct->pPoolSizes, sizeof(VkDescriptorPoolSize)*in_struct->poolSizeCount);
- }
-}
-
-void safe_VkDescriptorPoolCreateInfo::initialize(const safe_VkDescriptorPoolCreateInfo* copy_src)
-{
- sType = copy_src->sType;
- flags = copy_src->flags;
- maxSets = copy_src->maxSets;
- poolSizeCount = copy_src->poolSizeCount;
- pPoolSizes = nullptr;
- pNext = SafePnextCopy(copy_src->pNext);
- if (copy_src->pPoolSizes) {
- pPoolSizes = new VkDescriptorPoolSize[copy_src->poolSizeCount];
- memcpy ((void *)pPoolSizes, (void *)copy_src->pPoolSizes, sizeof(VkDescriptorPoolSize)*copy_src->poolSizeCount);
- }
-}
-
-safe_VkDescriptorSetAllocateInfo::safe_VkDescriptorSetAllocateInfo(const VkDescriptorSetAllocateInfo* in_struct) :
- sType(in_struct->sType),
- descriptorPool(in_struct->descriptorPool),
- descriptorSetCount(in_struct->descriptorSetCount),
- pSetLayouts(nullptr)
-{
- pNext = SafePnextCopy(in_struct->pNext);
- if (descriptorSetCount && in_struct->pSetLayouts) {
- pSetLayouts = new VkDescriptorSetLayout[descriptorSetCount];
- for (uint32_t i = 0; i < descriptorSetCount; ++i) {
- pSetLayouts[i] = in_struct->pSetLayouts[i];
- }
- }
-}
-
-safe_VkDescriptorSetAllocateInfo::safe_VkDescriptorSetAllocateInfo() :
- sType(VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO),
- pNext(nullptr),
- pSetLayouts(nullptr)
-{}
-
-safe_VkDescriptorSetAllocateInfo::safe_VkDescriptorSetAllocateInfo(const safe_VkDescriptorSetAllocateInfo& copy_src)
-{
- sType = copy_src.sType;
- descriptorPool = copy_src.descriptorPool;
- descriptorSetCount = copy_src.descriptorSetCount;
- pSetLayouts = nullptr;
- pNext = SafePnextCopy(copy_src.pNext);
- if (descriptorSetCount && copy_src.pSetLayouts) {
- pSetLayouts = new VkDescriptorSetLayout[descriptorSetCount];
- for (uint32_t i = 0; i < descriptorSetCount; ++i) {
- pSetLayouts[i] = copy_src.pSetLayouts[i];
- }
- }
-}
-
-safe_VkDescriptorSetAllocateInfo& safe_VkDescriptorSetAllocateInfo::operator=(const safe_VkDescriptorSetAllocateInfo& copy_src)
-{
- if (©_src == this) return *this;
-
- if (pSetLayouts)
- delete[] pSetLayouts;
- if (pNext)
- FreePnextChain(pNext);
-
- sType = copy_src.sType;
- descriptorPool = copy_src.descriptorPool;
- descriptorSetCount = copy_src.descriptorSetCount;
- pSetLayouts = nullptr;
- pNext = SafePnextCopy(copy_src.pNext);
- if (descriptorSetCount && copy_src.pSetLayouts) {
- pSetLayouts = new VkDescriptorSetLayout[descriptorSetCount];
- for (uint32_t i = 0; i < descriptorSetCount; ++i) {
- pSetLayouts[i] = copy_src.pSetLayouts[i];
- }
- }
-
- return *this;
-}
-
-safe_VkDescriptorSetAllocateInfo::~safe_VkDescriptorSetAllocateInfo()
-{
- if (pSetLayouts)
- delete[] pSetLayouts;
- if (pNext)
- FreePnextChain(pNext);
-}
-
-void safe_VkDescriptorSetAllocateInfo::initialize(const VkDescriptorSetAllocateInfo* in_struct)
-{
- sType = in_struct->sType;
- descriptorPool = in_struct->descriptorPool;
- descriptorSetCount = in_struct->descriptorSetCount;
- pSetLayouts = nullptr;
- pNext = SafePnextCopy(in_struct->pNext);
- if (descriptorSetCount && in_struct->pSetLayouts) {
- pSetLayouts = new VkDescriptorSetLayout[descriptorSetCount];
- for (uint32_t i = 0; i < descriptorSetCount; ++i) {
- pSetLayouts[i] = in_struct->pSetLayouts[i];
- }
- }
-}
-
-void safe_VkDescriptorSetAllocateInfo::initialize(const safe_VkDescriptorSetAllocateInfo* copy_src)
-{
- sType = copy_src->sType;
- descriptorPool = copy_src->descriptorPool;
- descriptorSetCount = copy_src->descriptorSetCount;
- pSetLayouts = nullptr;
- pNext = SafePnextCopy(copy_src->pNext);
- if (descriptorSetCount && copy_src->pSetLayouts) {
- pSetLayouts = new VkDescriptorSetLayout[descriptorSetCount];
- for (uint32_t i = 0; i < descriptorSetCount; ++i) {
- pSetLayouts[i] = copy_src->pSetLayouts[i];
- }
- }
-}
-
safe_VkWriteDescriptorSet::safe_VkWriteDescriptorSet(const VkWriteDescriptorSet* in_struct) :
sType(in_struct->sType),
dstSet(in_struct->dstSet),
@@ -4767,89 +5082,6 @@
}
}
-safe_VkCopyDescriptorSet::safe_VkCopyDescriptorSet(const VkCopyDescriptorSet* in_struct) :
- sType(in_struct->sType),
- srcSet(in_struct->srcSet),
- srcBinding(in_struct->srcBinding),
- srcArrayElement(in_struct->srcArrayElement),
- dstSet(in_struct->dstSet),
- dstBinding(in_struct->dstBinding),
- dstArrayElement(in_struct->dstArrayElement),
- descriptorCount(in_struct->descriptorCount)
-{
- pNext = SafePnextCopy(in_struct->pNext);
-}
-
-safe_VkCopyDescriptorSet::safe_VkCopyDescriptorSet() :
- sType(VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET),
- pNext(nullptr)
-{}
-
-safe_VkCopyDescriptorSet::safe_VkCopyDescriptorSet(const safe_VkCopyDescriptorSet& copy_src)
-{
- sType = copy_src.sType;
- srcSet = copy_src.srcSet;
- srcBinding = copy_src.srcBinding;
- srcArrayElement = copy_src.srcArrayElement;
- dstSet = copy_src.dstSet;
- dstBinding = copy_src.dstBinding;
- dstArrayElement = copy_src.dstArrayElement;
- descriptorCount = copy_src.descriptorCount;
- pNext = SafePnextCopy(copy_src.pNext);
-}
-
-safe_VkCopyDescriptorSet& safe_VkCopyDescriptorSet::operator=(const safe_VkCopyDescriptorSet& copy_src)
-{
- if (©_src == this) return *this;
-
- if (pNext)
- FreePnextChain(pNext);
-
- sType = copy_src.sType;
- srcSet = copy_src.srcSet;
- srcBinding = copy_src.srcBinding;
- srcArrayElement = copy_src.srcArrayElement;
- dstSet = copy_src.dstSet;
- dstBinding = copy_src.dstBinding;
- dstArrayElement = copy_src.dstArrayElement;
- descriptorCount = copy_src.descriptorCount;
- pNext = SafePnextCopy(copy_src.pNext);
-
- return *this;
-}
-
-safe_VkCopyDescriptorSet::~safe_VkCopyDescriptorSet()
-{
- if (pNext)
- FreePnextChain(pNext);
-}
-
-void safe_VkCopyDescriptorSet::initialize(const VkCopyDescriptorSet* in_struct)
-{
- sType = in_struct->sType;
- srcSet = in_struct->srcSet;
- srcBinding = in_struct->srcBinding;
- srcArrayElement = in_struct->srcArrayElement;
- dstSet = in_struct->dstSet;
- dstBinding = in_struct->dstBinding;
- dstArrayElement = in_struct->dstArrayElement;
- descriptorCount = in_struct->descriptorCount;
- pNext = SafePnextCopy(in_struct->pNext);
-}
-
-void safe_VkCopyDescriptorSet::initialize(const safe_VkCopyDescriptorSet* copy_src)
-{
- sType = copy_src->sType;
- srcSet = copy_src->srcSet;
- srcBinding = copy_src->srcBinding;
- srcArrayElement = copy_src->srcArrayElement;
- dstSet = copy_src->dstSet;
- dstBinding = copy_src->dstBinding;
- dstArrayElement = copy_src->dstArrayElement;
- descriptorCount = copy_src->descriptorCount;
- pNext = SafePnextCopy(copy_src->pNext);
-}
-
safe_VkFramebufferCreateInfo::safe_VkFramebufferCreateInfo(const VkFramebufferCreateInfo* in_struct) :
sType(in_struct->sType),
flags(in_struct->flags),
@@ -5610,235 +5842,6 @@
pInheritanceInfo = new safe_VkCommandBufferInheritanceInfo(*copy_src->pInheritanceInfo);
}
-safe_VkMemoryBarrier::safe_VkMemoryBarrier(const VkMemoryBarrier* in_struct) :
- sType(in_struct->sType),
- srcAccessMask(in_struct->srcAccessMask),
- dstAccessMask(in_struct->dstAccessMask)
-{
- pNext = SafePnextCopy(in_struct->pNext);
-}
-
-safe_VkMemoryBarrier::safe_VkMemoryBarrier() :
- sType(VK_STRUCTURE_TYPE_MEMORY_BARRIER),
- pNext(nullptr)
-{}
-
-safe_VkMemoryBarrier::safe_VkMemoryBarrier(const safe_VkMemoryBarrier& copy_src)
-{
- sType = copy_src.sType;
- srcAccessMask = copy_src.srcAccessMask;
- dstAccessMask = copy_src.dstAccessMask;
- pNext = SafePnextCopy(copy_src.pNext);
-}
-
-safe_VkMemoryBarrier& safe_VkMemoryBarrier::operator=(const safe_VkMemoryBarrier& copy_src)
-{
- if (©_src == this) return *this;
-
- if (pNext)
- FreePnextChain(pNext);
-
- sType = copy_src.sType;
- srcAccessMask = copy_src.srcAccessMask;
- dstAccessMask = copy_src.dstAccessMask;
- pNext = SafePnextCopy(copy_src.pNext);
-
- return *this;
-}
-
-safe_VkMemoryBarrier::~safe_VkMemoryBarrier()
-{
- if (pNext)
- FreePnextChain(pNext);
-}
-
-void safe_VkMemoryBarrier::initialize(const VkMemoryBarrier* in_struct)
-{
- sType = in_struct->sType;
- srcAccessMask = in_struct->srcAccessMask;
- dstAccessMask = in_struct->dstAccessMask;
- pNext = SafePnextCopy(in_struct->pNext);
-}
-
-void safe_VkMemoryBarrier::initialize(const safe_VkMemoryBarrier* copy_src)
-{
- sType = copy_src->sType;
- srcAccessMask = copy_src->srcAccessMask;
- dstAccessMask = copy_src->dstAccessMask;
- pNext = SafePnextCopy(copy_src->pNext);
-}
-
-safe_VkBufferMemoryBarrier::safe_VkBufferMemoryBarrier(const VkBufferMemoryBarrier* in_struct) :
- sType(in_struct->sType),
- srcAccessMask(in_struct->srcAccessMask),
- dstAccessMask(in_struct->dstAccessMask),
- srcQueueFamilyIndex(in_struct->srcQueueFamilyIndex),
- dstQueueFamilyIndex(in_struct->dstQueueFamilyIndex),
- buffer(in_struct->buffer),
- offset(in_struct->offset),
- size(in_struct->size)
-{
- pNext = SafePnextCopy(in_struct->pNext);
-}
-
-safe_VkBufferMemoryBarrier::safe_VkBufferMemoryBarrier() :
- sType(VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER),
- pNext(nullptr)
-{}
-
-safe_VkBufferMemoryBarrier::safe_VkBufferMemoryBarrier(const safe_VkBufferMemoryBarrier& copy_src)
-{
- sType = copy_src.sType;
- srcAccessMask = copy_src.srcAccessMask;
- dstAccessMask = copy_src.dstAccessMask;
- srcQueueFamilyIndex = copy_src.srcQueueFamilyIndex;
- dstQueueFamilyIndex = copy_src.dstQueueFamilyIndex;
- buffer = copy_src.buffer;
- offset = copy_src.offset;
- size = copy_src.size;
- pNext = SafePnextCopy(copy_src.pNext);
-}
-
-safe_VkBufferMemoryBarrier& safe_VkBufferMemoryBarrier::operator=(const safe_VkBufferMemoryBarrier& copy_src)
-{
- if (©_src == this) return *this;
-
- if (pNext)
- FreePnextChain(pNext);
-
- sType = copy_src.sType;
- srcAccessMask = copy_src.srcAccessMask;
- dstAccessMask = copy_src.dstAccessMask;
- srcQueueFamilyIndex = copy_src.srcQueueFamilyIndex;
- dstQueueFamilyIndex = copy_src.dstQueueFamilyIndex;
- buffer = copy_src.buffer;
- offset = copy_src.offset;
- size = copy_src.size;
- pNext = SafePnextCopy(copy_src.pNext);
-
- return *this;
-}
-
-safe_VkBufferMemoryBarrier::~safe_VkBufferMemoryBarrier()
-{
- if (pNext)
- FreePnextChain(pNext);
-}
-
-void safe_VkBufferMemoryBarrier::initialize(const VkBufferMemoryBarrier* in_struct)
-{
- sType = in_struct->sType;
- srcAccessMask = in_struct->srcAccessMask;
- dstAccessMask = in_struct->dstAccessMask;
- srcQueueFamilyIndex = in_struct->srcQueueFamilyIndex;
- dstQueueFamilyIndex = in_struct->dstQueueFamilyIndex;
- buffer = in_struct->buffer;
- offset = in_struct->offset;
- size = in_struct->size;
- pNext = SafePnextCopy(in_struct->pNext);
-}
-
-void safe_VkBufferMemoryBarrier::initialize(const safe_VkBufferMemoryBarrier* copy_src)
-{
- sType = copy_src->sType;
- srcAccessMask = copy_src->srcAccessMask;
- dstAccessMask = copy_src->dstAccessMask;
- srcQueueFamilyIndex = copy_src->srcQueueFamilyIndex;
- dstQueueFamilyIndex = copy_src->dstQueueFamilyIndex;
- buffer = copy_src->buffer;
- offset = copy_src->offset;
- size = copy_src->size;
- pNext = SafePnextCopy(copy_src->pNext);
-}
-
-safe_VkImageMemoryBarrier::safe_VkImageMemoryBarrier(const VkImageMemoryBarrier* in_struct) :
- sType(in_struct->sType),
- srcAccessMask(in_struct->srcAccessMask),
- dstAccessMask(in_struct->dstAccessMask),
- oldLayout(in_struct->oldLayout),
- newLayout(in_struct->newLayout),
- srcQueueFamilyIndex(in_struct->srcQueueFamilyIndex),
- dstQueueFamilyIndex(in_struct->dstQueueFamilyIndex),
- image(in_struct->image),
- subresourceRange(in_struct->subresourceRange)
-{
- pNext = SafePnextCopy(in_struct->pNext);
-}
-
-safe_VkImageMemoryBarrier::safe_VkImageMemoryBarrier() :
- sType(VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER),
- pNext(nullptr)
-{}
-
-safe_VkImageMemoryBarrier::safe_VkImageMemoryBarrier(const safe_VkImageMemoryBarrier& copy_src)
-{
- sType = copy_src.sType;
- srcAccessMask = copy_src.srcAccessMask;
- dstAccessMask = copy_src.dstAccessMask;
- oldLayout = copy_src.oldLayout;
- newLayout = copy_src.newLayout;
- srcQueueFamilyIndex = copy_src.srcQueueFamilyIndex;
- dstQueueFamilyIndex = copy_src.dstQueueFamilyIndex;
- image = copy_src.image;
- subresourceRange = copy_src.subresourceRange;
- pNext = SafePnextCopy(copy_src.pNext);
-}
-
-safe_VkImageMemoryBarrier& safe_VkImageMemoryBarrier::operator=(const safe_VkImageMemoryBarrier& copy_src)
-{
- if (©_src == this) return *this;
-
- if (pNext)
- FreePnextChain(pNext);
-
- sType = copy_src.sType;
- srcAccessMask = copy_src.srcAccessMask;
- dstAccessMask = copy_src.dstAccessMask;
- oldLayout = copy_src.oldLayout;
- newLayout = copy_src.newLayout;
- srcQueueFamilyIndex = copy_src.srcQueueFamilyIndex;
- dstQueueFamilyIndex = copy_src.dstQueueFamilyIndex;
- image = copy_src.image;
- subresourceRange = copy_src.subresourceRange;
- pNext = SafePnextCopy(copy_src.pNext);
-
- return *this;
-}
-
-safe_VkImageMemoryBarrier::~safe_VkImageMemoryBarrier()
-{
- if (pNext)
- FreePnextChain(pNext);
-}
-
-void safe_VkImageMemoryBarrier::initialize(const VkImageMemoryBarrier* in_struct)
-{
- sType = in_struct->sType;
- srcAccessMask = in_struct->srcAccessMask;
- dstAccessMask = in_struct->dstAccessMask;
- oldLayout = in_struct->oldLayout;
- newLayout = in_struct->newLayout;
- srcQueueFamilyIndex = in_struct->srcQueueFamilyIndex;
- dstQueueFamilyIndex = in_struct->dstQueueFamilyIndex;
- image = in_struct->image;
- subresourceRange = in_struct->subresourceRange;
- pNext = SafePnextCopy(in_struct->pNext);
-}
-
-void safe_VkImageMemoryBarrier::initialize(const safe_VkImageMemoryBarrier* copy_src)
-{
- sType = copy_src->sType;
- srcAccessMask = copy_src->srcAccessMask;
- dstAccessMask = copy_src->dstAccessMask;
- oldLayout = copy_src->oldLayout;
- newLayout = copy_src->newLayout;
- srcQueueFamilyIndex = copy_src->srcQueueFamilyIndex;
- dstQueueFamilyIndex = copy_src->dstQueueFamilyIndex;
- image = copy_src->image;
- subresourceRange = copy_src->subresourceRange;
- pNext = SafePnextCopy(copy_src->pNext);
-}
-
safe_VkRenderPassBeginInfo::safe_VkRenderPassBeginInfo(const VkRenderPassBeginInfo* in_struct) :
sType(in_struct->sType),
renderPass(in_struct->renderPass),
@@ -14672,7 +14675,7 @@
oldSwapchain(in_struct->oldSwapchain)
{
pNext = SafePnextCopy(in_struct->pNext);
- if (in_struct->pQueueFamilyIndices) {
+ if ((in_struct->imageSharingMode == VK_SHARING_MODE_CONCURRENT) && in_struct->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[in_struct->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)in_struct->pQueueFamilyIndices, sizeof(uint32_t)*in_struct->queueFamilyIndexCount);
}
@@ -14704,7 +14707,7 @@
clipped = copy_src.clipped;
oldSwapchain = copy_src.oldSwapchain;
pNext = SafePnextCopy(copy_src.pNext);
- if (copy_src.pQueueFamilyIndices) {
+ if ((copy_src.imageSharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src.pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src.queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src.pQueueFamilyIndices, sizeof(uint32_t)*copy_src.queueFamilyIndexCount);
}
@@ -14737,7 +14740,7 @@
clipped = copy_src.clipped;
oldSwapchain = copy_src.oldSwapchain;
pNext = SafePnextCopy(copy_src.pNext);
- if (copy_src.pQueueFamilyIndices) {
+ if ((copy_src.imageSharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src.pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src.queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src.pQueueFamilyIndices, sizeof(uint32_t)*copy_src.queueFamilyIndexCount);
}
@@ -14773,7 +14776,7 @@
clipped = in_struct->clipped;
oldSwapchain = in_struct->oldSwapchain;
pNext = SafePnextCopy(in_struct->pNext);
- if (in_struct->pQueueFamilyIndices) {
+ if ((in_struct->imageSharingMode == VK_SHARING_MODE_CONCURRENT) && in_struct->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[in_struct->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)in_struct->pQueueFamilyIndices, sizeof(uint32_t)*in_struct->queueFamilyIndexCount);
}
@@ -14799,7 +14802,7 @@
clipped = copy_src->clipped;
oldSwapchain = copy_src->oldSwapchain;
pNext = SafePnextCopy(copy_src->pNext);
- if (copy_src->pQueueFamilyIndices) {
+ if ((copy_src->imageSharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src->pQueueFamilyIndices, sizeof(uint32_t)*copy_src->queueFamilyIndexCount);
}
@@ -15396,6 +15399,64 @@
pNext = SafePnextCopy(copy_src->pNext);
}
+safe_VkDisplayModeCreateInfoKHR::safe_VkDisplayModeCreateInfoKHR(const VkDisplayModeCreateInfoKHR* in_struct) :
+ sType(in_struct->sType),
+ flags(in_struct->flags),
+ parameters(in_struct->parameters)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+safe_VkDisplayModeCreateInfoKHR::safe_VkDisplayModeCreateInfoKHR() :
+ sType(VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR),
+ pNext(nullptr)
+{}
+
+safe_VkDisplayModeCreateInfoKHR::safe_VkDisplayModeCreateInfoKHR(const safe_VkDisplayModeCreateInfoKHR& copy_src)
+{
+ sType = copy_src.sType;
+ flags = copy_src.flags;
+ parameters = copy_src.parameters;
+ pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkDisplayModeCreateInfoKHR& safe_VkDisplayModeCreateInfoKHR::operator=(const safe_VkDisplayModeCreateInfoKHR& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ flags = copy_src.flags;
+ parameters = copy_src.parameters;
+ pNext = SafePnextCopy(copy_src.pNext);
+
+ return *this;
+}
+
+safe_VkDisplayModeCreateInfoKHR::~safe_VkDisplayModeCreateInfoKHR()
+{
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkDisplayModeCreateInfoKHR::initialize(const VkDisplayModeCreateInfoKHR* in_struct)
+{
+ sType = in_struct->sType;
+ flags = in_struct->flags;
+ parameters = in_struct->parameters;
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+void safe_VkDisplayModeCreateInfoKHR::initialize(const safe_VkDisplayModeCreateInfoKHR* copy_src)
+{
+ sType = copy_src->sType;
+ flags = copy_src->flags;
+ parameters = copy_src->parameters;
+ pNext = SafePnextCopy(copy_src->pNext);
+}
+
safe_VkDisplayPropertiesKHR::safe_VkDisplayPropertiesKHR(const VkDisplayPropertiesKHR* in_struct) :
display(in_struct->display),
physicalDimensions(in_struct->physicalDimensions),
@@ -15466,64 +15527,6 @@
displayName = SafeStringCopy(copy_src->displayName);
}
-safe_VkDisplayModeCreateInfoKHR::safe_VkDisplayModeCreateInfoKHR(const VkDisplayModeCreateInfoKHR* in_struct) :
- sType(in_struct->sType),
- flags(in_struct->flags),
- parameters(in_struct->parameters)
-{
- pNext = SafePnextCopy(in_struct->pNext);
-}
-
-safe_VkDisplayModeCreateInfoKHR::safe_VkDisplayModeCreateInfoKHR() :
- sType(VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR),
- pNext(nullptr)
-{}
-
-safe_VkDisplayModeCreateInfoKHR::safe_VkDisplayModeCreateInfoKHR(const safe_VkDisplayModeCreateInfoKHR& copy_src)
-{
- sType = copy_src.sType;
- flags = copy_src.flags;
- parameters = copy_src.parameters;
- pNext = SafePnextCopy(copy_src.pNext);
-}
-
-safe_VkDisplayModeCreateInfoKHR& safe_VkDisplayModeCreateInfoKHR::operator=(const safe_VkDisplayModeCreateInfoKHR& copy_src)
-{
- if (©_src == this) return *this;
-
- if (pNext)
- FreePnextChain(pNext);
-
- sType = copy_src.sType;
- flags = copy_src.flags;
- parameters = copy_src.parameters;
- pNext = SafePnextCopy(copy_src.pNext);
-
- return *this;
-}
-
-safe_VkDisplayModeCreateInfoKHR::~safe_VkDisplayModeCreateInfoKHR()
-{
- if (pNext)
- FreePnextChain(pNext);
-}
-
-void safe_VkDisplayModeCreateInfoKHR::initialize(const VkDisplayModeCreateInfoKHR* in_struct)
-{
- sType = in_struct->sType;
- flags = in_struct->flags;
- parameters = in_struct->parameters;
- pNext = SafePnextCopy(in_struct->pNext);
-}
-
-void safe_VkDisplayModeCreateInfoKHR::initialize(const safe_VkDisplayModeCreateInfoKHR* copy_src)
-{
- sType = copy_src->sType;
- flags = copy_src->flags;
- parameters = copy_src->parameters;
- pNext = SafePnextCopy(copy_src->pNext);
-}
-
safe_VkDisplaySurfaceCreateInfoKHR::safe_VkDisplaySurfaceCreateInfoKHR(const VkDisplaySurfaceCreateInfoKHR* in_struct) :
sType(in_struct->sType),
flags(in_struct->flags),
@@ -19824,6 +19827,64 @@
pNext = SafePnextCopy(copy_src->pNext);
}
+safe_VkImageViewAddressPropertiesNVX::safe_VkImageViewAddressPropertiesNVX(const VkImageViewAddressPropertiesNVX* in_struct) :
+ sType(in_struct->sType),
+ deviceAddress(in_struct->deviceAddress),
+ size(in_struct->size)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+safe_VkImageViewAddressPropertiesNVX::safe_VkImageViewAddressPropertiesNVX() :
+ sType(VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX),
+ pNext(nullptr)
+{}
+
+safe_VkImageViewAddressPropertiesNVX::safe_VkImageViewAddressPropertiesNVX(const safe_VkImageViewAddressPropertiesNVX& copy_src)
+{
+ sType = copy_src.sType;
+ deviceAddress = copy_src.deviceAddress;
+ size = copy_src.size;
+ pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkImageViewAddressPropertiesNVX& safe_VkImageViewAddressPropertiesNVX::operator=(const safe_VkImageViewAddressPropertiesNVX& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ deviceAddress = copy_src.deviceAddress;
+ size = copy_src.size;
+ pNext = SafePnextCopy(copy_src.pNext);
+
+ return *this;
+}
+
+safe_VkImageViewAddressPropertiesNVX::~safe_VkImageViewAddressPropertiesNVX()
+{
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkImageViewAddressPropertiesNVX::initialize(const VkImageViewAddressPropertiesNVX* in_struct)
+{
+ sType = in_struct->sType;
+ deviceAddress = in_struct->deviceAddress;
+ size = in_struct->size;
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+void safe_VkImageViewAddressPropertiesNVX::initialize(const safe_VkImageViewAddressPropertiesNVX* copy_src)
+{
+ sType = copy_src->sType;
+ deviceAddress = copy_src->deviceAddress;
+ size = copy_src->size;
+ pNext = SafePnextCopy(copy_src->pNext);
+}
+
safe_VkTextureLODGatherFormatPropertiesAMD::safe_VkTextureLODGatherFormatPropertiesAMD(const VkTextureLODGatherFormatPropertiesAMD* in_struct) :
sType(in_struct->sType),
supportsTextureGatherLODBiasAMD(in_struct->supportsTextureGatherLODBiasAMD)
@@ -22081,146 +22142,6 @@
pNext = SafePnextCopy(copy_src->pNext);
}
-safe_VkDebugUtilsObjectNameInfoEXT::safe_VkDebugUtilsObjectNameInfoEXT(const VkDebugUtilsObjectNameInfoEXT* in_struct) :
- sType(in_struct->sType),
- objectType(in_struct->objectType),
- objectHandle(in_struct->objectHandle)
-{
- pNext = SafePnextCopy(in_struct->pNext);
- pObjectName = SafeStringCopy(in_struct->pObjectName);
-}
-
-safe_VkDebugUtilsObjectNameInfoEXT::safe_VkDebugUtilsObjectNameInfoEXT() :
- sType(VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT),
- pNext(nullptr),
- pObjectName(nullptr)
-{}
-
-safe_VkDebugUtilsObjectNameInfoEXT::safe_VkDebugUtilsObjectNameInfoEXT(const safe_VkDebugUtilsObjectNameInfoEXT& copy_src)
-{
- sType = copy_src.sType;
- objectType = copy_src.objectType;
- objectHandle = copy_src.objectHandle;
- pNext = SafePnextCopy(copy_src.pNext);
- pObjectName = SafeStringCopy(copy_src.pObjectName);
-}
-
-safe_VkDebugUtilsObjectNameInfoEXT& safe_VkDebugUtilsObjectNameInfoEXT::operator=(const safe_VkDebugUtilsObjectNameInfoEXT& copy_src)
-{
- if (©_src == this) return *this;
-
- if (pObjectName) delete [] pObjectName;
- if (pNext)
- FreePnextChain(pNext);
-
- sType = copy_src.sType;
- objectType = copy_src.objectType;
- objectHandle = copy_src.objectHandle;
- pNext = SafePnextCopy(copy_src.pNext);
- pObjectName = SafeStringCopy(copy_src.pObjectName);
-
- return *this;
-}
-
-safe_VkDebugUtilsObjectNameInfoEXT::~safe_VkDebugUtilsObjectNameInfoEXT()
-{
- if (pObjectName) delete [] pObjectName;
- if (pNext)
- FreePnextChain(pNext);
-}
-
-void safe_VkDebugUtilsObjectNameInfoEXT::initialize(const VkDebugUtilsObjectNameInfoEXT* in_struct)
-{
- sType = in_struct->sType;
- objectType = in_struct->objectType;
- objectHandle = in_struct->objectHandle;
- pNext = SafePnextCopy(in_struct->pNext);
- pObjectName = SafeStringCopy(in_struct->pObjectName);
-}
-
-void safe_VkDebugUtilsObjectNameInfoEXT::initialize(const safe_VkDebugUtilsObjectNameInfoEXT* copy_src)
-{
- sType = copy_src->sType;
- objectType = copy_src->objectType;
- objectHandle = copy_src->objectHandle;
- pNext = SafePnextCopy(copy_src->pNext);
- pObjectName = SafeStringCopy(copy_src->pObjectName);
-}
-
-safe_VkDebugUtilsObjectTagInfoEXT::safe_VkDebugUtilsObjectTagInfoEXT(const VkDebugUtilsObjectTagInfoEXT* in_struct) :
- sType(in_struct->sType),
- objectType(in_struct->objectType),
- objectHandle(in_struct->objectHandle),
- tagName(in_struct->tagName),
- tagSize(in_struct->tagSize),
- pTag(in_struct->pTag)
-{
- pNext = SafePnextCopy(in_struct->pNext);
-}
-
-safe_VkDebugUtilsObjectTagInfoEXT::safe_VkDebugUtilsObjectTagInfoEXT() :
- sType(VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT),
- pNext(nullptr),
- pTag(nullptr)
-{}
-
-safe_VkDebugUtilsObjectTagInfoEXT::safe_VkDebugUtilsObjectTagInfoEXT(const safe_VkDebugUtilsObjectTagInfoEXT& copy_src)
-{
- sType = copy_src.sType;
- objectType = copy_src.objectType;
- objectHandle = copy_src.objectHandle;
- tagName = copy_src.tagName;
- tagSize = copy_src.tagSize;
- pTag = copy_src.pTag;
- pNext = SafePnextCopy(copy_src.pNext);
-}
-
-safe_VkDebugUtilsObjectTagInfoEXT& safe_VkDebugUtilsObjectTagInfoEXT::operator=(const safe_VkDebugUtilsObjectTagInfoEXT& copy_src)
-{
- if (©_src == this) return *this;
-
- if (pNext)
- FreePnextChain(pNext);
-
- sType = copy_src.sType;
- objectType = copy_src.objectType;
- objectHandle = copy_src.objectHandle;
- tagName = copy_src.tagName;
- tagSize = copy_src.tagSize;
- pTag = copy_src.pTag;
- pNext = SafePnextCopy(copy_src.pNext);
-
- return *this;
-}
-
-safe_VkDebugUtilsObjectTagInfoEXT::~safe_VkDebugUtilsObjectTagInfoEXT()
-{
- if (pNext)
- FreePnextChain(pNext);
-}
-
-void safe_VkDebugUtilsObjectTagInfoEXT::initialize(const VkDebugUtilsObjectTagInfoEXT* in_struct)
-{
- sType = in_struct->sType;
- objectType = in_struct->objectType;
- objectHandle = in_struct->objectHandle;
- tagName = in_struct->tagName;
- tagSize = in_struct->tagSize;
- pTag = in_struct->pTag;
- pNext = SafePnextCopy(in_struct->pNext);
-}
-
-void safe_VkDebugUtilsObjectTagInfoEXT::initialize(const safe_VkDebugUtilsObjectTagInfoEXT* copy_src)
-{
- sType = copy_src->sType;
- objectType = copy_src->objectType;
- objectHandle = copy_src->objectHandle;
- tagName = copy_src->tagName;
- tagSize = copy_src->tagSize;
- pTag = copy_src->pTag;
- pNext = SafePnextCopy(copy_src->pNext);
-}
-
safe_VkDebugUtilsLabelEXT::safe_VkDebugUtilsLabelEXT(const VkDebugUtilsLabelEXT* in_struct) :
sType(in_struct->sType)
{
@@ -22292,6 +22213,72 @@
}
}
+safe_VkDebugUtilsObjectNameInfoEXT::safe_VkDebugUtilsObjectNameInfoEXT(const VkDebugUtilsObjectNameInfoEXT* in_struct) :
+ sType(in_struct->sType),
+ objectType(in_struct->objectType),
+ objectHandle(in_struct->objectHandle)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+ pObjectName = SafeStringCopy(in_struct->pObjectName);
+}
+
+safe_VkDebugUtilsObjectNameInfoEXT::safe_VkDebugUtilsObjectNameInfoEXT() :
+ sType(VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT),
+ pNext(nullptr),
+ pObjectName(nullptr)
+{}
+
+safe_VkDebugUtilsObjectNameInfoEXT::safe_VkDebugUtilsObjectNameInfoEXT(const safe_VkDebugUtilsObjectNameInfoEXT& copy_src)
+{
+ sType = copy_src.sType;
+ objectType = copy_src.objectType;
+ objectHandle = copy_src.objectHandle;
+ pNext = SafePnextCopy(copy_src.pNext);
+ pObjectName = SafeStringCopy(copy_src.pObjectName);
+}
+
+safe_VkDebugUtilsObjectNameInfoEXT& safe_VkDebugUtilsObjectNameInfoEXT::operator=(const safe_VkDebugUtilsObjectNameInfoEXT& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pObjectName) delete [] pObjectName;
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ objectType = copy_src.objectType;
+ objectHandle = copy_src.objectHandle;
+ pNext = SafePnextCopy(copy_src.pNext);
+ pObjectName = SafeStringCopy(copy_src.pObjectName);
+
+ return *this;
+}
+
+safe_VkDebugUtilsObjectNameInfoEXT::~safe_VkDebugUtilsObjectNameInfoEXT()
+{
+ if (pObjectName) delete [] pObjectName;
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkDebugUtilsObjectNameInfoEXT::initialize(const VkDebugUtilsObjectNameInfoEXT* in_struct)
+{
+ sType = in_struct->sType;
+ objectType = in_struct->objectType;
+ objectHandle = in_struct->objectHandle;
+ pNext = SafePnextCopy(in_struct->pNext);
+ pObjectName = SafeStringCopy(in_struct->pObjectName);
+}
+
+void safe_VkDebugUtilsObjectNameInfoEXT::initialize(const safe_VkDebugUtilsObjectNameInfoEXT* copy_src)
+{
+ sType = copy_src->sType;
+ objectType = copy_src->objectType;
+ objectHandle = copy_src->objectHandle;
+ pNext = SafePnextCopy(copy_src->pNext);
+ pObjectName = SafeStringCopy(copy_src->pObjectName);
+}
+
safe_VkDebugUtilsMessengerCallbackDataEXT::safe_VkDebugUtilsMessengerCallbackDataEXT(const VkDebugUtilsMessengerCallbackDataEXT* in_struct) :
sType(in_struct->sType),
flags(in_struct->flags),
@@ -22574,6 +22561,80 @@
pUserData = copy_src->pUserData;
pNext = SafePnextCopy(copy_src->pNext);
}
+
+safe_VkDebugUtilsObjectTagInfoEXT::safe_VkDebugUtilsObjectTagInfoEXT(const VkDebugUtilsObjectTagInfoEXT* in_struct) :
+ sType(in_struct->sType),
+ objectType(in_struct->objectType),
+ objectHandle(in_struct->objectHandle),
+ tagName(in_struct->tagName),
+ tagSize(in_struct->tagSize),
+ pTag(in_struct->pTag)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+safe_VkDebugUtilsObjectTagInfoEXT::safe_VkDebugUtilsObjectTagInfoEXT() :
+ sType(VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT),
+ pNext(nullptr),
+ pTag(nullptr)
+{}
+
+safe_VkDebugUtilsObjectTagInfoEXT::safe_VkDebugUtilsObjectTagInfoEXT(const safe_VkDebugUtilsObjectTagInfoEXT& copy_src)
+{
+ sType = copy_src.sType;
+ objectType = copy_src.objectType;
+ objectHandle = copy_src.objectHandle;
+ tagName = copy_src.tagName;
+ tagSize = copy_src.tagSize;
+ pTag = copy_src.pTag;
+ pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkDebugUtilsObjectTagInfoEXT& safe_VkDebugUtilsObjectTagInfoEXT::operator=(const safe_VkDebugUtilsObjectTagInfoEXT& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ objectType = copy_src.objectType;
+ objectHandle = copy_src.objectHandle;
+ tagName = copy_src.tagName;
+ tagSize = copy_src.tagSize;
+ pTag = copy_src.pTag;
+ pNext = SafePnextCopy(copy_src.pNext);
+
+ return *this;
+}
+
+safe_VkDebugUtilsObjectTagInfoEXT::~safe_VkDebugUtilsObjectTagInfoEXT()
+{
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkDebugUtilsObjectTagInfoEXT::initialize(const VkDebugUtilsObjectTagInfoEXT* in_struct)
+{
+ sType = in_struct->sType;
+ objectType = in_struct->objectType;
+ objectHandle = in_struct->objectHandle;
+ tagName = in_struct->tagName;
+ tagSize = in_struct->tagSize;
+ pTag = in_struct->pTag;
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+void safe_VkDebugUtilsObjectTagInfoEXT::initialize(const safe_VkDebugUtilsObjectTagInfoEXT* copy_src)
+{
+ sType = copy_src->sType;
+ objectType = copy_src->objectType;
+ objectHandle = copy_src->objectHandle;
+ tagName = copy_src->tagName;
+ tagSize = copy_src->tagSize;
+ pTag = copy_src->pTag;
+ pNext = SafePnextCopy(copy_src->pNext);
+}
#ifdef VK_USE_PLATFORM_ANDROID_KHR
@@ -24164,7 +24225,7 @@
pQueueFamilyIndices(nullptr)
{
pNext = SafePnextCopy(in_struct->pNext);
- if (in_struct->pQueueFamilyIndices) {
+ if ((in_struct->sharingMode == VK_SHARING_MODE_CONCURRENT) && in_struct->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[in_struct->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)in_struct->pQueueFamilyIndices, sizeof(uint32_t)*in_struct->queueFamilyIndexCount);
}
@@ -24184,7 +24245,7 @@
queueFamilyIndexCount = copy_src.queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
pNext = SafePnextCopy(copy_src.pNext);
- if (copy_src.pQueueFamilyIndices) {
+ if ((copy_src.sharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src.pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src.queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src.pQueueFamilyIndices, sizeof(uint32_t)*copy_src.queueFamilyIndexCount);
}
@@ -24205,7 +24266,7 @@
queueFamilyIndexCount = copy_src.queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
pNext = SafePnextCopy(copy_src.pNext);
- if (copy_src.pQueueFamilyIndices) {
+ if ((copy_src.sharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src.pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src.queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src.pQueueFamilyIndices, sizeof(uint32_t)*copy_src.queueFamilyIndexCount);
}
@@ -24229,7 +24290,7 @@
queueFamilyIndexCount = in_struct->queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
pNext = SafePnextCopy(in_struct->pNext);
- if (in_struct->pQueueFamilyIndices) {
+ if ((in_struct->sharingMode == VK_SHARING_MODE_CONCURRENT) && in_struct->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[in_struct->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)in_struct->pQueueFamilyIndices, sizeof(uint32_t)*in_struct->queueFamilyIndexCount);
}
@@ -24243,7 +24304,7 @@
queueFamilyIndexCount = copy_src->queueFamilyIndexCount;
pQueueFamilyIndices = nullptr;
pNext = SafePnextCopy(copy_src->pNext);
- if (copy_src->pQueueFamilyIndices) {
+ if ((copy_src->sharingMode == VK_SHARING_MODE_CONCURRENT) && copy_src->pQueueFamilyIndices) {
pQueueFamilyIndices = new uint32_t[copy_src->queueFamilyIndexCount];
memcpy ((void *)pQueueFamilyIndices, (void *)copy_src->pQueueFamilyIndices, sizeof(uint32_t)*copy_src->queueFamilyIndexCount);
}
@@ -27869,7 +27930,7 @@
}
safe_VkQueryPoolPerformanceQueryCreateInfoINTEL::safe_VkQueryPoolPerformanceQueryCreateInfoINTEL() :
- sType(VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL),
+ sType(VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL),
pNext(nullptr)
{}
@@ -30342,6 +30403,114 @@
pNext = SafePnextCopy(copy_src->pNext);
}
+safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* in_struct) :
+ sType(in_struct->sType),
+ shaderBufferFloat32Atomics(in_struct->shaderBufferFloat32Atomics),
+ shaderBufferFloat32AtomicAdd(in_struct->shaderBufferFloat32AtomicAdd),
+ shaderBufferFloat64Atomics(in_struct->shaderBufferFloat64Atomics),
+ shaderBufferFloat64AtomicAdd(in_struct->shaderBufferFloat64AtomicAdd),
+ shaderSharedFloat32Atomics(in_struct->shaderSharedFloat32Atomics),
+ shaderSharedFloat32AtomicAdd(in_struct->shaderSharedFloat32AtomicAdd),
+ shaderSharedFloat64Atomics(in_struct->shaderSharedFloat64Atomics),
+ shaderSharedFloat64AtomicAdd(in_struct->shaderSharedFloat64AtomicAdd),
+ shaderImageFloat32Atomics(in_struct->shaderImageFloat32Atomics),
+ shaderImageFloat32AtomicAdd(in_struct->shaderImageFloat32AtomicAdd),
+ sparseImageFloat32Atomics(in_struct->sparseImageFloat32Atomics),
+ sparseImageFloat32AtomicAdd(in_struct->sparseImageFloat32AtomicAdd)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT() :
+ sType(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT),
+ pNext(nullptr)
+{}
+
+safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(const safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT& copy_src)
+{
+ sType = copy_src.sType;
+ shaderBufferFloat32Atomics = copy_src.shaderBufferFloat32Atomics;
+ shaderBufferFloat32AtomicAdd = copy_src.shaderBufferFloat32AtomicAdd;
+ shaderBufferFloat64Atomics = copy_src.shaderBufferFloat64Atomics;
+ shaderBufferFloat64AtomicAdd = copy_src.shaderBufferFloat64AtomicAdd;
+ shaderSharedFloat32Atomics = copy_src.shaderSharedFloat32Atomics;
+ shaderSharedFloat32AtomicAdd = copy_src.shaderSharedFloat32AtomicAdd;
+ shaderSharedFloat64Atomics = copy_src.shaderSharedFloat64Atomics;
+ shaderSharedFloat64AtomicAdd = copy_src.shaderSharedFloat64AtomicAdd;
+ shaderImageFloat32Atomics = copy_src.shaderImageFloat32Atomics;
+ shaderImageFloat32AtomicAdd = copy_src.shaderImageFloat32AtomicAdd;
+ sparseImageFloat32Atomics = copy_src.sparseImageFloat32Atomics;
+ sparseImageFloat32AtomicAdd = copy_src.sparseImageFloat32AtomicAdd;
+ pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT& safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::operator=(const safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ shaderBufferFloat32Atomics = copy_src.shaderBufferFloat32Atomics;
+ shaderBufferFloat32AtomicAdd = copy_src.shaderBufferFloat32AtomicAdd;
+ shaderBufferFloat64Atomics = copy_src.shaderBufferFloat64Atomics;
+ shaderBufferFloat64AtomicAdd = copy_src.shaderBufferFloat64AtomicAdd;
+ shaderSharedFloat32Atomics = copy_src.shaderSharedFloat32Atomics;
+ shaderSharedFloat32AtomicAdd = copy_src.shaderSharedFloat32AtomicAdd;
+ shaderSharedFloat64Atomics = copy_src.shaderSharedFloat64Atomics;
+ shaderSharedFloat64AtomicAdd = copy_src.shaderSharedFloat64AtomicAdd;
+ shaderImageFloat32Atomics = copy_src.shaderImageFloat32Atomics;
+ shaderImageFloat32AtomicAdd = copy_src.shaderImageFloat32AtomicAdd;
+ sparseImageFloat32Atomics = copy_src.sparseImageFloat32Atomics;
+ sparseImageFloat32AtomicAdd = copy_src.sparseImageFloat32AtomicAdd;
+ pNext = SafePnextCopy(copy_src.pNext);
+
+ return *this;
+}
+
+safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::~safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT()
+{
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::initialize(const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* in_struct)
+{
+ sType = in_struct->sType;
+ shaderBufferFloat32Atomics = in_struct->shaderBufferFloat32Atomics;
+ shaderBufferFloat32AtomicAdd = in_struct->shaderBufferFloat32AtomicAdd;
+ shaderBufferFloat64Atomics = in_struct->shaderBufferFloat64Atomics;
+ shaderBufferFloat64AtomicAdd = in_struct->shaderBufferFloat64AtomicAdd;
+ shaderSharedFloat32Atomics = in_struct->shaderSharedFloat32Atomics;
+ shaderSharedFloat32AtomicAdd = in_struct->shaderSharedFloat32AtomicAdd;
+ shaderSharedFloat64Atomics = in_struct->shaderSharedFloat64Atomics;
+ shaderSharedFloat64AtomicAdd = in_struct->shaderSharedFloat64AtomicAdd;
+ shaderImageFloat32Atomics = in_struct->shaderImageFloat32Atomics;
+ shaderImageFloat32AtomicAdd = in_struct->shaderImageFloat32AtomicAdd;
+ sparseImageFloat32Atomics = in_struct->sparseImageFloat32Atomics;
+ sparseImageFloat32AtomicAdd = in_struct->sparseImageFloat32AtomicAdd;
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+void safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT::initialize(const safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* copy_src)
+{
+ sType = copy_src->sType;
+ shaderBufferFloat32Atomics = copy_src->shaderBufferFloat32Atomics;
+ shaderBufferFloat32AtomicAdd = copy_src->shaderBufferFloat32AtomicAdd;
+ shaderBufferFloat64Atomics = copy_src->shaderBufferFloat64Atomics;
+ shaderBufferFloat64AtomicAdd = copy_src->shaderBufferFloat64AtomicAdd;
+ shaderSharedFloat32Atomics = copy_src->shaderSharedFloat32Atomics;
+ shaderSharedFloat32AtomicAdd = copy_src->shaderSharedFloat32AtomicAdd;
+ shaderSharedFloat64Atomics = copy_src->shaderSharedFloat64Atomics;
+ shaderSharedFloat64AtomicAdd = copy_src->shaderSharedFloat64AtomicAdd;
+ shaderImageFloat32Atomics = copy_src->shaderImageFloat32Atomics;
+ shaderImageFloat32AtomicAdd = copy_src->shaderImageFloat32AtomicAdd;
+ sparseImageFloat32Atomics = copy_src->sparseImageFloat32Atomics;
+ sparseImageFloat32AtomicAdd = copy_src->sparseImageFloat32AtomicAdd;
+ pNext = SafePnextCopy(copy_src->pNext);
+}
+
safe_VkPhysicalDeviceIndexTypeUint8FeaturesEXT::safe_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(const VkPhysicalDeviceIndexTypeUint8FeaturesEXT* in_struct) :
sType(in_struct->sType),
indexTypeUint8(in_struct->indexTypeUint8)
@@ -30395,6 +30564,59 @@
pNext = SafePnextCopy(copy_src->pNext);
}
+safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT::safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* in_struct) :
+ sType(in_struct->sType),
+ extendedDynamicState(in_struct->extendedDynamicState)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT::safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT() :
+ sType(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT),
+ pNext(nullptr)
+{}
+
+safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT::safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(const safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT& copy_src)
+{
+ sType = copy_src.sType;
+ extendedDynamicState = copy_src.extendedDynamicState;
+ pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT& safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT::operator=(const safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ extendedDynamicState = copy_src.extendedDynamicState;
+ pNext = SafePnextCopy(copy_src.pNext);
+
+ return *this;
+}
+
+safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT::~safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT()
+{
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT::initialize(const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* in_struct)
+{
+ sType = in_struct->sType;
+ extendedDynamicState = in_struct->extendedDynamicState;
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+void safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT::initialize(const safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* copy_src)
+{
+ sType = copy_src->sType;
+ extendedDynamicState = copy_src->extendedDynamicState;
+ pNext = SafePnextCopy(copy_src->pNext);
+}
+
safe_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT::safe_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT* in_struct) :
sType(in_struct->sType),
shaderDemoteToHelperInvocation(in_struct->shaderDemoteToHelperInvocation)
@@ -31614,6 +31836,455 @@
pNext = SafePnextCopy(copy_src->pNext);
}
+safe_VkPhysicalDeviceRobustness2FeaturesEXT::safe_VkPhysicalDeviceRobustness2FeaturesEXT(const VkPhysicalDeviceRobustness2FeaturesEXT* in_struct) :
+ sType(in_struct->sType),
+ robustBufferAccess2(in_struct->robustBufferAccess2),
+ robustImageAccess2(in_struct->robustImageAccess2),
+ nullDescriptor(in_struct->nullDescriptor)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+safe_VkPhysicalDeviceRobustness2FeaturesEXT::safe_VkPhysicalDeviceRobustness2FeaturesEXT() :
+ sType(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT),
+ pNext(nullptr)
+{}
+
+safe_VkPhysicalDeviceRobustness2FeaturesEXT::safe_VkPhysicalDeviceRobustness2FeaturesEXT(const safe_VkPhysicalDeviceRobustness2FeaturesEXT& copy_src)
+{
+ sType = copy_src.sType;
+ robustBufferAccess2 = copy_src.robustBufferAccess2;
+ robustImageAccess2 = copy_src.robustImageAccess2;
+ nullDescriptor = copy_src.nullDescriptor;
+ pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkPhysicalDeviceRobustness2FeaturesEXT& safe_VkPhysicalDeviceRobustness2FeaturesEXT::operator=(const safe_VkPhysicalDeviceRobustness2FeaturesEXT& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ robustBufferAccess2 = copy_src.robustBufferAccess2;
+ robustImageAccess2 = copy_src.robustImageAccess2;
+ nullDescriptor = copy_src.nullDescriptor;
+ pNext = SafePnextCopy(copy_src.pNext);
+
+ return *this;
+}
+
+safe_VkPhysicalDeviceRobustness2FeaturesEXT::~safe_VkPhysicalDeviceRobustness2FeaturesEXT()
+{
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkPhysicalDeviceRobustness2FeaturesEXT::initialize(const VkPhysicalDeviceRobustness2FeaturesEXT* in_struct)
+{
+ sType = in_struct->sType;
+ robustBufferAccess2 = in_struct->robustBufferAccess2;
+ robustImageAccess2 = in_struct->robustImageAccess2;
+ nullDescriptor = in_struct->nullDescriptor;
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+void safe_VkPhysicalDeviceRobustness2FeaturesEXT::initialize(const safe_VkPhysicalDeviceRobustness2FeaturesEXT* copy_src)
+{
+ sType = copy_src->sType;
+ robustBufferAccess2 = copy_src->robustBufferAccess2;
+ robustImageAccess2 = copy_src->robustImageAccess2;
+ nullDescriptor = copy_src->nullDescriptor;
+ pNext = SafePnextCopy(copy_src->pNext);
+}
+
+safe_VkPhysicalDeviceRobustness2PropertiesEXT::safe_VkPhysicalDeviceRobustness2PropertiesEXT(const VkPhysicalDeviceRobustness2PropertiesEXT* in_struct) :
+ sType(in_struct->sType),
+ robustStorageBufferAccessSizeAlignment(in_struct->robustStorageBufferAccessSizeAlignment),
+ robustUniformBufferAccessSizeAlignment(in_struct->robustUniformBufferAccessSizeAlignment)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+safe_VkPhysicalDeviceRobustness2PropertiesEXT::safe_VkPhysicalDeviceRobustness2PropertiesEXT() :
+ sType(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT),
+ pNext(nullptr)
+{}
+
+safe_VkPhysicalDeviceRobustness2PropertiesEXT::safe_VkPhysicalDeviceRobustness2PropertiesEXT(const safe_VkPhysicalDeviceRobustness2PropertiesEXT& copy_src)
+{
+ sType = copy_src.sType;
+ robustStorageBufferAccessSizeAlignment = copy_src.robustStorageBufferAccessSizeAlignment;
+ robustUniformBufferAccessSizeAlignment = copy_src.robustUniformBufferAccessSizeAlignment;
+ pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkPhysicalDeviceRobustness2PropertiesEXT& safe_VkPhysicalDeviceRobustness2PropertiesEXT::operator=(const safe_VkPhysicalDeviceRobustness2PropertiesEXT& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ robustStorageBufferAccessSizeAlignment = copy_src.robustStorageBufferAccessSizeAlignment;
+ robustUniformBufferAccessSizeAlignment = copy_src.robustUniformBufferAccessSizeAlignment;
+ pNext = SafePnextCopy(copy_src.pNext);
+
+ return *this;
+}
+
+safe_VkPhysicalDeviceRobustness2PropertiesEXT::~safe_VkPhysicalDeviceRobustness2PropertiesEXT()
+{
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkPhysicalDeviceRobustness2PropertiesEXT::initialize(const VkPhysicalDeviceRobustness2PropertiesEXT* in_struct)
+{
+ sType = in_struct->sType;
+ robustStorageBufferAccessSizeAlignment = in_struct->robustStorageBufferAccessSizeAlignment;
+ robustUniformBufferAccessSizeAlignment = in_struct->robustUniformBufferAccessSizeAlignment;
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+void safe_VkPhysicalDeviceRobustness2PropertiesEXT::initialize(const safe_VkPhysicalDeviceRobustness2PropertiesEXT* copy_src)
+{
+ sType = copy_src->sType;
+ robustStorageBufferAccessSizeAlignment = copy_src->robustStorageBufferAccessSizeAlignment;
+ robustUniformBufferAccessSizeAlignment = copy_src->robustUniformBufferAccessSizeAlignment;
+ pNext = SafePnextCopy(copy_src->pNext);
+}
+
+safe_VkSamplerCustomBorderColorCreateInfoEXT::safe_VkSamplerCustomBorderColorCreateInfoEXT(const VkSamplerCustomBorderColorCreateInfoEXT* in_struct) :
+ sType(in_struct->sType),
+ customBorderColor(in_struct->customBorderColor),
+ format(in_struct->format)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+safe_VkSamplerCustomBorderColorCreateInfoEXT::safe_VkSamplerCustomBorderColorCreateInfoEXT() :
+ sType(VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT),
+ pNext(nullptr)
+{}
+
+safe_VkSamplerCustomBorderColorCreateInfoEXT::safe_VkSamplerCustomBorderColorCreateInfoEXT(const safe_VkSamplerCustomBorderColorCreateInfoEXT& copy_src)
+{
+ sType = copy_src.sType;
+ customBorderColor = copy_src.customBorderColor;
+ format = copy_src.format;
+ pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkSamplerCustomBorderColorCreateInfoEXT& safe_VkSamplerCustomBorderColorCreateInfoEXT::operator=(const safe_VkSamplerCustomBorderColorCreateInfoEXT& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ customBorderColor = copy_src.customBorderColor;
+ format = copy_src.format;
+ pNext = SafePnextCopy(copy_src.pNext);
+
+ return *this;
+}
+
+safe_VkSamplerCustomBorderColorCreateInfoEXT::~safe_VkSamplerCustomBorderColorCreateInfoEXT()
+{
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkSamplerCustomBorderColorCreateInfoEXT::initialize(const VkSamplerCustomBorderColorCreateInfoEXT* in_struct)
+{
+ sType = in_struct->sType;
+ customBorderColor = in_struct->customBorderColor;
+ format = in_struct->format;
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+void safe_VkSamplerCustomBorderColorCreateInfoEXT::initialize(const safe_VkSamplerCustomBorderColorCreateInfoEXT* copy_src)
+{
+ sType = copy_src->sType;
+ customBorderColor = copy_src->customBorderColor;
+ format = copy_src->format;
+ pNext = SafePnextCopy(copy_src->pNext);
+}
+
+safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT::safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT(const VkPhysicalDeviceCustomBorderColorPropertiesEXT* in_struct) :
+ sType(in_struct->sType),
+ maxCustomBorderColorSamplers(in_struct->maxCustomBorderColorSamplers)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT::safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT() :
+ sType(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT),
+ pNext(nullptr)
+{}
+
+safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT::safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT(const safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT& copy_src)
+{
+ sType = copy_src.sType;
+ maxCustomBorderColorSamplers = copy_src.maxCustomBorderColorSamplers;
+ pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT& safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT::operator=(const safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ maxCustomBorderColorSamplers = copy_src.maxCustomBorderColorSamplers;
+ pNext = SafePnextCopy(copy_src.pNext);
+
+ return *this;
+}
+
+safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT::~safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT()
+{
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT::initialize(const VkPhysicalDeviceCustomBorderColorPropertiesEXT* in_struct)
+{
+ sType = in_struct->sType;
+ maxCustomBorderColorSamplers = in_struct->maxCustomBorderColorSamplers;
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+void safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT::initialize(const safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT* copy_src)
+{
+ sType = copy_src->sType;
+ maxCustomBorderColorSamplers = copy_src->maxCustomBorderColorSamplers;
+ pNext = SafePnextCopy(copy_src->pNext);
+}
+
+safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT::safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT(const VkPhysicalDeviceCustomBorderColorFeaturesEXT* in_struct) :
+ sType(in_struct->sType),
+ customBorderColors(in_struct->customBorderColors),
+ customBorderColorWithoutFormat(in_struct->customBorderColorWithoutFormat)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT::safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT() :
+ sType(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT),
+ pNext(nullptr)
+{}
+
+safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT::safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT(const safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT& copy_src)
+{
+ sType = copy_src.sType;
+ customBorderColors = copy_src.customBorderColors;
+ customBorderColorWithoutFormat = copy_src.customBorderColorWithoutFormat;
+ pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT& safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT::operator=(const safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ customBorderColors = copy_src.customBorderColors;
+ customBorderColorWithoutFormat = copy_src.customBorderColorWithoutFormat;
+ pNext = SafePnextCopy(copy_src.pNext);
+
+ return *this;
+}
+
+safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT::~safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT()
+{
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT::initialize(const VkPhysicalDeviceCustomBorderColorFeaturesEXT* in_struct)
+{
+ sType = in_struct->sType;
+ customBorderColors = in_struct->customBorderColors;
+ customBorderColorWithoutFormat = in_struct->customBorderColorWithoutFormat;
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+void safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT::initialize(const safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT* copy_src)
+{
+ sType = copy_src->sType;
+ customBorderColors = copy_src->customBorderColors;
+ customBorderColorWithoutFormat = copy_src->customBorderColorWithoutFormat;
+ pNext = SafePnextCopy(copy_src->pNext);
+}
+
+safe_VkPhysicalDevicePrivateDataFeaturesEXT::safe_VkPhysicalDevicePrivateDataFeaturesEXT(const VkPhysicalDevicePrivateDataFeaturesEXT* in_struct) :
+ sType(in_struct->sType),
+ privateData(in_struct->privateData)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+safe_VkPhysicalDevicePrivateDataFeaturesEXT::safe_VkPhysicalDevicePrivateDataFeaturesEXT() :
+ sType(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT),
+ pNext(nullptr)
+{}
+
+safe_VkPhysicalDevicePrivateDataFeaturesEXT::safe_VkPhysicalDevicePrivateDataFeaturesEXT(const safe_VkPhysicalDevicePrivateDataFeaturesEXT& copy_src)
+{
+ sType = copy_src.sType;
+ privateData = copy_src.privateData;
+ pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkPhysicalDevicePrivateDataFeaturesEXT& safe_VkPhysicalDevicePrivateDataFeaturesEXT::operator=(const safe_VkPhysicalDevicePrivateDataFeaturesEXT& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ privateData = copy_src.privateData;
+ pNext = SafePnextCopy(copy_src.pNext);
+
+ return *this;
+}
+
+safe_VkPhysicalDevicePrivateDataFeaturesEXT::~safe_VkPhysicalDevicePrivateDataFeaturesEXT()
+{
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkPhysicalDevicePrivateDataFeaturesEXT::initialize(const VkPhysicalDevicePrivateDataFeaturesEXT* in_struct)
+{
+ sType = in_struct->sType;
+ privateData = in_struct->privateData;
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+void safe_VkPhysicalDevicePrivateDataFeaturesEXT::initialize(const safe_VkPhysicalDevicePrivateDataFeaturesEXT* copy_src)
+{
+ sType = copy_src->sType;
+ privateData = copy_src->privateData;
+ pNext = SafePnextCopy(copy_src->pNext);
+}
+
+safe_VkDevicePrivateDataCreateInfoEXT::safe_VkDevicePrivateDataCreateInfoEXT(const VkDevicePrivateDataCreateInfoEXT* in_struct) :
+ sType(in_struct->sType),
+ privateDataSlotRequestCount(in_struct->privateDataSlotRequestCount)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+safe_VkDevicePrivateDataCreateInfoEXT::safe_VkDevicePrivateDataCreateInfoEXT() :
+ sType(VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT),
+ pNext(nullptr)
+{}
+
+safe_VkDevicePrivateDataCreateInfoEXT::safe_VkDevicePrivateDataCreateInfoEXT(const safe_VkDevicePrivateDataCreateInfoEXT& copy_src)
+{
+ sType = copy_src.sType;
+ privateDataSlotRequestCount = copy_src.privateDataSlotRequestCount;
+ pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkDevicePrivateDataCreateInfoEXT& safe_VkDevicePrivateDataCreateInfoEXT::operator=(const safe_VkDevicePrivateDataCreateInfoEXT& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ privateDataSlotRequestCount = copy_src.privateDataSlotRequestCount;
+ pNext = SafePnextCopy(copy_src.pNext);
+
+ return *this;
+}
+
+safe_VkDevicePrivateDataCreateInfoEXT::~safe_VkDevicePrivateDataCreateInfoEXT()
+{
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkDevicePrivateDataCreateInfoEXT::initialize(const VkDevicePrivateDataCreateInfoEXT* in_struct)
+{
+ sType = in_struct->sType;
+ privateDataSlotRequestCount = in_struct->privateDataSlotRequestCount;
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+void safe_VkDevicePrivateDataCreateInfoEXT::initialize(const safe_VkDevicePrivateDataCreateInfoEXT* copy_src)
+{
+ sType = copy_src->sType;
+ privateDataSlotRequestCount = copy_src->privateDataSlotRequestCount;
+ pNext = SafePnextCopy(copy_src->pNext);
+}
+
+safe_VkPrivateDataSlotCreateInfoEXT::safe_VkPrivateDataSlotCreateInfoEXT(const VkPrivateDataSlotCreateInfoEXT* in_struct) :
+ sType(in_struct->sType),
+ flags(in_struct->flags)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+safe_VkPrivateDataSlotCreateInfoEXT::safe_VkPrivateDataSlotCreateInfoEXT() :
+ sType(VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO_EXT),
+ pNext(nullptr)
+{}
+
+safe_VkPrivateDataSlotCreateInfoEXT::safe_VkPrivateDataSlotCreateInfoEXT(const safe_VkPrivateDataSlotCreateInfoEXT& copy_src)
+{
+ sType = copy_src.sType;
+ flags = copy_src.flags;
+ pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkPrivateDataSlotCreateInfoEXT& safe_VkPrivateDataSlotCreateInfoEXT::operator=(const safe_VkPrivateDataSlotCreateInfoEXT& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ flags = copy_src.flags;
+ pNext = SafePnextCopy(copy_src.pNext);
+
+ return *this;
+}
+
+safe_VkPrivateDataSlotCreateInfoEXT::~safe_VkPrivateDataSlotCreateInfoEXT()
+{
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkPrivateDataSlotCreateInfoEXT::initialize(const VkPrivateDataSlotCreateInfoEXT* in_struct)
+{
+ sType = in_struct->sType;
+ flags = in_struct->flags;
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+void safe_VkPrivateDataSlotCreateInfoEXT::initialize(const safe_VkPrivateDataSlotCreateInfoEXT* copy_src)
+{
+ sType = copy_src->sType;
+ flags = copy_src->flags;
+ pNext = SafePnextCopy(copy_src->pNext);
+}
+
safe_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT::safe_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT* in_struct) :
sType(in_struct->sType),
pipelineCreationCacheControl(in_struct->pipelineCreationCacheControl)
@@ -31772,6 +32443,287 @@
flags = copy_src->flags;
pNext = SafePnextCopy(copy_src->pNext);
}
+
+safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT::safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* in_struct) :
+ sType(in_struct->sType),
+ fragmentDensityMapDeferred(in_struct->fragmentDensityMapDeferred)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT::safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT() :
+ sType(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT),
+ pNext(nullptr)
+{}
+
+safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT::safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(const safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT& copy_src)
+{
+ sType = copy_src.sType;
+ fragmentDensityMapDeferred = copy_src.fragmentDensityMapDeferred;
+ pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT& safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT::operator=(const safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ fragmentDensityMapDeferred = copy_src.fragmentDensityMapDeferred;
+ pNext = SafePnextCopy(copy_src.pNext);
+
+ return *this;
+}
+
+safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT::~safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT()
+{
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT::initialize(const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* in_struct)
+{
+ sType = in_struct->sType;
+ fragmentDensityMapDeferred = in_struct->fragmentDensityMapDeferred;
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+void safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT::initialize(const safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* copy_src)
+{
+ sType = copy_src->sType;
+ fragmentDensityMapDeferred = copy_src->fragmentDensityMapDeferred;
+ pNext = SafePnextCopy(copy_src->pNext);
+}
+
+safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT::safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* in_struct) :
+ sType(in_struct->sType),
+ subsampledLoads(in_struct->subsampledLoads),
+ subsampledCoarseReconstructionEarlyAccess(in_struct->subsampledCoarseReconstructionEarlyAccess),
+ maxSubsampledArrayLayers(in_struct->maxSubsampledArrayLayers),
+ maxDescriptorSetSubsampledSamplers(in_struct->maxDescriptorSetSubsampledSamplers)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT::safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT() :
+ sType(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT),
+ pNext(nullptr)
+{}
+
+safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT::safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(const safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT& copy_src)
+{
+ sType = copy_src.sType;
+ subsampledLoads = copy_src.subsampledLoads;
+ subsampledCoarseReconstructionEarlyAccess = copy_src.subsampledCoarseReconstructionEarlyAccess;
+ maxSubsampledArrayLayers = copy_src.maxSubsampledArrayLayers;
+ maxDescriptorSetSubsampledSamplers = copy_src.maxDescriptorSetSubsampledSamplers;
+ pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT& safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT::operator=(const safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ subsampledLoads = copy_src.subsampledLoads;
+ subsampledCoarseReconstructionEarlyAccess = copy_src.subsampledCoarseReconstructionEarlyAccess;
+ maxSubsampledArrayLayers = copy_src.maxSubsampledArrayLayers;
+ maxDescriptorSetSubsampledSamplers = copy_src.maxDescriptorSetSubsampledSamplers;
+ pNext = SafePnextCopy(copy_src.pNext);
+
+ return *this;
+}
+
+safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT::~safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT()
+{
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT::initialize(const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* in_struct)
+{
+ sType = in_struct->sType;
+ subsampledLoads = in_struct->subsampledLoads;
+ subsampledCoarseReconstructionEarlyAccess = in_struct->subsampledCoarseReconstructionEarlyAccess;
+ maxSubsampledArrayLayers = in_struct->maxSubsampledArrayLayers;
+ maxDescriptorSetSubsampledSamplers = in_struct->maxDescriptorSetSubsampledSamplers;
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+void safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT::initialize(const safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* copy_src)
+{
+ sType = copy_src->sType;
+ subsampledLoads = copy_src->subsampledLoads;
+ subsampledCoarseReconstructionEarlyAccess = copy_src->subsampledCoarseReconstructionEarlyAccess;
+ maxSubsampledArrayLayers = copy_src->maxSubsampledArrayLayers;
+ maxDescriptorSetSubsampledSamplers = copy_src->maxDescriptorSetSubsampledSamplers;
+ pNext = SafePnextCopy(copy_src->pNext);
+}
+
+safe_VkPhysicalDeviceImageRobustnessFeaturesEXT::safe_VkPhysicalDeviceImageRobustnessFeaturesEXT(const VkPhysicalDeviceImageRobustnessFeaturesEXT* in_struct) :
+ sType(in_struct->sType),
+ robustImageAccess(in_struct->robustImageAccess)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+safe_VkPhysicalDeviceImageRobustnessFeaturesEXT::safe_VkPhysicalDeviceImageRobustnessFeaturesEXT() :
+ sType(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT),
+ pNext(nullptr)
+{}
+
+safe_VkPhysicalDeviceImageRobustnessFeaturesEXT::safe_VkPhysicalDeviceImageRobustnessFeaturesEXT(const safe_VkPhysicalDeviceImageRobustnessFeaturesEXT& copy_src)
+{
+ sType = copy_src.sType;
+ robustImageAccess = copy_src.robustImageAccess;
+ pNext = SafePnextCopy(copy_src.pNext);
+}
+
+safe_VkPhysicalDeviceImageRobustnessFeaturesEXT& safe_VkPhysicalDeviceImageRobustnessFeaturesEXT::operator=(const safe_VkPhysicalDeviceImageRobustnessFeaturesEXT& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ robustImageAccess = copy_src.robustImageAccess;
+ pNext = SafePnextCopy(copy_src.pNext);
+
+ return *this;
+}
+
+safe_VkPhysicalDeviceImageRobustnessFeaturesEXT::~safe_VkPhysicalDeviceImageRobustnessFeaturesEXT()
+{
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkPhysicalDeviceImageRobustnessFeaturesEXT::initialize(const VkPhysicalDeviceImageRobustnessFeaturesEXT* in_struct)
+{
+ sType = in_struct->sType;
+ robustImageAccess = in_struct->robustImageAccess;
+ pNext = SafePnextCopy(in_struct->pNext);
+}
+
+void safe_VkPhysicalDeviceImageRobustnessFeaturesEXT::initialize(const safe_VkPhysicalDeviceImageRobustnessFeaturesEXT* copy_src)
+{
+ sType = copy_src->sType;
+ robustImageAccess = copy_src->robustImageAccess;
+ pNext = SafePnextCopy(copy_src->pNext);
+}
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+
+
+safe_VkDirectFBSurfaceCreateInfoEXT::safe_VkDirectFBSurfaceCreateInfoEXT(const VkDirectFBSurfaceCreateInfoEXT* in_struct) :
+ sType(in_struct->sType),
+ flags(in_struct->flags),
+ dfb(nullptr),
+ surface(nullptr)
+{
+ pNext = SafePnextCopy(in_struct->pNext);
+ if (in_struct->dfb) {
+ dfb = new IDirectFB(*in_struct->dfb);
+ }
+ if (in_struct->surface) {
+ surface = new IDirectFBSurface(*in_struct->surface);
+ }
+}
+
+safe_VkDirectFBSurfaceCreateInfoEXT::safe_VkDirectFBSurfaceCreateInfoEXT() :
+ sType(VK_STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT),
+ pNext(nullptr),
+ dfb(nullptr),
+ surface(nullptr)
+{}
+
+safe_VkDirectFBSurfaceCreateInfoEXT::safe_VkDirectFBSurfaceCreateInfoEXT(const safe_VkDirectFBSurfaceCreateInfoEXT& copy_src)
+{
+ sType = copy_src.sType;
+ flags = copy_src.flags;
+ dfb = nullptr;
+ surface = nullptr;
+ pNext = SafePnextCopy(copy_src.pNext);
+ if (copy_src.dfb) {
+ dfb = new IDirectFB(*copy_src.dfb);
+ }
+ if (copy_src.surface) {
+ surface = new IDirectFBSurface(*copy_src.surface);
+ }
+}
+
+safe_VkDirectFBSurfaceCreateInfoEXT& safe_VkDirectFBSurfaceCreateInfoEXT::operator=(const safe_VkDirectFBSurfaceCreateInfoEXT& copy_src)
+{
+ if (©_src == this) return *this;
+
+ if (dfb)
+ delete dfb;
+ if (surface)
+ delete surface;
+ if (pNext)
+ FreePnextChain(pNext);
+
+ sType = copy_src.sType;
+ flags = copy_src.flags;
+ dfb = nullptr;
+ surface = nullptr;
+ pNext = SafePnextCopy(copy_src.pNext);
+ if (copy_src.dfb) {
+ dfb = new IDirectFB(*copy_src.dfb);
+ }
+ if (copy_src.surface) {
+ surface = new IDirectFBSurface(*copy_src.surface);
+ }
+
+ return *this;
+}
+
+safe_VkDirectFBSurfaceCreateInfoEXT::~safe_VkDirectFBSurfaceCreateInfoEXT()
+{
+ if (dfb)
+ delete dfb;
+ if (surface)
+ delete surface;
+ if (pNext)
+ FreePnextChain(pNext);
+}
+
+void safe_VkDirectFBSurfaceCreateInfoEXT::initialize(const VkDirectFBSurfaceCreateInfoEXT* in_struct)
+{
+ sType = in_struct->sType;
+ flags = in_struct->flags;
+ dfb = nullptr;
+ surface = nullptr;
+ pNext = SafePnextCopy(in_struct->pNext);
+ if (in_struct->dfb) {
+ dfb = new IDirectFB(*in_struct->dfb);
+ }
+ if (in_struct->surface) {
+ surface = new IDirectFBSurface(*in_struct->surface);
+ }
+}
+
+void safe_VkDirectFBSurfaceCreateInfoEXT::initialize(const safe_VkDirectFBSurfaceCreateInfoEXT* copy_src)
+{
+ sType = copy_src->sType;
+ flags = copy_src->flags;
+ dfb = nullptr;
+ surface = nullptr;
+ pNext = SafePnextCopy(copy_src->pNext);
+ if (copy_src->dfb) {
+ dfb = new IDirectFB(*copy_src->dfb);
+ }
+ if (copy_src->surface) {
+ surface = new IDirectFBSurface(*copy_src->surface);
+ }
+}
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
+
#ifdef VK_USE_PLATFORM_FUCHSIA
@@ -34236,7 +35188,7 @@
void *SafePnextCopy(const void *pNext) {
if (!pNext) return nullptr;
- void *safe_pNext;
+ void *safe_pNext{};
const VkBaseOutStructure *header = reinterpret_cast<const VkBaseOutStructure *>(pNext);
switch (header->sType) {
@@ -34774,7 +35726,7 @@
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL:
safe_pNext = new safe_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL(reinterpret_cast<const VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL *>(pNext));
break;
- case VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL:
+ case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL:
safe_pNext = new safe_VkQueryPoolPerformanceQueryCreateInfoINTEL(reinterpret_cast<const VkQueryPoolPerformanceQueryCreateInfoINTEL *>(pNext));
break;
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT:
@@ -34858,9 +35810,15 @@
case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT:
safe_pNext = new safe_VkPipelineRasterizationLineStateCreateInfoEXT(reinterpret_cast<const VkPipelineRasterizationLineStateCreateInfoEXT *>(pNext));
break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT:
+ safe_pNext = new safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT *>(pNext));
+ break;
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT:
safe_pNext = new safe_VkPhysicalDeviceIndexTypeUint8FeaturesEXT(reinterpret_cast<const VkPhysicalDeviceIndexTypeUint8FeaturesEXT *>(pNext));
break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT:
+ safe_pNext = new safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *>(pNext));
+ break;
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT:
safe_pNext = new safe_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT *>(pNext));
break;
@@ -34885,6 +35843,27 @@
case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM:
safe_pNext = new safe_VkCommandBufferInheritanceRenderPassTransformInfoQCOM(reinterpret_cast<const VkCommandBufferInheritanceRenderPassTransformInfoQCOM *>(pNext));
break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT:
+ safe_pNext = new safe_VkPhysicalDeviceRobustness2FeaturesEXT(reinterpret_cast<const VkPhysicalDeviceRobustness2FeaturesEXT *>(pNext));
+ break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT:
+ safe_pNext = new safe_VkPhysicalDeviceRobustness2PropertiesEXT(reinterpret_cast<const VkPhysicalDeviceRobustness2PropertiesEXT *>(pNext));
+ break;
+ case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT:
+ safe_pNext = new safe_VkSamplerCustomBorderColorCreateInfoEXT(reinterpret_cast<const VkSamplerCustomBorderColorCreateInfoEXT *>(pNext));
+ break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT:
+ safe_pNext = new safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT(reinterpret_cast<const VkPhysicalDeviceCustomBorderColorPropertiesEXT *>(pNext));
+ break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT:
+ safe_pNext = new safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceCustomBorderColorFeaturesEXT *>(pNext));
+ break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT:
+ safe_pNext = new safe_VkPhysicalDevicePrivateDataFeaturesEXT(reinterpret_cast<const VkPhysicalDevicePrivateDataFeaturesEXT *>(pNext));
+ break;
+ case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT:
+ safe_pNext = new safe_VkDevicePrivateDataCreateInfoEXT(reinterpret_cast<const VkDevicePrivateDataCreateInfoEXT *>(pNext));
+ break;
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT:
safe_pNext = new safe_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT(reinterpret_cast<const VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT *>(pNext));
break;
@@ -34894,6 +35873,15 @@
case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV:
safe_pNext = new safe_VkDeviceDiagnosticsConfigCreateInfoNV(reinterpret_cast<const VkDeviceDiagnosticsConfigCreateInfoNV *>(pNext));
break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT:
+ safe_pNext = new safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT *>(pNext));
+ break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT:
+ safe_pNext = new safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(reinterpret_cast<const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT *>(pNext));
+ break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT:
+ safe_pNext = new safe_VkPhysicalDeviceImageRobustnessFeaturesEXT(reinterpret_cast<const VkPhysicalDeviceImageRobustnessFeaturesEXT *>(pNext));
+ break;
#ifdef VK_ENABLE_BETA_EXTENSIONS
case VK_STRUCTURE_TYPE_DEFERRED_OPERATION_INFO_KHR:
safe_pNext = new safe_VkDeferredOperationInfoKHR(reinterpret_cast<const VkDeferredOperationInfoKHR *>(pNext));
@@ -34980,7 +35968,21 @@
break;
#endif // VK_USE_PLATFORM_WIN32_KHR
default: // Encountered an unknown sType -- skip (do not copy) this entry in the chain
- safe_pNext = SafePnextCopy(header->pNext);
+ // If sType is in custom list, construct blind copy
+ for (auto item : custom_stype_info) {
+ if (item.first == header->sType) {
+ safe_pNext = malloc(item.second);
+ memcpy(safe_pNext, header, item.second);
+ // Deep copy the rest of the pNext chain
+ VkBaseOutStructure *custom_struct = reinterpret_cast<VkBaseOutStructure *>(safe_pNext);
+ if (custom_struct->pNext) {
+ custom_struct->pNext = reinterpret_cast<VkBaseOutStructure *>(SafePnextCopy(custom_struct->pNext));
+ }
+ }
+ }
+ if (!safe_pNext) {
+ safe_pNext = SafePnextCopy(header->pNext);
+ }
break;
}
@@ -35519,7 +36521,7 @@
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL:
delete reinterpret_cast<const safe_VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL *>(header);
break;
- case VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL:
+ case VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL:
delete reinterpret_cast<const safe_VkQueryPoolPerformanceQueryCreateInfoINTEL *>(header);
break;
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT:
@@ -35603,9 +36605,15 @@
case VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT:
delete reinterpret_cast<const safe_VkPipelineRasterizationLineStateCreateInfoEXT *>(header);
break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT:
+ delete reinterpret_cast<const safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT *>(header);
+ break;
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT:
delete reinterpret_cast<const safe_VkPhysicalDeviceIndexTypeUint8FeaturesEXT *>(header);
break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT:
+ delete reinterpret_cast<const safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *>(header);
+ break;
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT:
delete reinterpret_cast<const safe_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT *>(header);
break;
@@ -35630,6 +36638,27 @@
case VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM:
delete reinterpret_cast<const safe_VkCommandBufferInheritanceRenderPassTransformInfoQCOM *>(header);
break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT:
+ delete reinterpret_cast<const safe_VkPhysicalDeviceRobustness2FeaturesEXT *>(header);
+ break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT:
+ delete reinterpret_cast<const safe_VkPhysicalDeviceRobustness2PropertiesEXT *>(header);
+ break;
+ case VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT:
+ delete reinterpret_cast<const safe_VkSamplerCustomBorderColorCreateInfoEXT *>(header);
+ break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT:
+ delete reinterpret_cast<const safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT *>(header);
+ break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT:
+ delete reinterpret_cast<const safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT *>(header);
+ break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT:
+ delete reinterpret_cast<const safe_VkPhysicalDevicePrivateDataFeaturesEXT *>(header);
+ break;
+ case VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT:
+ delete reinterpret_cast<const safe_VkDevicePrivateDataCreateInfoEXT *>(header);
+ break;
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT:
delete reinterpret_cast<const safe_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT *>(header);
break;
@@ -35639,6 +36668,15 @@
case VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV:
delete reinterpret_cast<const safe_VkDeviceDiagnosticsConfigCreateInfoNV *>(header);
break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT:
+ delete reinterpret_cast<const safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT *>(header);
+ break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT:
+ delete reinterpret_cast<const safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT *>(header);
+ break;
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT:
+ delete reinterpret_cast<const safe_VkPhysicalDeviceImageRobustnessFeaturesEXT *>(header);
+ break;
#ifdef VK_ENABLE_BETA_EXTENSIONS
case VK_STRUCTURE_TYPE_DEFERRED_OPERATION_INFO_KHR:
delete reinterpret_cast<const safe_VkDeferredOperationInfoKHR *>(header);
@@ -35724,9 +36762,20 @@
delete reinterpret_cast<const safe_VkSurfaceFullScreenExclusiveWin32InfoEXT *>(header);
break;
#endif // VK_USE_PLATFORM_WIN32_KHR
- default: // Encountered an unknown sType -- panic, there should be none such in safe chain
- assert(false);
- FreePnextChain(header->pNext);
+ default: // Encountered an unknown sType
+ // If sType is in custom list, free custom struct memory and clean up
+ for (auto item : custom_stype_info) {
+ if (item.first == header->sType) {
+ if (header->pNext) {
+ FreePnextChain(header->pNext);
+ }
+ free(const_cast<void *>(pNext));
+ pNext = nullptr;
+ }
+ }
+ if (pNext) {
+ FreePnextChain(header->pNext);
+ }
break;
}
}
diff --git a/layers/generated/vk_safe_struct.h b/layers/generated/vk_safe_struct.h
index d8ed5da..f51de8b 100644
--- a/layers/generated/vk_safe_struct.h
+++ b/layers/generated/vk_safe_struct.h
@@ -32,12 +32,90 @@
#pragma once
#include <vulkan/vulkan.h>
+#include <stdlib.h>
void *SafePnextCopy(const void *pNext);
void FreePnextChain(const void *pNext);
char *SafeStringCopy(const char *in_string);
+struct safe_VkBufferMemoryBarrier {
+ VkStructureType sType;
+ const void* pNext;
+ VkAccessFlags srcAccessMask;
+ VkAccessFlags dstAccessMask;
+ uint32_t srcQueueFamilyIndex;
+ uint32_t dstQueueFamilyIndex;
+ VkBuffer buffer;
+ VkDeviceSize offset;
+ VkDeviceSize size;
+ safe_VkBufferMemoryBarrier(const VkBufferMemoryBarrier* in_struct);
+ safe_VkBufferMemoryBarrier(const safe_VkBufferMemoryBarrier& copy_src);
+ safe_VkBufferMemoryBarrier& operator=(const safe_VkBufferMemoryBarrier& copy_src);
+ safe_VkBufferMemoryBarrier();
+ ~safe_VkBufferMemoryBarrier();
+ void initialize(const VkBufferMemoryBarrier* in_struct);
+ void initialize(const safe_VkBufferMemoryBarrier* copy_src);
+ VkBufferMemoryBarrier *ptr() { return reinterpret_cast<VkBufferMemoryBarrier *>(this); }
+ VkBufferMemoryBarrier const *ptr() const { return reinterpret_cast<VkBufferMemoryBarrier const *>(this); }
+};
+
+struct safe_VkImageMemoryBarrier {
+ VkStructureType sType;
+ const void* pNext;
+ VkAccessFlags srcAccessMask;
+ VkAccessFlags dstAccessMask;
+ VkImageLayout oldLayout;
+ VkImageLayout newLayout;
+ uint32_t srcQueueFamilyIndex;
+ uint32_t dstQueueFamilyIndex;
+ VkImage image;
+ VkImageSubresourceRange subresourceRange;
+ safe_VkImageMemoryBarrier(const VkImageMemoryBarrier* in_struct);
+ safe_VkImageMemoryBarrier(const safe_VkImageMemoryBarrier& copy_src);
+ safe_VkImageMemoryBarrier& operator=(const safe_VkImageMemoryBarrier& copy_src);
+ safe_VkImageMemoryBarrier();
+ ~safe_VkImageMemoryBarrier();
+ void initialize(const VkImageMemoryBarrier* in_struct);
+ void initialize(const safe_VkImageMemoryBarrier* copy_src);
+ VkImageMemoryBarrier *ptr() { return reinterpret_cast<VkImageMemoryBarrier *>(this); }
+ VkImageMemoryBarrier const *ptr() const { return reinterpret_cast<VkImageMemoryBarrier const *>(this); }
+};
+
+struct safe_VkMemoryBarrier {
+ VkStructureType sType;
+ const void* pNext;
+ VkAccessFlags srcAccessMask;
+ VkAccessFlags dstAccessMask;
+ safe_VkMemoryBarrier(const VkMemoryBarrier* in_struct);
+ safe_VkMemoryBarrier(const safe_VkMemoryBarrier& copy_src);
+ safe_VkMemoryBarrier& operator=(const safe_VkMemoryBarrier& copy_src);
+ safe_VkMemoryBarrier();
+ ~safe_VkMemoryBarrier();
+ void initialize(const VkMemoryBarrier* in_struct);
+ void initialize(const safe_VkMemoryBarrier* copy_src);
+ VkMemoryBarrier *ptr() { return reinterpret_cast<VkMemoryBarrier *>(this); }
+ VkMemoryBarrier const *ptr() const { return reinterpret_cast<VkMemoryBarrier const *>(this); }
+};
+
+struct safe_VkAllocationCallbacks {
+ void* pUserData;
+ PFN_vkAllocationFunction pfnAllocation;
+ PFN_vkReallocationFunction pfnReallocation;
+ PFN_vkFreeFunction pfnFree;
+ PFN_vkInternalAllocationNotification pfnInternalAllocation;
+ PFN_vkInternalFreeNotification pfnInternalFree;
+ safe_VkAllocationCallbacks(const VkAllocationCallbacks* in_struct);
+ safe_VkAllocationCallbacks(const safe_VkAllocationCallbacks& copy_src);
+ safe_VkAllocationCallbacks& operator=(const safe_VkAllocationCallbacks& copy_src);
+ safe_VkAllocationCallbacks();
+ ~safe_VkAllocationCallbacks();
+ void initialize(const VkAllocationCallbacks* in_struct);
+ void initialize(const safe_VkAllocationCallbacks* copy_src);
+ VkAllocationCallbacks *ptr() { return reinterpret_cast<VkAllocationCallbacks *>(this); }
+ VkAllocationCallbacks const *ptr() const { return reinterpret_cast<VkAllocationCallbacks const *>(this); }
+};
+
struct safe_VkApplicationInfo {
VkStructureType sType;
const void* pNext;
@@ -77,24 +155,6 @@
VkInstanceCreateInfo const *ptr() const { return reinterpret_cast<VkInstanceCreateInfo const *>(this); }
};
-struct safe_VkAllocationCallbacks {
- void* pUserData;
- PFN_vkAllocationFunction pfnAllocation;
- PFN_vkReallocationFunction pfnReallocation;
- PFN_vkFreeFunction pfnFree;
- PFN_vkInternalAllocationNotification pfnInternalAllocation;
- PFN_vkInternalFreeNotification pfnInternalFree;
- safe_VkAllocationCallbacks(const VkAllocationCallbacks* in_struct);
- safe_VkAllocationCallbacks(const safe_VkAllocationCallbacks& copy_src);
- safe_VkAllocationCallbacks& operator=(const safe_VkAllocationCallbacks& copy_src);
- safe_VkAllocationCallbacks();
- ~safe_VkAllocationCallbacks();
- void initialize(const VkAllocationCallbacks* in_struct);
- void initialize(const safe_VkAllocationCallbacks* copy_src);
- VkAllocationCallbacks *ptr() { return reinterpret_cast<VkAllocationCallbacks *>(this); }
- VkAllocationCallbacks const *ptr() const { return reinterpret_cast<VkAllocationCallbacks const *>(this); }
-};
-
struct safe_VkDeviceQueueCreateInfo {
VkStructureType sType;
const void* pNext;
@@ -156,22 +216,6 @@
VkSubmitInfo const *ptr() const { return reinterpret_cast<VkSubmitInfo const *>(this); }
};
-struct safe_VkMemoryAllocateInfo {
- VkStructureType sType;
- const void* pNext;
- VkDeviceSize allocationSize;
- uint32_t memoryTypeIndex;
- safe_VkMemoryAllocateInfo(const VkMemoryAllocateInfo* in_struct);
- safe_VkMemoryAllocateInfo(const safe_VkMemoryAllocateInfo& copy_src);
- safe_VkMemoryAllocateInfo& operator=(const safe_VkMemoryAllocateInfo& copy_src);
- safe_VkMemoryAllocateInfo();
- ~safe_VkMemoryAllocateInfo();
- void initialize(const VkMemoryAllocateInfo* in_struct);
- void initialize(const safe_VkMemoryAllocateInfo* copy_src);
- VkMemoryAllocateInfo *ptr() { return reinterpret_cast<VkMemoryAllocateInfo *>(this); }
- VkMemoryAllocateInfo const *ptr() const { return reinterpret_cast<VkMemoryAllocateInfo const *>(this); }
-};
-
struct safe_VkMappedMemoryRange {
VkStructureType sType;
const void* pNext;
@@ -189,6 +233,22 @@
VkMappedMemoryRange const *ptr() const { return reinterpret_cast<VkMappedMemoryRange const *>(this); }
};
+struct safe_VkMemoryAllocateInfo {
+ VkStructureType sType;
+ const void* pNext;
+ VkDeviceSize allocationSize;
+ uint32_t memoryTypeIndex;
+ safe_VkMemoryAllocateInfo(const VkMemoryAllocateInfo* in_struct);
+ safe_VkMemoryAllocateInfo(const safe_VkMemoryAllocateInfo& copy_src);
+ safe_VkMemoryAllocateInfo& operator=(const safe_VkMemoryAllocateInfo& copy_src);
+ safe_VkMemoryAllocateInfo();
+ ~safe_VkMemoryAllocateInfo();
+ void initialize(const VkMemoryAllocateInfo* in_struct);
+ void initialize(const safe_VkMemoryAllocateInfo* copy_src);
+ VkMemoryAllocateInfo *ptr() { return reinterpret_cast<VkMemoryAllocateInfo *>(this); }
+ VkMemoryAllocateInfo const *ptr() const { return reinterpret_cast<VkMemoryAllocateInfo const *>(this); }
+};
+
struct safe_VkSparseBufferMemoryBindInfo {
VkBuffer buffer;
uint32_t bindCount;
@@ -476,6 +536,25 @@
VkPipelineShaderStageCreateInfo const *ptr() const { return reinterpret_cast<VkPipelineShaderStageCreateInfo const *>(this); }
};
+struct safe_VkComputePipelineCreateInfo {
+ VkStructureType sType;
+ const void* pNext;
+ VkPipelineCreateFlags flags;
+ safe_VkPipelineShaderStageCreateInfo stage;
+ VkPipelineLayout layout;
+ VkPipeline basePipelineHandle;
+ int32_t basePipelineIndex;
+ safe_VkComputePipelineCreateInfo(const VkComputePipelineCreateInfo* in_struct);
+ safe_VkComputePipelineCreateInfo(const safe_VkComputePipelineCreateInfo& copy_src);
+ safe_VkComputePipelineCreateInfo& operator=(const safe_VkComputePipelineCreateInfo& copy_src);
+ safe_VkComputePipelineCreateInfo();
+ ~safe_VkComputePipelineCreateInfo();
+ void initialize(const VkComputePipelineCreateInfo* in_struct);
+ void initialize(const safe_VkComputePipelineCreateInfo* copy_src);
+ VkComputePipelineCreateInfo *ptr() { return reinterpret_cast<VkComputePipelineCreateInfo *>(this); }
+ VkComputePipelineCreateInfo const *ptr() const { return reinterpret_cast<VkComputePipelineCreateInfo const *>(this); }
+};
+
struct safe_VkPipelineVertexInputStateCreateInfo {
VkStructureType sType;
const void* pNext;
@@ -685,25 +764,6 @@
VkGraphicsPipelineCreateInfo const *ptr() const { return reinterpret_cast<VkGraphicsPipelineCreateInfo const *>(this); }
};
-struct safe_VkComputePipelineCreateInfo {
- VkStructureType sType;
- const void* pNext;
- VkPipelineCreateFlags flags;
- safe_VkPipelineShaderStageCreateInfo stage;
- VkPipelineLayout layout;
- VkPipeline basePipelineHandle;
- int32_t basePipelineIndex;
- safe_VkComputePipelineCreateInfo(const VkComputePipelineCreateInfo* in_struct);
- safe_VkComputePipelineCreateInfo(const safe_VkComputePipelineCreateInfo& copy_src);
- safe_VkComputePipelineCreateInfo& operator=(const safe_VkComputePipelineCreateInfo& copy_src);
- safe_VkComputePipelineCreateInfo();
- ~safe_VkComputePipelineCreateInfo();
- void initialize(const VkComputePipelineCreateInfo* in_struct);
- void initialize(const safe_VkComputePipelineCreateInfo* copy_src);
- VkComputePipelineCreateInfo *ptr() { return reinterpret_cast<VkComputePipelineCreateInfo *>(this); }
- VkComputePipelineCreateInfo const *ptr() const { return reinterpret_cast<VkComputePipelineCreateInfo const *>(this); }
-};
-
struct safe_VkPipelineLayoutCreateInfo {
VkStructureType sType;
const void* pNext;
@@ -753,38 +813,25 @@
VkSamplerCreateInfo const *ptr() const { return reinterpret_cast<VkSamplerCreateInfo const *>(this); }
};
-struct safe_VkDescriptorSetLayoutBinding {
- uint32_t binding;
- VkDescriptorType descriptorType;
- uint32_t descriptorCount;
- VkShaderStageFlags stageFlags;
- VkSampler* pImmutableSamplers;
- safe_VkDescriptorSetLayoutBinding(const VkDescriptorSetLayoutBinding* in_struct);
- safe_VkDescriptorSetLayoutBinding(const safe_VkDescriptorSetLayoutBinding& copy_src);
- safe_VkDescriptorSetLayoutBinding& operator=(const safe_VkDescriptorSetLayoutBinding& copy_src);
- safe_VkDescriptorSetLayoutBinding();
- ~safe_VkDescriptorSetLayoutBinding();
- void initialize(const VkDescriptorSetLayoutBinding* in_struct);
- void initialize(const safe_VkDescriptorSetLayoutBinding* copy_src);
- VkDescriptorSetLayoutBinding *ptr() { return reinterpret_cast<VkDescriptorSetLayoutBinding *>(this); }
- VkDescriptorSetLayoutBinding const *ptr() const { return reinterpret_cast<VkDescriptorSetLayoutBinding const *>(this); }
-};
-
-struct safe_VkDescriptorSetLayoutCreateInfo {
+struct safe_VkCopyDescriptorSet {
VkStructureType sType;
const void* pNext;
- VkDescriptorSetLayoutCreateFlags flags;
- uint32_t bindingCount;
- safe_VkDescriptorSetLayoutBinding* pBindings;
- safe_VkDescriptorSetLayoutCreateInfo(const VkDescriptorSetLayoutCreateInfo* in_struct);
- safe_VkDescriptorSetLayoutCreateInfo(const safe_VkDescriptorSetLayoutCreateInfo& copy_src);
- safe_VkDescriptorSetLayoutCreateInfo& operator=(const safe_VkDescriptorSetLayoutCreateInfo& copy_src);
- safe_VkDescriptorSetLayoutCreateInfo();
- ~safe_VkDescriptorSetLayoutCreateInfo();
- void initialize(const VkDescriptorSetLayoutCreateInfo* in_struct);
- void initialize(const safe_VkDescriptorSetLayoutCreateInfo* copy_src);
- VkDescriptorSetLayoutCreateInfo *ptr() { return reinterpret_cast<VkDescriptorSetLayoutCreateInfo *>(this); }
- VkDescriptorSetLayoutCreateInfo const *ptr() const { return reinterpret_cast<VkDescriptorSetLayoutCreateInfo const *>(this); }
+ VkDescriptorSet srcSet;
+ uint32_t srcBinding;
+ uint32_t srcArrayElement;
+ VkDescriptorSet dstSet;
+ uint32_t dstBinding;
+ uint32_t dstArrayElement;
+ uint32_t descriptorCount;
+ safe_VkCopyDescriptorSet(const VkCopyDescriptorSet* in_struct);
+ safe_VkCopyDescriptorSet(const safe_VkCopyDescriptorSet& copy_src);
+ safe_VkCopyDescriptorSet& operator=(const safe_VkCopyDescriptorSet& copy_src);
+ safe_VkCopyDescriptorSet();
+ ~safe_VkCopyDescriptorSet();
+ void initialize(const VkCopyDescriptorSet* in_struct);
+ void initialize(const safe_VkCopyDescriptorSet* copy_src);
+ VkCopyDescriptorSet *ptr() { return reinterpret_cast<VkCopyDescriptorSet *>(this); }
+ VkCopyDescriptorSet const *ptr() const { return reinterpret_cast<VkCopyDescriptorSet const *>(this); }
};
struct safe_VkDescriptorPoolCreateInfo {
@@ -822,6 +869,40 @@
VkDescriptorSetAllocateInfo const *ptr() const { return reinterpret_cast<VkDescriptorSetAllocateInfo const *>(this); }
};
+struct safe_VkDescriptorSetLayoutBinding {
+ uint32_t binding;
+ VkDescriptorType descriptorType;
+ uint32_t descriptorCount;
+ VkShaderStageFlags stageFlags;
+ VkSampler* pImmutableSamplers;
+ safe_VkDescriptorSetLayoutBinding(const VkDescriptorSetLayoutBinding* in_struct);
+ safe_VkDescriptorSetLayoutBinding(const safe_VkDescriptorSetLayoutBinding& copy_src);
+ safe_VkDescriptorSetLayoutBinding& operator=(const safe_VkDescriptorSetLayoutBinding& copy_src);
+ safe_VkDescriptorSetLayoutBinding();
+ ~safe_VkDescriptorSetLayoutBinding();
+ void initialize(const VkDescriptorSetLayoutBinding* in_struct);
+ void initialize(const safe_VkDescriptorSetLayoutBinding* copy_src);
+ VkDescriptorSetLayoutBinding *ptr() { return reinterpret_cast<VkDescriptorSetLayoutBinding *>(this); }
+ VkDescriptorSetLayoutBinding const *ptr() const { return reinterpret_cast<VkDescriptorSetLayoutBinding const *>(this); }
+};
+
+struct safe_VkDescriptorSetLayoutCreateInfo {
+ VkStructureType sType;
+ const void* pNext;
+ VkDescriptorSetLayoutCreateFlags flags;
+ uint32_t bindingCount;
+ safe_VkDescriptorSetLayoutBinding* pBindings;
+ safe_VkDescriptorSetLayoutCreateInfo(const VkDescriptorSetLayoutCreateInfo* in_struct);
+ safe_VkDescriptorSetLayoutCreateInfo(const safe_VkDescriptorSetLayoutCreateInfo& copy_src);
+ safe_VkDescriptorSetLayoutCreateInfo& operator=(const safe_VkDescriptorSetLayoutCreateInfo& copy_src);
+ safe_VkDescriptorSetLayoutCreateInfo();
+ ~safe_VkDescriptorSetLayoutCreateInfo();
+ void initialize(const VkDescriptorSetLayoutCreateInfo* in_struct);
+ void initialize(const safe_VkDescriptorSetLayoutCreateInfo* copy_src);
+ VkDescriptorSetLayoutCreateInfo *ptr() { return reinterpret_cast<VkDescriptorSetLayoutCreateInfo *>(this); }
+ VkDescriptorSetLayoutCreateInfo const *ptr() const { return reinterpret_cast<VkDescriptorSetLayoutCreateInfo const *>(this); }
+};
+
struct safe_VkWriteDescriptorSet {
VkStructureType sType;
const void* pNext;
@@ -844,27 +925,6 @@
VkWriteDescriptorSet const *ptr() const { return reinterpret_cast<VkWriteDescriptorSet const *>(this); }
};
-struct safe_VkCopyDescriptorSet {
- VkStructureType sType;
- const void* pNext;
- VkDescriptorSet srcSet;
- uint32_t srcBinding;
- uint32_t srcArrayElement;
- VkDescriptorSet dstSet;
- uint32_t dstBinding;
- uint32_t dstArrayElement;
- uint32_t descriptorCount;
- safe_VkCopyDescriptorSet(const VkCopyDescriptorSet* in_struct);
- safe_VkCopyDescriptorSet(const safe_VkCopyDescriptorSet& copy_src);
- safe_VkCopyDescriptorSet& operator=(const safe_VkCopyDescriptorSet& copy_src);
- safe_VkCopyDescriptorSet();
- ~safe_VkCopyDescriptorSet();
- void initialize(const VkCopyDescriptorSet* in_struct);
- void initialize(const safe_VkCopyDescriptorSet* copy_src);
- VkCopyDescriptorSet *ptr() { return reinterpret_cast<VkCopyDescriptorSet *>(this); }
- VkCopyDescriptorSet const *ptr() const { return reinterpret_cast<VkCopyDescriptorSet const *>(this); }
-};
-
struct safe_VkFramebufferCreateInfo {
VkStructureType sType;
const void* pNext;
@@ -998,65 +1058,6 @@
VkCommandBufferBeginInfo const *ptr() const { return reinterpret_cast<VkCommandBufferBeginInfo const *>(this); }
};
-struct safe_VkMemoryBarrier {
- VkStructureType sType;
- const void* pNext;
- VkAccessFlags srcAccessMask;
- VkAccessFlags dstAccessMask;
- safe_VkMemoryBarrier(const VkMemoryBarrier* in_struct);
- safe_VkMemoryBarrier(const safe_VkMemoryBarrier& copy_src);
- safe_VkMemoryBarrier& operator=(const safe_VkMemoryBarrier& copy_src);
- safe_VkMemoryBarrier();
- ~safe_VkMemoryBarrier();
- void initialize(const VkMemoryBarrier* in_struct);
- void initialize(const safe_VkMemoryBarrier* copy_src);
- VkMemoryBarrier *ptr() { return reinterpret_cast<VkMemoryBarrier *>(this); }
- VkMemoryBarrier const *ptr() const { return reinterpret_cast<VkMemoryBarrier const *>(this); }
-};
-
-struct safe_VkBufferMemoryBarrier {
- VkStructureType sType;
- const void* pNext;
- VkAccessFlags srcAccessMask;
- VkAccessFlags dstAccessMask;
- uint32_t srcQueueFamilyIndex;
- uint32_t dstQueueFamilyIndex;
- VkBuffer buffer;
- VkDeviceSize offset;
- VkDeviceSize size;
- safe_VkBufferMemoryBarrier(const VkBufferMemoryBarrier* in_struct);
- safe_VkBufferMemoryBarrier(const safe_VkBufferMemoryBarrier& copy_src);
- safe_VkBufferMemoryBarrier& operator=(const safe_VkBufferMemoryBarrier& copy_src);
- safe_VkBufferMemoryBarrier();
- ~safe_VkBufferMemoryBarrier();
- void initialize(const VkBufferMemoryBarrier* in_struct);
- void initialize(const safe_VkBufferMemoryBarrier* copy_src);
- VkBufferMemoryBarrier *ptr() { return reinterpret_cast<VkBufferMemoryBarrier *>(this); }
- VkBufferMemoryBarrier const *ptr() const { return reinterpret_cast<VkBufferMemoryBarrier const *>(this); }
-};
-
-struct safe_VkImageMemoryBarrier {
- VkStructureType sType;
- const void* pNext;
- VkAccessFlags srcAccessMask;
- VkAccessFlags dstAccessMask;
- VkImageLayout oldLayout;
- VkImageLayout newLayout;
- uint32_t srcQueueFamilyIndex;
- uint32_t dstQueueFamilyIndex;
- VkImage image;
- VkImageSubresourceRange subresourceRange;
- safe_VkImageMemoryBarrier(const VkImageMemoryBarrier* in_struct);
- safe_VkImageMemoryBarrier(const safe_VkImageMemoryBarrier& copy_src);
- safe_VkImageMemoryBarrier& operator=(const safe_VkImageMemoryBarrier& copy_src);
- safe_VkImageMemoryBarrier();
- ~safe_VkImageMemoryBarrier();
- void initialize(const VkImageMemoryBarrier* in_struct);
- void initialize(const safe_VkImageMemoryBarrier* copy_src);
- VkImageMemoryBarrier *ptr() { return reinterpret_cast<VkImageMemoryBarrier *>(this); }
- VkImageMemoryBarrier const *ptr() const { return reinterpret_cast<VkImageMemoryBarrier const *>(this); }
-};
-
struct safe_VkRenderPassBeginInfo {
VkStructureType sType;
const void* pNext;
@@ -3272,6 +3273,22 @@
VkDeviceGroupSwapchainCreateInfoKHR const *ptr() const { return reinterpret_cast<VkDeviceGroupSwapchainCreateInfoKHR const *>(this); }
};
+struct safe_VkDisplayModeCreateInfoKHR {
+ VkStructureType sType;
+ const void* pNext;
+ VkDisplayModeCreateFlagsKHR flags;
+ VkDisplayModeParametersKHR parameters;
+ safe_VkDisplayModeCreateInfoKHR(const VkDisplayModeCreateInfoKHR* in_struct);
+ safe_VkDisplayModeCreateInfoKHR(const safe_VkDisplayModeCreateInfoKHR& copy_src);
+ safe_VkDisplayModeCreateInfoKHR& operator=(const safe_VkDisplayModeCreateInfoKHR& copy_src);
+ safe_VkDisplayModeCreateInfoKHR();
+ ~safe_VkDisplayModeCreateInfoKHR();
+ void initialize(const VkDisplayModeCreateInfoKHR* in_struct);
+ void initialize(const safe_VkDisplayModeCreateInfoKHR* copy_src);
+ VkDisplayModeCreateInfoKHR *ptr() { return reinterpret_cast<VkDisplayModeCreateInfoKHR *>(this); }
+ VkDisplayModeCreateInfoKHR const *ptr() const { return reinterpret_cast<VkDisplayModeCreateInfoKHR const *>(this); }
+};
+
struct safe_VkDisplayPropertiesKHR {
VkDisplayKHR display;
const char* displayName;
@@ -3291,22 +3308,6 @@
VkDisplayPropertiesKHR const *ptr() const { return reinterpret_cast<VkDisplayPropertiesKHR const *>(this); }
};
-struct safe_VkDisplayModeCreateInfoKHR {
- VkStructureType sType;
- const void* pNext;
- VkDisplayModeCreateFlagsKHR flags;
- VkDisplayModeParametersKHR parameters;
- safe_VkDisplayModeCreateInfoKHR(const VkDisplayModeCreateInfoKHR* in_struct);
- safe_VkDisplayModeCreateInfoKHR(const safe_VkDisplayModeCreateInfoKHR& copy_src);
- safe_VkDisplayModeCreateInfoKHR& operator=(const safe_VkDisplayModeCreateInfoKHR& copy_src);
- safe_VkDisplayModeCreateInfoKHR();
- ~safe_VkDisplayModeCreateInfoKHR();
- void initialize(const VkDisplayModeCreateInfoKHR* in_struct);
- void initialize(const safe_VkDisplayModeCreateInfoKHR* copy_src);
- VkDisplayModeCreateInfoKHR *ptr() { return reinterpret_cast<VkDisplayModeCreateInfoKHR *>(this); }
- VkDisplayModeCreateInfoKHR const *ptr() const { return reinterpret_cast<VkDisplayModeCreateInfoKHR const *>(this); }
-};
-
struct safe_VkDisplaySurfaceCreateInfoKHR {
VkStructureType sType;
const void* pNext;
@@ -4453,6 +4454,22 @@
VkImageViewHandleInfoNVX const *ptr() const { return reinterpret_cast<VkImageViewHandleInfoNVX const *>(this); }
};
+struct safe_VkImageViewAddressPropertiesNVX {
+ VkStructureType sType;
+ void* pNext;
+ VkDeviceAddress deviceAddress;
+ VkDeviceSize size;
+ safe_VkImageViewAddressPropertiesNVX(const VkImageViewAddressPropertiesNVX* in_struct);
+ safe_VkImageViewAddressPropertiesNVX(const safe_VkImageViewAddressPropertiesNVX& copy_src);
+ safe_VkImageViewAddressPropertiesNVX& operator=(const safe_VkImageViewAddressPropertiesNVX& copy_src);
+ safe_VkImageViewAddressPropertiesNVX();
+ ~safe_VkImageViewAddressPropertiesNVX();
+ void initialize(const VkImageViewAddressPropertiesNVX* in_struct);
+ void initialize(const safe_VkImageViewAddressPropertiesNVX* copy_src);
+ VkImageViewAddressPropertiesNVX *ptr() { return reinterpret_cast<VkImageViewAddressPropertiesNVX *>(this); }
+ VkImageViewAddressPropertiesNVX const *ptr() const { return reinterpret_cast<VkImageViewAddressPropertiesNVX const *>(this); }
+};
+
struct safe_VkTextureLODGatherFormatPropertiesAMD {
VkStructureType sType;
void* pNext;
@@ -5029,6 +5046,22 @@
};
#endif // VK_USE_PLATFORM_MACOS_MVK
+struct safe_VkDebugUtilsLabelEXT {
+ VkStructureType sType;
+ const void* pNext;
+ const char* pLabelName;
+ float color[4];
+ safe_VkDebugUtilsLabelEXT(const VkDebugUtilsLabelEXT* in_struct);
+ safe_VkDebugUtilsLabelEXT(const safe_VkDebugUtilsLabelEXT& copy_src);
+ safe_VkDebugUtilsLabelEXT& operator=(const safe_VkDebugUtilsLabelEXT& copy_src);
+ safe_VkDebugUtilsLabelEXT();
+ ~safe_VkDebugUtilsLabelEXT();
+ void initialize(const VkDebugUtilsLabelEXT* in_struct);
+ void initialize(const safe_VkDebugUtilsLabelEXT* copy_src);
+ VkDebugUtilsLabelEXT *ptr() { return reinterpret_cast<VkDebugUtilsLabelEXT *>(this); }
+ VkDebugUtilsLabelEXT const *ptr() const { return reinterpret_cast<VkDebugUtilsLabelEXT const *>(this); }
+};
+
struct safe_VkDebugUtilsObjectNameInfoEXT {
VkStructureType sType;
const void* pNext;
@@ -5046,41 +5079,6 @@
VkDebugUtilsObjectNameInfoEXT const *ptr() const { return reinterpret_cast<VkDebugUtilsObjectNameInfoEXT const *>(this); }
};
-struct safe_VkDebugUtilsObjectTagInfoEXT {
- VkStructureType sType;
- const void* pNext;
- VkObjectType objectType;
- uint64_t objectHandle;
- uint64_t tagName;
- size_t tagSize;
- const void* pTag;
- safe_VkDebugUtilsObjectTagInfoEXT(const VkDebugUtilsObjectTagInfoEXT* in_struct);
- safe_VkDebugUtilsObjectTagInfoEXT(const safe_VkDebugUtilsObjectTagInfoEXT& copy_src);
- safe_VkDebugUtilsObjectTagInfoEXT& operator=(const safe_VkDebugUtilsObjectTagInfoEXT& copy_src);
- safe_VkDebugUtilsObjectTagInfoEXT();
- ~safe_VkDebugUtilsObjectTagInfoEXT();
- void initialize(const VkDebugUtilsObjectTagInfoEXT* in_struct);
- void initialize(const safe_VkDebugUtilsObjectTagInfoEXT* copy_src);
- VkDebugUtilsObjectTagInfoEXT *ptr() { return reinterpret_cast<VkDebugUtilsObjectTagInfoEXT *>(this); }
- VkDebugUtilsObjectTagInfoEXT const *ptr() const { return reinterpret_cast<VkDebugUtilsObjectTagInfoEXT const *>(this); }
-};
-
-struct safe_VkDebugUtilsLabelEXT {
- VkStructureType sType;
- const void* pNext;
- const char* pLabelName;
- float color[4];
- safe_VkDebugUtilsLabelEXT(const VkDebugUtilsLabelEXT* in_struct);
- safe_VkDebugUtilsLabelEXT(const safe_VkDebugUtilsLabelEXT& copy_src);
- safe_VkDebugUtilsLabelEXT& operator=(const safe_VkDebugUtilsLabelEXT& copy_src);
- safe_VkDebugUtilsLabelEXT();
- ~safe_VkDebugUtilsLabelEXT();
- void initialize(const VkDebugUtilsLabelEXT* in_struct);
- void initialize(const safe_VkDebugUtilsLabelEXT* copy_src);
- VkDebugUtilsLabelEXT *ptr() { return reinterpret_cast<VkDebugUtilsLabelEXT *>(this); }
- VkDebugUtilsLabelEXT const *ptr() const { return reinterpret_cast<VkDebugUtilsLabelEXT const *>(this); }
-};
-
struct safe_VkDebugUtilsMessengerCallbackDataEXT {
VkStructureType sType;
const void* pNext;
@@ -5124,6 +5122,25 @@
VkDebugUtilsMessengerCreateInfoEXT const *ptr() const { return reinterpret_cast<VkDebugUtilsMessengerCreateInfoEXT const *>(this); }
};
+struct safe_VkDebugUtilsObjectTagInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ VkObjectType objectType;
+ uint64_t objectHandle;
+ uint64_t tagName;
+ size_t tagSize;
+ const void* pTag;
+ safe_VkDebugUtilsObjectTagInfoEXT(const VkDebugUtilsObjectTagInfoEXT* in_struct);
+ safe_VkDebugUtilsObjectTagInfoEXT(const safe_VkDebugUtilsObjectTagInfoEXT& copy_src);
+ safe_VkDebugUtilsObjectTagInfoEXT& operator=(const safe_VkDebugUtilsObjectTagInfoEXT& copy_src);
+ safe_VkDebugUtilsObjectTagInfoEXT();
+ ~safe_VkDebugUtilsObjectTagInfoEXT();
+ void initialize(const VkDebugUtilsObjectTagInfoEXT* in_struct);
+ void initialize(const safe_VkDebugUtilsObjectTagInfoEXT* copy_src);
+ VkDebugUtilsObjectTagInfoEXT *ptr() { return reinterpret_cast<VkDebugUtilsObjectTagInfoEXT *>(this); }
+ VkDebugUtilsObjectTagInfoEXT const *ptr() const { return reinterpret_cast<VkDebugUtilsObjectTagInfoEXT const *>(this); }
+};
+
#ifdef VK_USE_PLATFORM_ANDROID_KHR
struct safe_VkAndroidHardwareBufferUsageANDROID {
VkStructureType sType;
@@ -7073,6 +7090,32 @@
VkPipelineRasterizationLineStateCreateInfoEXT const *ptr() const { return reinterpret_cast<VkPipelineRasterizationLineStateCreateInfoEXT const *>(this); }
};
+struct safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 shaderBufferFloat32Atomics;
+ VkBool32 shaderBufferFloat32AtomicAdd;
+ VkBool32 shaderBufferFloat64Atomics;
+ VkBool32 shaderBufferFloat64AtomicAdd;
+ VkBool32 shaderSharedFloat32Atomics;
+ VkBool32 shaderSharedFloat32AtomicAdd;
+ VkBool32 shaderSharedFloat64Atomics;
+ VkBool32 shaderSharedFloat64AtomicAdd;
+ VkBool32 shaderImageFloat32Atomics;
+ VkBool32 shaderImageFloat32AtomicAdd;
+ VkBool32 sparseImageFloat32Atomics;
+ VkBool32 sparseImageFloat32AtomicAdd;
+ safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* in_struct);
+ safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT(const safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT& copy_src);
+ safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT& operator=(const safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT& copy_src);
+ safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT();
+ ~safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT();
+ void initialize(const VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* in_struct);
+ void initialize(const safe_VkPhysicalDeviceShaderAtomicFloatFeaturesEXT* copy_src);
+ VkPhysicalDeviceShaderAtomicFloatFeaturesEXT *ptr() { return reinterpret_cast<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT *>(this); }
+ VkPhysicalDeviceShaderAtomicFloatFeaturesEXT const *ptr() const { return reinterpret_cast<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT const *>(this); }
+};
+
struct safe_VkPhysicalDeviceIndexTypeUint8FeaturesEXT {
VkStructureType sType;
void* pNext;
@@ -7088,6 +7131,21 @@
VkPhysicalDeviceIndexTypeUint8FeaturesEXT const *ptr() const { return reinterpret_cast<VkPhysicalDeviceIndexTypeUint8FeaturesEXT const *>(this); }
};
+struct safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 extendedDynamicState;
+ safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* in_struct);
+ safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT(const safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT& copy_src);
+ safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT& operator=(const safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT& copy_src);
+ safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT();
+ ~safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT();
+ void initialize(const VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* in_struct);
+ void initialize(const safe_VkPhysicalDeviceExtendedDynamicStateFeaturesEXT* copy_src);
+ VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *ptr() { return reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT *>(this); }
+ VkPhysicalDeviceExtendedDynamicStateFeaturesEXT const *ptr() const { return reinterpret_cast<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT const *>(this); }
+};
+
struct safe_VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT {
VkStructureType sType;
void* pNext;
@@ -7105,7 +7163,7 @@
struct safe_VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV {
VkStructureType sType;
- const void* pNext;
+ void* pNext;
uint32_t maxGraphicsShaderGroupCount;
uint32_t maxIndirectSequenceCount;
uint32_t maxIndirectCommandsTokenCount;
@@ -7333,6 +7391,131 @@
VkCommandBufferInheritanceRenderPassTransformInfoQCOM const *ptr() const { return reinterpret_cast<VkCommandBufferInheritanceRenderPassTransformInfoQCOM const *>(this); }
};
+struct safe_VkPhysicalDeviceRobustness2FeaturesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 robustBufferAccess2;
+ VkBool32 robustImageAccess2;
+ VkBool32 nullDescriptor;
+ safe_VkPhysicalDeviceRobustness2FeaturesEXT(const VkPhysicalDeviceRobustness2FeaturesEXT* in_struct);
+ safe_VkPhysicalDeviceRobustness2FeaturesEXT(const safe_VkPhysicalDeviceRobustness2FeaturesEXT& copy_src);
+ safe_VkPhysicalDeviceRobustness2FeaturesEXT& operator=(const safe_VkPhysicalDeviceRobustness2FeaturesEXT& copy_src);
+ safe_VkPhysicalDeviceRobustness2FeaturesEXT();
+ ~safe_VkPhysicalDeviceRobustness2FeaturesEXT();
+ void initialize(const VkPhysicalDeviceRobustness2FeaturesEXT* in_struct);
+ void initialize(const safe_VkPhysicalDeviceRobustness2FeaturesEXT* copy_src);
+ VkPhysicalDeviceRobustness2FeaturesEXT *ptr() { return reinterpret_cast<VkPhysicalDeviceRobustness2FeaturesEXT *>(this); }
+ VkPhysicalDeviceRobustness2FeaturesEXT const *ptr() const { return reinterpret_cast<VkPhysicalDeviceRobustness2FeaturesEXT const *>(this); }
+};
+
+struct safe_VkPhysicalDeviceRobustness2PropertiesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkDeviceSize robustStorageBufferAccessSizeAlignment;
+ VkDeviceSize robustUniformBufferAccessSizeAlignment;
+ safe_VkPhysicalDeviceRobustness2PropertiesEXT(const VkPhysicalDeviceRobustness2PropertiesEXT* in_struct);
+ safe_VkPhysicalDeviceRobustness2PropertiesEXT(const safe_VkPhysicalDeviceRobustness2PropertiesEXT& copy_src);
+ safe_VkPhysicalDeviceRobustness2PropertiesEXT& operator=(const safe_VkPhysicalDeviceRobustness2PropertiesEXT& copy_src);
+ safe_VkPhysicalDeviceRobustness2PropertiesEXT();
+ ~safe_VkPhysicalDeviceRobustness2PropertiesEXT();
+ void initialize(const VkPhysicalDeviceRobustness2PropertiesEXT* in_struct);
+ void initialize(const safe_VkPhysicalDeviceRobustness2PropertiesEXT* copy_src);
+ VkPhysicalDeviceRobustness2PropertiesEXT *ptr() { return reinterpret_cast<VkPhysicalDeviceRobustness2PropertiesEXT *>(this); }
+ VkPhysicalDeviceRobustness2PropertiesEXT const *ptr() const { return reinterpret_cast<VkPhysicalDeviceRobustness2PropertiesEXT const *>(this); }
+};
+
+struct safe_VkSamplerCustomBorderColorCreateInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ VkClearColorValue customBorderColor;
+ VkFormat format;
+ safe_VkSamplerCustomBorderColorCreateInfoEXT(const VkSamplerCustomBorderColorCreateInfoEXT* in_struct);
+ safe_VkSamplerCustomBorderColorCreateInfoEXT(const safe_VkSamplerCustomBorderColorCreateInfoEXT& copy_src);
+ safe_VkSamplerCustomBorderColorCreateInfoEXT& operator=(const safe_VkSamplerCustomBorderColorCreateInfoEXT& copy_src);
+ safe_VkSamplerCustomBorderColorCreateInfoEXT();
+ ~safe_VkSamplerCustomBorderColorCreateInfoEXT();
+ void initialize(const VkSamplerCustomBorderColorCreateInfoEXT* in_struct);
+ void initialize(const safe_VkSamplerCustomBorderColorCreateInfoEXT* copy_src);
+ VkSamplerCustomBorderColorCreateInfoEXT *ptr() { return reinterpret_cast<VkSamplerCustomBorderColorCreateInfoEXT *>(this); }
+ VkSamplerCustomBorderColorCreateInfoEXT const *ptr() const { return reinterpret_cast<VkSamplerCustomBorderColorCreateInfoEXT const *>(this); }
+};
+
+struct safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT {
+ VkStructureType sType;
+ void* pNext;
+ uint32_t maxCustomBorderColorSamplers;
+ safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT(const VkPhysicalDeviceCustomBorderColorPropertiesEXT* in_struct);
+ safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT(const safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT& copy_src);
+ safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT& operator=(const safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT& copy_src);
+ safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT();
+ ~safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT();
+ void initialize(const VkPhysicalDeviceCustomBorderColorPropertiesEXT* in_struct);
+ void initialize(const safe_VkPhysicalDeviceCustomBorderColorPropertiesEXT* copy_src);
+ VkPhysicalDeviceCustomBorderColorPropertiesEXT *ptr() { return reinterpret_cast<VkPhysicalDeviceCustomBorderColorPropertiesEXT *>(this); }
+ VkPhysicalDeviceCustomBorderColorPropertiesEXT const *ptr() const { return reinterpret_cast<VkPhysicalDeviceCustomBorderColorPropertiesEXT const *>(this); }
+};
+
+struct safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 customBorderColors;
+ VkBool32 customBorderColorWithoutFormat;
+ safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT(const VkPhysicalDeviceCustomBorderColorFeaturesEXT* in_struct);
+ safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT(const safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT& copy_src);
+ safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT& operator=(const safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT& copy_src);
+ safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT();
+ ~safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT();
+ void initialize(const VkPhysicalDeviceCustomBorderColorFeaturesEXT* in_struct);
+ void initialize(const safe_VkPhysicalDeviceCustomBorderColorFeaturesEXT* copy_src);
+ VkPhysicalDeviceCustomBorderColorFeaturesEXT *ptr() { return reinterpret_cast<VkPhysicalDeviceCustomBorderColorFeaturesEXT *>(this); }
+ VkPhysicalDeviceCustomBorderColorFeaturesEXT const *ptr() const { return reinterpret_cast<VkPhysicalDeviceCustomBorderColorFeaturesEXT const *>(this); }
+};
+
+struct safe_VkPhysicalDevicePrivateDataFeaturesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 privateData;
+ safe_VkPhysicalDevicePrivateDataFeaturesEXT(const VkPhysicalDevicePrivateDataFeaturesEXT* in_struct);
+ safe_VkPhysicalDevicePrivateDataFeaturesEXT(const safe_VkPhysicalDevicePrivateDataFeaturesEXT& copy_src);
+ safe_VkPhysicalDevicePrivateDataFeaturesEXT& operator=(const safe_VkPhysicalDevicePrivateDataFeaturesEXT& copy_src);
+ safe_VkPhysicalDevicePrivateDataFeaturesEXT();
+ ~safe_VkPhysicalDevicePrivateDataFeaturesEXT();
+ void initialize(const VkPhysicalDevicePrivateDataFeaturesEXT* in_struct);
+ void initialize(const safe_VkPhysicalDevicePrivateDataFeaturesEXT* copy_src);
+ VkPhysicalDevicePrivateDataFeaturesEXT *ptr() { return reinterpret_cast<VkPhysicalDevicePrivateDataFeaturesEXT *>(this); }
+ VkPhysicalDevicePrivateDataFeaturesEXT const *ptr() const { return reinterpret_cast<VkPhysicalDevicePrivateDataFeaturesEXT const *>(this); }
+};
+
+struct safe_VkDevicePrivateDataCreateInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ uint32_t privateDataSlotRequestCount;
+ safe_VkDevicePrivateDataCreateInfoEXT(const VkDevicePrivateDataCreateInfoEXT* in_struct);
+ safe_VkDevicePrivateDataCreateInfoEXT(const safe_VkDevicePrivateDataCreateInfoEXT& copy_src);
+ safe_VkDevicePrivateDataCreateInfoEXT& operator=(const safe_VkDevicePrivateDataCreateInfoEXT& copy_src);
+ safe_VkDevicePrivateDataCreateInfoEXT();
+ ~safe_VkDevicePrivateDataCreateInfoEXT();
+ void initialize(const VkDevicePrivateDataCreateInfoEXT* in_struct);
+ void initialize(const safe_VkDevicePrivateDataCreateInfoEXT* copy_src);
+ VkDevicePrivateDataCreateInfoEXT *ptr() { return reinterpret_cast<VkDevicePrivateDataCreateInfoEXT *>(this); }
+ VkDevicePrivateDataCreateInfoEXT const *ptr() const { return reinterpret_cast<VkDevicePrivateDataCreateInfoEXT const *>(this); }
+};
+
+struct safe_VkPrivateDataSlotCreateInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ VkPrivateDataSlotCreateFlagsEXT flags;
+ safe_VkPrivateDataSlotCreateInfoEXT(const VkPrivateDataSlotCreateInfoEXT* in_struct);
+ safe_VkPrivateDataSlotCreateInfoEXT(const safe_VkPrivateDataSlotCreateInfoEXT& copy_src);
+ safe_VkPrivateDataSlotCreateInfoEXT& operator=(const safe_VkPrivateDataSlotCreateInfoEXT& copy_src);
+ safe_VkPrivateDataSlotCreateInfoEXT();
+ ~safe_VkPrivateDataSlotCreateInfoEXT();
+ void initialize(const VkPrivateDataSlotCreateInfoEXT* in_struct);
+ void initialize(const safe_VkPrivateDataSlotCreateInfoEXT* copy_src);
+ VkPrivateDataSlotCreateInfoEXT *ptr() { return reinterpret_cast<VkPrivateDataSlotCreateInfoEXT *>(this); }
+ VkPrivateDataSlotCreateInfoEXT const *ptr() const { return reinterpret_cast<VkPrivateDataSlotCreateInfoEXT const *>(this); }
+};
+
struct safe_VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT {
VkStructureType sType;
void* pNext;
@@ -7378,6 +7561,73 @@
VkDeviceDiagnosticsConfigCreateInfoNV const *ptr() const { return reinterpret_cast<VkDeviceDiagnosticsConfigCreateInfoNV const *>(this); }
};
+struct safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 fragmentDensityMapDeferred;
+ safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* in_struct);
+ safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT(const safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT& copy_src);
+ safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT& operator=(const safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT& copy_src);
+ safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT();
+ ~safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT();
+ void initialize(const VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* in_struct);
+ void initialize(const safe_VkPhysicalDeviceFragmentDensityMap2FeaturesEXT* copy_src);
+ VkPhysicalDeviceFragmentDensityMap2FeaturesEXT *ptr() { return reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT *>(this); }
+ VkPhysicalDeviceFragmentDensityMap2FeaturesEXT const *ptr() const { return reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT const *>(this); }
+};
+
+struct safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 subsampledLoads;
+ VkBool32 subsampledCoarseReconstructionEarlyAccess;
+ uint32_t maxSubsampledArrayLayers;
+ uint32_t maxDescriptorSetSubsampledSamplers;
+ safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* in_struct);
+ safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT(const safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT& copy_src);
+ safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT& operator=(const safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT& copy_src);
+ safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT();
+ ~safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT();
+ void initialize(const VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* in_struct);
+ void initialize(const safe_VkPhysicalDeviceFragmentDensityMap2PropertiesEXT* copy_src);
+ VkPhysicalDeviceFragmentDensityMap2PropertiesEXT *ptr() { return reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2PropertiesEXT *>(this); }
+ VkPhysicalDeviceFragmentDensityMap2PropertiesEXT const *ptr() const { return reinterpret_cast<VkPhysicalDeviceFragmentDensityMap2PropertiesEXT const *>(this); }
+};
+
+struct safe_VkPhysicalDeviceImageRobustnessFeaturesEXT {
+ VkStructureType sType;
+ void* pNext;
+ VkBool32 robustImageAccess;
+ safe_VkPhysicalDeviceImageRobustnessFeaturesEXT(const VkPhysicalDeviceImageRobustnessFeaturesEXT* in_struct);
+ safe_VkPhysicalDeviceImageRobustnessFeaturesEXT(const safe_VkPhysicalDeviceImageRobustnessFeaturesEXT& copy_src);
+ safe_VkPhysicalDeviceImageRobustnessFeaturesEXT& operator=(const safe_VkPhysicalDeviceImageRobustnessFeaturesEXT& copy_src);
+ safe_VkPhysicalDeviceImageRobustnessFeaturesEXT();
+ ~safe_VkPhysicalDeviceImageRobustnessFeaturesEXT();
+ void initialize(const VkPhysicalDeviceImageRobustnessFeaturesEXT* in_struct);
+ void initialize(const safe_VkPhysicalDeviceImageRobustnessFeaturesEXT* copy_src);
+ VkPhysicalDeviceImageRobustnessFeaturesEXT *ptr() { return reinterpret_cast<VkPhysicalDeviceImageRobustnessFeaturesEXT *>(this); }
+ VkPhysicalDeviceImageRobustnessFeaturesEXT const *ptr() const { return reinterpret_cast<VkPhysicalDeviceImageRobustnessFeaturesEXT const *>(this); }
+};
+
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+struct safe_VkDirectFBSurfaceCreateInfoEXT {
+ VkStructureType sType;
+ const void* pNext;
+ VkDirectFBSurfaceCreateFlagsEXT flags;
+ IDirectFB* dfb;
+ IDirectFBSurface* surface;
+ safe_VkDirectFBSurfaceCreateInfoEXT(const VkDirectFBSurfaceCreateInfoEXT* in_struct);
+ safe_VkDirectFBSurfaceCreateInfoEXT(const safe_VkDirectFBSurfaceCreateInfoEXT& copy_src);
+ safe_VkDirectFBSurfaceCreateInfoEXT& operator=(const safe_VkDirectFBSurfaceCreateInfoEXT& copy_src);
+ safe_VkDirectFBSurfaceCreateInfoEXT();
+ ~safe_VkDirectFBSurfaceCreateInfoEXT();
+ void initialize(const VkDirectFBSurfaceCreateInfoEXT* in_struct);
+ void initialize(const safe_VkDirectFBSurfaceCreateInfoEXT* copy_src);
+ VkDirectFBSurfaceCreateInfoEXT *ptr() { return reinterpret_cast<VkDirectFBSurfaceCreateInfoEXT *>(this); }
+ VkDirectFBSurfaceCreateInfoEXT const *ptr() const { return reinterpret_cast<VkDirectFBSurfaceCreateInfoEXT const *>(this); }
+};
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
+
#ifdef VK_USE_PLATFORM_FUCHSIA
struct safe_VkBufferCollectionCreateInfoFUCHSIA {
VkStructureType sType;
diff --git a/layers/generated/vk_typemap_helper.h b/layers/generated/vk_typemap_helper.h
index d6bcea4..68d3401 100644
--- a/layers/generated/vk_typemap_helper.h
+++ b/layers/generated/vk_typemap_helper.h
@@ -39,6 +39,33 @@
template <VkStructureType id> struct LvlSTypeMap {};
template <typename T> struct LvlTypeMap {};
+// Map type VkBufferMemoryBarrier to id VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER
+template <> struct LvlTypeMap<VkBufferMemoryBarrier> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER> {
+ typedef VkBufferMemoryBarrier Type;
+};
+
+// Map type VkImageMemoryBarrier to id VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER
+template <> struct LvlTypeMap<VkImageMemoryBarrier> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER> {
+ typedef VkImageMemoryBarrier Type;
+};
+
+// Map type VkMemoryBarrier to id VK_STRUCTURE_TYPE_MEMORY_BARRIER
+template <> struct LvlTypeMap<VkMemoryBarrier> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_MEMORY_BARRIER> {
+ typedef VkMemoryBarrier Type;
+};
+
// Map type VkApplicationInfo to id VK_STRUCTURE_TYPE_APPLICATION_INFO
template <> struct LvlTypeMap<VkApplicationInfo> {
static const VkStructureType kSType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
@@ -84,15 +111,6 @@
typedef VkSubmitInfo Type;
};
-// Map type VkMemoryAllocateInfo to id VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO
-template <> struct LvlTypeMap<VkMemoryAllocateInfo> {
- static const VkStructureType kSType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
-};
-
-template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO> {
- typedef VkMemoryAllocateInfo Type;
-};
-
// Map type VkMappedMemoryRange to id VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE
template <> struct LvlTypeMap<VkMappedMemoryRange> {
static const VkStructureType kSType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
@@ -102,6 +120,15 @@
typedef VkMappedMemoryRange Type;
};
+// Map type VkMemoryAllocateInfo to id VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO
+template <> struct LvlTypeMap<VkMemoryAllocateInfo> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO> {
+ typedef VkMemoryAllocateInfo Type;
+};
+
// Map type VkBindSparseInfo to id VK_STRUCTURE_TYPE_BIND_SPARSE_INFO
template <> struct LvlTypeMap<VkBindSparseInfo> {
static const VkStructureType kSType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
@@ -210,6 +237,15 @@
typedef VkPipelineShaderStageCreateInfo Type;
};
+// Map type VkComputePipelineCreateInfo to id VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO
+template <> struct LvlTypeMap<VkComputePipelineCreateInfo> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO> {
+ typedef VkComputePipelineCreateInfo Type;
+};
+
// Map type VkPipelineVertexInputStateCreateInfo to id VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO
template <> struct LvlTypeMap<VkPipelineVertexInputStateCreateInfo> {
static const VkStructureType kSType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
@@ -300,15 +336,6 @@
typedef VkGraphicsPipelineCreateInfo Type;
};
-// Map type VkComputePipelineCreateInfo to id VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO
-template <> struct LvlTypeMap<VkComputePipelineCreateInfo> {
- static const VkStructureType kSType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO;
-};
-
-template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO> {
- typedef VkComputePipelineCreateInfo Type;
-};
-
// Map type VkPipelineLayoutCreateInfo to id VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO
template <> struct LvlTypeMap<VkPipelineLayoutCreateInfo> {
static const VkStructureType kSType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
@@ -327,13 +354,13 @@
typedef VkSamplerCreateInfo Type;
};
-// Map type VkDescriptorSetLayoutCreateInfo to id VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO
-template <> struct LvlTypeMap<VkDescriptorSetLayoutCreateInfo> {
- static const VkStructureType kSType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
+// Map type VkCopyDescriptorSet to id VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET
+template <> struct LvlTypeMap<VkCopyDescriptorSet> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
};
-template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO> {
- typedef VkDescriptorSetLayoutCreateInfo Type;
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET> {
+ typedef VkCopyDescriptorSet Type;
};
// Map type VkDescriptorPoolCreateInfo to id VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO
@@ -354,6 +381,15 @@
typedef VkDescriptorSetAllocateInfo Type;
};
+// Map type VkDescriptorSetLayoutCreateInfo to id VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO
+template <> struct LvlTypeMap<VkDescriptorSetLayoutCreateInfo> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO> {
+ typedef VkDescriptorSetLayoutCreateInfo Type;
+};
+
// Map type VkWriteDescriptorSet to id VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET
template <> struct LvlTypeMap<VkWriteDescriptorSet> {
static const VkStructureType kSType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
@@ -363,15 +399,6 @@
typedef VkWriteDescriptorSet Type;
};
-// Map type VkCopyDescriptorSet to id VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET
-template <> struct LvlTypeMap<VkCopyDescriptorSet> {
- static const VkStructureType kSType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
-};
-
-template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET> {
- typedef VkCopyDescriptorSet Type;
-};
-
// Map type VkFramebufferCreateInfo to id VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO
template <> struct LvlTypeMap<VkFramebufferCreateInfo> {
static const VkStructureType kSType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
@@ -426,33 +453,6 @@
typedef VkCommandBufferBeginInfo Type;
};
-// Map type VkMemoryBarrier to id VK_STRUCTURE_TYPE_MEMORY_BARRIER
-template <> struct LvlTypeMap<VkMemoryBarrier> {
- static const VkStructureType kSType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
-};
-
-template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_MEMORY_BARRIER> {
- typedef VkMemoryBarrier Type;
-};
-
-// Map type VkBufferMemoryBarrier to id VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER
-template <> struct LvlTypeMap<VkBufferMemoryBarrier> {
- static const VkStructureType kSType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
-};
-
-template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER> {
- typedef VkBufferMemoryBarrier Type;
-};
-
-// Map type VkImageMemoryBarrier to id VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER
-template <> struct LvlTypeMap<VkImageMemoryBarrier> {
- static const VkStructureType kSType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
-};
-
-template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER> {
- typedef VkImageMemoryBarrier Type;
-};
-
// Map type VkRenderPassBeginInfo to id VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO
template <> struct LvlTypeMap<VkRenderPassBeginInfo> {
static const VkStructureType kSType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
@@ -2210,6 +2210,15 @@
typedef VkImageViewHandleInfoNVX Type;
};
+// Map type VkImageViewAddressPropertiesNVX to id VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX
+template <> struct LvlTypeMap<VkImageViewAddressPropertiesNVX> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX> {
+ typedef VkImageViewAddressPropertiesNVX Type;
+};
+
// Map type VkTextureLODGatherFormatPropertiesAMD to id VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD
template <> struct LvlTypeMap<VkTextureLODGatherFormatPropertiesAMD> {
static const VkStructureType kSType = VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD;
@@ -2530,24 +2539,6 @@
};
#endif // VK_USE_PLATFORM_MACOS_MVK
-// Map type VkDebugUtilsObjectNameInfoEXT to id VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT
-template <> struct LvlTypeMap<VkDebugUtilsObjectNameInfoEXT> {
- static const VkStructureType kSType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT;
-};
-
-template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT> {
- typedef VkDebugUtilsObjectNameInfoEXT Type;
-};
-
-// Map type VkDebugUtilsObjectTagInfoEXT to id VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT
-template <> struct LvlTypeMap<VkDebugUtilsObjectTagInfoEXT> {
- static const VkStructureType kSType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT;
-};
-
-template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT> {
- typedef VkDebugUtilsObjectTagInfoEXT Type;
-};
-
// Map type VkDebugUtilsLabelEXT to id VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT
template <> struct LvlTypeMap<VkDebugUtilsLabelEXT> {
static const VkStructureType kSType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT;
@@ -2557,6 +2548,15 @@
typedef VkDebugUtilsLabelEXT Type;
};
+// Map type VkDebugUtilsObjectNameInfoEXT to id VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT
+template <> struct LvlTypeMap<VkDebugUtilsObjectNameInfoEXT> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT> {
+ typedef VkDebugUtilsObjectNameInfoEXT Type;
+};
+
// Map type VkDebugUtilsMessengerCallbackDataEXT to id VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT
template <> struct LvlTypeMap<VkDebugUtilsMessengerCallbackDataEXT> {
static const VkStructureType kSType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT;
@@ -2575,6 +2575,15 @@
typedef VkDebugUtilsMessengerCreateInfoEXT Type;
};
+// Map type VkDebugUtilsObjectTagInfoEXT to id VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT
+template <> struct LvlTypeMap<VkDebugUtilsObjectTagInfoEXT> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT> {
+ typedef VkDebugUtilsObjectTagInfoEXT Type;
+};
+
#ifdef VK_USE_PLATFORM_ANDROID_KHR
// Map type VkAndroidHardwareBufferUsageANDROID to id VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID
template <> struct LvlTypeMap<VkAndroidHardwareBufferUsageANDROID> {
@@ -3237,12 +3246,12 @@
typedef VkInitializePerformanceApiInfoINTEL Type;
};
-// Map type VkQueryPoolPerformanceQueryCreateInfoINTEL to id VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL
+// Map type VkQueryPoolPerformanceQueryCreateInfoINTEL to id VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL
template <> struct LvlTypeMap<VkQueryPoolPerformanceQueryCreateInfoINTEL> {
- static const VkStructureType kSType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL;
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL;
};
-template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL> {
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL> {
typedef VkQueryPoolPerformanceQueryCreateInfoINTEL Type;
};
@@ -3616,6 +3625,15 @@
typedef VkPipelineRasterizationLineStateCreateInfoEXT Type;
};
+// Map type VkPhysicalDeviceShaderAtomicFloatFeaturesEXT to id VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT
+template <> struct LvlTypeMap<VkPhysicalDeviceShaderAtomicFloatFeaturesEXT> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT> {
+ typedef VkPhysicalDeviceShaderAtomicFloatFeaturesEXT Type;
+};
+
// Map type VkPhysicalDeviceIndexTypeUint8FeaturesEXT to id VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT
template <> struct LvlTypeMap<VkPhysicalDeviceIndexTypeUint8FeaturesEXT> {
static const VkStructureType kSType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT;
@@ -3625,6 +3643,15 @@
typedef VkPhysicalDeviceIndexTypeUint8FeaturesEXT Type;
};
+// Map type VkPhysicalDeviceExtendedDynamicStateFeaturesEXT to id VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT
+template <> struct LvlTypeMap<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT> {
+ typedef VkPhysicalDeviceExtendedDynamicStateFeaturesEXT Type;
+};
+
// Map type VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT to id VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT
template <> struct LvlTypeMap<VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT> {
static const VkStructureType kSType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT;
@@ -3742,6 +3769,78 @@
typedef VkCommandBufferInheritanceRenderPassTransformInfoQCOM Type;
};
+// Map type VkPhysicalDeviceRobustness2FeaturesEXT to id VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT
+template <> struct LvlTypeMap<VkPhysicalDeviceRobustness2FeaturesEXT> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT> {
+ typedef VkPhysicalDeviceRobustness2FeaturesEXT Type;
+};
+
+// Map type VkPhysicalDeviceRobustness2PropertiesEXT to id VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT
+template <> struct LvlTypeMap<VkPhysicalDeviceRobustness2PropertiesEXT> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT> {
+ typedef VkPhysicalDeviceRobustness2PropertiesEXT Type;
+};
+
+// Map type VkSamplerCustomBorderColorCreateInfoEXT to id VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT
+template <> struct LvlTypeMap<VkSamplerCustomBorderColorCreateInfoEXT> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT> {
+ typedef VkSamplerCustomBorderColorCreateInfoEXT Type;
+};
+
+// Map type VkPhysicalDeviceCustomBorderColorPropertiesEXT to id VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT
+template <> struct LvlTypeMap<VkPhysicalDeviceCustomBorderColorPropertiesEXT> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT> {
+ typedef VkPhysicalDeviceCustomBorderColorPropertiesEXT Type;
+};
+
+// Map type VkPhysicalDeviceCustomBorderColorFeaturesEXT to id VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT
+template <> struct LvlTypeMap<VkPhysicalDeviceCustomBorderColorFeaturesEXT> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT> {
+ typedef VkPhysicalDeviceCustomBorderColorFeaturesEXT Type;
+};
+
+// Map type VkPhysicalDevicePrivateDataFeaturesEXT to id VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT
+template <> struct LvlTypeMap<VkPhysicalDevicePrivateDataFeaturesEXT> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT> {
+ typedef VkPhysicalDevicePrivateDataFeaturesEXT Type;
+};
+
+// Map type VkDevicePrivateDataCreateInfoEXT to id VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT
+template <> struct LvlTypeMap<VkDevicePrivateDataCreateInfoEXT> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT> {
+ typedef VkDevicePrivateDataCreateInfoEXT Type;
+};
+
+// Map type VkPrivateDataSlotCreateInfoEXT to id VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO_EXT
+template <> struct LvlTypeMap<VkPrivateDataSlotCreateInfoEXT> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO_EXT;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO_EXT> {
+ typedef VkPrivateDataSlotCreateInfoEXT Type;
+};
+
// Map type VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT to id VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT
template <> struct LvlTypeMap<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT> {
static const VkStructureType kSType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT;
@@ -3769,6 +3868,44 @@
typedef VkDeviceDiagnosticsConfigCreateInfoNV Type;
};
+// Map type VkPhysicalDeviceFragmentDensityMap2FeaturesEXT to id VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT
+template <> struct LvlTypeMap<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT> {
+ typedef VkPhysicalDeviceFragmentDensityMap2FeaturesEXT Type;
+};
+
+// Map type VkPhysicalDeviceFragmentDensityMap2PropertiesEXT to id VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT
+template <> struct LvlTypeMap<VkPhysicalDeviceFragmentDensityMap2PropertiesEXT> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT> {
+ typedef VkPhysicalDeviceFragmentDensityMap2PropertiesEXT Type;
+};
+
+// Map type VkPhysicalDeviceImageRobustnessFeaturesEXT to id VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT
+template <> struct LvlTypeMap<VkPhysicalDeviceImageRobustnessFeaturesEXT> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT> {
+ typedef VkPhysicalDeviceImageRobustnessFeaturesEXT Type;
+};
+
+#ifdef VK_USE_PLATFORM_DIRECTFB_EXT
+// Map type VkDirectFBSurfaceCreateInfoEXT to id VK_STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT
+template <> struct LvlTypeMap<VkDirectFBSurfaceCreateInfoEXT> {
+ static const VkStructureType kSType = VK_STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT;
+};
+
+template <> struct LvlSTypeMap<VK_STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT> {
+ typedef VkDirectFBSurfaceCreateInfoEXT Type;
+};
+
+#endif // VK_USE_PLATFORM_DIRECTFB_EXT
#ifdef VK_USE_PLATFORM_FUCHSIA
// Map type VkBufferCollectionCreateInfoFUCHSIA to id VK_STRUCTURE_TYPE_BUFFER_COLLECTION_CREATE_INFO_FUCHSIA
template <> struct LvlTypeMap<VkBufferCollectionCreateInfoFUCHSIA> {
diff --git a/layers/generated/vk_validation_error_messages.h b/layers/generated/vk_validation_error_messages.h
index 75ce3f4..d4fcba3 100644
--- a/layers/generated/vk_validation_error_messages.h
+++ b/layers/generated/vk_validation_error_messages.h
@@ -1,5 +1,5 @@
/* THIS FILE IS GENERATED - DO NOT EDIT (scripts/vk_validation_stats.py) */
-/* Vulkan specification version: 1.2.135 */
+/* Vulkan specification version: 1.2.148 */
/*
* Vulkan
*
@@ -31,6099 +31,6473 @@
typedef struct _vuid_spec_text_pair {
const char * vuid;
const char * spec_text;
+ const char * url_id;
} vuid_spec_text_pair;
static const vuid_spec_text_pair vuid_spec_text[] = {
- {"VUID-VkAabbPositionsKHR-minX-03546", "minX must be less than or equal to maxX (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAabbPositionsKHR-minX-03546)"},
- {"VUID-VkAabbPositionsKHR-minY-03547", "minY must be less than or equal to maxY (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAabbPositionsKHR-minY-03547)"},
- {"VUID-VkAabbPositionsKHR-minZ-03548", "minZ must be less than or equal to maxZ (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAabbPositionsKHR-minZ-03548)"},
- {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-commonparent", "Both of dstAccelerationStructure, and srcAccelerationStructure that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureBuildGeometryInfoKHR-commonparent)"},
- {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-dstAccelerationStructure-parameter", "dstAccelerationStructure must be a valid VkAccelerationStructureKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureBuildGeometryInfoKHR-dstAccelerationStructure-parameter)"},
- {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-flags-parameter", "flags must be a valid combination of VkBuildAccelerationStructureFlagBitsKHR values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureBuildGeometryInfoKHR-flags-parameter)"},
- {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkDeferredOperationInfoKHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureBuildGeometryInfoKHR-pNext-pNext)"},
- {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureBuildGeometryInfoKHR-sType-sType)"},
- {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureBuildGeometryInfoKHR-sType-unique)"},
- {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-scratchData-03539", "scratchData must have been created with VK_BUFFER_USAGE_RAY_TRACING_BIT_KHR usage flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureBuildGeometryInfoKHR-scratchData-03539)"},
- {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-scratchData-parameter", "scratchData must be a valid VkDeviceOrHostAddressKHR union (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureBuildGeometryInfoKHR-scratchData-parameter)"},
- {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-srcAccelerationStructure-parameter", "If srcAccelerationStructure is not VK_NULL_HANDLE, srcAccelerationStructure must be a valid VkAccelerationStructureKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureBuildGeometryInfoKHR-srcAccelerationStructure-parameter)"},
- {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-type-parameter", "type must be a valid VkAccelerationStructureTypeKHR value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureBuildGeometryInfoKHR-type-parameter)"},
- {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-update-03537", "If update is VK_TRUE, srcAccelerationStructure must not be VK_NULL_HANDLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureBuildGeometryInfoKHR-update-03537)"},
- {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-update-03538", "If update is VK_TRUE, srcAccelerationStructure must have been built before with VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR set in VkAccelerationStructureBuildGeometryInfoKHR::flags (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureBuildGeometryInfoKHR-update-03538)"},
- {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-update-03540", "If update is enam:VK_TRUE, the srcAccelerationStructure and dstAccelerationStructure objects must either be the same object or not have any memory aliasing (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureBuildGeometryInfoKHR-update-03540)"},
- {"VUID-VkAccelerationStructureBuildOffsetInfoKHR-primitiveOffset-03551", "For geometries of type VK_GEOMETRY_TYPE_TRIANGLES_KHR, if the geometry uses indices, the offset primitiveOffset from VkAccelerationStructureGeometryTrianglesDataKHR::indexData must be a multiple of the element size of VkAccelerationStructureGeometryTrianglesDataKHR::indexType (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureBuildOffsetInfoKHR-primitiveOffset-03551)"},
- {"VUID-VkAccelerationStructureBuildOffsetInfoKHR-primitiveOffset-03552", "For geometries of type VK_GEOMETRY_TYPE_TRIANGLES_KHR, if the geometry doesn't use indices, the offset primitiveOffset from VkAccelerationStructureGeometryTrianglesDataKHR::vertexData must be a multiple of the component size of VkAccelerationStructureGeometryTrianglesDataKHR::vertexType (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureBuildOffsetInfoKHR-primitiveOffset-03552)"},
- {"VUID-VkAccelerationStructureBuildOffsetInfoKHR-primitiveOffset-03554", "For geometries of type VK_GEOMETRY_TYPE_AABBS_KHR, the offset primitiveOffset from VkAccelerationStructureGeometryAabbsDataKHR::data must be a multiple of 8 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureBuildOffsetInfoKHR-primitiveOffset-03554)"},
- {"VUID-VkAccelerationStructureBuildOffsetInfoKHR-primitiveOffset-03555", "For geometries of type VK_GEOMETRY_TYPE_INSTANCES_KHR, the offset primitiveOffset from VkAccelerationStructureGeometryInstancesDataKHR::data must be a multiple of 16 // TODO - Almost certainly should be more here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureBuildOffsetInfoKHR-primitiveOffset-03555)"},
- {"VUID-VkAccelerationStructureBuildOffsetInfoKHR-transformOffset-03553", "For geometries of type VK_GEOMETRY_TYPE_TRIANGLES_KHR, the offset transformOffset from VkAccelerationStructureGeometryTrianglesDataKHR::transformData must be a multiple of 16 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureBuildOffsetInfoKHR-transformOffset-03553)"},
- {"VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-geometryType-03501", "If geometryType is VK_GEOMETRY_TYPE_TRIANGLES_KHR, vertexFormat must support the VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR in VkFormatProperties::bufferFeatures as returned by vkGetPhysicalDeviceFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-geometryType-03501)"},
- {"VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-geometryType-03502", "If geometryType is VK_GEOMETRY_TYPE_TRIANGLES_KHR, indexType must be VK_INDEX_TYPE_UINT16, VK_INDEX_TYPE_UINT32, or VK_INDEX_TYPE_NONE_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-geometryType-03502)"},
- {"VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-geometryType-parameter", "geometryType must be a valid VkGeometryTypeKHR value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-geometryType-parameter)"},
- {"VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-indexType-parameter", "indexType must be a valid VkIndexType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-indexType-parameter)"},
- {"VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-pNext-pNext)"},
- {"VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_GEOMETRY_TYPE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-sType-sType)"},
- {"VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-vertexFormat-parameter", "If vertexFormat is not 0, vertexFormat must be a valid VkFormat value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-vertexFormat-parameter)"},
- {"VUID-VkAccelerationStructureCreateInfoKHR-compactedSize-03490", "If compactedSize is not 0 then maxGeometryCount must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateInfoKHR-compactedSize-03490)"},
- {"VUID-VkAccelerationStructureCreateInfoKHR-deviceAddress-03500", "If deviceAddress is not 0, VkPhysicalDeviceRayTracingFeaturesKHR::rayTracingAccelerationStructureCaptureReplay must be VK_TRUE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateInfoKHR-deviceAddress-03500)"},
- {"VUID-VkAccelerationStructureCreateInfoKHR-flags-03499", "If flags has the VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR bit set, then it must not have the VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateInfoKHR-flags-03499)"},
- {"VUID-VkAccelerationStructureCreateInfoKHR-flags-parameter", "flags must be a valid combination of VkBuildAccelerationStructureFlagBitsKHR values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateInfoKHR-flags-parameter)"},
- {"VUID-VkAccelerationStructureCreateInfoKHR-maxGeometryCount-arraylength", "maxGeometryCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateInfoKHR-maxGeometryCount-arraylength)"},
- {"VUID-VkAccelerationStructureCreateInfoKHR-maxPrimitiveCount-03493", "The total number of triangles in all geometries must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxPrimitiveCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateInfoKHR-maxPrimitiveCount-03493)"},
- {"VUID-VkAccelerationStructureCreateInfoKHR-maxPrimitiveCount-03494", "The total number of AABBs in all geometries must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxPrimitiveCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateInfoKHR-maxPrimitiveCount-03494)"},
- {"VUID-VkAccelerationStructureCreateInfoKHR-pGeometryInfos-parameter", "pGeometryInfos must be a valid pointer to an array of maxGeometryCount valid VkAccelerationStructureCreateGeometryTypeInfoKHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateInfoKHR-pGeometryInfos-parameter)"},
- {"VUID-VkAccelerationStructureCreateInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateInfoKHR-pNext-pNext)"},
- {"VUID-VkAccelerationStructureCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateInfoKHR-sType-sType)"},
- {"VUID-VkAccelerationStructureCreateInfoKHR-type-03491", "If type is VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR then maxGeometryCount must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxGeometryCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateInfoKHR-type-03491)"},
- {"VUID-VkAccelerationStructureCreateInfoKHR-type-03492", "If type is VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR then pGeometryInfos->pname:maxPrimitiveCount must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxInstanceCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateInfoKHR-type-03492)"},
- {"VUID-VkAccelerationStructureCreateInfoKHR-type-03495", "If type is VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR and compactedSize is 0, maxGeometryCount must be 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateInfoKHR-type-03495)"},
- {"VUID-VkAccelerationStructureCreateInfoKHR-type-03496", "If type is VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR and compactedSize is 0, the geometryType member of elements of pGeometryInfos must be VK_GEOMETRY_TYPE_INSTANCES_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateInfoKHR-type-03496)"},
- {"VUID-VkAccelerationStructureCreateInfoKHR-type-03497", "If type is VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR and compactedSize is 0, the geometryType member of elements of pGeometryInfos must not be VK_GEOMETRY_TYPE_INSTANCES_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateInfoKHR-type-03497)"},
- {"VUID-VkAccelerationStructureCreateInfoKHR-type-03498", "If type is VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR then the geometryType member of each geometry in pGeometryInfos must be the same (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateInfoKHR-type-03498)"},
- {"VUID-VkAccelerationStructureCreateInfoKHR-type-parameter", "type must be a valid VkAccelerationStructureTypeKHR value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateInfoKHR-type-parameter)"},
- {"VUID-VkAccelerationStructureCreateInfoNV-compactedSize-02421", "If compactedSize is not 0 then both info.geometryCount and info.instanceCount must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateInfoNV-compactedSize-02421)"},
- {"VUID-VkAccelerationStructureCreateInfoNV-info-parameter", "info must be a valid VkAccelerationStructureInfoNV structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateInfoNV-info-parameter)"},
- {"VUID-VkAccelerationStructureCreateInfoNV-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateInfoNV-pNext-pNext)"},
- {"VUID-VkAccelerationStructureCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureCreateInfoNV-sType-sType)"},
- {"VUID-VkAccelerationStructureDeviceAddressInfoKHR-accelerationStructure-parameter", "accelerationStructure must be a valid VkAccelerationStructureKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureDeviceAddressInfoKHR-accelerationStructure-parameter)"},
- {"VUID-VkAccelerationStructureDeviceAddressInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureDeviceAddressInfoKHR-pNext-pNext)"},
- {"VUID-VkAccelerationStructureDeviceAddressInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureDeviceAddressInfoKHR-sType-sType)"},
- {"VUID-VkAccelerationStructureGeometryAabbsDataKHR-data-03544", "data must be aligned to 8 bytes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryAabbsDataKHR-data-03544)"},
- {"VUID-VkAccelerationStructureGeometryAabbsDataKHR-data-parameter", "data must be a valid VkDeviceOrHostAddressConstKHR union (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryAabbsDataKHR-data-parameter)"},
- {"VUID-VkAccelerationStructureGeometryAabbsDataKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryAabbsDataKHR-pNext-pNext)"},
- {"VUID-VkAccelerationStructureGeometryAabbsDataKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_AABBS_DATA_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryAabbsDataKHR-sType-sType)"},
- {"VUID-VkAccelerationStructureGeometryAabbsDataKHR-stride-03545", "stride must be a multiple of 8 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryAabbsDataKHR-stride-03545)"},
- {"VUID-VkAccelerationStructureGeometryDataKHR-aabbs-parameter", "aabbs must be a valid VkAccelerationStructureGeometryAabbsDataKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryDataKHR-aabbs-parameter)"},
- {"VUID-VkAccelerationStructureGeometryDataKHR-instances-parameter", "instances must be a valid VkAccelerationStructureGeometryInstancesDataKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryDataKHR-instances-parameter)"},
- {"VUID-VkAccelerationStructureGeometryDataKHR-triangles-parameter", "triangles must be a valid VkAccelerationStructureGeometryTrianglesDataKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryDataKHR-triangles-parameter)"},
- {"VUID-VkAccelerationStructureGeometryInstancesDataKHR-arrayOfPointers-03550", "If arrayOfPointers is true, each pointer must be aligned to 16 bytes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryInstancesDataKHR-arrayOfPointers-03550)"},
- {"VUID-VkAccelerationStructureGeometryInstancesDataKHR-data-03549", "data must be aligned to 16 bytes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryInstancesDataKHR-data-03549)"},
- {"VUID-VkAccelerationStructureGeometryInstancesDataKHR-data-parameter", "data must be a valid VkDeviceOrHostAddressConstKHR union (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryInstancesDataKHR-data-parameter)"},
- {"VUID-VkAccelerationStructureGeometryInstancesDataKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryInstancesDataKHR-pNext-pNext)"},
- {"VUID-VkAccelerationStructureGeometryInstancesDataKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryInstancesDataKHR-sType-sType)"},
- {"VUID-VkAccelerationStructureGeometryKHR-flags-parameter", "flags must be a valid combination of VkGeometryFlagBitsKHR values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryKHR-flags-parameter)"},
- {"VUID-VkAccelerationStructureGeometryKHR-geometry-parameter", "geometry must be a valid VkAccelerationStructureGeometryDataKHR union (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryKHR-geometry-parameter)"},
- {"VUID-VkAccelerationStructureGeometryKHR-geometryType-03541", "If geometryType is VK_GEOMETRY_TYPE_AABBS_KHR, the aabbs member of geometry must be a valid VkAccelerationStructureGeometryAabbsDataKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryKHR-geometryType-03541)"},
- {"VUID-VkAccelerationStructureGeometryKHR-geometryType-03542", "If geometryType is VK_GEOMETRY_TYPE_TRIANGLES_KHR, the triangles member of geometry must be a valid VkAccelerationStructureGeometryTrianglesDataKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryKHR-geometryType-03542)"},
- {"VUID-VkAccelerationStructureGeometryKHR-geometryType-03543", "If geometryType is VK_GEOMETRY_TYPE_INSTANCES_KHR, the instances member of geometry must be a valid VkAccelerationStructureGeometryInstancesDataKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryKHR-geometryType-03543)"},
- {"VUID-VkAccelerationStructureGeometryKHR-geometryType-parameter", "geometryType must be a valid VkGeometryTypeKHR value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryKHR-geometryType-parameter)"},
- {"VUID-VkAccelerationStructureGeometryKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryKHR-pNext-pNext)"},
- {"VUID-VkAccelerationStructureGeometryKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryKHR-sType-sType)"},
- {"VUID-VkAccelerationStructureGeometryTrianglesDataKHR-indexData-parameter", "If indexData is not 0, indexData must be a valid VkDeviceOrHostAddressConstKHR union (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryTrianglesDataKHR-indexData-parameter)"},
- {"VUID-VkAccelerationStructureGeometryTrianglesDataKHR-indexType-parameter", "indexType must be a valid VkIndexType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryTrianglesDataKHR-indexType-parameter)"},
- {"VUID-VkAccelerationStructureGeometryTrianglesDataKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryTrianglesDataKHR-pNext-pNext)"},
- {"VUID-VkAccelerationStructureGeometryTrianglesDataKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryTrianglesDataKHR-sType-sType)"},
- {"VUID-VkAccelerationStructureGeometryTrianglesDataKHR-transformData-parameter", "If transformData is not 0, transformData must be a valid VkDeviceOrHostAddressConstKHR union (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryTrianglesDataKHR-transformData-parameter)"},
- {"VUID-VkAccelerationStructureGeometryTrianglesDataKHR-vertexData-parameter", "vertexData must be a valid VkDeviceOrHostAddressConstKHR union (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryTrianglesDataKHR-vertexData-parameter)"},
- {"VUID-VkAccelerationStructureGeometryTrianglesDataKHR-vertexFormat-parameter", "vertexFormat must be a valid VkFormat value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureGeometryTrianglesDataKHR-vertexFormat-parameter)"},
- {"VUID-VkAccelerationStructureInfoNV-flags-02592", "If flags has the VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_NV bit set, then it must not have the VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_NV bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureInfoNV-flags-02592)"},
- {"VUID-VkAccelerationStructureInfoNV-flags-03486", "flags must be a valid combination of VkBuildAccelerationStructureFlagBitsNV values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureInfoNV-flags-03486)"},
- {"VUID-VkAccelerationStructureInfoNV-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureInfoNV-flags-zerobitmask)"},
- {"VUID-VkAccelerationStructureInfoNV-geometryCount-02422", "geometryCount must be less than or equal to VkPhysicalDeviceRayTracingPropertiesNV::maxGeometryCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureInfoNV-geometryCount-02422)"},
- {"VUID-VkAccelerationStructureInfoNV-instanceCount-02423", "instanceCount must be less than or equal to VkPhysicalDeviceRayTracingPropertiesNV::maxInstanceCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureInfoNV-instanceCount-02423)"},
- {"VUID-VkAccelerationStructureInfoNV-instanceData-02782", "If instanceData is not VK_NULL_HANDLE, instanceData must have been created with VK_BUFFER_USAGE_RAY_TRACING_BIT_NV usage flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureInfoNV-instanceData-02782)"},
- {"VUID-VkAccelerationStructureInfoNV-maxTriangleCount-02424", "The total number of triangles in all geometries must be less than or equal to VkPhysicalDeviceRayTracingPropertiesNV::maxTriangleCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureInfoNV-maxTriangleCount-02424)"},
- {"VUID-VkAccelerationStructureInfoNV-pGeometries-parameter", "If geometryCount is not 0, pGeometries must be a valid pointer to an array of geometryCount valid VkGeometryNV structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureInfoNV-pGeometries-parameter)"},
- {"VUID-VkAccelerationStructureInfoNV-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureInfoNV-pNext-pNext)"},
- {"VUID-VkAccelerationStructureInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureInfoNV-sType-sType)"},
- {"VUID-VkAccelerationStructureInfoNV-scratch-02781", "scratch must have been created with VK_BUFFER_USAGE_RAY_TRACING_BIT_NV usage flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureInfoNV-scratch-02781)"},
- {"VUID-VkAccelerationStructureInfoNV-type-02425", "If type is VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV then geometryCount must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureInfoNV-type-02425)"},
- {"VUID-VkAccelerationStructureInfoNV-type-02426", "If type is VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV then instanceCount must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureInfoNV-type-02426)"},
- {"VUID-VkAccelerationStructureInfoNV-type-02786", "If type is VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV then the geometryType member of each geometry in pGeometries must be the same (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureInfoNV-type-02786)"},
- {"VUID-VkAccelerationStructureInfoNV-type-parameter", "type must be a valid VkAccelerationStructureTypeNV value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureInfoNV-type-parameter)"},
- {"VUID-VkAccelerationStructureInstanceKHR-flags-parameter", "flags must be a valid combination of VkGeometryInstanceFlagBitsKHR values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureInstanceKHR-flags-parameter)"},
- {"VUID-VkAccelerationStructureMemoryRequirementsInfoKHR-accelerationStructure-parameter", "accelerationStructure must be a valid VkAccelerationStructureKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureMemoryRequirementsInfoKHR-accelerationStructure-parameter)"},
- {"VUID-VkAccelerationStructureMemoryRequirementsInfoKHR-buildType-parameter", "buildType must be a valid VkAccelerationStructureBuildTypeKHR value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureMemoryRequirementsInfoKHR-buildType-parameter)"},
- {"VUID-VkAccelerationStructureMemoryRequirementsInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureMemoryRequirementsInfoKHR-pNext-pNext)"},
- {"VUID-VkAccelerationStructureMemoryRequirementsInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureMemoryRequirementsInfoKHR-sType-sType)"},
- {"VUID-VkAccelerationStructureMemoryRequirementsInfoKHR-type-parameter", "type must be a valid VkAccelerationStructureMemoryRequirementsTypeKHR value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureMemoryRequirementsInfoKHR-type-parameter)"},
- {"VUID-VkAccelerationStructureMemoryRequirementsInfoNV-accelerationStructure-parameter", "accelerationStructure must be a valid VkAccelerationStructureNV handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureMemoryRequirementsInfoNV-accelerationStructure-parameter)"},
- {"VUID-VkAccelerationStructureMemoryRequirementsInfoNV-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureMemoryRequirementsInfoNV-pNext-pNext)"},
- {"VUID-VkAccelerationStructureMemoryRequirementsInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureMemoryRequirementsInfoNV-sType-sType)"},
- {"VUID-VkAccelerationStructureMemoryRequirementsInfoNV-type-parameter", "type must be a valid VkAccelerationStructureMemoryRequirementsTypeNV value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureMemoryRequirementsInfoNV-type-parameter)"},
- {"VUID-VkAccelerationStructureVersionKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureVersionKHR-pNext-pNext)"},
- {"VUID-VkAccelerationStructureVersionKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_VERSION_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureVersionKHR-sType-sType)"},
- {"VUID-VkAccelerationStructureVersionKHR-versionData-parameter", "versionData must be a valid pointer to an array of 2*VK_UUID_SIZE uint8_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAccelerationStructureVersionKHR-versionData-parameter)"},
- {"VUID-VkAcquireNextImageInfoKHR-commonparent", "Each of fence, semaphore, and swapchain that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkInstance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-commonparent)"},
- {"VUID-VkAcquireNextImageInfoKHR-deviceMask-01290", "deviceMask must be a valid device mask (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-deviceMask-01290)"},
- {"VUID-VkAcquireNextImageInfoKHR-deviceMask-01291", "deviceMask must not be zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-deviceMask-01291)"},
- {"VUID-VkAcquireNextImageInfoKHR-fence-01289", "If fence is not VK_NULL_HANDLE it must be unsignaled and must not be associated with any other queue command that has not yet completed execution on that queue (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-fence-01289)"},
- {"VUID-VkAcquireNextImageInfoKHR-fence-parameter", "If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-fence-parameter)"},
- {"VUID-VkAcquireNextImageInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-pNext-pNext)"},
- {"VUID-VkAcquireNextImageInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-sType-sType)"},
- {"VUID-VkAcquireNextImageInfoKHR-semaphore-01288", "If semaphore is not VK_NULL_HANDLE it must be unsignaled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-semaphore-01288)"},
- {"VUID-VkAcquireNextImageInfoKHR-semaphore-01781", "If semaphore is not VK_NULL_HANDLE it must not have any uncompleted signal or wait operations pending (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-semaphore-01781)"},
- {"VUID-VkAcquireNextImageInfoKHR-semaphore-01782", "semaphore and fence must not both be equal to VK_NULL_HANDLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-semaphore-01782)"},
- {"VUID-VkAcquireNextImageInfoKHR-semaphore-03266", "semaphore must have a VkSemaphoreType of VK_SEMAPHORE_TYPE_BINARY (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-semaphore-03266)"},
- {"VUID-VkAcquireNextImageInfoKHR-semaphore-parameter", "If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-semaphore-parameter)"},
- {"VUID-VkAcquireNextImageInfoKHR-swapchain-01675", "swapchain must not be in the retired state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-swapchain-01675)"},
- {"VUID-VkAcquireNextImageInfoKHR-swapchain-parameter", "swapchain must be a valid VkSwapchainKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAcquireNextImageInfoKHR-swapchain-parameter)"},
- {"VUID-VkAcquireProfilingLockInfoKHR-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAcquireProfilingLockInfoKHR-flags-zerobitmask)"},
- {"VUID-VkAcquireProfilingLockInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAcquireProfilingLockInfoKHR-pNext-pNext)"},
- {"VUID-VkAcquireProfilingLockInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACQUIRE_PROFILING_LOCK_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAcquireProfilingLockInfoKHR-sType-sType)"},
- {"VUID-VkAllocationCallbacks-pfnAllocation-00632", "pfnAllocation must be a valid pointer to a valid user-defined PFN_vkAllocationFunction (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAllocationCallbacks-pfnAllocation-00632)"},
- {"VUID-VkAllocationCallbacks-pfnFree-00634", "pfnFree must be a valid pointer to a valid user-defined PFN_vkFreeFunction (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAllocationCallbacks-pfnFree-00634)"},
- {"VUID-VkAllocationCallbacks-pfnInternalAllocation-00635", "If either of pfnInternalAllocation or pfnInternalFree is not NULL, both must be valid callbacks (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAllocationCallbacks-pfnInternalAllocation-00635)"},
- {"VUID-VkAllocationCallbacks-pfnReallocation-00633", "pfnReallocation must be a valid pointer to a valid user-defined PFN_vkReallocationFunction (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAllocationCallbacks-pfnReallocation-00633)"},
- {"VUID-VkAndroidHardwareBufferFormatPropertiesANDROID-sType-sType", "sType must be VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAndroidHardwareBufferFormatPropertiesANDROID-sType-sType)"},
- {"VUID-VkAndroidHardwareBufferPropertiesANDROID-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkAndroidHardwareBufferFormatPropertiesANDROID (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAndroidHardwareBufferPropertiesANDROID-pNext-pNext)"},
- {"VUID-VkAndroidHardwareBufferPropertiesANDROID-sType-sType", "sType must be VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAndroidHardwareBufferPropertiesANDROID-sType-sType)"},
- {"VUID-VkAndroidHardwareBufferPropertiesANDROID-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAndroidHardwareBufferPropertiesANDROID-sType-unique)"},
- {"VUID-VkAndroidHardwareBufferUsageANDROID-sType-sType", "sType must be VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAndroidHardwareBufferUsageANDROID-sType-sType)"},
- {"VUID-VkAndroidSurfaceCreateInfoKHR-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAndroidSurfaceCreateInfoKHR-flags-zerobitmask)"},
- {"VUID-VkAndroidSurfaceCreateInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAndroidSurfaceCreateInfoKHR-pNext-pNext)"},
- {"VUID-VkAndroidSurfaceCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAndroidSurfaceCreateInfoKHR-sType-sType)"},
- {"VUID-VkAndroidSurfaceCreateInfoKHR-window-01248", "window must point to a valid Android ANativeWindow. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAndroidSurfaceCreateInfoKHR-window-01248)"},
- {"VUID-VkApplicationInfo-pApplicationName-parameter", "If pApplicationName is not NULL, pApplicationName must be a null-terminated UTF-8 string (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkApplicationInfo-pApplicationName-parameter)"},
- {"VUID-VkApplicationInfo-pEngineName-parameter", "If pEngineName is not NULL, pEngineName must be a null-terminated UTF-8 string (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkApplicationInfo-pEngineName-parameter)"},
- {"VUID-VkApplicationInfo-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkApplicationInfo-pNext-pNext)"},
- {"VUID-VkApplicationInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_APPLICATION_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkApplicationInfo-sType-sType)"},
- {"VUID-VkAttachmentDescription-finalLayout-00843", "finalLayout must not be VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-finalLayout-00843)"},
- {"VUID-VkAttachmentDescription-finalLayout-parameter", "finalLayout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-finalLayout-parameter)"},
- {"VUID-VkAttachmentDescription-flags-parameter", "flags must be a valid combination of VkAttachmentDescriptionFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-flags-parameter)"},
- {"VUID-VkAttachmentDescription-format-03280", "If format is a color format, initialLayout must not be VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-format-03280)"},
- {"VUID-VkAttachmentDescription-format-03281", "If format is a depth/stencil format, initialLayout must not be VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-format-03281)"},
- {"VUID-VkAttachmentDescription-format-03282", "If format is a color format, finalLayout must not be VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-format-03282)"},
- {"VUID-VkAttachmentDescription-format-03283", "If format is a depth/stencil format, finalLayout must not be VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-format-03283)"},
- {"VUID-VkAttachmentDescription-format-03286", "If format is a color format, initialLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-format-03286)"},
- {"VUID-VkAttachmentDescription-format-03287", "If format is a color format, finalLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-format-03287)"},
- {"VUID-VkAttachmentDescription-format-03288", "If format is a depth/stencil format which includes both depth and stencil aspects, initialLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-format-03288)"},
- {"VUID-VkAttachmentDescription-format-03289", "If format is a depth/stencil format which includes both depth and stencil aspects, finalLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-format-03289)"},
- {"VUID-VkAttachmentDescription-format-03290", "If format is a depth/stencil format which includes only the depth aspect, initialLayout must not be VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-format-03290)"},
- {"VUID-VkAttachmentDescription-format-03291", "If format is a depth/stencil format which includes only the depth aspect, finalLayout must not be VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-format-03291)"},
- {"VUID-VkAttachmentDescription-format-03292", "If format is a depth/stencil format which includes only the stencil aspect, initialLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-format-03292)"},
- {"VUID-VkAttachmentDescription-format-03293", "If format is a depth/stencil format which includes only the stencil aspect, finalLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-format-03293)"},
- {"VUID-VkAttachmentDescription-format-parameter", "format must be a valid VkFormat value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-format-parameter)"},
- {"VUID-VkAttachmentDescription-initialLayout-parameter", "initialLayout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-initialLayout-parameter)"},
- {"VUID-VkAttachmentDescription-loadOp-parameter", "loadOp must be a valid VkAttachmentLoadOp value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-loadOp-parameter)"},
- {"VUID-VkAttachmentDescription-samples-parameter", "samples must be a valid VkSampleCountFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-samples-parameter)"},
- {"VUID-VkAttachmentDescription-separateDepthStencilLayouts-03284", "If the separateDepthStencilLayouts feature is not enabled, initialLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-separateDepthStencilLayouts-03284)"},
- {"VUID-VkAttachmentDescription-separateDepthStencilLayouts-03285", "If the separateDepthStencilLayouts feature is not enabled, finalLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-separateDepthStencilLayouts-03285)"},
- {"VUID-VkAttachmentDescription-stencilLoadOp-parameter", "stencilLoadOp must be a valid VkAttachmentLoadOp value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-stencilLoadOp-parameter)"},
- {"VUID-VkAttachmentDescription-stencilStoreOp-parameter", "stencilStoreOp must be a valid VkAttachmentStoreOp value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-stencilStoreOp-parameter)"},
- {"VUID-VkAttachmentDescription-storeOp-parameter", "storeOp must be a valid VkAttachmentStoreOp value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription-storeOp-parameter)"},
- {"VUID-VkAttachmentDescription2-finalLayout-03061", "finalLayout must not be VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-finalLayout-03061)"},
- {"VUID-VkAttachmentDescription2-finalLayout-parameter", "finalLayout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-finalLayout-parameter)"},
- {"VUID-VkAttachmentDescription2-flags-parameter", "flags must be a valid combination of VkAttachmentDescriptionFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-flags-parameter)"},
- {"VUID-VkAttachmentDescription2-format-03294", "If format is a color format, initialLayout must not be VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-format-03294)"},
- {"VUID-VkAttachmentDescription2-format-03295", "If format is a depth/stencil format, initialLayout must not be VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-format-03295)"},
- {"VUID-VkAttachmentDescription2-format-03296", "If format is a color format, finalLayout must not be VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-format-03296)"},
- {"VUID-VkAttachmentDescription2-format-03297", "If format is a depth/stencil format, finalLayout must not be VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-format-03297)"},
- {"VUID-VkAttachmentDescription2-format-03300", "If format is a color format, initialLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-format-03300)"},
- {"VUID-VkAttachmentDescription2-format-03301", "If format is a color format, finalLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-format-03301)"},
- {"VUID-VkAttachmentDescription2-format-03302", "If format is a depth/stencil format which includes both depth and stencil aspects, and initialLayout is VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, the pNext chain must include a VkAttachmentDescriptionStencilLayout structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-format-03302)"},
- {"VUID-VkAttachmentDescription2-format-03303", "If format is a depth/stencil format which includes both depth and stencil aspects, and finalLayout is VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, the pNext chain must include a VkAttachmentDescriptionStencilLayout structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-format-03303)"},
- {"VUID-VkAttachmentDescription2-format-03304", "If format is a depth/stencil format which includes only the depth aspect, initialLayout must not be VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-format-03304)"},
- {"VUID-VkAttachmentDescription2-format-03305", "If format is a depth/stencil format which includes only the depth aspect, finalLayout must not be VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-format-03305)"},
- {"VUID-VkAttachmentDescription2-format-03306", "If format is a depth/stencil format which includes only the stencil aspect, initialLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-format-03306)"},
- {"VUID-VkAttachmentDescription2-format-03307", "If format is a depth/stencil format which includes only the stencil aspect, finalLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-format-03307)"},
- {"VUID-VkAttachmentDescription2-format-parameter", "format must be a valid VkFormat value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-format-parameter)"},
- {"VUID-VkAttachmentDescription2-initialLayout-parameter", "initialLayout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-initialLayout-parameter)"},
- {"VUID-VkAttachmentDescription2-loadOp-parameter", "loadOp must be a valid VkAttachmentLoadOp value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-loadOp-parameter)"},
- {"VUID-VkAttachmentDescription2-sType-sType", "sType must be VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-sType-sType)"},
- {"VUID-VkAttachmentDescription2-samples-parameter", "samples must be a valid VkSampleCountFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-samples-parameter)"},
- {"VUID-VkAttachmentDescription2-separateDepthStencilLayouts-03298", "If the separateDepthStencilLayouts feature is not enabled, initialLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-separateDepthStencilLayouts-03298)"},
- {"VUID-VkAttachmentDescription2-separateDepthStencilLayouts-03299", "If the separateDepthStencilLayouts feature is not enabled, finalLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-separateDepthStencilLayouts-03299)"},
- {"VUID-VkAttachmentDescription2-stencilLoadOp-parameter", "stencilLoadOp must be a valid VkAttachmentLoadOp value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-stencilLoadOp-parameter)"},
- {"VUID-VkAttachmentDescription2-stencilStoreOp-parameter", "stencilStoreOp must be a valid VkAttachmentStoreOp value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-stencilStoreOp-parameter)"},
- {"VUID-VkAttachmentDescription2-storeOp-parameter", "storeOp must be a valid VkAttachmentStoreOp value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescription2-storeOp-parameter)"},
- {"VUID-VkAttachmentDescriptionStencilLayout-sType-sType", "sType must be VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescriptionStencilLayout-sType-sType)"},
- {"VUID-VkAttachmentDescriptionStencilLayout-stencilFinalLayout-03309", "stencilFinalLayout must not be VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescriptionStencilLayout-stencilFinalLayout-03309)"},
- {"VUID-VkAttachmentDescriptionStencilLayout-stencilFinalLayout-03310", "stencilFinalLayout must not be VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescriptionStencilLayout-stencilFinalLayout-03310)"},
- {"VUID-VkAttachmentDescriptionStencilLayout-stencilFinalLayout-parameter", "stencilFinalLayout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescriptionStencilLayout-stencilFinalLayout-parameter)"},
- {"VUID-VkAttachmentDescriptionStencilLayout-stencilInitialLayout-03308", "stencilInitialLayout must not be VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescriptionStencilLayout-stencilInitialLayout-03308)"},
- {"VUID-VkAttachmentDescriptionStencilLayout-stencilInitialLayout-parameter", "stencilInitialLayout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentDescriptionStencilLayout-stencilInitialLayout-parameter)"},
- {"VUID-VkAttachmentReference-layout-00857", "If attachment is not VK_ATTACHMENT_UNUSED, layout must not be VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentReference-layout-00857)"},
- {"VUID-VkAttachmentReference-layout-parameter", "layout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentReference-layout-parameter)"},
- {"VUID-VkAttachmentReference2-attachment-03311", "If attachment is not VK_ATTACHMENT_UNUSED, and aspectMask does not include VK_IMAGE_ASPECT_STENCIL_BIT or VK_IMAGE_ASPECT_DEPTH_BIT, layout must not be VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentReference2-attachment-03311)"},
- {"VUID-VkAttachmentReference2-attachment-03312", "If attachment is not VK_ATTACHMENT_UNUSED, and aspectMask does not include VK_IMAGE_ASPECT_COLOR_BIT, layout must not be VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentReference2-attachment-03312)"},
- {"VUID-VkAttachmentReference2-attachment-03314", "If attachment is not VK_ATTACHMENT_UNUSED, and aspectMask includes VK_IMAGE_ASPECT_COLOR_BIT, layout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL, (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentReference2-attachment-03314)"},
- {"VUID-VkAttachmentReference2-attachment-03315", "If attachment is not VK_ATTACHMENT_UNUSED, and aspectMask includes both VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT, and layout is VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, the pNext chain must include a VkAttachmentReferenceStencilLayout structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentReference2-attachment-03315)"},
- {"VUID-VkAttachmentReference2-attachment-03316", "If attachment is not VK_ATTACHMENT_UNUSED, and aspectMask includes only VK_IMAGE_ASPECT_DEPTH_BIT then layout must not be VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentReference2-attachment-03316)"},
- {"VUID-VkAttachmentReference2-attachment-03317", "If attachment is not VK_ATTACHMENT_UNUSED, and aspectMask includes only VK_IMAGE_ASPECT_STENCIL_BIT then layout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentReference2-attachment-03317)"},
- {"VUID-VkAttachmentReference2-layout-03077", "If attachment is not VK_ATTACHMENT_UNUSED, layout must not be VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_PREINITIALIZED, or VK_IMAGE_LAYOUT_PRESENT_SRC_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentReference2-layout-03077)"},
- {"VUID-VkAttachmentReference2-layout-parameter", "layout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentReference2-layout-parameter)"},
- {"VUID-VkAttachmentReference2-sType-sType", "sType must be VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentReference2-sType-sType)"},
- {"VUID-VkAttachmentReference2-separateDepthStencilLayouts-03313", "If the separateDepthStencilLayouts feature is not enabled, and attachment is not VK_ATTACHMENT_UNUSED, layout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL, (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentReference2-separateDepthStencilLayouts-03313)"},
- {"VUID-VkAttachmentReferenceStencilLayout-sType-sType", "sType must be VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentReferenceStencilLayout-sType-sType)"},
- {"VUID-VkAttachmentReferenceStencilLayout-stencilLayout-03318", "stencilLayout must not be VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_PRESENT_SRC_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentReferenceStencilLayout-stencilLayout-03318)"},
- {"VUID-VkAttachmentReferenceStencilLayout-stencilLayout-parameter", "stencilLayout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentReferenceStencilLayout-stencilLayout-parameter)"},
- {"VUID-VkAttachmentSampleLocationsEXT-attachmentIndex-01531", "attachmentIndex must be less than the attachmentCount specified in VkRenderPassCreateInfo the render pass specified by VkRenderPassBeginInfo::renderPass was created with (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentSampleLocationsEXT-attachmentIndex-01531)"},
- {"VUID-VkAttachmentSampleLocationsEXT-sampleLocationsInfo-parameter", "sampleLocationsInfo must be a valid VkSampleLocationsInfoEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkAttachmentSampleLocationsEXT-sampleLocationsInfo-parameter)"},
- {"VUID-VkBindAccelerationStructureMemoryInfoKHR-accelerationStructure-02450", "accelerationStructure must not already be backed by a memory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindAccelerationStructureMemoryInfoKHR-accelerationStructure-02450)"},
- {"VUID-VkBindAccelerationStructureMemoryInfoKHR-accelerationStructure-parameter", "accelerationStructure must be a valid VkAccelerationStructureKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindAccelerationStructureMemoryInfoKHR-accelerationStructure-parameter)"},
- {"VUID-VkBindAccelerationStructureMemoryInfoKHR-commonparent", "Both of accelerationStructure, and memory must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindAccelerationStructureMemoryInfoKHR-commonparent)"},
- {"VUID-VkBindAccelerationStructureMemoryInfoKHR-memory-02593", "memory must have been allocated using one of the memory types allowed in the memoryTypeBits member of the VkMemoryRequirements structure returned from a call to vkGetAccelerationStructureMemoryRequirementsKHR with accelerationStructure and type of VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindAccelerationStructureMemoryInfoKHR-memory-02593)"},
- {"VUID-VkBindAccelerationStructureMemoryInfoKHR-memory-parameter", "memory must be a valid VkDeviceMemory handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindAccelerationStructureMemoryInfoKHR-memory-parameter)"},
- {"VUID-VkBindAccelerationStructureMemoryInfoKHR-memoryOffset-02451", "memoryOffset must be less than the size of memory (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindAccelerationStructureMemoryInfoKHR-memoryOffset-02451)"},
- {"VUID-VkBindAccelerationStructureMemoryInfoKHR-memoryOffset-02594", "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from a call to vkGetAccelerationStructureMemoryRequirementsKHR with accelerationStructure and type of VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindAccelerationStructureMemoryInfoKHR-memoryOffset-02594)"},
- {"VUID-VkBindAccelerationStructureMemoryInfoKHR-pDeviceIndices-parameter", "If deviceIndexCount is not 0, pDeviceIndices must be a valid pointer to an array of deviceIndexCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindAccelerationStructureMemoryInfoKHR-pDeviceIndices-parameter)"},
- {"VUID-VkBindAccelerationStructureMemoryInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindAccelerationStructureMemoryInfoKHR-pNext-pNext)"},
- {"VUID-VkBindAccelerationStructureMemoryInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindAccelerationStructureMemoryInfoKHR-sType-sType)"},
- {"VUID-VkBindAccelerationStructureMemoryInfoKHR-size-02595", "The size member of the VkMemoryRequirements structure returned from a call to vkGetAccelerationStructureMemoryRequirementsKHR with accelerationStructure and type of VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_KHR must be less than or equal to the size of memory minus memoryOffset (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindAccelerationStructureMemoryInfoKHR-size-02595)"},
- {"VUID-VkBindBufferMemoryDeviceGroupInfo-deviceIndexCount-01606", "deviceIndexCount must either be zero or equal to the number of physical devices in the logical device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryDeviceGroupInfo-deviceIndexCount-01606)"},
- {"VUID-VkBindBufferMemoryDeviceGroupInfo-pDeviceIndices-01607", "All elements of pDeviceIndices must be valid device indices (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryDeviceGroupInfo-pDeviceIndices-01607)"},
- {"VUID-VkBindBufferMemoryDeviceGroupInfo-pDeviceIndices-parameter", "If deviceIndexCount is not 0, pDeviceIndices must be a valid pointer to an array of deviceIndexCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryDeviceGroupInfo-pDeviceIndices-parameter)"},
- {"VUID-VkBindBufferMemoryDeviceGroupInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryDeviceGroupInfo-sType-sType)"},
- {"VUID-VkBindBufferMemoryInfo-buffer-01593", "buffer must not already be backed by a memory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-01593)"},
- {"VUID-VkBindBufferMemoryInfo-buffer-01594", "buffer must not have been created with any sparse memory binding flags (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-01594)"},
- {"VUID-VkBindBufferMemoryInfo-buffer-01602", "If buffer requires a dedicated allocation(as reported by vkGetBufferMemoryRequirements2 in VkMemoryDedicatedRequirements::requiresDedicatedAllocation for buffer), memory must have been created with VkMemoryDedicatedAllocateInfo::buffer equal to buffer and memoryOffset must be zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-01602)"},
- {"VUID-VkBindBufferMemoryInfo-buffer-01603", "If buffer was created with VkDedicatedAllocationBufferCreateInfoNV::dedicatedAllocation equal to VK_TRUE, memory must have been created with VkDedicatedAllocationMemoryAllocateInfoNV::buffer equal to buffer and memoryOffset must be zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-01603)"},
- {"VUID-VkBindBufferMemoryInfo-buffer-01604", "If buffer was not created with VkDedicatedAllocationBufferCreateInfoNV::dedicatedAllocation equal to VK_TRUE, memory must not have been allocated dedicated for a specific buffer or image (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkBindBufferMemoryInfo-buffer-01604)"},
- {"VUID-VkBindBufferMemoryInfo-buffer-parameter", "buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-buffer-parameter)"},
- {"VUID-VkBindBufferMemoryInfo-bufferDeviceAddress-02838", "If the VkPhysicalDeviceBufferDeviceAddressFeaturesKHR::bufferDeviceAddress feature is enabled and buffer was created with the VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR bit set, memory must have been allocated with the VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-bufferDeviceAddress-02838)"},
- {"VUID-VkBindBufferMemoryInfo-commonparent", "Both of buffer, and memory must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-commonparent)"},
- {"VUID-VkBindBufferMemoryInfo-handleTypes-02791", "If the value of VkExportMemoryAllocateInfo::handleTypes used to allocate memory is not 0, it must include at least one of the handles set in VkExternalMemoryBufferCreateInfo::handleTypes when buffer was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-handleTypes-02791)"},
- {"VUID-VkBindBufferMemoryInfo-memory-01599", "memory must have been allocated using one of the memory types allowed in the memoryTypeBits member of the VkMemoryRequirements structure returned from a call to vkGetBufferMemoryRequirements with buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-memory-01599)"},
- {"VUID-VkBindBufferMemoryInfo-memory-01900", "If the VkMemoryAllocateInfo provided when memory was allocated included a VkMemoryDedicatedAllocateInfo structure in its pNext chain, and VkMemoryDedicatedAllocateInfo::buffer was not VK_NULL_HANDLE, then buffer must equal VkMemoryDedicatedAllocateInfo::buffer and memoryOffset must be zero. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-memory-01900)"},
- {"VUID-VkBindBufferMemoryInfo-memory-02792", "If memory was created by a memory import operation, the external handle type of the imported memory must also have been set in VkExternalMemoryBufferCreateInfo::handleTypes when buffer was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-memory-02792)"},
- {"VUID-VkBindBufferMemoryInfo-memory-parameter", "memory must be a valid VkDeviceMemory handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-memory-parameter)"},
- {"VUID-VkBindBufferMemoryInfo-memoryOffset-01595", "memoryOffset must be less than the size of memory (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-memoryOffset-01595)"},
- {"VUID-VkBindBufferMemoryInfo-memoryOffset-01600", "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from a call to vkGetBufferMemoryRequirements with buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-memoryOffset-01600)"},
- {"VUID-VkBindBufferMemoryInfo-pNext-01605", "If the pNext chain includes a VkBindBufferMemoryDeviceGroupInfo structure, all instances of memory specified by VkBindBufferMemoryDeviceGroupInfo::pDeviceIndices must have been allocated (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-pNext-01605)"},
- {"VUID-VkBindBufferMemoryInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkBindBufferMemoryDeviceGroupInfo (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-pNext-pNext)"},
- {"VUID-VkBindBufferMemoryInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-sType-sType)"},
- {"VUID-VkBindBufferMemoryInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-sType-unique)"},
- {"VUID-VkBindBufferMemoryInfo-size-01601", "The size member of the VkMemoryRequirements structure returned from a call to vkGetBufferMemoryRequirements with buffer must be less than or equal to the size of memory minus memoryOffset (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindBufferMemoryInfo-size-01601)"},
- {"VUID-VkBindImageMemoryDeviceGroupInfo-deviceIndexCount-01633", "At least one of deviceIndexCount and splitInstanceBindRegionCount must be zero. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-deviceIndexCount-01633)"},
- {"VUID-VkBindImageMemoryDeviceGroupInfo-deviceIndexCount-01634", "deviceIndexCount must either be zero or equal to the number of physical devices in the logical device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-deviceIndexCount-01634)"},
- {"VUID-VkBindImageMemoryDeviceGroupInfo-extent-01640", "The extent.width member of any element of pSplitInstanceBindRegions must either be a multiple of the sparse image block width of all non-metadata aspects of the image, or else extent.width + offset.x must equal the width of the image subresource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-extent-01640)"},
- {"VUID-VkBindImageMemoryDeviceGroupInfo-extent-01641", "The extent.height member of any element of pSplitInstanceBindRegions must either be a multiple of the sparse image block height of all non-metadata aspects of the image, or else extent.height + offset.y must equal the width of the image subresource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-extent-01641)"},
- {"VUID-VkBindImageMemoryDeviceGroupInfo-offset-01638", "The offset.x member of any element of pSplitInstanceBindRegions must be a multiple of the sparse image block width (VkSparseImageFormatProperties::imageGranularity.width) of all non-metadata aspects of the image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-offset-01638)"},
- {"VUID-VkBindImageMemoryDeviceGroupInfo-offset-01639", "The offset.y member of any element of pSplitInstanceBindRegions must be a multiple of the sparse image block height (VkSparseImageFormatProperties::imageGranularity.height) of all non-metadata aspects of the image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-offset-01639)"},
- {"VUID-VkBindImageMemoryDeviceGroupInfo-pDeviceIndices-01635", "All elements of pDeviceIndices must be valid device indices. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-pDeviceIndices-01635)"},
- {"VUID-VkBindImageMemoryDeviceGroupInfo-pDeviceIndices-parameter", "If deviceIndexCount is not 0, pDeviceIndices must be a valid pointer to an array of deviceIndexCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-pDeviceIndices-parameter)"},
- {"VUID-VkBindImageMemoryDeviceGroupInfo-pSplitInstanceBindRegions-01637", "Elements of pSplitInstanceBindRegions that correspond to the same instance of an image must not overlap. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-pSplitInstanceBindRegions-01637)"},
- {"VUID-VkBindImageMemoryDeviceGroupInfo-pSplitInstanceBindRegions-parameter", "If splitInstanceBindRegionCount is not 0, pSplitInstanceBindRegions must be a valid pointer to an array of splitInstanceBindRegionCount VkRect2D structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-pSplitInstanceBindRegions-parameter)"},
- {"VUID-VkBindImageMemoryDeviceGroupInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-sType-sType)"},
- {"VUID-VkBindImageMemoryDeviceGroupInfo-splitInstanceBindRegionCount-01636", "splitInstanceBindRegionCount must either be zero or equal to the number of physical devices in the logical device squared (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryDeviceGroupInfo-splitInstanceBindRegionCount-01636)"},
- {"VUID-VkBindImageMemoryInfo-commonparent", "Both of image, and memory that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-commonparent)"},
- {"VUID-VkBindImageMemoryInfo-handleTypes-02793", "If the value of VkExportMemoryAllocateInfo::handleTypes used to allocate memory is not 0, it must include at least one of the handles set in VkExternalMemoryImageCreateInfo::handleTypes when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-handleTypes-02793)"},
- {"VUID-VkBindImageMemoryInfo-image-01609", "image must not already be backed by a memory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-image-01609)"},
- {"VUID-VkBindImageMemoryInfo-image-01610", "image must not have been created with any sparse memory binding flags (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-image-01610)"},
- {"VUID-VkBindImageMemoryInfo-image-01622", "If image requires a dedicated allocation (as reported by vkGetImageMemoryRequirements2 in VkMemoryDedicatedRequirements::requiresDedicatedAllocation for image), memory must have been created with VkMemoryDedicatedAllocateInfo::image equal to image and memoryOffset must be zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-image-01622)"},
- {"VUID-VkBindImageMemoryInfo-image-01623", "If image was created with VkDedicatedAllocationImageCreateInfoNV::dedicatedAllocation equal to VK_TRUE, memory must have been created with VkDedicatedAllocationMemoryAllocateInfoNV::image equal to image and memoryOffset must be zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-image-01623)"},
- {"VUID-VkBindImageMemoryInfo-image-01624", "If image was not created with VkDedicatedAllocationImageCreateInfoNV::dedicatedAllocation equal to VK_TRUE, memory must not have been allocated dedicated for a specific buffer or image (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkBindImageMemoryInfo-image-01624)"},
- {"VUID-VkBindImageMemoryInfo-image-01630", "If image was created with a valid swapchain handle in VkImageSwapchainCreateInfoKHR::swapchain, then the pNext chain must include a VkBindImageMemorySwapchainInfoKHR structure containing the same swapchain handle. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-image-01630)"},
- {"VUID-VkBindImageMemoryInfo-image-parameter", "image must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-image-parameter)"},
- {"VUID-VkBindImageMemoryInfo-memory-01612", "memory must have been allocated using one of the memory types allowed in the memoryTypeBits member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements with image (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkBindImageMemoryInfo-memory-01612)"},
- {"VUID-VkBindImageMemoryInfo-memory-01614", "The difference of the size of memory and memoryOffset must be greater than or equal to the size member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements with the same image (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkBindImageMemoryInfo-memory-01614)"},
- {"VUID-VkBindImageMemoryInfo-memory-01625", "memory must be a valid VkDeviceMemory handle (https://www.khronos.org/registry/vulkan/specs/1.1/html/vkspec.html#VUID-VkBindImageMemoryInfo-memory-01625)"},
- {"VUID-VkBindImageMemoryInfo-memory-01903", "If the VkMemoryAllocateInfo provided when memory was allocated included a VkMemoryDedicatedAllocateInfo structure in its pNext chain, and VkMemoryDedicatedAllocateInfo::image was not VK_NULL_HANDLE, then image must equal VkMemoryDedicatedAllocateInfo::image and memoryOffset must be zero. (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-memory-01903)"},
- {"VUID-VkBindImageMemoryInfo-memory-02630", "If the dedicated allocation image aliasing feature is not enabled, and the VkMemoryAllocateInfo provided when memory was allocated included a VkMemoryDedicatedAllocateInfo structure in its pNext chain, and VkMemoryDedicatedAllocateInfo::image was not VK_NULL_HANDLE, then image must equal VkMemoryDedicatedAllocateInfo::image and memoryOffset must be zero. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-memory-02630)"},
- {"VUID-VkBindImageMemoryInfo-memory-02631", "If the dedicated allocation image aliasing feature is enabled, and the VkMemoryAllocateInfo provided when memory was allocated included a VkMemoryDedicatedAllocateInfo structure in its pNext chain, and VkMemoryDedicatedAllocateInfo::image was not VK_NULL_HANDLE, then memoryOffset must be zero, and image must be either equal to VkMemoryDedicatedAllocateInfo::image or an image that was created using the same parameters in VkImageCreateInfo, with the exception that extent and arrayLayers may differ subject to the following restrictions: every dimension in the extent parameter of the image being bound must be equal to or smaller than the original image for which the allocation was created; and the arrayLayers parameter of the image being bound must be equal to or smaller than the original image for which the allocation was created. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-memory-02631)"},
- {"VUID-VkBindImageMemoryInfo-memory-02794", "If memory was created by a memory import operation, the external handle type of the imported memory must also have been set in VkExternalMemoryImageCreateInfo::handleTypes when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-memory-02794)"},
- {"VUID-VkBindImageMemoryInfo-memoryOffset-01611", "memoryOffset must be less than the size of memory (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-memoryOffset-01611)"},
- {"VUID-VkBindImageMemoryInfo-memoryOffset-01613", "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements with image (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkBindImageMemoryInfo-memoryOffset-01613)"},
- {"VUID-VkBindImageMemoryInfo-pNext-01615", "If the pNext chain does not include a VkBindImagePlaneMemoryInfo structure, memory must have been allocated using one of the memory types allowed in the memoryTypeBits member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements2 with image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01615)"},
- {"VUID-VkBindImageMemoryInfo-pNext-01616", "If the pNext chain does not include a VkBindImagePlaneMemoryInfo structure, memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements2 with image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01616)"},
- {"VUID-VkBindImageMemoryInfo-pNext-01617", "If the pNext chain does not include a VkBindImagePlaneMemoryInfo structure, the difference of the size of memory and memoryOffset must be greater than or equal to the size member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements2 with the same image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01617)"},
- {"VUID-VkBindImageMemoryInfo-pNext-01618", "If the pNext chain includes a VkBindImagePlaneMemoryInfo structure, image must have been created with the VK_IMAGE_CREATE_DISJOINT_BIT bit set. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01618)"},
- {"VUID-VkBindImageMemoryInfo-pNext-01619", "If the pNext chain includes a VkBindImagePlaneMemoryInfo structure, memory must have been allocated using one of the memory types allowed in the memoryTypeBits member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements2 with image and where VkBindImagePlaneMemoryInfo::planeAspect corresponds to the VkImagePlaneMemoryRequirementsInfo::planeAspect in the VkImageMemoryRequirementsInfo2 structure's pNext chain (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01619)"},
- {"VUID-VkBindImageMemoryInfo-pNext-01620", "If the pNext chain includes a VkBindImagePlaneMemoryInfo structure, memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements2 with image and where VkBindImagePlaneMemoryInfo::planeAspect corresponds to the VkImagePlaneMemoryRequirementsInfo::planeAspect in the VkImageMemoryRequirementsInfo2 structure's pNext chain (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01620)"},
- {"VUID-VkBindImageMemoryInfo-pNext-01621", "If the pNext chain includes a VkBindImagePlaneMemoryInfo structure, the difference of the size of memory and memoryOffset must be greater than or equal to the size member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements2 with the same image and where VkBindImagePlaneMemoryInfo::planeAspect corresponds to the VkImagePlaneMemoryRequirementsInfo::planeAspect in the VkImageMemoryRequirementsInfo2 structure's pNext chain (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01621)"},
- {"VUID-VkBindImageMemoryInfo-pNext-01626", "If the pNext chain includes a VkBindImageMemoryDeviceGroupInfo structure, all instances of memory specified by VkBindImageMemoryDeviceGroupInfo::pDeviceIndices must have been allocated (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01626)"},
- {"VUID-VkBindImageMemoryInfo-pNext-01627", "If the pNext chain includes a VkBindImageMemoryDeviceGroupInfo structure, and VkBindImageMemoryDeviceGroupInfo::splitInstanceBindRegionCount is not zero, then image must have been created with the VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01627)"},
- {"VUID-VkBindImageMemoryInfo-pNext-01628", "If the pNext chain includes a VkBindImageMemoryDeviceGroupInfo structure, all elements of VkBindImageMemoryDeviceGroupInfo::pSplitInstanceBindRegions must be valid rectangles contained within the dimensions of image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01628)"},
- {"VUID-VkBindImageMemoryInfo-pNext-01629", "If the pNext chain includes a VkBindImageMemoryDeviceGroupInfo structure, the union of the areas of all elements of VkBindImageMemoryDeviceGroupInfo::pSplitInstanceBindRegions that correspond to the same instance of image must cover the entire image. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01629)"},
- {"VUID-VkBindImageMemoryInfo-pNext-01631", "If the pNext chain includes a VkBindImageMemorySwapchainInfoKHR structure, memory must be VK_NULL_HANDLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01631)"},
- {"VUID-VkBindImageMemoryInfo-pNext-01632", "If the pNext chain does not include a VkBindImageMemorySwapchainInfoKHR structure, memory must be a valid VkDeviceMemory handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-01632)"},
- {"VUID-VkBindImageMemoryInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkBindImageMemoryDeviceGroupInfo, VkBindImageMemorySwapchainInfoKHR, or VkBindImagePlaneMemoryInfo (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-pNext-pNext)"},
- {"VUID-VkBindImageMemoryInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-sType-sType)"},
- {"VUID-VkBindImageMemoryInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemoryInfo-sType-unique)"},
- {"VUID-VkBindImageMemorySwapchainInfoKHR-imageIndex-01644", "imageIndex must be less than the number of images in swapchain (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemorySwapchainInfoKHR-imageIndex-01644)"},
- {"VUID-VkBindImageMemorySwapchainInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemorySwapchainInfoKHR-sType-sType)"},
- {"VUID-VkBindImageMemorySwapchainInfoKHR-swapchain-parameter", "swapchain must be a valid VkSwapchainKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImageMemorySwapchainInfoKHR-swapchain-parameter)"},
- {"VUID-VkBindImagePlaneMemoryInfo-planeAspect-02283", "If the image's tiling is VK_IMAGE_TILING_LINEAR or VK_IMAGE_TILING_OPTIMAL, then planeAspect must be a single valid format plane for the image. (That is, planeAspect must be VK_IMAGE_ASPECT_PLANE_0_BIT or VK_IMAGE_ASPECT_PLANE_1_BIT for '_2PLANE' formats and planeAspect must be VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT, or VK_IMAGE_ASPECT_PLANE_2_BIT for '_3PLANE' formats.) (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImagePlaneMemoryInfo-planeAspect-02283)"},
- {"VUID-VkBindImagePlaneMemoryInfo-planeAspect-02284", "If the image's tiling is VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then planeAspect must be a single valid memory plane for the image. (That is, aspectMask must specify a plane index that is less than the drmFormatModifierPlaneCount associated with the image's format and drmFormatModifier.) (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImagePlaneMemoryInfo-planeAspect-02284)"},
- {"VUID-VkBindImagePlaneMemoryInfo-planeAspect-parameter", "planeAspect must be a valid VkImageAspectFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImagePlaneMemoryInfo-planeAspect-parameter)"},
- {"VUID-VkBindImagePlaneMemoryInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindImagePlaneMemoryInfo-sType-sType)"},
- {"VUID-VkBindIndexBufferIndirectCommandNV-None-02946", "The buffer's usage flag from which the address was acquired must have the VK_BUFFER_USAGE_INDEX_BUFFER_BIT bit set. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindIndexBufferIndirectCommandNV-None-02946)"},
- {"VUID-VkBindIndexBufferIndirectCommandNV-None-02948", "Each element of the buffer from which the address was acquired and that is non-sparse must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindIndexBufferIndirectCommandNV-None-02948)"},
- {"VUID-VkBindIndexBufferIndirectCommandNV-bufferAddress-02947", "The bufferAddress must be aligned to the indexType used. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindIndexBufferIndirectCommandNV-bufferAddress-02947)"},
- {"VUID-VkBindIndexBufferIndirectCommandNV-indexType-parameter", "indexType must be a valid VkIndexType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindIndexBufferIndirectCommandNV-indexType-parameter)"},
- {"VUID-VkBindShaderGroupIndirectCommandNV-None-02944", "The current bound graphics pipeline, as well as the pipelines it may reference, must have been created with VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindShaderGroupIndirectCommandNV-None-02944)"},
- {"VUID-VkBindShaderGroupIndirectCommandNV-index-02945", "The index must be within range of the accessible shader groups of the current bound graphics pipeline. See vkCmdBindPipelineShaderGroupNV for further details. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindShaderGroupIndirectCommandNV-index-02945)"},
- {"VUID-VkBindSparseInfo-commonparent", "Both of the elements of pSignalSemaphores, and the elements of pWaitSemaphores that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindSparseInfo-commonparent)"},
- {"VUID-VkBindSparseInfo-pBufferBinds-parameter", "If bufferBindCount is not 0, pBufferBinds must be a valid pointer to an array of bufferBindCount valid VkSparseBufferMemoryBindInfo structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindSparseInfo-pBufferBinds-parameter)"},
- {"VUID-VkBindSparseInfo-pImageBinds-parameter", "If imageBindCount is not 0, pImageBinds must be a valid pointer to an array of imageBindCount valid VkSparseImageMemoryBindInfo structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindSparseInfo-pImageBinds-parameter)"},
- {"VUID-VkBindSparseInfo-pImageOpaqueBinds-parameter", "If imageOpaqueBindCount is not 0, pImageOpaqueBinds must be a valid pointer to an array of imageOpaqueBindCount valid VkSparseImageOpaqueMemoryBindInfo structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindSparseInfo-pImageOpaqueBinds-parameter)"},
- {"VUID-VkBindSparseInfo-pNext-03247", "If the pNext chain of this structure includes a VkTimelineSemaphoreSubmitInfo structure and any element of pWaitSemaphores was created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE then its waitSemaphoreValueCount member must equal waitSemaphoreCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindSparseInfo-pNext-03247)"},
- {"VUID-VkBindSparseInfo-pNext-03248", "If the pNext chain of this structure includes a VkTimelineSemaphoreSubmitInfo structure and any element of pSignalSemaphores was created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE then its signalSemaphoreValueCount member must equal signalSemaphoreCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindSparseInfo-pNext-03248)"},
- {"VUID-VkBindSparseInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkDeviceGroupBindSparseInfo or VkTimelineSemaphoreSubmitInfo (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindSparseInfo-pNext-pNext)"},
- {"VUID-VkBindSparseInfo-pSignalSemaphores-03249", "For each element of pSignalSemaphores created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE the corresponding element of VkTimelineSemaphoreSubmitInfo::pSignalSemaphoreValues must have a value greater than the current value of the semaphore when the semaphore signal operation is executed (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindSparseInfo-pSignalSemaphores-03249)"},
- {"VUID-VkBindSparseInfo-pSignalSemaphores-03251", "For each element of pSignalSemaphores created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE the corresponding element of VkTimelineSemaphoreSubmitInfo::pSignalSemaphoreValues must have a value which does not differ from the current value of the semaphore or from the value of any outstanding semaphore wait or signal operation on that semaphore by more than maxTimelineSemaphoreValueDifference. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindSparseInfo-pSignalSemaphores-03251)"},
- {"VUID-VkBindSparseInfo-pSignalSemaphores-parameter", "If signalSemaphoreCount is not 0, pSignalSemaphores must be a valid pointer to an array of signalSemaphoreCount valid VkSemaphore handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindSparseInfo-pSignalSemaphores-parameter)"},
- {"VUID-VkBindSparseInfo-pWaitSemaphores-03246", "If any element of pWaitSemaphores or pSignalSemaphores was created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE then the pNext chain must include a VkTimelineSemaphoreSubmitInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindSparseInfo-pWaitSemaphores-03246)"},
- {"VUID-VkBindSparseInfo-pWaitSemaphores-03250", "For each element of pWaitSemaphores created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE the corresponding element of VkTimelineSemaphoreSubmitInfo::pWaitSemaphoreValues must have a value which does not differ from the current value of the semaphore or from the value of any outstanding semaphore wait or signal operation on that semaphore by more than maxTimelineSemaphoreValueDifference. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindSparseInfo-pWaitSemaphores-03250)"},
- {"VUID-VkBindSparseInfo-pWaitSemaphores-parameter", "If waitSemaphoreCount is not 0, pWaitSemaphores must be a valid pointer to an array of waitSemaphoreCount valid VkSemaphore handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindSparseInfo-pWaitSemaphores-parameter)"},
- {"VUID-VkBindSparseInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_BIND_SPARSE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindSparseInfo-sType-sType)"},
- {"VUID-VkBindSparseInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindSparseInfo-sType-unique)"},
- {"VUID-VkBindVertexBufferIndirectCommandNV-None-02949", "The buffer's usage flag from which the address was acquired must have the VK_BUFFER_USAGE_VERTEX_BUFFER_BIT bit set. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindVertexBufferIndirectCommandNV-None-02949)"},
- {"VUID-VkBindVertexBufferIndirectCommandNV-None-02950", "Each element of the buffer from which the address was acquired and that is non-sparse must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBindVertexBufferIndirectCommandNV-None-02950)"},
- {"VUID-VkBufferCopy-size-01988", "The size must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCopy-size-01988)"},
- {"VUID-VkBufferCreateInfo-None-01888", "If any of the bits VK_BUFFER_CREATE_SPARSE_BINDING_BIT, VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT, or VK_BUFFER_CREATE_SPARSE_ALIASED_BIT are set, VK_BUFFER_CREATE_PROTECTED_BIT must not also be set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-None-01888)"},
- {"VUID-VkBufferCreateInfo-deviceAddress-02604", "If VkBufferDeviceAddressCreateInfoEXT::deviceAddress is not zero, flags must include VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-deviceAddress-02604)"},
- {"VUID-VkBufferCreateInfo-flags-00915", "If the sparse bindings feature is not enabled, flags must not contain VK_BUFFER_CREATE_SPARSE_BINDING_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-flags-00915)"},
- {"VUID-VkBufferCreateInfo-flags-00916", "If the sparse buffer residency feature is not enabled, flags must not contain VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-flags-00916)"},
- {"VUID-VkBufferCreateInfo-flags-00917", "If the sparse aliased residency feature is not enabled, flags must not contain VK_BUFFER_CREATE_SPARSE_ALIASED_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-flags-00917)"},
- {"VUID-VkBufferCreateInfo-flags-00918", "If flags contains VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT or VK_BUFFER_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_BUFFER_CREATE_SPARSE_BINDING_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-flags-00918)"},
- {"VUID-VkBufferCreateInfo-flags-01887", "If the protected memory feature is not enabled, flags must not contain VK_BUFFER_CREATE_PROTECTED_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-flags-01887)"},
- {"VUID-VkBufferCreateInfo-flags-03338", "If flags includes VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT, the bufferDeviceAddressCaptureReplay or VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::bufferDeviceAddressCaptureReplay feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-flags-03338)"},
- {"VUID-VkBufferCreateInfo-flags-parameter", "flags must be a valid combination of VkBufferCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-flags-parameter)"},
- {"VUID-VkBufferCreateInfo-opaqueCaptureAddress-03337", "If VkBufferOpaqueCaptureAddressCreateInfo::opaqueCaptureAddress is not zero, flags must include VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-opaqueCaptureAddress-03337)"},
- {"VUID-VkBufferCreateInfo-pNext-00920", "If the pNext chain includes a VkExternalMemoryBufferCreateInfo structure, its handleTypes member must only contain bits that are also in VkExternalBufferProperties::externalMemoryProperties.compatibleHandleTypes, as returned by vkGetPhysicalDeviceExternalBufferProperties with pExternalBufferInfo->handleType equal to any one of the handle types specified in VkExternalMemoryBufferCreateInfo::handleTypes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-pNext-00920)"},
- {"VUID-VkBufferCreateInfo-pNext-01571", "If the pNext chain includes a VkDedicatedAllocationBufferCreateInfoNV structure, and the dedicatedAllocation member of the chained structure is VK_TRUE, then flags must not include VK_BUFFER_CREATE_SPARSE_BINDING_BIT, VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT, or VK_BUFFER_CREATE_SPARSE_ALIASED_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-pNext-01571)"},
- {"VUID-VkBufferCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkBufferDeviceAddressCreateInfoEXT, VkBufferOpaqueCaptureAddressCreateInfo, VkDedicatedAllocationBufferCreateInfoNV, or VkExternalMemoryBufferCreateInfo (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-pNext-pNext)"},
- {"VUID-VkBufferCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-sType-sType)"},
- {"VUID-VkBufferCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-sType-unique)"},
- {"VUID-VkBufferCreateInfo-sharingMode-00913", "If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a valid pointer to an array of queueFamilyIndexCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-sharingMode-00913)"},
- {"VUID-VkBufferCreateInfo-sharingMode-00914", "If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-sharingMode-00914)"},
- {"VUID-VkBufferCreateInfo-sharingMode-01391", "If sharingMode is VK_SHARING_MODE_CONCURRENT, each element of pQueueFamilyIndices must be unique and must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the physicalDevice that was used to create device (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferCreateInfo-sharingMode-01391)"},
- {"VUID-VkBufferCreateInfo-sharingMode-01419", "If sharingMode is VK_SHARING_MODE_CONCURRENT, each element of pQueueFamilyIndices must be unique and must be less than pQueueFamilyPropertyCount returned by either vkGetPhysicalDeviceQueueFamilyProperties or vkGetPhysicalDeviceQueueFamilyProperties2 for the physicalDevice that was used to create device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-sharingMode-01419)"},
- {"VUID-VkBufferCreateInfo-sharingMode-parameter", "sharingMode must be a valid VkSharingMode value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-sharingMode-parameter)"},
- {"VUID-VkBufferCreateInfo-size-00912", "size must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-size-00912)"},
- {"VUID-VkBufferCreateInfo-usage-parameter", "usage must be a valid combination of VkBufferUsageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-usage-parameter)"},
- {"VUID-VkBufferCreateInfo-usage-requiredbitmask", "usage must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferCreateInfo-usage-requiredbitmask)"},
- {"VUID-VkBufferDeviceAddressCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferDeviceAddressCreateInfoEXT-sType-sType)"},
- {"VUID-VkBufferDeviceAddressInfo-buffer-02600", "If buffer is non-sparse and was not created with the VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT flag, then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferDeviceAddressInfo-buffer-02600)"},
- {"VUID-VkBufferDeviceAddressInfo-buffer-02601", "buffer must have been created with VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferDeviceAddressInfo-buffer-02601)"},
- {"VUID-VkBufferDeviceAddressInfo-buffer-parameter", "buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferDeviceAddressInfo-buffer-parameter)"},
- {"VUID-VkBufferDeviceAddressInfo-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferDeviceAddressInfo-pNext-pNext)"},
- {"VUID-VkBufferDeviceAddressInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferDeviceAddressInfo-sType-sType)"},
- {"VUID-VkBufferImageCopy-None-00214", "When copying to the depth aspect of an image subresource, the data in the source buffer must be in the range [0,1] (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkBufferImageCopy-None-00214)"},
- {"VUID-VkBufferImageCopy-None-01735", "If the calling command's VkImage parameter is a compressed image, or a single-plane, '_422' image format, bufferRowLength must be a multiple of the compressed texel block width (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferImageCopy-None-01735)"},
- {"VUID-VkBufferImageCopy-None-01736", "If the calling command's VkImage parameter is a compressed image, or a single-plane, '_422' image format, bufferImageHeight must be a multiple of the compressed texel block height (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferImageCopy-None-01736)"},
- {"VUID-VkBufferImageCopy-None-01737", "If the calling command's VkImage parameter is a compressed image, or a single-plane, '_422' image format, all members of imageOffset must be a multiple of the corresponding dimensions of the compressed texel block (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferImageCopy-None-01737)"},
- {"VUID-VkBufferImageCopy-None-01738", "If the calling command's VkImage parameter is a compressed image, or a single-plane, '_422' image format, bufferOffset must be a multiple of the compressed texel block size in bytes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferImageCopy-None-01738)"},
- {"VUID-VkBufferImageCopy-None-01739", "If the calling command's VkImage parameter is a compressed image, or a single-plane, '_422' image format, imageExtent.width must be a multiple of the compressed texel block width or (imageExtent.width + imageOffset.x) must equal the image subresource width (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferImageCopy-None-01739)"},
- {"VUID-VkBufferImageCopy-None-01740", "If the calling command's VkImage parameter is a compressed image, or a single-plane, '_422' image format, imageExtent.height must be a multiple of the compressed texel block height or (imageExtent.height + imageOffset.y) must equal the image subresource height (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferImageCopy-None-01740)"},
- {"VUID-VkBufferImageCopy-None-01741", "If the calling command's VkImage parameter is a compressed image, or a single-plane, '_422' image format, imageExtent.depth must be a multiple of the compressed texel block depth or (imageExtent.depth + imageOffset.z) must equal the image subresource depth (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferImageCopy-None-01741)"},
- {"VUID-VkBufferImageCopy-aspectMask-00211", "The aspectMask member of imageSubresource must specify aspects present in the calling command's VkImage parameter (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferImageCopy-aspectMask-00211)"},
- {"VUID-VkBufferImageCopy-aspectMask-00212", "The aspectMask member of imageSubresource must only have a single bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferImageCopy-aspectMask-00212)"},
- {"VUID-VkBufferImageCopy-aspectMask-01560", "If the calling command's VkImage parameter's format is a multi-planar format, then the aspectMask member of imageSubresource must be VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT, or VK_IMAGE_ASPECT_PLANE_2_BIT (with VK_IMAGE_ASPECT_PLANE_2_BIT valid only for image formats with three planes) (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferImageCopy-aspectMask-01560)"},
- {"VUID-VkBufferImageCopy-baseArrayLayer-00213", "If the calling command's VkImage parameter is of VkImageType VK_IMAGE_TYPE_3D, the baseArrayLayer and layerCount members of imageSubresource must be 0 and 1, respectively (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferImageCopy-baseArrayLayer-00213)"},
- {"VUID-VkBufferImageCopy-bufferImageHeight-00196", "bufferImageHeight must be 0, or greater than or equal to the height member of imageExtent (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferImageCopy-bufferImageHeight-00196)"},
- {"VUID-VkBufferImageCopy-bufferImageHeight-00204", "If the calling command's VkImage parameter is a compressed image, bufferImageHeight must be a multiple of the compressed texel block height (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferImageCopy-bufferImageHeight-00204)"},
- {"VUID-VkBufferImageCopy-bufferOffset-00193", "If the calling command's VkImage parameter's format is not a depth/stencil format, then bufferOffset must be a multiple of the format's texel block size. (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferImageCopy-bufferOffset-00193)"},
- {"VUID-VkBufferImageCopy-bufferOffset-00194", "bufferOffset must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferImageCopy-bufferOffset-00194)"},
- {"VUID-VkBufferImageCopy-bufferOffset-00206", "If the calling command's VkImage parameter is a compressed image, bufferOffset must be a multiple of the compressed texel block size in bytes (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferImageCopy-bufferOffset-00206)"},
- {"VUID-VkBufferImageCopy-bufferOffset-01558", "If the calling command's VkImage parameter's format is not a depth/stencil format or a multi-planar format, then bufferOffset must be a multiple of the format's texel block size. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferImageCopy-bufferOffset-01558)"},
- {"VUID-VkBufferImageCopy-bufferOffset-01559", "If the calling command's VkImage parameter's format is a multi-planar format, then bufferOffset must be a multiple of the element size of the compatible format for the format and the aspectMask of the imageSubresource as defined in Compatible formats of planes of multi-planar formats (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferImageCopy-bufferOffset-01559)"},
- {"VUID-VkBufferImageCopy-bufferRowLength-00195", "bufferRowLength must be 0, or greater than or equal to the width member of imageExtent (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferImageCopy-bufferRowLength-00195)"},
- {"VUID-VkBufferImageCopy-bufferRowLength-00203", "If the calling command's VkImage parameter is a compressed image, bufferRowLength must be a multiple of the compressed texel block width (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferImageCopy-bufferRowLength-00203)"},
- {"VUID-VkBufferImageCopy-imageExtent-00207", "If the calling command's VkImage parameter is a compressed image, imageExtent.width must be a multiple of the compressed texel block width or (imageExtent.width + imageOffset.x) must equal the image subresource width (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferImageCopy-imageExtent-00207)"},
- {"VUID-VkBufferImageCopy-imageExtent-00208", "If the calling command's VkImage parameter is a compressed image, imageExtent.height must be a multiple of the compressed texel block height or (imageExtent.height + imageOffset.y) must equal the image subresource height (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferImageCopy-imageExtent-00208)"},
- {"VUID-VkBufferImageCopy-imageExtent-00209", "If the calling command's VkImage parameter is a compressed image, imageExtent.depth must be a multiple of the compressed texel block depth or (imageExtent.depth + imageOffset.z) must equal the image subresource depth (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferImageCopy-imageExtent-00209)"},
- {"VUID-VkBufferImageCopy-imageOffset-00197", "imageOffset.x and (imageExtent.width + imageOffset.x) must both be greater than or equal to 0 and less than or equal to the image subresource width (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferImageCopy-imageOffset-00197)"},
- {"VUID-VkBufferImageCopy-imageOffset-00198", "imageOffset.y and (imageExtent.height + imageOffset.y) must both be greater than or equal to 0 and less than or equal to the image subresource height (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferImageCopy-imageOffset-00198)"},
- {"VUID-VkBufferImageCopy-imageOffset-00200", "imageOffset.z and (imageExtent.depth + imageOffset.z) must both be greater than or equal to 0 and less than or equal to the image subresource depth (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferImageCopy-imageOffset-00200)"},
- {"VUID-VkBufferImageCopy-imageOffset-00205", "If the calling command's VkImage parameter is a compressed image, all members of imageOffset must be a multiple of the corresponding dimensions of the compressed texel block (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferImageCopy-imageOffset-00205)"},
- {"VUID-VkBufferImageCopy-imageSubresource-parameter", "imageSubresource must be a valid VkImageSubresourceLayers structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferImageCopy-imageSubresource-parameter)"},
- {"VUID-VkBufferImageCopy-srcImage-00199", "If the calling command's srcImage (vkCmdCopyImageToBuffer) or dstImage (vkCmdCopyBufferToImage) is of type VK_IMAGE_TYPE_1D, then imageOffset.y must be 0 and imageExtent.height must be 1. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferImageCopy-srcImage-00199)"},
- {"VUID-VkBufferImageCopy-srcImage-00201", "If the calling command's srcImage (vkCmdCopyImageToBuffer) or dstImage (vkCmdCopyBufferToImage) is of type VK_IMAGE_TYPE_1D or VK_IMAGE_TYPE_2D, then imageOffset.z must be 0 and imageExtent.depth must be 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferImageCopy-srcImage-00201)"},
- {"VUID-VkBufferMemoryBarrier-buffer-01190", "If buffer was created with a sharing mode of VK_SHARING_MODE_CONCURRENT, srcQueueFamilyIndex and dstQueueFamilyIndex must both be VK_QUEUE_FAMILY_IGNORED (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01190)"},
- {"VUID-VkBufferMemoryBarrier-buffer-01191", "If buffer was created with a sharing mode of VK_SHARING_MODE_CONCURRENT, at least one of srcQueueFamilyIndex and dstQueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01191)"},
- {"VUID-VkBufferMemoryBarrier-buffer-01192", "If buffer was created with a sharing mode of VK_SHARING_MODE_EXCLUSIVE, srcQueueFamilyIndex and dstQueueFamilyIndex must either both be VK_QUEUE_FAMILY_IGNORED, or both be a valid queue family (see Queue Family Properties) (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01192)"},
- {"VUID-VkBufferMemoryBarrier-buffer-01193", "If buffer was created with a sharing mode of VK_SHARING_MODE_EXCLUSIVE and srcQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, dstQueueFamilyIndex must also be VK_QUEUE_FAMILY_IGNORED (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01193)"},
- {"VUID-VkBufferMemoryBarrier-buffer-01196", "If buffer was created with a sharing mode of VK_SHARING_MODE_EXCLUSIVE, and srcQueueFamilyIndex and dstQueueFamilyIndex are not VK_QUEUE_FAMILY_IGNORED, at least one of them must be the same as the family of the queue that will execute this barrier (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01196)"},
- {"VUID-VkBufferMemoryBarrier-buffer-01763", "If buffer was created with a sharing mode of VK_SHARING_MODE_CONCURRENT, and one of srcQueueFamilyIndex and dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, the other must be VK_QUEUE_FAMILY_IGNORED or a special queue family reserved for external memory ownership transfers, as described in Queue Family Ownership Transfer. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01763)"},
- {"VUID-VkBufferMemoryBarrier-buffer-01764", "If buffer was created with a sharing mode of VK_SHARING_MODE_EXCLUSIVE and srcQueueFamilyIndex is not VK_QUEUE_FAMILY_IGNORED, it must be a valid queue family or a special queue family reserved for external memory transfers, as described in Queue Family Ownership Transfer. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01764)"},
- {"VUID-VkBufferMemoryBarrier-buffer-01765", "If buffer was created with a sharing mode of VK_SHARING_MODE_EXCLUSIVE and dstQueueFamilyIndex is not VK_QUEUE_FAMILY_IGNORED, it must be a valid queue family or a special queue family reserved for external memory transfers, as described in Queue Family Ownership Transfer. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01765)"},
- {"VUID-VkBufferMemoryBarrier-buffer-01931", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-01931)"},
- {"VUID-VkBufferMemoryBarrier-buffer-parameter", "buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-buffer-parameter)"},
- {"VUID-VkBufferMemoryBarrier-offset-01187", "offset must be less than the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-offset-01187)"},
- {"VUID-VkBufferMemoryBarrier-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-pNext-pNext)"},
- {"VUID-VkBufferMemoryBarrier-sType-sType", "sType must be VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-sType-sType)"},
- {"VUID-VkBufferMemoryBarrier-size-01188", "If size is not equal to VK_WHOLE_SIZE, size must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-size-01188)"},
- {"VUID-VkBufferMemoryBarrier-size-01189", "If size is not equal to VK_WHOLE_SIZE, size must be less than or equal to than the size of buffer minus offset (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferMemoryBarrier-size-01189)"},
- {"VUID-VkBufferMemoryRequirementsInfo2-buffer-parameter", "buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferMemoryRequirementsInfo2-buffer-parameter)"},
- {"VUID-VkBufferMemoryRequirementsInfo2-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferMemoryRequirementsInfo2-pNext-pNext)"},
- {"VUID-VkBufferMemoryRequirementsInfo2-sType-sType", "sType must be VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferMemoryRequirementsInfo2-sType-sType)"},
- {"VUID-VkBufferOpaqueCaptureAddressCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferOpaqueCaptureAddressCreateInfo-sType-sType)"},
- {"VUID-VkBufferViewCreateInfo-buffer-00932", "buffer must have been created with a usage value containing at least one of VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferViewCreateInfo-buffer-00932)"},
- {"VUID-VkBufferViewCreateInfo-buffer-00933", "If buffer was created with usage containing VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, format must be supported for uniform texel buffers, as specified by the VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT flag in VkFormatProperties::bufferFeatures returned by vkGetPhysicalDeviceFormatProperties (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferViewCreateInfo-buffer-00933)"},
- {"VUID-VkBufferViewCreateInfo-buffer-00934", "If buffer was created with usage containing VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, format must be supported for storage texel buffers, as specified by the VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT flag in VkFormatProperties::bufferFeatures returned by vkGetPhysicalDeviceFormatProperties (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferViewCreateInfo-buffer-00934)"},
- {"VUID-VkBufferViewCreateInfo-buffer-00935", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferViewCreateInfo-buffer-00935)"},
- {"VUID-VkBufferViewCreateInfo-buffer-02750", "If the texelBufferAlignment feature is enabled and if buffer was created with usage containing VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, offset must be a multiple of the lesser of VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT::storageTexelBufferOffsetAlignmentBytes or, if VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT::storageTexelBufferOffsetSingleTexelAlignment is VK_TRUE, the size of a texel of the requested format. If the size of a texel is a multiple of three bytes, then the size of a single component of format is used instead (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferViewCreateInfo-buffer-02750)"},
- {"VUID-VkBufferViewCreateInfo-buffer-02751", "If the texelBufferAlignment feature is enabled and if buffer was created with usage containing VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, offset must be a multiple of the lesser of VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT::uniformTexelBufferOffsetAlignmentBytes or, if VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT::uniformTexelBufferOffsetSingleTexelAlignment is VK_TRUE, the size of a texel of the requested format. If the size of a texel is a multiple of three bytes, then the size of a single component of format is used instead (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferViewCreateInfo-buffer-02751)"},
- {"VUID-VkBufferViewCreateInfo-buffer-parameter", "buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferViewCreateInfo-buffer-parameter)"},
- {"VUID-VkBufferViewCreateInfo-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferViewCreateInfo-flags-zerobitmask)"},
- {"VUID-VkBufferViewCreateInfo-format-parameter", "format must be a valid VkFormat value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferViewCreateInfo-format-parameter)"},
- {"VUID-VkBufferViewCreateInfo-offset-00925", "offset must be less than the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferViewCreateInfo-offset-00925)"},
- {"VUID-VkBufferViewCreateInfo-offset-00926", "offset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkBufferViewCreateInfo-offset-00926)"},
- {"VUID-VkBufferViewCreateInfo-offset-00931", "If range is not equal to VK_WHOLE_SIZE, the sum of offset and range must be less than or equal to the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferViewCreateInfo-offset-00931)"},
- {"VUID-VkBufferViewCreateInfo-offset-02749", "If the texelBufferAlignment feature is not enabled, offset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferViewCreateInfo-offset-02749)"},
- {"VUID-VkBufferViewCreateInfo-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferViewCreateInfo-pNext-pNext)"},
- {"VUID-VkBufferViewCreateInfo-range-00928", "If range is not equal to VK_WHOLE_SIZE, range must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferViewCreateInfo-range-00928)"},
- {"VUID-VkBufferViewCreateInfo-range-00929", "If range is not equal to VK_WHOLE_SIZE, range must be an integer multiple of the texel block size of format (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferViewCreateInfo-range-00929)"},
- {"VUID-VkBufferViewCreateInfo-range-00930", "If range is not equal to VK_WHOLE_SIZE, range divided by the texel block size of format, multiplied by the number of texels per texel block for that format (as defined in the Compatible Formats table), must be less than or equal to VkPhysicalDeviceLimits::maxTexelBufferElements (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferViewCreateInfo-range-00930)"},
- {"VUID-VkBufferViewCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkBufferViewCreateInfo-sType-sType)"},
- {"VUID-VkCalibratedTimestampInfoEXT-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCalibratedTimestampInfoEXT-pNext-pNext)"},
- {"VUID-VkCalibratedTimestampInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCalibratedTimestampInfoEXT-sType-sType)"},
- {"VUID-VkCalibratedTimestampInfoEXT-timeDomain-02354", "timeDomain must be one of the VkTimeDomainEXT values returned by vkGetPhysicalDeviceCalibrateableTimeDomainsEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCalibratedTimestampInfoEXT-timeDomain-02354)"},
- {"VUID-VkCalibratedTimestampInfoEXT-timeDomain-parameter", "timeDomain must be a valid VkTimeDomainEXT value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCalibratedTimestampInfoEXT-timeDomain-parameter)"},
- {"VUID-VkCheckpointDataNV-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCheckpointDataNV-pNext-pNext)"},
- {"VUID-VkCheckpointDataNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCheckpointDataNV-sType-sType)"},
- {"VUID-VkClearAttachment-aspectMask-00019", "If aspectMask includes VK_IMAGE_ASPECT_COLOR_BIT, it must not include VK_IMAGE_ASPECT_DEPTH_BIT or VK_IMAGE_ASPECT_STENCIL_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkClearAttachment-aspectMask-00019)"},
- {"VUID-VkClearAttachment-aspectMask-00020", "aspectMask must not include VK_IMAGE_ASPECT_METADATA_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkClearAttachment-aspectMask-00020)"},
- {"VUID-VkClearAttachment-aspectMask-02246", "aspectMask must not include VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT for any index i. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkClearAttachment-aspectMask-02246)"},
- {"VUID-VkClearAttachment-aspectMask-parameter", "aspectMask must be a valid combination of VkImageAspectFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkClearAttachment-aspectMask-parameter)"},
- {"VUID-VkClearAttachment-aspectMask-requiredbitmask", "aspectMask must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkClearAttachment-aspectMask-requiredbitmask)"},
- {"VUID-VkClearAttachment-clearValue-00021", "clearValue must be a valid VkClearValue union (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkClearAttachment-clearValue-00021)"},
- {"VUID-VkClearDepthStencilValue-depth-00022", "Unless the VK_EXT_depth_range_unrestricted extension is enabled depth must be between 0.0 and 1.0, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkClearDepthStencilValue-depth-00022)"},
- {"VUID-VkClearDepthStencilValue-depth-02506", "depth must be between 0.0 and 1.0, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkClearDepthStencilValue-depth-02506)"},
- {"VUID-VkCoarseSampleLocationNV-pixelX-02078", "pixelX must be less than the width (in pixels) of the fragment. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCoarseSampleLocationNV-pixelX-02078)"},
- {"VUID-VkCoarseSampleLocationNV-pixelY-02079", "pixelY must be less than the height (in pixels) of the fragment. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCoarseSampleLocationNV-pixelY-02079)"},
- {"VUID-VkCoarseSampleLocationNV-sample-02080", "sample must be less than the number of coverage samples in each pixel belonging to the fragment. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCoarseSampleLocationNV-sample-02080)"},
- {"VUID-VkCoarseSampleOrderCustomNV-pSampleLocations-02077", "The array pSampleLocations must contain exactly one entry for every combination of valid values for pixelX, pixelY, and sample in the structure VkCoarseSampleOrderCustomNV. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCoarseSampleOrderCustomNV-pSampleLocations-02077)"},
- {"VUID-VkCoarseSampleOrderCustomNV-pSampleLocations-parameter", "pSampleLocations must be a valid pointer to an array of sampleLocationCount VkCoarseSampleLocationNV structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCoarseSampleOrderCustomNV-pSampleLocations-parameter)"},
- {"VUID-VkCoarseSampleOrderCustomNV-sampleCount-02074", "sampleCount must correspond to a sample count enumerated in VkSampleCountFlags whose corresponding bit is set in VkPhysicalDeviceLimits::framebufferNoAttachmentsSampleCounts. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCoarseSampleOrderCustomNV-sampleCount-02074)"},
- {"VUID-VkCoarseSampleOrderCustomNV-sampleLocationCount-02075", "sampleLocationCount must be equal to the product of sampleCount, the fragment width for shadingRate, and the fragment height for shadingRate. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCoarseSampleOrderCustomNV-sampleLocationCount-02075)"},
- {"VUID-VkCoarseSampleOrderCustomNV-sampleLocationCount-02076", "sampleLocationCount must be less than or equal to the value of VkPhysicalDeviceShadingRateImagePropertiesNV::shadingRateMaxCoarseSamples. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCoarseSampleOrderCustomNV-sampleLocationCount-02076)"},
- {"VUID-VkCoarseSampleOrderCustomNV-sampleLocationCount-arraylength", "sampleLocationCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCoarseSampleOrderCustomNV-sampleLocationCount-arraylength)"},
- {"VUID-VkCoarseSampleOrderCustomNV-shadingRate-02073", "shadingRate must be a shading rate that generates fragments with more than one pixel. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCoarseSampleOrderCustomNV-shadingRate-02073)"},
- {"VUID-VkCoarseSampleOrderCustomNV-shadingRate-parameter", "shadingRate must be a valid VkShadingRatePaletteEntryNV value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCoarseSampleOrderCustomNV-shadingRate-parameter)"},
- {"VUID-VkCommandBufferAllocateInfo-commandBufferCount-00044", "commandBufferCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferAllocateInfo-commandBufferCount-00044)"},
- {"VUID-VkCommandBufferAllocateInfo-commandPool-parameter", "commandPool must be a valid VkCommandPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferAllocateInfo-commandPool-parameter)"},
- {"VUID-VkCommandBufferAllocateInfo-level-parameter", "level must be a valid VkCommandBufferLevel value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferAllocateInfo-level-parameter)"},
- {"VUID-VkCommandBufferAllocateInfo-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferAllocateInfo-pNext-pNext)"},
- {"VUID-VkCommandBufferAllocateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferAllocateInfo-sType-sType)"},
- {"VUID-VkCommandBufferBeginInfo-flags-00053", "If flags contains VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, the renderPass member of pInheritanceInfo must be a valid VkRenderPass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferBeginInfo-flags-00053)"},
- {"VUID-VkCommandBufferBeginInfo-flags-00054", "If flags contains VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, the subpass member of pInheritanceInfo must be a valid subpass index within the renderPass member of pInheritanceInfo (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferBeginInfo-flags-00054)"},
- {"VUID-VkCommandBufferBeginInfo-flags-00055", "If flags contains VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, the framebuffer member of pInheritanceInfo must be either VK_NULL_HANDLE, or a valid VkFramebuffer that is compatible with the renderPass member of pInheritanceInfo (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferBeginInfo-flags-00055)"},
- {"VUID-VkCommandBufferBeginInfo-flags-parameter", "flags must be a valid combination of VkCommandBufferUsageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferBeginInfo-flags-parameter)"},
- {"VUID-VkCommandBufferBeginInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkDeviceGroupCommandBufferBeginInfo (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferBeginInfo-pNext-pNext)"},
- {"VUID-VkCommandBufferBeginInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferBeginInfo-sType-sType)"},
- {"VUID-VkCommandBufferBeginInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferBeginInfo-sType-unique)"},
- {"VUID-VkCommandBufferInheritanceConditionalRenderingInfoEXT-conditionalRenderingEnable-01977", "If the inherited conditional rendering feature is not enabled, conditionalRenderingEnable must be VK_FALSE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferInheritanceConditionalRenderingInfoEXT-conditionalRenderingEnable-01977)"},
- {"VUID-VkCommandBufferInheritanceConditionalRenderingInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferInheritanceConditionalRenderingInfoEXT-sType-sType)"},
- {"VUID-VkCommandBufferInheritanceInfo-commonparent", "Both of framebuffer, and renderPass that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferInheritanceInfo-commonparent)"},
- {"VUID-VkCommandBufferInheritanceInfo-occlusionQueryEnable-00056", "If the inherited queries feature is not enabled, occlusionQueryEnable must be VK_FALSE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferInheritanceInfo-occlusionQueryEnable-00056)"},
- {"VUID-VkCommandBufferInheritanceInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkCommandBufferInheritanceConditionalRenderingInfoEXT or VkCommandBufferInheritanceRenderPassTransformInfoQCOM (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferInheritanceInfo-pNext-pNext)"},
- {"VUID-VkCommandBufferInheritanceInfo-pipelineStatistics-00058", "If the pipeline statistics queries feature is not enabled, pipelineStatistics must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferInheritanceInfo-pipelineStatistics-00058)"},
- {"VUID-VkCommandBufferInheritanceInfo-pipelineStatistics-02789", "If the pipeline statistics queries feature is enabled, pipelineStatistics must be a valid combination of VkQueryPipelineStatisticFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferInheritanceInfo-pipelineStatistics-02789)"},
- {"VUID-VkCommandBufferInheritanceInfo-queryFlags-00057", "If the inherited queries feature is enabled, queryFlags must be a valid combination of VkQueryControlFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferInheritanceInfo-queryFlags-00057)"},
- {"VUID-VkCommandBufferInheritanceInfo-queryFlags-02788", "If the inherited queries feature is not enabled, queryFlags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferInheritanceInfo-queryFlags-02788)"},
- {"VUID-VkCommandBufferInheritanceInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferInheritanceInfo-sType-sType)"},
- {"VUID-VkCommandBufferInheritanceInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferInheritanceInfo-sType-unique)"},
- {"VUID-VkCommandBufferInheritanceRenderPassTransformInfoQCOM-sType-sType", "sType must be VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferInheritanceRenderPassTransformInfoQCOM-sType-sType)"},
- {"VUID-VkCommandBufferInheritanceRenderPassTransformInfoQCOM-transform-02864", "transform must be VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR, VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR, VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR, or VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandBufferInheritanceRenderPassTransformInfoQCOM-transform-02864)"},
- {"VUID-VkCommandPoolCreateInfo-flags-02860", "If the protected memory feature is not enabled, the VK_COMMAND_POOL_CREATE_PROTECTED_BIT bit of flags must not be set. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandPoolCreateInfo-flags-02860)"},
- {"VUID-VkCommandPoolCreateInfo-flags-parameter", "flags must be a valid combination of VkCommandPoolCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandPoolCreateInfo-flags-parameter)"},
- {"VUID-VkCommandPoolCreateInfo-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandPoolCreateInfo-pNext-pNext)"},
- {"VUID-VkCommandPoolCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCommandPoolCreateInfo-sType-sType)"},
- {"VUID-VkComponentMapping-a-parameter", "a must be a valid VkComponentSwizzle value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComponentMapping-a-parameter)"},
- {"VUID-VkComponentMapping-b-parameter", "b must be a valid VkComponentSwizzle value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComponentMapping-b-parameter)"},
- {"VUID-VkComponentMapping-g-parameter", "g must be a valid VkComponentSwizzle value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComponentMapping-g-parameter)"},
- {"VUID-VkComponentMapping-r-parameter", "r must be a valid VkComponentSwizzle value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComponentMapping-r-parameter)"},
- {"VUID-VkComputePipelineCreateInfo-commonparent", "Both of basePipelineHandle, and layout that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-commonparent)"},
- {"VUID-VkComputePipelineCreateInfo-flags-00697", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineIndex is -1, basePipelineHandle must be a valid handle to a compute VkPipeline (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-flags-00697)"},
- {"VUID-VkComputePipelineCreateInfo-flags-00698", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineHandle is VK_NULL_HANDLE, basePipelineIndex must be a valid index into the calling command's pCreateInfos parameter (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-flags-00698)"},
- {"VUID-VkComputePipelineCreateInfo-flags-00699", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineIndex is not -1, basePipelineHandle must be VK_NULL_HANDLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-flags-00699)"},
- {"VUID-VkComputePipelineCreateInfo-flags-00700", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineHandle is not VK_NULL_HANDLE, basePipelineIndex must be -1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-flags-00700)"},
- {"VUID-VkComputePipelineCreateInfo-flags-02874", "flags must not include VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-flags-02874)"},
- {"VUID-VkComputePipelineCreateInfo-flags-03364", "flags must not include VK_PIPELINE_CREATE_LIBRARY_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-flags-03364)"},
- {"VUID-VkComputePipelineCreateInfo-flags-03365", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-flags-03365)"},
- {"VUID-VkComputePipelineCreateInfo-flags-03366", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-flags-03366)"},
- {"VUID-VkComputePipelineCreateInfo-flags-03367", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-flags-03367)"},
- {"VUID-VkComputePipelineCreateInfo-flags-03368", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-flags-03368)"},
- {"VUID-VkComputePipelineCreateInfo-flags-03369", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-flags-03369)"},
- {"VUID-VkComputePipelineCreateInfo-flags-03370", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-flags-03370)"},
- {"VUID-VkComputePipelineCreateInfo-flags-parameter", "flags must be a valid combination of VkPipelineCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-flags-parameter)"},
- {"VUID-VkComputePipelineCreateInfo-layout-00703", "layout must be consistent with the layout of the compute shader specified in stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-layout-00703)"},
- {"VUID-VkComputePipelineCreateInfo-layout-01687", "The number of resources in layout accessible to the compute shader stage must be less than or equal to VkPhysicalDeviceLimits::maxPerStageResources (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-layout-01687)"},
- {"VUID-VkComputePipelineCreateInfo-layout-parameter", "layout must be a valid VkPipelineLayout handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-layout-parameter)"},
- {"VUID-VkComputePipelineCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkPipelineCompilerControlCreateInfoAMD or VkPipelineCreationFeedbackCreateInfoEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-pNext-pNext)"},
- {"VUID-VkComputePipelineCreateInfo-pipelineCreationCacheControl-02875", "If the pipelineCreationCacheControl feature is not enabled, flags must not include VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT or VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-pipelineCreationCacheControl-02875)"},
- {"VUID-VkComputePipelineCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-sType-sType)"},
- {"VUID-VkComputePipelineCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-sType-unique)"},
- {"VUID-VkComputePipelineCreateInfo-stage-00701", "The stage member of stage must be VK_SHADER_STAGE_COMPUTE_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-stage-00701)"},
- {"VUID-VkComputePipelineCreateInfo-stage-00702", "The shader code for the entry point identified by stage and the rest of the state identified by this structure must adhere to the pipeline linking rules described in the Shader Interfaces chapter (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-stage-00702)"},
- {"VUID-VkComputePipelineCreateInfo-stage-parameter", "stage must be a valid VkPipelineShaderStageCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkComputePipelineCreateInfo-stage-parameter)"},
- {"VUID-VkConditionalRenderingBeginInfoEXT-buffer-01981", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkConditionalRenderingBeginInfoEXT-buffer-01981)"},
- {"VUID-VkConditionalRenderingBeginInfoEXT-buffer-01982", "buffer must have been created with the VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkConditionalRenderingBeginInfoEXT-buffer-01982)"},
- {"VUID-VkConditionalRenderingBeginInfoEXT-buffer-parameter", "buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkConditionalRenderingBeginInfoEXT-buffer-parameter)"},
- {"VUID-VkConditionalRenderingBeginInfoEXT-flags-parameter", "flags must be a valid combination of VkConditionalRenderingFlagBitsEXT values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkConditionalRenderingBeginInfoEXT-flags-parameter)"},
- {"VUID-VkConditionalRenderingBeginInfoEXT-offset-01983", "offset must be less than the size of buffer by at least 32 bits. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkConditionalRenderingBeginInfoEXT-offset-01983)"},
- {"VUID-VkConditionalRenderingBeginInfoEXT-offset-01984", "offset must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkConditionalRenderingBeginInfoEXT-offset-01984)"},
- {"VUID-VkConditionalRenderingBeginInfoEXT-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkConditionalRenderingBeginInfoEXT-pNext-pNext)"},
- {"VUID-VkConditionalRenderingBeginInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkConditionalRenderingBeginInfoEXT-sType-sType)"},
- {"VUID-VkCooperativeMatrixPropertiesNV-AType-parameter", "AType must be a valid VkComponentTypeNV value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCooperativeMatrixPropertiesNV-AType-parameter)"},
- {"VUID-VkCooperativeMatrixPropertiesNV-BType-parameter", "BType must be a valid VkComponentTypeNV value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCooperativeMatrixPropertiesNV-BType-parameter)"},
- {"VUID-VkCooperativeMatrixPropertiesNV-CType-parameter", "CType must be a valid VkComponentTypeNV value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCooperativeMatrixPropertiesNV-CType-parameter)"},
- {"VUID-VkCooperativeMatrixPropertiesNV-DType-parameter", "DType must be a valid VkComponentTypeNV value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCooperativeMatrixPropertiesNV-DType-parameter)"},
- {"VUID-VkCooperativeMatrixPropertiesNV-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCooperativeMatrixPropertiesNV-pNext-pNext)"},
- {"VUID-VkCooperativeMatrixPropertiesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCooperativeMatrixPropertiesNV-sType-sType)"},
- {"VUID-VkCooperativeMatrixPropertiesNV-scope-parameter", "scope must be a valid VkScopeNV value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCooperativeMatrixPropertiesNV-scope-parameter)"},
- {"VUID-VkCopyAccelerationStructureInfoKHR-commonparent", "Both of dst, and src must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyAccelerationStructureInfoKHR-commonparent)"},
- {"VUID-VkCopyAccelerationStructureInfoKHR-dst-parameter", "dst must be a valid VkAccelerationStructureKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyAccelerationStructureInfoKHR-dst-parameter)"},
- {"VUID-VkCopyAccelerationStructureInfoKHR-mode-03410", "mode must be VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR or VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyAccelerationStructureInfoKHR-mode-03410)"},
- {"VUID-VkCopyAccelerationStructureInfoKHR-mode-parameter", "mode must be a valid VkCopyAccelerationStructureModeKHR value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyAccelerationStructureInfoKHR-mode-parameter)"},
- {"VUID-VkCopyAccelerationStructureInfoKHR-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkDeferredOperationInfoKHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyAccelerationStructureInfoKHR-pNext-pNext)"},
- {"VUID-VkCopyAccelerationStructureInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_COPY_ACCELERATION_STRUCTURE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyAccelerationStructureInfoKHR-sType-sType)"},
- {"VUID-VkCopyAccelerationStructureInfoKHR-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyAccelerationStructureInfoKHR-sType-unique)"},
- {"VUID-VkCopyAccelerationStructureInfoKHR-src-03411", "src must have been built with VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR if mode is VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyAccelerationStructureInfoKHR-src-03411)"},
- {"VUID-VkCopyAccelerationStructureInfoKHR-src-parameter", "src must be a valid VkAccelerationStructureKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyAccelerationStructureInfoKHR-src-parameter)"},
- {"VUID-VkCopyAccelerationStructureToMemoryInfoKHR-dst-03561", "The memory pointed to by dst must be at least as large as the serialization size of src, as reported by VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyAccelerationStructureToMemoryInfoKHR-dst-03561)"},
- {"VUID-VkCopyAccelerationStructureToMemoryInfoKHR-dst-parameter", "dst must be a valid VkDeviceOrHostAddressKHR union (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyAccelerationStructureToMemoryInfoKHR-dst-parameter)"},
- {"VUID-VkCopyAccelerationStructureToMemoryInfoKHR-mode-03412", "mode must be VK_COPY_ACCELERATION_STRUCTURE_MODE_SERIALIZE_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyAccelerationStructureToMemoryInfoKHR-mode-03412)"},
- {"VUID-VkCopyAccelerationStructureToMemoryInfoKHR-mode-parameter", "mode must be a valid VkCopyAccelerationStructureModeKHR value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyAccelerationStructureToMemoryInfoKHR-mode-parameter)"},
- {"VUID-VkCopyAccelerationStructureToMemoryInfoKHR-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkDeferredOperationInfoKHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyAccelerationStructureToMemoryInfoKHR-pNext-pNext)"},
- {"VUID-VkCopyAccelerationStructureToMemoryInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_COPY_ACCELERATION_STRUCTURE_TO_MEMORY_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyAccelerationStructureToMemoryInfoKHR-sType-sType)"},
- {"VUID-VkCopyAccelerationStructureToMemoryInfoKHR-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyAccelerationStructureToMemoryInfoKHR-sType-unique)"},
- {"VUID-VkCopyAccelerationStructureToMemoryInfoKHR-src-parameter", "src must be a valid VkAccelerationStructureKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyAccelerationStructureToMemoryInfoKHR-src-parameter)"},
- {"VUID-VkCopyDescriptorSet-commonparent", "Both of dstSet, and srcSet must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-commonparent)"},
- {"VUID-VkCopyDescriptorSet-dstArrayElement-00348", "The sum of dstArrayElement and descriptorCount must be less than or equal to the number of array elements in the descriptor set binding specified by dstBinding, and all applicable consecutive bindings, as described by consecutive binding updates (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-dstArrayElement-00348)"},
- {"VUID-VkCopyDescriptorSet-dstBinding-00347", "dstBinding must be a valid binding within dstSet (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-dstBinding-00347)"},
- {"VUID-VkCopyDescriptorSet-dstBinding-02224", "If the descriptor type of the descriptor set binding specified by dstBinding is VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, dstArrayElement must be an integer multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-dstBinding-02224)"},
- {"VUID-VkCopyDescriptorSet-dstBinding-02632", "The type of dstBinding within dstSet must be equal to the type of srcBinding within srcSet (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-dstBinding-02632)"},
- {"VUID-VkCopyDescriptorSet-dstBinding-02753", "If the descriptor type of the descriptor set binding specified by dstBinding is VK_DESCRIPTOR_TYPE_SAMPLER, then dstSet must not have been allocated with a layout that included immutable samplers for dstBinding (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-dstBinding-02753)"},
- {"VUID-VkCopyDescriptorSet-dstSet-parameter", "dstSet must be a valid VkDescriptorSet handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-dstSet-parameter)"},
- {"VUID-VkCopyDescriptorSet-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-pNext-pNext)"},
- {"VUID-VkCopyDescriptorSet-sType-sType", "sType must be VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-sType-sType)"},
- {"VUID-VkCopyDescriptorSet-srcArrayElement-00346", "The sum of srcArrayElement and descriptorCount must be less than or equal to the number of array elements in the descriptor set binding specified by srcBinding, and all applicable consecutive bindings, as described by consecutive binding updates (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-srcArrayElement-00346)"},
- {"VUID-VkCopyDescriptorSet-srcBinding-00345", "srcBinding must be a valid binding within srcSet (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-srcBinding-00345)"},
- {"VUID-VkCopyDescriptorSet-srcBinding-02223", "If the descriptor type of the descriptor set binding specified by srcBinding is VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, srcArrayElement must be an integer multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-srcBinding-02223)"},
- {"VUID-VkCopyDescriptorSet-srcBinding-02225", "If the descriptor type of the descriptor set binding specified by either srcBinding or dstBinding is VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, descriptorCount must be an integer multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-srcBinding-02225)"},
- {"VUID-VkCopyDescriptorSet-srcSet-00349", "If srcSet is equal to dstSet, then the source and destination ranges of descriptors must not overlap, where the ranges may include array elements from consecutive bindings as described by consecutive binding updates (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-srcSet-00349)"},
- {"VUID-VkCopyDescriptorSet-srcSet-01918", "If srcSet's layout was created with the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT flag set, then dstSet's layout must also have been created with the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT flag set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-srcSet-01918)"},
- {"VUID-VkCopyDescriptorSet-srcSet-01919", "If srcSet's layout was created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT flag set, then dstSet's layout must also have been created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT flag set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-srcSet-01919)"},
- {"VUID-VkCopyDescriptorSet-srcSet-01920", "If the descriptor pool from which srcSet was allocated was created with the VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT flag set, then the descriptor pool from which dstSet was allocated must also have been created with the VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT flag set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-srcSet-01920)"},
- {"VUID-VkCopyDescriptorSet-srcSet-01921", "If the descriptor pool from which srcSet was allocated was created without the VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT flag set, then the descriptor pool from which dstSet was allocated must also have been created without the VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT flag set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-srcSet-01921)"},
- {"VUID-VkCopyDescriptorSet-srcSet-parameter", "srcSet must be a valid VkDescriptorSet handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyDescriptorSet-srcSet-parameter)"},
- {"VUID-VkCopyMemoryToAccelerationStructureInfoKHR-dst-parameter", "dst must be a valid VkAccelerationStructureKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyMemoryToAccelerationStructureInfoKHR-dst-parameter)"},
- {"VUID-VkCopyMemoryToAccelerationStructureInfoKHR-mode-03413", "mode must be VK_COPY_ACCELERATION_STRUCTURE_MODE_DESERIALIZE_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyMemoryToAccelerationStructureInfoKHR-mode-03413)"},
- {"VUID-VkCopyMemoryToAccelerationStructureInfoKHR-mode-parameter", "mode must be a valid VkCopyAccelerationStructureModeKHR value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyMemoryToAccelerationStructureInfoKHR-mode-parameter)"},
- {"VUID-VkCopyMemoryToAccelerationStructureInfoKHR-pInfo-03414", "The data in pInfo->pname:src must have a format compatible with the destination physical device as returned by vkGetDeviceAccelerationStructureCompatibilityKHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyMemoryToAccelerationStructureInfoKHR-pInfo-03414)"},
- {"VUID-VkCopyMemoryToAccelerationStructureInfoKHR-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkDeferredOperationInfoKHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyMemoryToAccelerationStructureInfoKHR-pNext-pNext)"},
- {"VUID-VkCopyMemoryToAccelerationStructureInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_COPY_MEMORY_TO_ACCELERATION_STRUCTURE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyMemoryToAccelerationStructureInfoKHR-sType-sType)"},
- {"VUID-VkCopyMemoryToAccelerationStructureInfoKHR-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyMemoryToAccelerationStructureInfoKHR-sType-unique)"},
- {"VUID-VkCopyMemoryToAccelerationStructureInfoKHR-src-parameter", "src must be a valid VkDeviceOrHostAddressConstKHR union (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkCopyMemoryToAccelerationStructureInfoKHR-src-parameter)"},
- {"VUID-VkD3D12FenceSubmitInfoKHR-pSignalSemaphoreValues-parameter", "If signalSemaphoreValuesCount is not 0, and pSignalSemaphoreValues is not NULL, pSignalSemaphoreValues must be a valid pointer to an array of signalSemaphoreValuesCount uint64_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkD3D12FenceSubmitInfoKHR-pSignalSemaphoreValues-parameter)"},
- {"VUID-VkD3D12FenceSubmitInfoKHR-pWaitSemaphoreValues-parameter", "If waitSemaphoreValuesCount is not 0, and pWaitSemaphoreValues is not NULL, pWaitSemaphoreValues must be a valid pointer to an array of waitSemaphoreValuesCount uint64_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkD3D12FenceSubmitInfoKHR-pWaitSemaphoreValues-parameter)"},
- {"VUID-VkD3D12FenceSubmitInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkD3D12FenceSubmitInfoKHR-sType-sType)"},
- {"VUID-VkD3D12FenceSubmitInfoKHR-signalSemaphoreValuesCount-00080", "signalSemaphoreValuesCount must be the same value as VkSubmitInfo::signalSemaphoreCount, where VkSubmitInfo is in the pNext chain of this VkD3D12FenceSubmitInfoKHR structure. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkD3D12FenceSubmitInfoKHR-signalSemaphoreValuesCount-00080)"},
- {"VUID-VkD3D12FenceSubmitInfoKHR-waitSemaphoreValuesCount-00079", "waitSemaphoreValuesCount must be the same value as VkSubmitInfo::waitSemaphoreCount, where VkSubmitInfo is in the pNext chain of this VkD3D12FenceSubmitInfoKHR structure. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkD3D12FenceSubmitInfoKHR-waitSemaphoreValuesCount-00079)"},
- {"VUID-VkDebugMarkerMarkerInfoEXT-pMarkerName-parameter", "pMarkerName must be a null-terminated UTF-8 string (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugMarkerMarkerInfoEXT-pMarkerName-parameter)"},
- {"VUID-VkDebugMarkerMarkerInfoEXT-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugMarkerMarkerInfoEXT-pNext-pNext)"},
- {"VUID-VkDebugMarkerMarkerInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugMarkerMarkerInfoEXT-sType-sType)"},
- {"VUID-VkDebugMarkerObjectNameInfoEXT-object-01491", "object must not be VK_NULL_HANDLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugMarkerObjectNameInfoEXT-object-01491)"},
- {"VUID-VkDebugMarkerObjectNameInfoEXT-object-01492", "object must be a Vulkan object of the type associated with objectType as defined in VkDebugReportObjectTypeEXT and Vulkan Handle Relationship. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugMarkerObjectNameInfoEXT-object-01492)"},
- {"VUID-VkDebugMarkerObjectNameInfoEXT-objectType-01490", "objectType must not be VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugMarkerObjectNameInfoEXT-objectType-01490)"},
- {"VUID-VkDebugMarkerObjectNameInfoEXT-objectType-parameter", "objectType must be a valid VkDebugReportObjectTypeEXT value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugMarkerObjectNameInfoEXT-objectType-parameter)"},
- {"VUID-VkDebugMarkerObjectNameInfoEXT-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugMarkerObjectNameInfoEXT-pNext-pNext)"},
- {"VUID-VkDebugMarkerObjectNameInfoEXT-pObjectName-parameter", "pObjectName must be a null-terminated UTF-8 string (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugMarkerObjectNameInfoEXT-pObjectName-parameter)"},
- {"VUID-VkDebugMarkerObjectNameInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugMarkerObjectNameInfoEXT-sType-sType)"},
- {"VUID-VkDebugMarkerObjectTagInfoEXT-object-01494", "object must not be VK_NULL_HANDLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugMarkerObjectTagInfoEXT-object-01494)"},
- {"VUID-VkDebugMarkerObjectTagInfoEXT-object-01495", "object must be a Vulkan object of the type associated with objectType as defined in VkDebugReportObjectTypeEXT and Vulkan Handle Relationship. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugMarkerObjectTagInfoEXT-object-01495)"},
- {"VUID-VkDebugMarkerObjectTagInfoEXT-objectType-01493", "objectType must not be VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugMarkerObjectTagInfoEXT-objectType-01493)"},
- {"VUID-VkDebugMarkerObjectTagInfoEXT-objectType-parameter", "objectType must be a valid VkDebugReportObjectTypeEXT value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugMarkerObjectTagInfoEXT-objectType-parameter)"},
- {"VUID-VkDebugMarkerObjectTagInfoEXT-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugMarkerObjectTagInfoEXT-pNext-pNext)"},
- {"VUID-VkDebugMarkerObjectTagInfoEXT-pTag-parameter", "pTag must be a valid pointer to an array of tagSize bytes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugMarkerObjectTagInfoEXT-pTag-parameter)"},
- {"VUID-VkDebugMarkerObjectTagInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugMarkerObjectTagInfoEXT-sType-sType)"},
- {"VUID-VkDebugMarkerObjectTagInfoEXT-tagSize-arraylength", "tagSize must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugMarkerObjectTagInfoEXT-tagSize-arraylength)"},
- {"VUID-VkDebugReportCallbackCreateInfoEXT-flags-parameter", "flags must be a valid combination of VkDebugReportFlagBitsEXT values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugReportCallbackCreateInfoEXT-flags-parameter)"},
- {"VUID-VkDebugReportCallbackCreateInfoEXT-pfnCallback-parameter", "pfnCallback must be a valid PFN_vkDebugReportCallbackEXT value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugReportCallbackCreateInfoEXT-pfnCallback-parameter)"},
- {"VUID-VkDebugReportCallbackCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugReportCallbackCreateInfoEXT-sType-sType)"},
- {"VUID-VkDebugUtilsLabelEXT-pLabelName-parameter", "pLabelName must be a null-terminated UTF-8 string (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsLabelEXT-pLabelName-parameter)"},
- {"VUID-VkDebugUtilsLabelEXT-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsLabelEXT-pNext-pNext)"},
- {"VUID-VkDebugUtilsLabelEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsLabelEXT-sType-sType)"},
- {"VUID-VkDebugUtilsMessengerCallbackDataEXT-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCallbackDataEXT-flags-zerobitmask)"},
- {"VUID-VkDebugUtilsMessengerCallbackDataEXT-pCmdBufLabels-parameter", "If cmdBufLabelCount is not 0, pCmdBufLabels must be a valid pointer to an array of cmdBufLabelCount valid VkDebugUtilsLabelEXT structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCallbackDataEXT-pCmdBufLabels-parameter)"},
- {"VUID-VkDebugUtilsMessengerCallbackDataEXT-pMessage-parameter", "pMessage must be a null-terminated UTF-8 string (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCallbackDataEXT-pMessage-parameter)"},
- {"VUID-VkDebugUtilsMessengerCallbackDataEXT-pMessageIdName-parameter", "If pMessageIdName is not NULL, pMessageIdName must be a null-terminated UTF-8 string (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCallbackDataEXT-pMessageIdName-parameter)"},
- {"VUID-VkDebugUtilsMessengerCallbackDataEXT-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCallbackDataEXT-pNext-pNext)"},
- {"VUID-VkDebugUtilsMessengerCallbackDataEXT-pObjects-parameter", "If objectCount is not 0, pObjects must be a valid pointer to an array of objectCount valid VkDebugUtilsObjectNameInfoEXT structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCallbackDataEXT-pObjects-parameter)"},
- {"VUID-VkDebugUtilsMessengerCallbackDataEXT-pQueueLabels-parameter", "If queueLabelCount is not 0, pQueueLabels must be a valid pointer to an array of queueLabelCount valid VkDebugUtilsLabelEXT structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCallbackDataEXT-pQueueLabels-parameter)"},
- {"VUID-VkDebugUtilsMessengerCallbackDataEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCallbackDataEXT-sType-sType)"},
- {"VUID-VkDebugUtilsMessengerCreateInfoEXT-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-flags-zerobitmask)"},
- {"VUID-VkDebugUtilsMessengerCreateInfoEXT-messageSeverity-parameter", "messageSeverity must be a valid combination of VkDebugUtilsMessageSeverityFlagBitsEXT values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-messageSeverity-parameter)"},
- {"VUID-VkDebugUtilsMessengerCreateInfoEXT-messageSeverity-requiredbitmask", "messageSeverity must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-messageSeverity-requiredbitmask)"},
- {"VUID-VkDebugUtilsMessengerCreateInfoEXT-messageType-parameter", "messageType must be a valid combination of VkDebugUtilsMessageTypeFlagBitsEXT values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-messageType-parameter)"},
- {"VUID-VkDebugUtilsMessengerCreateInfoEXT-messageType-requiredbitmask", "messageType must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-messageType-requiredbitmask)"},
- {"VUID-VkDebugUtilsMessengerCreateInfoEXT-pfnUserCallback-01914", "pfnUserCallback must be a valid PFN_vkDebugUtilsMessengerCallbackEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-pfnUserCallback-01914)"},
- {"VUID-VkDebugUtilsMessengerCreateInfoEXT-pfnUserCallback-parameter", "pfnUserCallback must be a valid PFN_vkDebugUtilsMessengerCallbackEXT value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-pfnUserCallback-parameter)"},
- {"VUID-VkDebugUtilsMessengerCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsMessengerCreateInfoEXT-sType-sType)"},
- {"VUID-VkDebugUtilsObjectNameInfoEXT-objectType-02589", "If objectType is VK_OBJECT_TYPE_UNKNOWN, objectHandle must not be VK_NULL_HANDLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectNameInfoEXT-objectType-02589)"},
- {"VUID-VkDebugUtilsObjectNameInfoEXT-objectType-02590", "If objectType is not VK_OBJECT_TYPE_UNKNOWN, objectHandle must be VK_NULL_HANDLE or a valid Vulkan handle of the type associated with objectType as defined in the VkObjectType and Vulkan Handle Relationship table (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectNameInfoEXT-objectType-02590)"},
- {"VUID-VkDebugUtilsObjectNameInfoEXT-objectType-parameter", "objectType must be a valid VkObjectType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectNameInfoEXT-objectType-parameter)"},
- {"VUID-VkDebugUtilsObjectNameInfoEXT-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectNameInfoEXT-pNext-pNext)"},
- {"VUID-VkDebugUtilsObjectNameInfoEXT-pObjectName-parameter", "pObjectName must be a null-terminated UTF-8 string (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectNameInfoEXT-pObjectName-parameter)"},
- {"VUID-VkDebugUtilsObjectNameInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectNameInfoEXT-sType-sType)"},
- {"VUID-VkDebugUtilsObjectTagInfoEXT-objectHandle-01910", "objectHandle must be a valid Vulkan handle of the type associated with objectType as defined in the VkObjectType and Vulkan Handle Relationship table (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-objectHandle-01910)"},
- {"VUID-VkDebugUtilsObjectTagInfoEXT-objectType-01908", "objectType must not be VK_OBJECT_TYPE_UNKNOWN (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-objectType-01908)"},
- {"VUID-VkDebugUtilsObjectTagInfoEXT-objectType-parameter", "objectType must be a valid VkObjectType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-objectType-parameter)"},
- {"VUID-VkDebugUtilsObjectTagInfoEXT-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-pNext-pNext)"},
- {"VUID-VkDebugUtilsObjectTagInfoEXT-pTag-parameter", "pTag must be a valid pointer to an array of tagSize bytes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-pTag-parameter)"},
- {"VUID-VkDebugUtilsObjectTagInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-sType-sType)"},
- {"VUID-VkDebugUtilsObjectTagInfoEXT-tagSize-arraylength", "tagSize must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDebugUtilsObjectTagInfoEXT-tagSize-arraylength)"},
- {"VUID-VkDedicatedAllocationBufferCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDedicatedAllocationBufferCreateInfoNV-sType-sType)"},
- {"VUID-VkDedicatedAllocationImageCreateInfoNV-dedicatedAllocation-00994", "If dedicatedAllocation is VK_TRUE, VkImageCreateInfo::flags must not include VK_IMAGE_CREATE_SPARSE_BINDING_BIT, VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT, or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDedicatedAllocationImageCreateInfoNV-dedicatedAllocation-00994)"},
- {"VUID-VkDedicatedAllocationImageCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDedicatedAllocationImageCreateInfoNV-sType-sType)"},
- {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-00651", "If buffer is not VK_NULL_HANDLE, the buffer must have been created with VkDedicatedAllocationBufferCreateInfoNV::dedicatedAllocation equal to VK_TRUE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-00651)"},
- {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-00653", "If buffer is not VK_NULL_HANDLE, VkMemoryAllocateInfo::allocationSize must equal the VkMemoryRequirements::size of the buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-00653)"},
- {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-00655", "If buffer is not VK_NULL_HANDLE and VkMemoryAllocateInfo defines a memory import operation, the memory being imported must also be a dedicated buffer allocation and buffer must be identical to the buffer associated with the imported memory. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-00655)"},
- {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-parameter", "If buffer is not VK_NULL_HANDLE, buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-parameter)"},
- {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-commonparent", "Both of buffer, and image that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDedicatedAllocationMemoryAllocateInfoNV-commonparent)"},
- {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00649", "At least one of image and buffer must be VK_NULL_HANDLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00649)"},
- {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00650", "If image is not VK_NULL_HANDLE, the image must have been created with VkDedicatedAllocationImageCreateInfoNV::dedicatedAllocation equal to VK_TRUE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00650)"},
- {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00652", "If image is not VK_NULL_HANDLE, VkMemoryAllocateInfo::allocationSize must equal the VkMemoryRequirements::size of the image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00652)"},
- {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00654", "If image is not VK_NULL_HANDLE and VkMemoryAllocateInfo defines a memory import operation, the memory being imported must also be a dedicated image allocation and image must be identical to the image associated with the imported memory. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00654)"},
- {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-parameter", "If image is not VK_NULL_HANDLE, image must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-parameter)"},
- {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDedicatedAllocationMemoryAllocateInfoNV-sType-sType)"},
- {"VUID-VkDeferredOperationInfoKHR-operationHandle-03433", "Any previous deferred operation that was associated with operationHandle must be complete (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeferredOperationInfoKHR-operationHandle-03433)"},
- {"VUID-VkDeferredOperationInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEFERRED_OPERATION_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeferredOperationInfoKHR-sType-sType)"},
- {"VUID-VkDescriptorBufferInfo-buffer-parameter", "buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorBufferInfo-buffer-parameter)"},
- {"VUID-VkDescriptorBufferInfo-offset-00340", "offset must be less than the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorBufferInfo-offset-00340)"},
- {"VUID-VkDescriptorBufferInfo-range-00341", "If range is not equal to VK_WHOLE_SIZE, range must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorBufferInfo-range-00341)"},
- {"VUID-VkDescriptorBufferInfo-range-00342", "If range is not equal to VK_WHOLE_SIZE, range must be less than or equal to the size of buffer minus offset (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorBufferInfo-range-00342)"},
- {"VUID-VkDescriptorImageInfo-commonparent", "Both of imageView, and sampler that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorImageInfo-commonparent)"},
- {"VUID-VkDescriptorImageInfo-imageLayout-00344", "imageLayout must match the actual VkImageLayout of each subresource accessible from imageView at the time this descriptor is accessed as defined by the image layout matching rules (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorImageInfo-imageLayout-00344)"},
- {"VUID-VkDescriptorImageInfo-imageView-00343", "imageView must not be 2D or 2D array image view created from a 3D image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorImageInfo-imageView-00343)"},
- {"VUID-VkDescriptorImageInfo-imageView-01976", "If imageView is created from a depth/stencil image, the aspectMask used to create the imageView must include either VK_IMAGE_ASPECT_DEPTH_BIT or VK_IMAGE_ASPECT_STENCIL_BIT but not both. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorImageInfo-imageView-01976)"},
- {"VUID-VkDescriptorImageInfo-sampler-01564", "If sampler is used and the VkFormat of the image is a multi-planar format, the image must have been created with VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT, and the aspectMask of the imageView must be VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT or (for three-plane formats only) VK_IMAGE_ASPECT_PLANE_2_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorImageInfo-sampler-01564)"},
- {"VUID-VkDescriptorPoolCreateInfo-flags-parameter", "flags must be a valid combination of VkDescriptorPoolCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorPoolCreateInfo-flags-parameter)"},
- {"VUID-VkDescriptorPoolCreateInfo-maxSets-00301", "maxSets must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorPoolCreateInfo-maxSets-00301)"},
- {"VUID-VkDescriptorPoolCreateInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkDescriptorPoolInlineUniformBlockCreateInfoEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorPoolCreateInfo-pNext-pNext)"},
- {"VUID-VkDescriptorPoolCreateInfo-pPoolSizes-parameter", "pPoolSizes must be a valid pointer to an array of poolSizeCount valid VkDescriptorPoolSize structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorPoolCreateInfo-pPoolSizes-parameter)"},
- {"VUID-VkDescriptorPoolCreateInfo-poolSizeCount-arraylength", "poolSizeCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorPoolCreateInfo-poolSizeCount-arraylength)"},
- {"VUID-VkDescriptorPoolCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorPoolCreateInfo-sType-sType)"},
- {"VUID-VkDescriptorPoolCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorPoolCreateInfo-sType-unique)"},
- {"VUID-VkDescriptorPoolInlineUniformBlockCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorPoolInlineUniformBlockCreateInfoEXT-sType-sType)"},
- {"VUID-VkDescriptorPoolSize-descriptorCount-00302", "descriptorCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorPoolSize-descriptorCount-00302)"},
- {"VUID-VkDescriptorPoolSize-type-02218", "If type is VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then descriptorCount must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorPoolSize-type-02218)"},
- {"VUID-VkDescriptorPoolSize-type-parameter", "type must be a valid VkDescriptorType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorPoolSize-type-parameter)"},
- {"VUID-VkDescriptorSetAllocateInfo-commonparent", "Both of descriptorPool, and the elements of pSetLayouts must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-commonparent)"},
- {"VUID-VkDescriptorSetAllocateInfo-descriptorPool-00307", "descriptorPool must have enough free descriptor capacity remaining to allocate the descriptor sets of the specified layouts (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-descriptorPool-00307)"},
- {"VUID-VkDescriptorSetAllocateInfo-descriptorPool-parameter", "descriptorPool must be a valid VkDescriptorPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-descriptorPool-parameter)"},
- {"VUID-VkDescriptorSetAllocateInfo-descriptorSetCount-00306", "descriptorSetCount must not be greater than the number of sets that are currently available for allocation in descriptorPool (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-descriptorSetCount-00306)"},
- {"VUID-VkDescriptorSetAllocateInfo-descriptorSetCount-arraylength", "descriptorSetCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-descriptorSetCount-arraylength)"},
- {"VUID-VkDescriptorSetAllocateInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkDescriptorSetVariableDescriptorCountAllocateInfo (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-pNext-pNext)"},
- {"VUID-VkDescriptorSetAllocateInfo-pSetLayouts-00308", "Each element of pSetLayouts must not have been created with VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-pSetLayouts-00308)"},
- {"VUID-VkDescriptorSetAllocateInfo-pSetLayouts-03044", "If any element of pSetLayouts was created with the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set, descriptorPool must have been created with the VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT flag set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-pSetLayouts-03044)"},
- {"VUID-VkDescriptorSetAllocateInfo-pSetLayouts-parameter", "pSetLayouts must be a valid pointer to an array of descriptorSetCount valid VkDescriptorSetLayout handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-pSetLayouts-parameter)"},
- {"VUID-VkDescriptorSetAllocateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-sType-sType)"},
- {"VUID-VkDescriptorSetAllocateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetAllocateInfo-sType-unique)"},
- {"VUID-VkDescriptorSetLayoutBinding-descriptorCount-00283", "If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBinding-descriptorCount-00283)"},
- {"VUID-VkDescriptorSetLayoutBinding-descriptorType-00282", "If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a valid pointer to an array of descriptorCount valid VkSampler handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBinding-descriptorType-00282)"},
- {"VUID-VkDescriptorSetLayoutBinding-descriptorType-01510", "If descriptorType is VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT and descriptorCount is not 0, then stageFlags must be 0 or VK_SHADER_STAGE_FRAGMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBinding-descriptorType-01510)"},
- {"VUID-VkDescriptorSetLayoutBinding-descriptorType-02209", "If descriptorType is VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then descriptorCount must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBinding-descriptorType-02209)"},
- {"VUID-VkDescriptorSetLayoutBinding-descriptorType-02210", "If descriptorType is VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then descriptorCount must be less than or equal to VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxInlineUniformBlockSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBinding-descriptorType-02210)"},
- {"VUID-VkDescriptorSetLayoutBinding-descriptorType-parameter", "descriptorType must be a valid VkDescriptorType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBinding-descriptorType-parameter)"},
- {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-None-03011", "All bindings with descriptor type VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-None-03011)"},
- {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-bindingCount-03002", "If bindingCount is not zero, bindingCount must equal VkDescriptorSetLayoutCreateInfo::bindingCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-bindingCount-03002)"},
- {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingInlineUniformBlockUpdateAfterBind-02211", "If VkPhysicalDeviceInlineUniformBlockFeaturesEXT::descriptorBindingInlineUniformBlockUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingInlineUniformBlockUpdateAfterBind-02211)"},
- {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingPartiallyBound-03013", "If VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingPartiallyBound is not enabled, all elements of pBindingFlags must not include VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingPartiallyBound-03013)"},
- {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingSampledImageUpdateAfterBind-03006", "If VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingSampledImageUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, or VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingSampledImageUpdateAfterBind-03006)"},
- {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingStorageBufferUpdateAfterBind-03008", "If VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingStorageBufferUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_STORAGE_BUFFER must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingStorageBufferUpdateAfterBind-03008)"},
- {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingStorageImageUpdateAfterBind-03007", "If VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingStorageImageUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_STORAGE_IMAGE must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingStorageImageUpdateAfterBind-03007)"},
- {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingStorageTexelBufferUpdateAfterBind-03010", "If VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingStorageTexelBufferUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingStorageTexelBufferUpdateAfterBind-03010)"},
- {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingUniformBufferUpdateAfterBind-03005", "If VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingUniformBufferUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingUniformBufferUpdateAfterBind-03005)"},
- {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingUniformTexelBufferUpdateAfterBind-03009", "If VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingUniformTexelBufferUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingUniformTexelBufferUpdateAfterBind-03009)"},
- {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingUpdateUnusedWhilePending-03012", "If VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingUpdateUnusedWhilePending is not enabled, all elements of pBindingFlags must not include VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingUpdateUnusedWhilePending-03012)"},
- {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingVariableDescriptorCount-03014", "If VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingVariableDescriptorCount is not enabled, all elements of pBindingFlags must not include VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingVariableDescriptorCount-03014)"},
- {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-flags-03003", "If VkDescriptorSetLayoutCreateInfo::flags includes VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, then all elements of pBindingFlags must not include VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT, VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT, or VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-flags-03003)"},
- {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-pBindingFlags-03004", "If an element of pBindingFlags includes VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT, then all other elements of VkDescriptorSetLayoutCreateInfo::pBindings must have a smaller value of binding (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-pBindingFlags-03004)"},
- {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-pBindingFlags-03015", "If an element of pBindingFlags includes VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT, that element's descriptorType must not be VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-pBindingFlags-03015)"},
- {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-pBindingFlags-parameter", "If bindingCount is not 0, and pBindingFlags is not NULL, pBindingFlags must be a valid pointer to an array of bindingCount valid combinations of VkDescriptorBindingFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-pBindingFlags-parameter)"},
- {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-sType-sType)"},
- {"VUID-VkDescriptorSetLayoutCreateInfo-binding-00279", "The VkDescriptorSetLayoutBinding::binding members of the elements of the pBindings array must each have different values. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-binding-00279)"},
- {"VUID-VkDescriptorSetLayoutCreateInfo-descriptorType-03001", "If any binding has the VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT bit set, then all bindings must not have descriptorType of VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-descriptorType-03001)"},
- {"VUID-VkDescriptorSetLayoutCreateInfo-flags-00280", "If flags contains VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, then all elements of pBindings must not have a descriptorType of VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-flags-00280)"},
- {"VUID-VkDescriptorSetLayoutCreateInfo-flags-00281", "If flags contains VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, then the total number of elements of all bindings must be less than or equal to VkPhysicalDevicePushDescriptorPropertiesKHR::maxPushDescriptors (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-flags-00281)"},
- {"VUID-VkDescriptorSetLayoutCreateInfo-flags-02208", "If flags contains VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, then all elements of pBindings must not have a descriptorType of VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-flags-02208)"},
- {"VUID-VkDescriptorSetLayoutCreateInfo-flags-03000", "If any binding has the VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT bit set, flags must include VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-flags-03000)"},
- {"VUID-VkDescriptorSetLayoutCreateInfo-flags-parameter", "flags must be a valid combination of VkDescriptorSetLayoutCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-flags-parameter)"},
- {"VUID-VkDescriptorSetLayoutCreateInfo-pBindings-parameter", "If bindingCount is not 0, pBindings must be a valid pointer to an array of bindingCount valid VkDescriptorSetLayoutBinding structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-pBindings-parameter)"},
- {"VUID-VkDescriptorSetLayoutCreateInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkDescriptorSetLayoutBindingFlagsCreateInfo (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-pNext-pNext)"},
- {"VUID-VkDescriptorSetLayoutCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-sType-sType)"},
- {"VUID-VkDescriptorSetLayoutCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutCreateInfo-sType-unique)"},
- {"VUID-VkDescriptorSetLayoutSupport-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkDescriptorSetVariableDescriptorCountLayoutSupport (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutSupport-pNext-pNext)"},
- {"VUID-VkDescriptorSetLayoutSupport-sType-sType", "sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutSupport-sType-sType)"},
- {"VUID-VkDescriptorSetLayoutSupport-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetLayoutSupport-sType-unique)"},
- {"VUID-VkDescriptorSetVariableDescriptorCountAllocateInfo-descriptorSetCount-03045", "If descriptorSetCount is not zero, descriptorSetCount must equal VkDescriptorSetAllocateInfo::descriptorSetCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetVariableDescriptorCountAllocateInfo-descriptorSetCount-03045)"},
- {"VUID-VkDescriptorSetVariableDescriptorCountAllocateInfo-pDescriptorCounts-parameter", "If descriptorSetCount is not 0, pDescriptorCounts must be a valid pointer to an array of descriptorSetCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetVariableDescriptorCountAllocateInfo-pDescriptorCounts-parameter)"},
- {"VUID-VkDescriptorSetVariableDescriptorCountAllocateInfo-pSetLayouts-03046", "If VkDescriptorSetAllocateInfo::pSetLayouts[i] has a variable descriptor count binding, then pDescriptorCounts[i] must be less than or equal to the descriptor count specified for that binding when the descriptor set layout was created. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetVariableDescriptorCountAllocateInfo-pSetLayouts-03046)"},
- {"VUID-VkDescriptorSetVariableDescriptorCountAllocateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetVariableDescriptorCountAllocateInfo-sType-sType)"},
- {"VUID-VkDescriptorSetVariableDescriptorCountLayoutSupport-sType-sType", "sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorSetVariableDescriptorCountLayoutSupport-sType-sType)"},
- {"VUID-VkDescriptorUpdateTemplateCreateInfo-commonparent", "Both of descriptorSetLayout, and pipelineLayout that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-commonparent)"},
- {"VUID-VkDescriptorUpdateTemplateCreateInfo-descriptorUpdateEntryCount-arraylength", "descriptorUpdateEntryCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-descriptorUpdateEntryCount-arraylength)"},
- {"VUID-VkDescriptorUpdateTemplateCreateInfo-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-flags-zerobitmask)"},
- {"VUID-VkDescriptorUpdateTemplateCreateInfo-pDescriptorUpdateEntries-parameter", "pDescriptorUpdateEntries must be a valid pointer to an array of descriptorUpdateEntryCount valid VkDescriptorUpdateTemplateEntry structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-pDescriptorUpdateEntries-parameter)"},
- {"VUID-VkDescriptorUpdateTemplateCreateInfo-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-pNext-pNext)"},
- {"VUID-VkDescriptorUpdateTemplateCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-sType-sType)"},
- {"VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00350", "If templateType is VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET, descriptorSetLayout must be a valid VkDescriptorSetLayout handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00350)"},
- {"VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00351", "If templateType is VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, pipelineBindPoint must be a valid VkPipelineBindPoint value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00351)"},
- {"VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00352", "If templateType is VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, pipelineLayout must be a valid VkPipelineLayout handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00352)"},
- {"VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00353", "If templateType is VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, set must be the unique set number in the pipeline layout that uses a descriptor set layout that was created with VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00353)"},
- {"VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-parameter", "templateType must be a valid VkDescriptorUpdateTemplateType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-parameter)"},
- {"VUID-VkDescriptorUpdateTemplateEntry-descriptor-02226", "If descriptor type is VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, dstArrayElement must be an integer multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateEntry-descriptor-02226)"},
- {"VUID-VkDescriptorUpdateTemplateEntry-descriptor-02227", "If descriptor type is VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, descriptorCount must be an integer multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateEntry-descriptor-02227)"},
- {"VUID-VkDescriptorUpdateTemplateEntry-descriptorType-parameter", "descriptorType must be a valid VkDescriptorType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateEntry-descriptorType-parameter)"},
- {"VUID-VkDescriptorUpdateTemplateEntry-dstArrayElement-00355", "dstArrayElement and descriptorCount must be less than or equal to the number of array elements in the descriptor set binding implicitly specified when using a descriptor update template to update descriptors, and all applicable consecutive bindings, as described by consecutive binding updates (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateEntry-dstArrayElement-00355)"},
- {"VUID-VkDescriptorUpdateTemplateEntry-dstBinding-00354", "dstBinding must be a valid binding in the descriptor set layout implicitly specified when using a descriptor update template to update descriptors. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDescriptorUpdateTemplateEntry-dstBinding-00354)"},
- {"VUID-VkDeviceCreateInfo-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceCreateInfo-flags-zerobitmask)"},
- {"VUID-VkDeviceCreateInfo-pEnabledFeatures-parameter", "If pEnabledFeatures is not NULL, pEnabledFeatures must be a valid pointer to a valid VkPhysicalDeviceFeatures structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceCreateInfo-pEnabledFeatures-parameter)"},
- {"VUID-VkDeviceCreateInfo-pNext-00373", "If the pNext chain includes a VkPhysicalDeviceFeatures2 structure, then pEnabledFeatures must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceCreateInfo-pNext-00373)"},
- {"VUID-VkDeviceCreateInfo-pNext-02829", "If the pNext chain includes a VkPhysicalDeviceVulkan11Features structure, then it must not include a VkPhysicalDevice16BitStorageFeatures, VkPhysicalDeviceMultiviewFeatures, VkPhysicalDeviceVariablePointersFeatures, VkPhysicalDeviceProtectedMemoryFeatures, VkPhysicalDeviceSamplerYcbcrConversionFeatures, or VkPhysicalDeviceShaderDrawParametersFeatures structure (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkDeviceCreateInfo-pNext-02829)"},
- {"VUID-VkDeviceCreateInfo-pNext-02830", "If the pNext chain includes a VkPhysicalDeviceVulkan12Features structure, then it must not include a VkPhysicalDevice8BitStorageFeatures, VkPhysicalDeviceShaderAtomicInt64Features, VkPhysicalDeviceShaderFloat16Int8Features, VkPhysicalDeviceDescriptorIndexingFeatures, VkPhysicalDeviceScalarBlockLayoutFeatures, VkPhysicalDeviceImagelessFramebufferFeatures, VkPhysicalDeviceUniformBufferStandardLayoutFeatures, VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures, VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures, VkPhysicalDeviceHostQueryResetFeatures, VkPhysicalDeviceTimelineSemaphoreFeatures, VkPhysicalDeviceBufferDeviceAddressFeatures, or VkPhysicalDeviceVulkanMemoryModelFeatures structure (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkDeviceCreateInfo-pNext-02830)"},
- {"VUID-VkDeviceCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkDeviceDiagnosticsConfigCreateInfoNV, VkDeviceGroupDeviceCreateInfo, VkDeviceMemoryOverallocationCreateInfoAMD, VkPhysicalDevice16BitStorageFeatures, VkPhysicalDevice8BitStorageFeatures, VkPhysicalDeviceASTCDecodeFeaturesEXT, VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT, VkPhysicalDeviceBufferDeviceAddressFeatures, VkPhysicalDeviceBufferDeviceAddressFeaturesEXT, VkPhysicalDeviceCoherentMemoryFeaturesAMD, VkPhysicalDeviceComputeShaderDerivativesFeaturesNV, VkPhysicalDeviceConditionalRenderingFeaturesEXT, VkPhysicalDeviceCooperativeMatrixFeaturesNV, VkPhysicalDeviceCornerSampledImageFeaturesNV, VkPhysicalDeviceCoverageReductionModeFeaturesNV, VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV, VkPhysicalDeviceDepthClipEnableFeaturesEXT, VkPhysicalDeviceDescriptorIndexingFeatures, VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV, VkPhysicalDeviceDiagnosticsConfigFeaturesNV, VkPhysicalDeviceExclusiveScissorFeaturesNV, VkPhysicalDeviceFeatures2, VkPhysicalDeviceFragmentDensityMapFeaturesEXT, VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV, VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT, VkPhysicalDeviceHostQueryResetFeatures, VkPhysicalDeviceImagelessFramebufferFeatures, VkPhysicalDeviceIndexTypeUint8FeaturesEXT, VkPhysicalDeviceInlineUniformBlockFeaturesEXT, VkPhysicalDeviceLineRasterizationFeaturesEXT, VkPhysicalDeviceMemoryPriorityFeaturesEXT, VkPhysicalDeviceMeshShaderFeaturesNV, VkPhysicalDeviceMultiviewFeatures, VkPhysicalDevicePerformanceQueryFeaturesKHR, VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT, VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR, VkPhysicalDeviceProtectedMemoryFeatures, VkPhysicalDeviceRayTracingFeaturesKHR, VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV, VkPhysicalDeviceSamplerYcbcrConversionFeatures, VkPhysicalDeviceScalarBlockLayoutFeatures, VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures, VkPhysicalDeviceShaderAtomicInt64Features, VkPhysicalDeviceShaderClockFeaturesKHR, VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT, VkPhysicalDeviceShaderDrawParametersFeatures, VkPhysicalDeviceShaderFloat16Int8Features, VkPhysicalDeviceShaderImageFootprintFeaturesNV, VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL, VkPhysicalDeviceShaderSMBuiltinsFeaturesNV, VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures, VkPhysicalDeviceShadingRateImageFeaturesNV, VkPhysicalDeviceSubgroupSizeControlFeaturesEXT, VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT, VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT, VkPhysicalDeviceTimelineSemaphoreFeatures, VkPhysicalDeviceTransformFeedbackFeaturesEXT, VkPhysicalDeviceUniformBufferStandardLayoutFeatures, VkPhysicalDeviceVariablePointersFeatures, VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT, VkPhysicalDeviceVulkan11Features, VkPhysicalDeviceVulkan12Features, VkPhysicalDeviceVulkanMemoryModelFeatures, or VkPhysicalDeviceYcbcrImageArraysFeaturesEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceCreateInfo-pNext-pNext)"},
- {"VUID-VkDeviceCreateInfo-pQueueCreateInfos-parameter", "pQueueCreateInfos must be a valid pointer to an array of queueCreateInfoCount valid VkDeviceQueueCreateInfo structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceCreateInfo-pQueueCreateInfos-parameter)"},
- {"VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-00374", "ppEnabledExtensionNames must not contain both VK_KHR_maintenance1 and VK_AMD_negative_viewport_height (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-00374)"},
- {"VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-01840", "ppEnabledExtensionNames must not contain VK_AMD_negative_viewport_height (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-01840)"},
- {"VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-03328", "ppEnabledExtensionNames must not contain both VK_KHR_buffer_device_address and VK_EXT_buffer_device_address (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-03328)"},
- {"VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-parameter", "If enabledExtensionCount is not 0, ppEnabledExtensionNames must be a valid pointer to an array of enabledExtensionCount null-terminated UTF-8 strings (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-parameter)"},
- {"VUID-VkDeviceCreateInfo-ppEnabledExtensions-02831", "If ppEnabledExtensions contains \"VK_KHR_draw_indirect_count\" and the pNext chain includes a VkPhysicalDeviceVulkan12Features structure, then VkPhysicalDeviceVulkan12Features::drawIndirectCount must be VK_TRUE (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkDeviceCreateInfo-ppEnabledExtensions-02831)"},
- {"VUID-VkDeviceCreateInfo-ppEnabledExtensions-02832", "If ppEnabledExtensions contains \"VK_KHR_sampler_mirror_clamp_to_edge\" and the pNext chain includes a VkPhysicalDeviceVulkan12Features structure, then VkPhysicalDeviceVulkan12Features::samplerMirrorClampToEdge must be VK_TRUE (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkDeviceCreateInfo-ppEnabledExtensions-02832)"},
- {"VUID-VkDeviceCreateInfo-ppEnabledExtensions-02833", "If ppEnabledExtensions contains \"VK_EXT_descriptor_indexing\" and the pNext chain includes a VkPhysicalDeviceVulkan12Features structure, then VkPhysicalDeviceVulkan12Features::descriptorIndexing must be VK_TRUE (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkDeviceCreateInfo-ppEnabledExtensions-02833)"},
- {"VUID-VkDeviceCreateInfo-ppEnabledExtensions-02834", "If ppEnabledExtensions contains \"VK_EXT_sampler_filter_minmax\" and the pNext chain includes a VkPhysicalDeviceVulkan12Features structure, then VkPhysicalDeviceVulkan12Features::samplerFilterMinmax must be VK_TRUE (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkDeviceCreateInfo-ppEnabledExtensions-02834)"},
- {"VUID-VkDeviceCreateInfo-ppEnabledExtensions-02835", "If ppEnabledExtensions contains \"VK_EXT_shader_viewport_index_layer\" and the pNext chain includes a VkPhysicalDeviceVulkan12Features structure, then VkPhysicalDeviceVulkan12Features::shaderOutputViewportIndex and VkPhysicalDeviceVulkan12Features::shaderOutputLayer must both be VK_TRUE (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkDeviceCreateInfo-ppEnabledExtensions-02835)"},
- {"VUID-VkDeviceCreateInfo-ppEnabledLayerNames-parameter", "If enabledLayerCount is not 0, ppEnabledLayerNames must be a valid pointer to an array of enabledLayerCount null-terminated UTF-8 strings (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceCreateInfo-ppEnabledLayerNames-parameter)"},
- {"VUID-VkDeviceCreateInfo-queueCreateInfoCount-arraylength", "queueCreateInfoCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceCreateInfo-queueCreateInfoCount-arraylength)"},
- {"VUID-VkDeviceCreateInfo-queueFamilyIndex-00372", "The queueFamilyIndex member of each element of pQueueCreateInfos must be unique within pQueueCreateInfos (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkDeviceCreateInfo-queueFamilyIndex-00372)"},
- {"VUID-VkDeviceCreateInfo-queueFamilyIndex-02802", "The queueFamilyIndex member of each element of pQueueCreateInfos must be unique within pQueueCreateInfos, except that two members can share the same queueFamilyIndex if one is a protected-capable queue and one is not a protected-capable queue (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceCreateInfo-queueFamilyIndex-02802)"},
- {"VUID-VkDeviceCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceCreateInfo-sType-sType)"},
- {"VUID-VkDeviceCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceCreateInfo-sType-unique)"},
- {"VUID-VkDeviceDiagnosticsConfigCreateInfoNV-flags-parameter", "flags must be a valid combination of VkDeviceDiagnosticsConfigFlagBitsNV values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceDiagnosticsConfigCreateInfoNV-flags-parameter)"},
- {"VUID-VkDeviceDiagnosticsConfigCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceDiagnosticsConfigCreateInfoNV-sType-sType)"},
- {"VUID-VkDeviceEventInfoEXT-deviceEvent-parameter", "deviceEvent must be a valid VkDeviceEventTypeEXT value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceEventInfoEXT-deviceEvent-parameter)"},
- {"VUID-VkDeviceEventInfoEXT-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceEventInfoEXT-pNext-pNext)"},
- {"VUID-VkDeviceEventInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_EVENT_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceEventInfoEXT-sType-sType)"},
- {"VUID-VkDeviceGroupBindSparseInfo-memoryDeviceIndex-01119", "Each memory allocation bound in this batch must have allocated an instance for memoryDeviceIndex. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupBindSparseInfo-memoryDeviceIndex-01119)"},
- {"VUID-VkDeviceGroupBindSparseInfo-resourceDeviceIndex-01118", "resourceDeviceIndex and memoryDeviceIndex must both be valid device indices. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupBindSparseInfo-resourceDeviceIndex-01118)"},
- {"VUID-VkDeviceGroupBindSparseInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupBindSparseInfo-sType-sType)"},
- {"VUID-VkDeviceGroupCommandBufferBeginInfo-deviceMask-00106", "deviceMask must be a valid device mask value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupCommandBufferBeginInfo-deviceMask-00106)"},
- {"VUID-VkDeviceGroupCommandBufferBeginInfo-deviceMask-00107", "deviceMask must not be zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupCommandBufferBeginInfo-deviceMask-00107)"},
- {"VUID-VkDeviceGroupCommandBufferBeginInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupCommandBufferBeginInfo-sType-sType)"},
- {"VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-00375", "Each element of pPhysicalDevices must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-00375)"},
- {"VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-00376", "All elements of pPhysicalDevices must be in the same device group as enumerated by vkEnumeratePhysicalDeviceGroups (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-00376)"},
- {"VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-parameter", "If physicalDeviceCount is not 0, pPhysicalDevices must be a valid pointer to an array of physicalDeviceCount valid VkPhysicalDevice handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-parameter)"},
- {"VUID-VkDeviceGroupDeviceCreateInfo-physicalDeviceCount-00377", "If physicalDeviceCount is not 0, the physicalDevice parameter of vkCreateDevice must be an element of pPhysicalDevices. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupDeviceCreateInfo-physicalDeviceCount-00377)"},
- {"VUID-VkDeviceGroupDeviceCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupDeviceCreateInfo-sType-sType)"},
- {"VUID-VkDeviceGroupPresentCapabilitiesKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentCapabilitiesKHR-pNext-pNext)"},
- {"VUID-VkDeviceGroupPresentCapabilitiesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentCapabilitiesKHR-sType-sType)"},
- {"VUID-VkDeviceGroupPresentInfoKHR-mode-01298", "If mode is VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR, then each element of pDeviceMasks must have exactly one bit set, and the corresponding element of VkDeviceGroupPresentCapabilitiesKHR::presentMask must be non-zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-mode-01298)"},
- {"VUID-VkDeviceGroupPresentInfoKHR-mode-01299", "If mode is VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHR, then each element of pDeviceMasks must have exactly one bit set, and some physical device in the logical device must include that bit in its VkDeviceGroupPresentCapabilitiesKHR::presentMask. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-mode-01299)"},
- {"VUID-VkDeviceGroupPresentInfoKHR-mode-01300", "If mode is VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHR, then each element of pDeviceMasks must have a value for which all set bits are set in one of the elements of VkDeviceGroupPresentCapabilitiesKHR::presentMask (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-mode-01300)"},
- {"VUID-VkDeviceGroupPresentInfoKHR-mode-01301", "If mode is VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHR, then for each bit set in each element of pDeviceMasks, the corresponding element of VkDeviceGroupPresentCapabilitiesKHR::presentMask must be non-zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-mode-01301)"},
- {"VUID-VkDeviceGroupPresentInfoKHR-mode-01303", "mode must have exactly one bit set, and that bit must have been included in VkDeviceGroupSwapchainCreateInfoKHR::modes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-mode-01303)"},
- {"VUID-VkDeviceGroupPresentInfoKHR-mode-parameter", "mode must be a valid VkDeviceGroupPresentModeFlagBitsKHR value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-mode-parameter)"},
- {"VUID-VkDeviceGroupPresentInfoKHR-pDeviceMasks-01302", "The value of each element of pDeviceMasks must be equal to the device mask passed in VkAcquireNextImageInfoKHR::deviceMask when the image index was last acquired (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-pDeviceMasks-01302)"},
- {"VUID-VkDeviceGroupPresentInfoKHR-pDeviceMasks-parameter", "If swapchainCount is not 0, pDeviceMasks must be a valid pointer to an array of swapchainCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-pDeviceMasks-parameter)"},
- {"VUID-VkDeviceGroupPresentInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-sType-sType)"},
- {"VUID-VkDeviceGroupPresentInfoKHR-swapchainCount-01297", "swapchainCount must equal 0 or VkPresentInfoKHR::swapchainCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupPresentInfoKHR-swapchainCount-01297)"},
- {"VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00905", "deviceMask must be a valid device mask value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00905)"},
- {"VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00906", "deviceMask must not be zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00906)"},
- {"VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00907", "deviceMask must be a subset of the command buffer's initial device mask (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00907)"},
- {"VUID-VkDeviceGroupRenderPassBeginInfo-deviceRenderAreaCount-00908", "deviceRenderAreaCount must either be zero or equal to the number of physical devices in the logical device. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupRenderPassBeginInfo-deviceRenderAreaCount-00908)"},
- {"VUID-VkDeviceGroupRenderPassBeginInfo-pDeviceRenderAreas-parameter", "If deviceRenderAreaCount is not 0, pDeviceRenderAreas must be a valid pointer to an array of deviceRenderAreaCount VkRect2D structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupRenderPassBeginInfo-pDeviceRenderAreas-parameter)"},
- {"VUID-VkDeviceGroupRenderPassBeginInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupRenderPassBeginInfo-sType-sType)"},
- {"VUID-VkDeviceGroupSubmitInfo-commandBufferCount-00083", "commandBufferCount must equal VkSubmitInfo::commandBufferCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-commandBufferCount-00083)"},
- {"VUID-VkDeviceGroupSubmitInfo-pCommandBufferDeviceMasks-00086", "All elements of pCommandBufferDeviceMasks must be valid device masks (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-pCommandBufferDeviceMasks-00086)"},
- {"VUID-VkDeviceGroupSubmitInfo-pCommandBufferDeviceMasks-parameter", "If commandBufferCount is not 0, pCommandBufferDeviceMasks must be a valid pointer to an array of commandBufferCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-pCommandBufferDeviceMasks-parameter)"},
- {"VUID-VkDeviceGroupSubmitInfo-pSignalSemaphoreDeviceIndices-parameter", "If signalSemaphoreCount is not 0, pSignalSemaphoreDeviceIndices must be a valid pointer to an array of signalSemaphoreCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-pSignalSemaphoreDeviceIndices-parameter)"},
- {"VUID-VkDeviceGroupSubmitInfo-pWaitSemaphoreDeviceIndices-00085", "All elements of pWaitSemaphoreDeviceIndices and pSignalSemaphoreDeviceIndices must be valid device indices (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-pWaitSemaphoreDeviceIndices-00085)"},
- {"VUID-VkDeviceGroupSubmitInfo-pWaitSemaphoreDeviceIndices-parameter", "If waitSemaphoreCount is not 0, pWaitSemaphoreDeviceIndices must be a valid pointer to an array of waitSemaphoreCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-pWaitSemaphoreDeviceIndices-parameter)"},
- {"VUID-VkDeviceGroupSubmitInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-sType-sType)"},
- {"VUID-VkDeviceGroupSubmitInfo-signalSemaphoreCount-00084", "signalSemaphoreCount must equal VkSubmitInfo::signalSemaphoreCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-signalSemaphoreCount-00084)"},
- {"VUID-VkDeviceGroupSubmitInfo-waitSemaphoreCount-00082", "waitSemaphoreCount must equal VkSubmitInfo::waitSemaphoreCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupSubmitInfo-waitSemaphoreCount-00082)"},
- {"VUID-VkDeviceGroupSwapchainCreateInfoKHR-modes-parameter", "modes must be a valid combination of VkDeviceGroupPresentModeFlagBitsKHR values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupSwapchainCreateInfoKHR-modes-parameter)"},
- {"VUID-VkDeviceGroupSwapchainCreateInfoKHR-modes-requiredbitmask", "modes must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupSwapchainCreateInfoKHR-modes-requiredbitmask)"},
- {"VUID-VkDeviceGroupSwapchainCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceGroupSwapchainCreateInfoKHR-sType-sType)"},
- {"VUID-VkDeviceMemoryOpaqueCaptureAddressInfo-memory-03336", "memory must have been allocated with VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceMemoryOpaqueCaptureAddressInfo-memory-03336)"},
- {"VUID-VkDeviceMemoryOpaqueCaptureAddressInfo-memory-parameter", "memory must be a valid VkDeviceMemory handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceMemoryOpaqueCaptureAddressInfo-memory-parameter)"},
- {"VUID-VkDeviceMemoryOpaqueCaptureAddressInfo-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceMemoryOpaqueCaptureAddressInfo-pNext-pNext)"},
- {"VUID-VkDeviceMemoryOpaqueCaptureAddressInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceMemoryOpaqueCaptureAddressInfo-sType-sType)"},
- {"VUID-VkDeviceMemoryOverallocationCreateInfoAMD-overallocationBehavior-parameter", "overallocationBehavior must be a valid VkMemoryOverallocationBehaviorAMD value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceMemoryOverallocationCreateInfoAMD-overallocationBehavior-parameter)"},
- {"VUID-VkDeviceMemoryOverallocationCreateInfoAMD-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceMemoryOverallocationCreateInfoAMD-sType-sType)"},
- {"VUID-VkDeviceQueueCreateInfo-flags-02861", "If the protected memory feature is not enabled, the VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT bit of flags must not be set. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceQueueCreateInfo-flags-02861)"},
- {"VUID-VkDeviceQueueCreateInfo-flags-parameter", "flags must be a valid combination of VkDeviceQueueCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceQueueCreateInfo-flags-parameter)"},
- {"VUID-VkDeviceQueueCreateInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkDeviceQueueGlobalPriorityCreateInfoEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceQueueCreateInfo-pNext-pNext)"},
- {"VUID-VkDeviceQueueCreateInfo-pQueuePriorities-00383", "Each element of pQueuePriorities must be between 0.0 and 1.0 inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceQueueCreateInfo-pQueuePriorities-00383)"},
- {"VUID-VkDeviceQueueCreateInfo-pQueuePriorities-parameter", "pQueuePriorities must be a valid pointer to an array of queueCount float values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceQueueCreateInfo-pQueuePriorities-parameter)"},
- {"VUID-VkDeviceQueueCreateInfo-queueCount-00382", "queueCount must be less than or equal to the queueCount member of the VkQueueFamilyProperties structure, as returned by vkGetPhysicalDeviceQueueFamilyProperties in the pQueueFamilyProperties[queueFamilyIndex] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceQueueCreateInfo-queueCount-00382)"},
- {"VUID-VkDeviceQueueCreateInfo-queueCount-arraylength", "queueCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceQueueCreateInfo-queueCount-arraylength)"},
- {"VUID-VkDeviceQueueCreateInfo-queueFamilyIndex-00381", "queueFamilyIndex must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceQueueCreateInfo-queueFamilyIndex-00381)"},
- {"VUID-VkDeviceQueueCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceQueueCreateInfo-sType-sType)"},
- {"VUID-VkDeviceQueueCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceQueueCreateInfo-sType-unique)"},
- {"VUID-VkDeviceQueueGlobalPriorityCreateInfoEXT-globalPriority-parameter", "globalPriority must be a valid VkQueueGlobalPriorityEXT value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceQueueGlobalPriorityCreateInfoEXT-globalPriority-parameter)"},
- {"VUID-VkDeviceQueueGlobalPriorityCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceQueueGlobalPriorityCreateInfoEXT-sType-sType)"},
- {"VUID-VkDeviceQueueInfo2-flags-parameter", "flags must be a valid combination of VkDeviceQueueCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceQueueInfo2-flags-parameter)"},
- {"VUID-VkDeviceQueueInfo2-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceQueueInfo2-pNext-pNext)"},
- {"VUID-VkDeviceQueueInfo2-queueFamilyIndex-01842", "queueFamilyIndex must be one of the queue family indices specified when device was created, via the VkDeviceQueueCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceQueueInfo2-queueFamilyIndex-01842)"},
- {"VUID-VkDeviceQueueInfo2-queueIndex-01843", "queueIndex must be less than the number of queues created for the specified queue family index and VkDeviceQueueCreateFlags member flags equal to this flags value when device was created, via the queueCount member of the VkDeviceQueueCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceQueueInfo2-queueIndex-01843)"},
- {"VUID-VkDeviceQueueInfo2-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDeviceQueueInfo2-sType-sType)"},
- {"VUID-VkDispatchIndirectCommand-x-00417", "x must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDispatchIndirectCommand-x-00417)"},
- {"VUID-VkDispatchIndirectCommand-y-00418", "y must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDispatchIndirectCommand-y-00418)"},
- {"VUID-VkDispatchIndirectCommand-z-00419", "z must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDispatchIndirectCommand-z-00419)"},
- {"VUID-VkDisplayEventInfoEXT-displayEvent-parameter", "displayEvent must be a valid VkDisplayEventTypeEXT value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayEventInfoEXT-displayEvent-parameter)"},
- {"VUID-VkDisplayEventInfoEXT-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayEventInfoEXT-pNext-pNext)"},
- {"VUID-VkDisplayEventInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DISPLAY_EVENT_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayEventInfoEXT-sType-sType)"},
- {"VUID-VkDisplayModeCreateInfoKHR-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayModeCreateInfoKHR-flags-zerobitmask)"},
- {"VUID-VkDisplayModeCreateInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayModeCreateInfoKHR-pNext-pNext)"},
- {"VUID-VkDisplayModeCreateInfoKHR-parameters-parameter", "parameters must be a valid VkDisplayModeParametersKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayModeCreateInfoKHR-parameters-parameter)"},
- {"VUID-VkDisplayModeCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayModeCreateInfoKHR-sType-sType)"},
- {"VUID-VkDisplayModeParametersKHR-height-01991", "The height member of visibleRegion must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayModeParametersKHR-height-01991)"},
- {"VUID-VkDisplayModeParametersKHR-refreshRate-01992", "refreshRate must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayModeParametersKHR-refreshRate-01992)"},
- {"VUID-VkDisplayModeParametersKHR-width-01990", "The width member of visibleRegion must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayModeParametersKHR-width-01990)"},
- {"VUID-VkDisplayModeProperties2KHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayModeProperties2KHR-pNext-pNext)"},
- {"VUID-VkDisplayModeProperties2KHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DISPLAY_MODE_PROPERTIES_2_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayModeProperties2KHR-sType-sType)"},
- {"VUID-VkDisplayNativeHdrSurfaceCapabilitiesAMD-sType-sType", "sType must be VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayNativeHdrSurfaceCapabilitiesAMD-sType-sType)"},
- {"VUID-VkDisplayPlaneCapabilities2KHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayPlaneCapabilities2KHR-pNext-pNext)"},
- {"VUID-VkDisplayPlaneCapabilities2KHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DISPLAY_PLANE_CAPABILITIES_2_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayPlaneCapabilities2KHR-sType-sType)"},
- {"VUID-VkDisplayPlaneInfo2KHR-mode-parameter", "mode must be a valid VkDisplayModeKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayPlaneInfo2KHR-mode-parameter)"},
- {"VUID-VkDisplayPlaneInfo2KHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayPlaneInfo2KHR-pNext-pNext)"},
- {"VUID-VkDisplayPlaneInfo2KHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DISPLAY_PLANE_INFO_2_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayPlaneInfo2KHR-sType-sType)"},
- {"VUID-VkDisplayPlaneProperties2KHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayPlaneProperties2KHR-pNext-pNext)"},
- {"VUID-VkDisplayPlaneProperties2KHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DISPLAY_PLANE_PROPERTIES_2_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayPlaneProperties2KHR-sType-sType)"},
- {"VUID-VkDisplayPowerInfoEXT-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayPowerInfoEXT-pNext-pNext)"},
- {"VUID-VkDisplayPowerInfoEXT-powerState-parameter", "powerState must be a valid VkDisplayPowerStateEXT value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayPowerInfoEXT-powerState-parameter)"},
- {"VUID-VkDisplayPowerInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DISPLAY_POWER_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayPowerInfoEXT-sType-sType)"},
- {"VUID-VkDisplayPresentInfoKHR-dstRect-01258", "dstRect must specify a rectangular region that is a subset of the visibleRegion parameter of the display mode the swapchain being presented uses (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayPresentInfoKHR-dstRect-01258)"},
- {"VUID-VkDisplayPresentInfoKHR-persistentContent-01259", "If the persistentContent member of the VkDisplayPropertiesKHR structure returned by vkGetPhysicalDeviceDisplayPropertiesKHR for the display the present operation targets then persistent must be VK_FALSE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayPresentInfoKHR-persistentContent-01259)"},
- {"VUID-VkDisplayPresentInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayPresentInfoKHR-sType-sType)"},
- {"VUID-VkDisplayPresentInfoKHR-srcRect-01257", "srcRect must specify a rectangular region that is a subset of the image being presented (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayPresentInfoKHR-srcRect-01257)"},
- {"VUID-VkDisplayProperties2KHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayProperties2KHR-pNext-pNext)"},
- {"VUID-VkDisplayProperties2KHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DISPLAY_PROPERTIES_2_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplayProperties2KHR-sType-sType)"},
- {"VUID-VkDisplaySurfaceCreateInfoKHR-alphaMode-01254", "If alphaMode is VK_DISPLAY_PLANE_ALPHA_GLOBAL_BIT_KHR then globalAlpha must be between 0 and 1, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplaySurfaceCreateInfoKHR-alphaMode-01254)"},
- {"VUID-VkDisplaySurfaceCreateInfoKHR-alphaMode-01255", "alphaMode must be 0 or one of the bits present in the supportedAlpha member of VkDisplayPlaneCapabilitiesKHR returned by vkGetDisplayPlaneCapabilitiesKHR for the display plane corresponding to displayMode (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplaySurfaceCreateInfoKHR-alphaMode-01255)"},
- {"VUID-VkDisplaySurfaceCreateInfoKHR-alphaMode-parameter", "alphaMode must be a valid VkDisplayPlaneAlphaFlagBitsKHR value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplaySurfaceCreateInfoKHR-alphaMode-parameter)"},
- {"VUID-VkDisplaySurfaceCreateInfoKHR-displayMode-parameter", "displayMode must be a valid VkDisplayModeKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplaySurfaceCreateInfoKHR-displayMode-parameter)"},
- {"VUID-VkDisplaySurfaceCreateInfoKHR-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplaySurfaceCreateInfoKHR-flags-zerobitmask)"},
- {"VUID-VkDisplaySurfaceCreateInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplaySurfaceCreateInfoKHR-pNext-pNext)"},
- {"VUID-VkDisplaySurfaceCreateInfoKHR-planeIndex-01252", "planeIndex must be less than the number of display planes supported by the device as determined by calling vkGetPhysicalDeviceDisplayPlanePropertiesKHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplaySurfaceCreateInfoKHR-planeIndex-01252)"},
- {"VUID-VkDisplaySurfaceCreateInfoKHR-planeReorderPossible-01253", "If the planeReorderPossible member of the VkDisplayPropertiesKHR structure returned by vkGetPhysicalDeviceDisplayPropertiesKHR for the display corresponding to displayMode is VK_TRUE then planeStackIndex must be less than the number of display planes supported by the device as determined by calling vkGetPhysicalDeviceDisplayPlanePropertiesKHR; otherwise planeStackIndex must equal the currentStackIndex member of VkDisplayPlanePropertiesKHR returned by vkGetPhysicalDeviceDisplayPlanePropertiesKHR for the display plane corresponding to displayMode (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplaySurfaceCreateInfoKHR-planeReorderPossible-01253)"},
- {"VUID-VkDisplaySurfaceCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplaySurfaceCreateInfoKHR-sType-sType)"},
- {"VUID-VkDisplaySurfaceCreateInfoKHR-transform-parameter", "transform must be a valid VkSurfaceTransformFlagBitsKHR value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplaySurfaceCreateInfoKHR-transform-parameter)"},
- {"VUID-VkDisplaySurfaceCreateInfoKHR-width-01256", "The width and height members of imageExtent must be less than the maxImageDimensions2D member of VkPhysicalDeviceLimits (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDisplaySurfaceCreateInfoKHR-width-01256)"},
- {"VUID-VkDrawIndexedIndirectCommand-None-00552", "For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in Vertex Input Description (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDrawIndexedIndirectCommand-None-00552)"},
- {"VUID-VkDrawIndexedIndirectCommand-firstInstance-00554", "If the drawIndirectFirstInstance feature is not enabled, firstInstance must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDrawIndexedIndirectCommand-firstInstance-00554)"},
- {"VUID-VkDrawIndexedIndirectCommand-indexSize-00553", "(indexSize * (firstIndex + indexCount) + offset) must be less than or equal to the size of the bound index buffer, with indexSize being based on the type specified by indexType, where the index buffer, indexType, and offset are specified via vkCmdBindIndexBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDrawIndexedIndirectCommand-indexSize-00553)"},
- {"VUID-VkDrawIndirectCommand-None-00500", "For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in Vertex Input Description (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDrawIndirectCommand-None-00500)"},
- {"VUID-VkDrawIndirectCommand-firstInstance-00501", "If the drawIndirectFirstInstance feature is not enabled, firstInstance must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDrawIndirectCommand-firstInstance-00501)"},
- {"VUID-VkDrawMeshTasksIndirectCommandNV-taskCount-02175", "taskCount must be less than or equal to VkPhysicalDeviceMeshShaderPropertiesNV::maxDrawMeshTasksCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDrawMeshTasksIndirectCommandNV-taskCount-02175)"},
- {"VUID-VkDrmFormatModifierPropertiesListEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkDrmFormatModifierPropertiesListEXT-sType-sType)"},
- {"VUID-VkEventCreateInfo-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkEventCreateInfo-flags-zerobitmask)"},
- {"VUID-VkEventCreateInfo-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkEventCreateInfo-pNext-pNext)"},
- {"VUID-VkEventCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_EVENT_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkEventCreateInfo-sType-sType)"},
- {"VUID-VkExportFenceCreateInfo-handleTypes-01446", "The bits in handleTypes must be supported and compatible, as reported by VkExternalFenceProperties. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExportFenceCreateInfo-handleTypes-01446)"},
- {"VUID-VkExportFenceCreateInfo-handleTypes-parameter", "handleTypes must be a valid combination of VkExternalFenceHandleTypeFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExportFenceCreateInfo-handleTypes-parameter)"},
- {"VUID-VkExportFenceCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExportFenceCreateInfo-sType-sType)"},
- {"VUID-VkExportFenceWin32HandleInfoKHR-handleTypes-01447", "If VkExportFenceCreateInfo::handleTypes does not include VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT, a VkExportFenceWin32HandleInfoKHR structure must not be included in the pNext chain of VkFenceCreateInfo. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExportFenceWin32HandleInfoKHR-handleTypes-01447)"},
- {"VUID-VkExportFenceWin32HandleInfoKHR-pAttributes-parameter", "If pAttributes is not NULL, pAttributes must be a valid pointer to a valid SECURITY_ATTRIBUTES value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExportFenceWin32HandleInfoKHR-pAttributes-parameter)"},
- {"VUID-VkExportFenceWin32HandleInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExportFenceWin32HandleInfoKHR-sType-sType)"},
- {"VUID-VkExportMemoryAllocateInfo-handleTypes-00656", "The bits in handleTypes must be supported and compatible, as reported by VkExternalImageFormatProperties or VkExternalBufferProperties. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExportMemoryAllocateInfo-handleTypes-00656)"},
- {"VUID-VkExportMemoryAllocateInfo-handleTypes-parameter", "handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExportMemoryAllocateInfo-handleTypes-parameter)"},
- {"VUID-VkExportMemoryAllocateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExportMemoryAllocateInfo-sType-sType)"},
- {"VUID-VkExportMemoryAllocateInfoNV-handleTypes-parameter", "handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBitsNV values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExportMemoryAllocateInfoNV-handleTypes-parameter)"},
- {"VUID-VkExportMemoryAllocateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExportMemoryAllocateInfoNV-sType-sType)"},
- {"VUID-VkExportMemoryWin32HandleInfoKHR-handleTypes-00657", "If VkExportMemoryAllocateInfo::handleTypes does not include VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT, or VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT, a VkExportMemoryWin32HandleInfoKHR structure must not be included in the pNext chain of VkMemoryAllocateInfo. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExportMemoryWin32HandleInfoKHR-handleTypes-00657)"},
- {"VUID-VkExportMemoryWin32HandleInfoKHR-pAttributes-parameter", "If pAttributes is not NULL, pAttributes must be a valid pointer to a valid SECURITY_ATTRIBUTES value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExportMemoryWin32HandleInfoKHR-pAttributes-parameter)"},
- {"VUID-VkExportMemoryWin32HandleInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExportMemoryWin32HandleInfoKHR-sType-sType)"},
- {"VUID-VkExportMemoryWin32HandleInfoNV-pAttributes-parameter", "If pAttributes is not NULL, pAttributes must be a valid pointer to a valid SECURITY_ATTRIBUTES value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExportMemoryWin32HandleInfoNV-pAttributes-parameter)"},
- {"VUID-VkExportMemoryWin32HandleInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExportMemoryWin32HandleInfoNV-sType-sType)"},
- {"VUID-VkExportSemaphoreCreateInfo-handleTypes-01124", "The bits in handleTypes must be supported and compatible, as reported by VkExternalSemaphoreProperties. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExportSemaphoreCreateInfo-handleTypes-01124)"},
- {"VUID-VkExportSemaphoreCreateInfo-handleTypes-parameter", "handleTypes must be a valid combination of VkExternalSemaphoreHandleTypeFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExportSemaphoreCreateInfo-handleTypes-parameter)"},
- {"VUID-VkExportSemaphoreCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExportSemaphoreCreateInfo-sType-sType)"},
- {"VUID-VkExportSemaphoreWin32HandleInfoKHR-handleTypes-01125", "If VkExportSemaphoreCreateInfo::handleTypes does not include VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT or VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT, VkExportSemaphoreWin32HandleInfoKHR must not be included in the pNext chain of VkSemaphoreCreateInfo. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExportSemaphoreWin32HandleInfoKHR-handleTypes-01125)"},
- {"VUID-VkExportSemaphoreWin32HandleInfoKHR-pAttributes-parameter", "If pAttributes is not NULL, pAttributes must be a valid pointer to a valid SECURITY_ATTRIBUTES value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExportSemaphoreWin32HandleInfoKHR-pAttributes-parameter)"},
- {"VUID-VkExportSemaphoreWin32HandleInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExportSemaphoreWin32HandleInfoKHR-sType-sType)"},
- {"VUID-VkExternalBufferProperties-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExternalBufferProperties-pNext-pNext)"},
- {"VUID-VkExternalBufferProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExternalBufferProperties-sType-sType)"},
- {"VUID-VkExternalFenceProperties-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExternalFenceProperties-pNext-pNext)"},
- {"VUID-VkExternalFenceProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExternalFenceProperties-sType-sType)"},
- {"VUID-VkExternalFormatANDROID-externalFormat-01894", "externalFormat must be 0 or a value returned in the externalFormat member of VkAndroidHardwareBufferFormatPropertiesANDROID by an earlier call to vkGetAndroidHardwareBufferPropertiesANDROID (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExternalFormatANDROID-externalFormat-01894)"},
- {"VUID-VkExternalFormatANDROID-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExternalFormatANDROID-sType-sType)"},
- {"VUID-VkExternalImageFormatProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExternalImageFormatProperties-sType-sType)"},
- {"VUID-VkExternalMemoryBufferCreateInfo-handleTypes-parameter", "handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExternalMemoryBufferCreateInfo-handleTypes-parameter)"},
- {"VUID-VkExternalMemoryBufferCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExternalMemoryBufferCreateInfo-sType-sType)"},
- {"VUID-VkExternalMemoryImageCreateInfo-handleTypes-parameter", "handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExternalMemoryImageCreateInfo-handleTypes-parameter)"},
- {"VUID-VkExternalMemoryImageCreateInfo-handleTypes-requiredbitmask", "handleTypes must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExternalMemoryImageCreateInfo-handleTypes-requiredbitmask)"},
- {"VUID-VkExternalMemoryImageCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExternalMemoryImageCreateInfo-sType-sType)"},
- {"VUID-VkExternalMemoryImageCreateInfoNV-handleTypes-parameter", "handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBitsNV values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExternalMemoryImageCreateInfoNV-handleTypes-parameter)"},
- {"VUID-VkExternalMemoryImageCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExternalMemoryImageCreateInfoNV-sType-sType)"},
- {"VUID-VkExternalSemaphoreProperties-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExternalSemaphoreProperties-pNext-pNext)"},
- {"VUID-VkExternalSemaphoreProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkExternalSemaphoreProperties-sType-sType)"},
- {"VUID-VkFenceCreateInfo-flags-parameter", "flags must be a valid combination of VkFenceCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFenceCreateInfo-flags-parameter)"},
- {"VUID-VkFenceCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkExportFenceCreateInfo or VkExportFenceWin32HandleInfoKHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFenceCreateInfo-pNext-pNext)"},
- {"VUID-VkFenceCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_FENCE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFenceCreateInfo-sType-sType)"},
- {"VUID-VkFenceCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFenceCreateInfo-sType-unique)"},
- {"VUID-VkFenceGetFdInfoKHR-fence-01455", "fence must not currently have its payload replaced by an imported payload as described below in Importing Fence Payloads unless that imported payload's handle type was included in VkExternalFenceProperties::exportFromImportedHandleTypes for handleType. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFenceGetFdInfoKHR-fence-01455)"},
- {"VUID-VkFenceGetFdInfoKHR-fence-parameter", "fence must be a valid VkFence handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFenceGetFdInfoKHR-fence-parameter)"},
- {"VUID-VkFenceGetFdInfoKHR-handleType-01453", "handleType must have been included in VkExportFenceCreateInfo::handleTypes when fence's current payload was created. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFenceGetFdInfoKHR-handleType-01453)"},
- {"VUID-VkFenceGetFdInfoKHR-handleType-01454", "If handleType refers to a handle type with copy payload transference semantics, fence must be signaled, or have an associated fence signal operation pending execution. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFenceGetFdInfoKHR-handleType-01454)"},
- {"VUID-VkFenceGetFdInfoKHR-handleType-01456", "handleType must be defined as a POSIX file descriptor handle. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFenceGetFdInfoKHR-handleType-01456)"},
- {"VUID-VkFenceGetFdInfoKHR-handleType-parameter", "handleType must be a valid VkExternalFenceHandleTypeFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFenceGetFdInfoKHR-handleType-parameter)"},
- {"VUID-VkFenceGetFdInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFenceGetFdInfoKHR-pNext-pNext)"},
- {"VUID-VkFenceGetFdInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFenceGetFdInfoKHR-sType-sType)"},
- {"VUID-VkFenceGetWin32HandleInfoKHR-fence-01450", "fence must not currently have its payload replaced by an imported payload as described below in Importing Fence Payloads unless that imported payload's handle type was included in VkExternalFenceProperties::exportFromImportedHandleTypes for handleType. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFenceGetWin32HandleInfoKHR-fence-01450)"},
- {"VUID-VkFenceGetWin32HandleInfoKHR-fence-parameter", "fence must be a valid VkFence handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFenceGetWin32HandleInfoKHR-fence-parameter)"},
- {"VUID-VkFenceGetWin32HandleInfoKHR-handleType-01448", "handleType must have been included in VkExportFenceCreateInfo::handleTypes when the fence's current payload was created. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFenceGetWin32HandleInfoKHR-handleType-01448)"},
- {"VUID-VkFenceGetWin32HandleInfoKHR-handleType-01449", "If handleType is defined as an NT handle, vkGetFenceWin32HandleKHR must be called no more than once for each valid unique combination of fence and handleType. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFenceGetWin32HandleInfoKHR-handleType-01449)"},
- {"VUID-VkFenceGetWin32HandleInfoKHR-handleType-01451", "If handleType refers to a handle type with copy payload transference semantics, fence must be signaled, or have an associated fence signal operation pending execution. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFenceGetWin32HandleInfoKHR-handleType-01451)"},
- {"VUID-VkFenceGetWin32HandleInfoKHR-handleType-01452", "handleType must be defined as an NT handle or a global share handle. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFenceGetWin32HandleInfoKHR-handleType-01452)"},
- {"VUID-VkFenceGetWin32HandleInfoKHR-handleType-parameter", "handleType must be a valid VkExternalFenceHandleTypeFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFenceGetWin32HandleInfoKHR-handleType-parameter)"},
- {"VUID-VkFenceGetWin32HandleInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFenceGetWin32HandleInfoKHR-pNext-pNext)"},
- {"VUID-VkFenceGetWin32HandleInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFenceGetWin32HandleInfoKHR-sType-sType)"},
- {"VUID-VkFilterCubicImageViewImageFormatPropertiesEXT-pNext-02627", "If the pNext chain of the VkImageFormatProperties2 structure includes a VkFilterCubicImageViewImageFormatPropertiesEXT structure, the pNext chain of the VkPhysicalDeviceImageFormatInfo2 structure must include a VkPhysicalDeviceImageViewImageFormatInfoEXT structure with an imageViewType that is compatible with imageType. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFilterCubicImageViewImageFormatPropertiesEXT-pNext-02627)"},
- {"VUID-VkFilterCubicImageViewImageFormatPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFilterCubicImageViewImageFormatPropertiesEXT-sType-sType)"},
- {"VUID-VkFormatProperties2-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkDrmFormatModifierPropertiesListEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFormatProperties2-pNext-pNext)"},
- {"VUID-VkFormatProperties2-sType-sType", "sType must be VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFormatProperties2-sType-sType)"},
- {"VUID-VkFormatProperties2-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFormatProperties2-sType-unique)"},
- {"VUID-VkFramebufferAttachmentImageInfo-flags-parameter", "flags must be a valid combination of VkImageCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferAttachmentImageInfo-flags-parameter)"},
- {"VUID-VkFramebufferAttachmentImageInfo-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferAttachmentImageInfo-pNext-pNext)"},
- {"VUID-VkFramebufferAttachmentImageInfo-pViewFormats-parameter", "If viewFormatCount is not 0, pViewFormats must be a valid pointer to an array of viewFormatCount valid VkFormat values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferAttachmentImageInfo-pViewFormats-parameter)"},
- {"VUID-VkFramebufferAttachmentImageInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferAttachmentImageInfo-sType-sType)"},
- {"VUID-VkFramebufferAttachmentImageInfo-usage-parameter", "usage must be a valid combination of VkImageUsageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferAttachmentImageInfo-usage-parameter)"},
- {"VUID-VkFramebufferAttachmentImageInfo-usage-requiredbitmask", "usage must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferAttachmentImageInfo-usage-requiredbitmask)"},
- {"VUID-VkFramebufferAttachmentsCreateInfo-pAttachmentImageInfos-parameter", "If attachmentImageInfoCount is not 0, pAttachmentImageInfos must be a valid pointer to an array of attachmentImageInfoCount valid VkFramebufferAttachmentImageInfo structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferAttachmentsCreateInfo-pAttachmentImageInfos-parameter)"},
- {"VUID-VkFramebufferAttachmentsCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferAttachmentsCreateInfo-sType-sType)"},
- {"VUID-VkFramebufferCreateInfo-attachmentCount-00876", "attachmentCount must be equal to the attachment count specified in renderPass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-attachmentCount-00876)"},
- {"VUID-VkFramebufferCreateInfo-commonparent", "Both of renderPass, and the elements of pAttachments that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-commonparent)"},
- {"VUID-VkFramebufferCreateInfo-flags-02778", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, and attachmentCount is not 0, pAttachments must be a valid pointer to an array of attachmentCount valid VkImageView handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-flags-02778)"},
- {"VUID-VkFramebufferCreateInfo-flags-03188", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, and attachmentCount is not 0, pAttachments must be a valid pointer to an array of attachmentCount valid VkImageView handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-flags-03188)"},
- {"VUID-VkFramebufferCreateInfo-flags-03189", "If the imageless framebuffer feature is not enabled, flags must not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-flags-03189)"},
- {"VUID-VkFramebufferCreateInfo-flags-03190", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the pNext chain must include a VkFramebufferAttachmentsCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-flags-03190)"},
- {"VUID-VkFramebufferCreateInfo-flags-03191", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the attachmentImageInfoCount member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain must be equal to either zero or attachmentCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-flags-03191)"},
- {"VUID-VkFramebufferCreateInfo-flags-03192", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the width member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain must be greater than or equal to width (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-flags-03192)"},
- {"VUID-VkFramebufferCreateInfo-flags-03193", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the height member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain must be greater than or equal to height (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-flags-03193)"},
- {"VUID-VkFramebufferCreateInfo-flags-03194", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the width member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain must be greater than or equal to width, except for any element that is referenced by VkRenderPassFragmentDensityMapCreateInfoEXT::fragmentDensityMapAttachment in renderPass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-flags-03194)"},
- {"VUID-VkFramebufferCreateInfo-flags-03195", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the height member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain must be greater than or equal to height, except for any element that is referenced by VkRenderPassFragmentDensityMapCreateInfoEXT::fragmentDensityMapAttachment in renderPass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-flags-03195)"},
- {"VUID-VkFramebufferCreateInfo-flags-03196", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the width member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain that is referenced by VkRenderPassFragmentDensityMapCreateInfoEXT::fragmentDensityMapAttachment in renderPass must be greater than or equal to the ceiling of width/maxFragmentDensityTexelSize.width (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-flags-03196)"},
- {"VUID-VkFramebufferCreateInfo-flags-03197", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the height member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain that is referenced by VkRenderPassFragmentDensityMapCreateInfoEXT::fragmentDensityMapAttachment in renderPass must be greater than or equal to the ceiling of height/maxFragmentDensityTexelSize.height (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-flags-03197)"},
- {"VUID-VkFramebufferCreateInfo-flags-03200", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the layerCount member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain must be greater than or equal to layers (https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-flags-03200)"},
- {"VUID-VkFramebufferCreateInfo-flags-03201", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the usage member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain that refers to an attachment used as a color attachment or resolve attachment by renderPass must include VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-flags-03201)"},
- {"VUID-VkFramebufferCreateInfo-flags-03202", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the usage member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain that refers to an attachment used as a depth/stencil attachment by renderPass must include VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-flags-03202)"},
- {"VUID-VkFramebufferCreateInfo-flags-03203", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the usage member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain that refers to an attachment used as a depth/stencil resolve attachment by renderPass must include VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-flags-03203)"},
- {"VUID-VkFramebufferCreateInfo-flags-03204", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the usage member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain that refers to an attachment used as an input attachment by renderPass must include VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-flags-03204)"},
- {"VUID-VkFramebufferCreateInfo-flags-03205", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, at least one element of the pViewFormats member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain must be equal to the corresponding value of VkAttachmentDescription::format used to create renderPass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-flags-03205)"},
- {"VUID-VkFramebufferCreateInfo-flags-parameter", "flags must be a valid combination of VkFramebufferCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-flags-parameter)"},
- {"VUID-VkFramebufferCreateInfo-height-00887", "height must be greater than 0. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-height-00887)"},
- {"VUID-VkFramebufferCreateInfo-height-00888", "height must be less than or equal to VkPhysicalDeviceLimits::maxFramebufferHeight (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-height-00888)"},
- {"VUID-VkFramebufferCreateInfo-layers-00889", "layers must be greater than 0. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-layers-00889)"},
- {"VUID-VkFramebufferCreateInfo-layers-00890", "layers must be less than or equal to VkPhysicalDeviceLimits::maxFramebufferLayers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-layers-00890)"},
- {"VUID-VkFramebufferCreateInfo-pAttachments-00877", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments that is used as a color attachment or resolve attachment by renderPass must have been created with a usage value including VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-pAttachments-00877)"},
- {"VUID-VkFramebufferCreateInfo-pAttachments-00879", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments that is used as an input attachment by renderPass must have been created with a usage value including VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-pAttachments-00879)"},
- {"VUID-VkFramebufferCreateInfo-pAttachments-00880", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments must have been created with a VkFormat value that matches the VkFormat specified by the corresponding VkAttachmentDescription in renderPass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-pAttachments-00880)"},
- {"VUID-VkFramebufferCreateInfo-pAttachments-00881", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments must have been created with a samples value that matches the samples value specified by the corresponding VkAttachmentDescription in renderPass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-pAttachments-00881)"},
- {"VUID-VkFramebufferCreateInfo-pAttachments-00882", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments must have dimensions at least as large as the corresponding framebuffer dimension (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-pAttachments-00882)"},
- {"VUID-VkFramebufferCreateInfo-pAttachments-00883", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments must only specify a single mip level (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-pAttachments-00883)"},
- {"VUID-VkFramebufferCreateInfo-pAttachments-00884", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments must have been created with the identity swizzle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-pAttachments-00884)"},
- {"VUID-VkFramebufferCreateInfo-pAttachments-00891", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments that is a 2D or 2D array image view taken from a 3D image must not be a depth/stencil format (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-pAttachments-00891)"},
- {"VUID-VkFramebufferCreateInfo-pAttachments-02552", "Each element of pAttachments that is used as a fragment density map attachment by renderPass must not have been created with a flags value including VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-pAttachments-02552)"},
- {"VUID-VkFramebufferCreateInfo-pAttachments-02554", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments must have dimensions at least as large as the corresponding framebuffer dimension except for any element that is referenced by fragmentDensityMapAttachment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-pAttachments-02554)"},
- {"VUID-VkFramebufferCreateInfo-pAttachments-02555", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, an element of pAttachments that is referenced by fragmentDensityMapAttachment must have a width at least as large as the ceiling of width/maxFragmentDensityTexelSize.width (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-pAttachments-02555)"},
- {"VUID-VkFramebufferCreateInfo-pAttachments-02556", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, an element of pAttachments that is referenced by fragmentDensityMapAttachment must have a height at least as large as the ceiling of height/maxFragmentDensityTexelSize.height (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-pAttachments-02556)"},
- {"VUID-VkFramebufferCreateInfo-pAttachments-02633", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments that is used as a depth/stencil attachment by renderPass must have been created with a usage value including VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-pAttachments-02633)"},
- {"VUID-VkFramebufferCreateInfo-pAttachments-02634", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments that is used as a depth/stencil resolve attachment by renderPass must have been created with a usage value including VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-pAttachments-02634)"},
- {"VUID-VkFramebufferCreateInfo-pAttachments-02744", "An element of pAttachments that is referenced by fragmentDensityMapAttachment must have a layerCount equal to 1 (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkFramebufferCreateInfo-pAttachments-02744)"},
- {"VUID-VkFramebufferCreateInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkFramebufferAttachmentsCreateInfo (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-pNext-pNext)"},
- {"VUID-VkFramebufferCreateInfo-renderPass-02531", "If renderPass was specified with non-zero view masks, layers must be 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-renderPass-02531)"},
- {"VUID-VkFramebufferCreateInfo-renderPass-02553", "If renderPass has a fragment density map attachment and non-subsample image feature is not enabled, each element of pAttachments must have been created with a flags value including VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT unless that element is the fragment density map attachment. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-renderPass-02553)"},
- {"VUID-VkFramebufferCreateInfo-renderPass-02743", "If renderPass was specified with non-zero view masks, each element of pAttachments must have a layerCount greater than the index of the most significant bit set in any of those view masks (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-renderPass-02743)"},
- {"VUID-VkFramebufferCreateInfo-renderPass-02745", "If renderPass was specified with non-zero view masks, each element of pAttachments that is not referenced by fragmentDensityMapAttachment must have a layerCount greater than the index of the most significant bit set in any of those view masks (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-renderPass-02745)"},
- {"VUID-VkFramebufferCreateInfo-renderPass-02746", "If renderPass was specified with non-zero view masks, each element of pAttachments that is referenced by fragmentDensityMapAttachment must have a layerCount equal to 1 or greater than the index of the most significant bit set in any of those view masks (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-renderPass-02746)"},
- {"VUID-VkFramebufferCreateInfo-renderPass-02747", "If renderPass was not specified with non-zero view masks, each element of pAttachments that is referenced by fragmentDensityMapAttachment must have a layerCount equal to 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-renderPass-02747)"},
- {"VUID-VkFramebufferCreateInfo-renderPass-03198", "If multiview is enabled for renderPass, and flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the layerCount member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain must be greater than the maximum bit index set in the view mask in the subpasses in which it is used in renderPass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-renderPass-03198)"},
- {"VUID-VkFramebufferCreateInfo-renderPass-03199", "If multiview is not enabled for renderPass, and flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the layerCount member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain must be greater than or equal to layers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-renderPass-03199)"},
- {"VUID-VkFramebufferCreateInfo-renderPass-parameter", "renderPass must be a valid VkRenderPass handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-renderPass-parameter)"},
- {"VUID-VkFramebufferCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-sType-sType)"},
- {"VUID-VkFramebufferCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-sType-unique)"},
- {"VUID-VkFramebufferCreateInfo-width-00885", "width must be greater than 0. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-width-00885)"},
- {"VUID-VkFramebufferCreateInfo-width-00886", "width must be less than or equal to VkPhysicalDeviceLimits::maxFramebufferWidth (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferCreateInfo-width-00886)"},
- {"VUID-VkFramebufferMixedSamplesCombinationNV-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferMixedSamplesCombinationNV-pNext-pNext)"},
- {"VUID-VkFramebufferMixedSamplesCombinationNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_FRAMEBUFFER_MIXED_SAMPLES_COMBINATION_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkFramebufferMixedSamplesCombinationNV-sType-sType)"},
- {"VUID-VkGeneratedCommandsInfoNV-commonparent", "Each of indirectCommandsLayout, pipeline, preprocessBuffer, sequencesCountBuffer, and sequencesIndexBuffer that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-commonparent)"},
- {"VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-02913", "If the indirectCommandsLayout uses a token of VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV, then the pipeline must have been created with multiple shader groups. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-02913)"},
- {"VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-02914", "If the indirectCommandsLayout uses a token of VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV, then the pipeline must have been created with VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV set in VkGraphicsPipelineCreateInfo::flags. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-02914)"},
- {"VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-02915", "If the indirectCommandsLayout uses a token of VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, then the pipeline`s VkPipelineLayout must match the VkIndirectCommandsLayoutTokenNV::pushconstantPipelineLayout. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-02915)"},
- {"VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-parameter", "indirectCommandsLayout must be a valid VkIndirectCommandsLayoutNV handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-parameter)"},
- {"VUID-VkGeneratedCommandsInfoNV-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-pNext-pNext)"},
- {"VUID-VkGeneratedCommandsInfoNV-pStreams-parameter", "pStreams must be a valid pointer to an array of streamCount valid VkIndirectCommandsStreamNV structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-pStreams-parameter)"},
- {"VUID-VkGeneratedCommandsInfoNV-pipeline-02912", "The provided pipeline must match the pipeline bound at execution time. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-pipeline-02912)"},
- {"VUID-VkGeneratedCommandsInfoNV-pipeline-parameter", "pipeline must be a valid VkPipeline handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-pipeline-parameter)"},
- {"VUID-VkGeneratedCommandsInfoNV-pipelineBindPoint-parameter", "pipelineBindPoint must be a valid VkPipelineBindPoint value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-pipelineBindPoint-parameter)"},
- {"VUID-VkGeneratedCommandsInfoNV-preprocessBuffer-02918", "preprocessBuffer must have the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set in its usage flag. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-preprocessBuffer-02918)"},
- {"VUID-VkGeneratedCommandsInfoNV-preprocessBuffer-parameter", "preprocessBuffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-preprocessBuffer-parameter)"},
- {"VUID-VkGeneratedCommandsInfoNV-preprocessOffset-02919", "preprocessOffset must be aligned to VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::minIndirectCommandsBufferOffsetAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-preprocessOffset-02919)"},
- {"VUID-VkGeneratedCommandsInfoNV-preprocessSize-02920", "preprocessSize must be at least equal to the memory requirement`s size returned by vkGetGeneratedCommandsMemoryRequirementsNV using the matching inputs (indirectCommandsLayout, ...) as within this structure. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-preprocessSize-02920)"},
- {"VUID-VkGeneratedCommandsInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_GENERATED_COMMANDS_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-sType-sType)"},
- {"VUID-VkGeneratedCommandsInfoNV-sequencesCount-02917", "sequencesCount must be less or equal to VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectSequenceCount and VkGeneratedCommandsMemoryRequirementsInfoNV::maxSequencesCount that was used to determine the preprocessSize. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-sequencesCount-02917)"},
- {"VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-02921", "sequencesCountBuffer can be set if the actual used count of sequences is sourced from the provided buffer. In that case the sequencesCount serves as upper bound. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-02921)"},
- {"VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-02922", "If sequencesCountBuffer is used, its usage flag must have the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-02922)"},
- {"VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-02923", "If sequencesCountBuffer is used, sequencesCountOffset must be aligned to VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::minSequencesCountBufferOffsetAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-02923)"},
- {"VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-parameter", "If sequencesCountBuffer is not VK_NULL_HANDLE, sequencesCountBuffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-parameter)"},
- {"VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-02924", "sequencesIndexBuffer must be set if indirectCommandsLayout's VK_INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT_NV is set, otherwise it must be VK_NULL_HANDLE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-02924)"},
- {"VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-02925", "If sequencesIndexBuffer is used, its usage flag must have the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-02925)"},
- {"VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-02926", "If sequencesIndexBuffer is used, sequencesIndexOffset must be aligned to VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::minSequencesIndexBufferOffsetAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-02926)"},
- {"VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-parameter", "If sequencesIndexBuffer is not VK_NULL_HANDLE, sequencesIndexBuffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-parameter)"},
- {"VUID-VkGeneratedCommandsInfoNV-streamCount-02916", "streamCount must match the indirectCommandsLayout's streamCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-streamCount-02916)"},
- {"VUID-VkGeneratedCommandsInfoNV-streamCount-arraylength", "streamCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsInfoNV-streamCount-arraylength)"},
- {"VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-maxSequencesCount-02907", "maxSequencesCount must be less or equal to VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectSequenceCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-maxSequencesCount-02907)"},
- {"VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-pNext-pNext)"},
- {"VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-sType-sType)"},
- {"VUID-VkGeometryAABBNV-aabbData-parameter", "If aabbData is not VK_NULL_HANDLE, aabbData must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryAABBNV-aabbData-parameter)"},
- {"VUID-VkGeometryAABBNV-offset-02439", "offset must be less than the size of aabbData (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryAABBNV-offset-02439)"},
- {"VUID-VkGeometryAABBNV-offset-02440", "offset must be a multiple of 8 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryAABBNV-offset-02440)"},
- {"VUID-VkGeometryAABBNV-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryAABBNV-pNext-pNext)"},
- {"VUID-VkGeometryAABBNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryAABBNV-sType-sType)"},
- {"VUID-VkGeometryAABBNV-stride-02441", "stride must be a multiple of 8 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryAABBNV-stride-02441)"},
- {"VUID-VkGeometryDataNV-aabbs-parameter", "aabbs must be a valid VkGeometryAABBNV structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryDataNV-aabbs-parameter)"},
- {"VUID-VkGeometryDataNV-triangles-parameter", "triangles must be a valid VkGeometryTrianglesNV structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryDataNV-triangles-parameter)"},
- {"VUID-VkGeometryNV-flags-parameter", "flags must be a valid combination of VkGeometryFlagBitsKHR values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryNV-flags-parameter)"},
- {"VUID-VkGeometryNV-geometry-parameter", "geometry must be a valid VkGeometryDataNV structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryNV-geometry-parameter)"},
- {"VUID-VkGeometryNV-geometryType-03503", "geometryType must be VK_GEOMETRY_TYPE_TRIANGLES_NV or VK_GEOMETRY_TYPE_AABBS_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryNV-geometryType-03503)"},
- {"VUID-VkGeometryNV-geometryType-parameter", "geometryType must be a valid VkGeometryTypeKHR value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryNV-geometryType-parameter)"},
- {"VUID-VkGeometryNV-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryNV-pNext-pNext)"},
- {"VUID-VkGeometryNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_GEOMETRY_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryNV-sType-sType)"},
- {"VUID-VkGeometryTrianglesNV-commonparent", "Each of indexData, transformData, and vertexData that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryTrianglesNV-commonparent)"},
- {"VUID-VkGeometryTrianglesNV-indexCount-02436", "indexCount must be 0 if indexType is VK_INDEX_TYPE_NONE_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryTrianglesNV-indexCount-02436)"},
- {"VUID-VkGeometryTrianglesNV-indexData-02434", "indexData must be VK_NULL_HANDLE if indexType is VK_INDEX_TYPE_NONE_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryTrianglesNV-indexData-02434)"},
- {"VUID-VkGeometryTrianglesNV-indexData-02435", "indexData must be a valid VkBuffer handle if indexType is not VK_INDEX_TYPE_NONE_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryTrianglesNV-indexData-02435)"},
- {"VUID-VkGeometryTrianglesNV-indexData-parameter", "If indexData is not VK_NULL_HANDLE, indexData must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryTrianglesNV-indexData-parameter)"},
- {"VUID-VkGeometryTrianglesNV-indexOffset-02431", "indexOffset must be less than the size of indexData (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryTrianglesNV-indexOffset-02431)"},
- {"VUID-VkGeometryTrianglesNV-indexOffset-02432", "indexOffset must be a multiple of the element size of indexType (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryTrianglesNV-indexOffset-02432)"},
- {"VUID-VkGeometryTrianglesNV-indexType-02433", "indexType must be VK_INDEX_TYPE_UINT16, VK_INDEX_TYPE_UINT32, or VK_INDEX_TYPE_NONE_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryTrianglesNV-indexType-02433)"},
- {"VUID-VkGeometryTrianglesNV-indexType-parameter", "indexType must be a valid VkIndexType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryTrianglesNV-indexType-parameter)"},
- {"VUID-VkGeometryTrianglesNV-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryTrianglesNV-pNext-pNext)"},
- {"VUID-VkGeometryTrianglesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryTrianglesNV-sType-sType)"},
- {"VUID-VkGeometryTrianglesNV-transformData-parameter", "If transformData is not VK_NULL_HANDLE, transformData must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryTrianglesNV-transformData-parameter)"},
- {"VUID-VkGeometryTrianglesNV-transformOffset-02437", "transformOffset must be less than the size of transformData (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryTrianglesNV-transformOffset-02437)"},
- {"VUID-VkGeometryTrianglesNV-transformOffset-02438", "transformOffset must be a multiple of 16 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryTrianglesNV-transformOffset-02438)"},
- {"VUID-VkGeometryTrianglesNV-vertexData-parameter", "If vertexData is not VK_NULL_HANDLE, vertexData must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryTrianglesNV-vertexData-parameter)"},
- {"VUID-VkGeometryTrianglesNV-vertexFormat-02430", "vertexFormat must be one of VK_FORMAT_R32G32B32_SFLOAT, VK_FORMAT_R32G32_SFLOAT, VK_FORMAT_R16G16B16_SFLOAT, VK_FORMAT_R16G16_SFLOAT, VK_FORMAT_R16G16_SNORM, or VK_FORMAT_R16G16B16_SNORM (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryTrianglesNV-vertexFormat-02430)"},
- {"VUID-VkGeometryTrianglesNV-vertexFormat-parameter", "vertexFormat must be a valid VkFormat value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryTrianglesNV-vertexFormat-parameter)"},
- {"VUID-VkGeometryTrianglesNV-vertexOffset-02428", "vertexOffset must be less than the size of vertexData (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryTrianglesNV-vertexOffset-02428)"},
- {"VUID-VkGeometryTrianglesNV-vertexOffset-02429", "vertexOffset must be a multiple of the component size of vertexFormat (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGeometryTrianglesNV-vertexOffset-02429)"},
- {"VUID-VkGraphicsPipelineCreateInfo-None-02322", "If there are any mesh shader stages in the pipeline there must not be any shader stage in the pipeline with a Xfb execution mode. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-None-02322)"},
- {"VUID-VkGraphicsPipelineCreateInfo-attachmentCount-00746", "If rasterization is not disabled and the subpass uses color attachments, the attachmentCount member of pColorBlendState must be equal to the colorAttachmentCount used to create subpass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-attachmentCount-00746)"},
- {"VUID-VkGraphicsPipelineCreateInfo-blendEnable-02023", "If rasterization is not disabled and the subpass uses color attachments, then for each color attachment in the subpass the blendEnable member of the corresponding element of the pAttachment member of pColorBlendState must be VK_FALSE if the attached image's format features does not contain VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-blendEnable-02023)"},
- {"VUID-VkGraphicsPipelineCreateInfo-commonparent", "Each of basePipelineHandle, layout, and renderPass that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-commonparent)"},
- {"VUID-VkGraphicsPipelineCreateInfo-coverageReductionMode-02722", "If the VK_NV_coverage_reduction_mode extension is enabled, the coverage reduction mode specified by VkPipelineCoverageReductionStateCreateInfoNV::coverageReductionMode, the rasterizationSamples member of pMultisampleState and the sample counts for the color and depth/stencil attachments (if the subpass has them) must be a valid combination returned by vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-coverageReductionMode-02722)"},
- {"VUID-VkGraphicsPipelineCreateInfo-flags-00722", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineIndex is -1, basePipelineHandle must be a valid handle to a graphics VkPipeline (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-flags-00722)"},
- {"VUID-VkGraphicsPipelineCreateInfo-flags-00723", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineHandle is VK_NULL_HANDLE, basePipelineIndex must be a valid index into the calling command's pCreateInfos parameter (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-flags-00723)"},
- {"VUID-VkGraphicsPipelineCreateInfo-flags-00724", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineIndex is not -1, basePipelineHandle must be VK_NULL_HANDLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-flags-00724)"},
- {"VUID-VkGraphicsPipelineCreateInfo-flags-00725", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineHandle is not VK_NULL_HANDLE, basePipelineIndex must be -1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-flags-00725)"},
- {"VUID-VkGraphicsPipelineCreateInfo-flags-00764", "flags must not contain the VK_PIPELINE_CREATE_DISPATCH_BASE flag. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-flags-00764)"},
- {"VUID-VkGraphicsPipelineCreateInfo-flags-02877", "If flags includes VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV, then the VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV->deviceGeneratedCommands feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-flags-02877)"},
- {"VUID-VkGraphicsPipelineCreateInfo-flags-03371", "flags must not include VK_PIPELINE_CREATE_LIBRARY_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-flags-03371)"},
- {"VUID-VkGraphicsPipelineCreateInfo-flags-03372", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-flags-03372)"},
- {"VUID-VkGraphicsPipelineCreateInfo-flags-03373", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-flags-03373)"},
- {"VUID-VkGraphicsPipelineCreateInfo-flags-03374", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-flags-03374)"},
- {"VUID-VkGraphicsPipelineCreateInfo-flags-03375", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-flags-03375)"},
- {"VUID-VkGraphicsPipelineCreateInfo-flags-03376", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-flags-03376)"},
- {"VUID-VkGraphicsPipelineCreateInfo-flags-03377", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-flags-03377)"},
- {"VUID-VkGraphicsPipelineCreateInfo-flags-parameter", "flags must be a valid combination of VkPipelineCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-flags-parameter)"},
- {"VUID-VkGraphicsPipelineCreateInfo-geometryStreams-02321", "If the last vertex processing stage is a geometry shader, and that geometry shader uses the GeometryStreams capability, then VkPhysicalDeviceTransformFeedbackFeaturesEXT::geometryStreams feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-geometryStreams-02321)"},
- {"VUID-VkGraphicsPipelineCreateInfo-layout-00756", "layout must be consistent with all shaders specified in pStages (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-layout-00756)"},
- {"VUID-VkGraphicsPipelineCreateInfo-layout-01688", "The number of resources in layout accessible to each shader stage that is used by the pipeline must be less than or equal to VkPhysicalDeviceLimits::maxPerStageResources (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-layout-01688)"},
- {"VUID-VkGraphicsPipelineCreateInfo-layout-parameter", "layout must be a valid VkPipelineLayout handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-layout-parameter)"},
- {"VUID-VkGraphicsPipelineCreateInfo-lineRasterizationMode-02766", "If the lineRasterizationMode member of a VkPipelineRasterizationLineStateCreateInfoEXT structure included in the pNext chain of pRasterizationState is VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT or VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT and if rasterization is enabled, then the alphaToCoverageEnable, alphaToOneEnable, and sampleShadingEnable members of pMultisampleState must all be VK_FALSE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-lineRasterizationMode-02766)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pDynamicState-parameter", "If pDynamicState is not NULL, pDynamicState must be a valid pointer to a valid VkPipelineDynamicStateCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pDynamicState-parameter)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00747", "If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports member of pViewportState must be a valid pointer to an array of pViewportState->viewportCount valid VkViewport structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00747)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00748", "If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member of pViewportState must be a valid pointer to an array of pViewportState->scissorCount VkRect2D structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00748)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00749", "If the wide lines feature is not enabled, and no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_LINE_WIDTH, the lineWidth member of pRasterizationState must be 1.0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00749)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00754", "If the depth bias clamping feature is not enabled, no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_DEPTH_BIAS, and the depthBiasEnable member of pRasterizationState is VK_TRUE, the depthBiasClamp member of pRasterizationState must be 0.0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00754)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00755", "If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_DEPTH_BOUNDS, and the depthBoundsTestEnable member of pDepthStencilState is VK_TRUE, the minDepthBounds and maxDepthBounds members of pDepthStencilState must be between 0.0 and 1.0, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00755)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01521", "If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT, and the sampleLocationsEnable member of a VkPipelineSampleLocationsStateCreateInfoEXT structure included in the pNext chain of pMultisampleState is VK_TRUE, sampleLocationsInfo.sampleLocationGridSize.width must evenly divide VkMultisamplePropertiesEXT::sampleLocationGridSize.width as returned by vkGetPhysicalDeviceMultisamplePropertiesEXT with a samples parameter equaling rasterizationSamples (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01521)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01522", "If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT, and the sampleLocationsEnable member of a VkPipelineSampleLocationsStateCreateInfoEXT structure included in the pNext chain of pMultisampleState is VK_TRUE, sampleLocationsInfo.sampleLocationGridSize.height must evenly divide VkMultisamplePropertiesEXT::sampleLocationGridSize.height as returned by vkGetPhysicalDeviceMultisamplePropertiesEXT with a samples parameter equaling rasterizationSamples (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01522)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01523", "If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT, and the sampleLocationsEnable member of a VkPipelineSampleLocationsStateCreateInfoEXT structure included in the pNext chain of pMultisampleState is VK_TRUE, sampleLocationsInfo.sampleLocationsPerPixel must equal rasterizationSamples (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01523)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715", "If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV, and the viewportWScalingEnable member of a VkPipelineViewportWScalingStateCreateInfoNV structure, included in the pNext chain of pViewportState, is VK_TRUE, the pViewportWScalings member of the VkPipelineViewportWScalingStateCreateInfoNV must be a pointer to an array of VkPipelineViewportWScalingStateCreateInfoNV::viewportCount valid VkViewportWScalingNV structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-02510", "If the VK_EXT_depth_range_unrestricted extension is not enabled and no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_DEPTH_BOUNDS, and the depthBoundsTestEnable member of pDepthStencilState is VK_TRUE, the minDepthBounds and maxDepthBounds members of pDepthStencilState must be between 0.0 and 1.0, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-02510)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkGraphicsPipelineShaderGroupsCreateInfoNV, VkPipelineCompilerControlCreateInfoAMD, VkPipelineCreationFeedbackCreateInfoEXT, VkPipelineDiscardRectangleStateCreateInfoEXT, or VkPipelineRepresentativeFragmentTestStateCreateInfoNV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pNext-pNext)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pRasterizationState-parameter", "pRasterizationState must be a valid pointer to a valid VkPipelineRasterizationStateCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pRasterizationState-parameter)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pStages-00729", "If pStages includes a tessellation control shader stage, it must include a tessellation evaluation shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-00729)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pStages-00730", "If pStages includes a tessellation evaluation shader stage, it must include a tessellation control shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-00730)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pStages-00731", "If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage, pTessellationState must be a valid pointer to a valid VkPipelineTessellationStateCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-00731)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pStages-00732", "If pStages includes tessellation shader stages, the shader code of at least one stage must contain an OpExecutionMode instruction that specifies the type of subdivision in the pipeline (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-00732)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pStages-00733", "If pStages includes tessellation shader stages, and the shader code of both stages contain an OpExecutionMode instruction that specifies the type of subdivision in the pipeline, they must both specify the same subdivision mode (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-00733)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pStages-00734", "If pStages includes tessellation shader stages, the shader code of at least one stage must contain an OpExecutionMode instruction that specifies the output patch size in the pipeline (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-00734)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pStages-00735", "If pStages includes tessellation shader stages, and the shader code of both contain an OpExecutionMode instruction that specifies the out patch size in the pipeline, they must both specify the same patch size (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-00735)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pStages-00736", "If pStages includes tessellation shader stages, the topology member of pInputAssembly must be VK_PRIMITIVE_TOPOLOGY_PATCH_LIST (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-00736)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pStages-00738", "If pStages includes a geometry shader stage, and does not include any tessellation shader stages, its shader code must contain an OpExecutionMode instruction that specifies an input primitive type that is compatible with the primitive topology specified in pInputAssembly (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-00738)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pStages-00739", "If pStages includes a geometry shader stage, and also includes tessellation shader stages, its shader code must contain an OpExecutionMode instruction that specifies an input primitive type that is compatible with the primitive topology that is output by the tessellation stages (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-00739)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pStages-00740", "If pStages includes a fragment shader stage and a geometry shader stage, and the fragment shader code reads from an input variable that is decorated with PrimitiveID, then the geometry shader code must write to a matching output variable, decorated with PrimitiveID, in all execution paths (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-00740)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pStages-00741", "If pStages includes a fragment shader stage, its shader code must not read from any input attachment that is defined as VK_ATTACHMENT_UNUSED in subpass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-00741)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pStages-00742", "The shader code for the entry points identified by pStages, and the rest of the state identified by this structure must adhere to the pipeline linking rules described in the Shader Interfaces chapter (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-00742)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pStages-01565", "If pStages includes a fragment shader stage and an input attachment was referenced by the VkRenderPassInputAttachmentAspectCreateInfo at renderPass create time, its shader code must not read from any aspect that was not specified in the aspectMask of the corresponding VkInputAttachmentAspectReference structure. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-01565)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pStages-02095", "The geometric shader stages provided in pStages must be either from the mesh shading pipeline (stage is VK_SHADER_STAGE_TASK_BIT_NV or VK_SHADER_STAGE_MESH_BIT_NV) or from the primitive shading pipeline (stage is VK_SHADER_STAGE_VERTEX_BIT, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, or VK_SHADER_STAGE_GEOMETRY_BIT). (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-02095)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pStages-02097", "If pStages includes a vertex shader stage, pVertexInputState must be a valid pointer to a valid VkPipelineVertexInputStateCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-02097)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pStages-02098", "If pStages includes a vertex shader stage, pInputAssemblyState must be a valid pointer to a valid VkPipelineInputAssemblyStateCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-02098)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pStages-02317", "The Xfb execution mode can be specified by only one shader stage in pStages (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-02317)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pStages-02318", "If any shader stage in pStages specifies Xfb execution mode it must be the last vertex processing stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-02318)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pStages-parameter", "pStages must be a valid pointer to an array of stageCount valid VkPipelineShaderStageCreateInfo structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pStages-parameter)"},
- {"VUID-VkGraphicsPipelineCreateInfo-pipelineCreationCacheControl-02878", "If the pipelineCreationCacheControl feature is not enabled, flags must not include VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT or VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-pipelineCreationCacheControl-02878)"},
- {"VUID-VkGraphicsPipelineCreateInfo-rasterizationStream-02319", "If a VkPipelineRasterizationStateStreamCreateInfoEXT::rasterizationStream value other than zero is specified, all variables in the output interface of the entry point being compiled decorated with Position, PointSize, ClipDistance, or CullDistance must all be decorated with identical Stream values that match the rasterizationStream (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-rasterizationStream-02319)"},
- {"VUID-VkGraphicsPipelineCreateInfo-rasterizationStream-02320", "If VkPipelineRasterizationStateStreamCreateInfoEXT::rasterizationStream is zero, or not specified, all variables in the output interface of the entry point being compiled decorated with Position, PointSize, ClipDistance, or CullDistance must all be decorated with a Stream value of zero, or must not specify the Stream decoration (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-rasterizationStream-02320)"},
- {"VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00750", "If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a valid pointer to a valid VkPipelineViewportStateCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00750)"},
- {"VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00751", "If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a valid pointer to a valid VkPipelineMultisampleStateCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00751)"},
- {"VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00752", "If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, and subpass uses a depth/stencil attachment, pDepthStencilState must be a valid pointer to a valid VkPipelineDepthStencilStateCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00752)"},
- {"VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00753", "If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, and subpass uses color attachments, pColorBlendState must be a valid pointer to a valid VkPipelineColorBlendStateCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00753)"},
- {"VUID-VkGraphicsPipelineCreateInfo-renderPass-00760", "If the renderPass has multiview enabled and subpass has more than one bit set in the view mask and multiviewTessellationShader is not enabled, then pStages must not include tessellation shaders. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-renderPass-00760)"},
- {"VUID-VkGraphicsPipelineCreateInfo-renderPass-00761", "If the renderPass has multiview enabled and subpass has more than one bit set in the view mask and multiviewGeometryShader is not enabled, then pStages must not include a geometry shader. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-renderPass-00761)"},
- {"VUID-VkGraphicsPipelineCreateInfo-renderPass-00762", "If the renderPass has multiview enabled and subpass has more than one bit set in the view mask, shaders in the pipeline must not write to the Layer built-in output (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-renderPass-00762)"},
- {"VUID-VkGraphicsPipelineCreateInfo-renderPass-00763", "If the renderPass has multiview enabled, then all shaders must not include variables decorated with the Layer built-in decoration in their interfaces. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-renderPass-00763)"},
- {"VUID-VkGraphicsPipelineCreateInfo-renderPass-parameter", "renderPass must be a valid VkRenderPass handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-renderPass-parameter)"},
- {"VUID-VkGraphicsPipelineCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-sType-sType)"},
- {"VUID-VkGraphicsPipelineCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-sType-unique)"},
- {"VUID-VkGraphicsPipelineCreateInfo-sampleLocationsEnable-01524", "If the sampleLocationsEnable member of a VkPipelineSampleLocationsStateCreateInfoEXT structure included in the pNext chain of pMultisampleState is VK_TRUE, the fragment shader code must not statically use the extended instruction InterpolateAtSample (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-sampleLocationsEnable-01524)"},
- {"VUID-VkGraphicsPipelineCreateInfo-stage-00726", "The stage member of each element of pStages must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-stage-00726)"},
- {"VUID-VkGraphicsPipelineCreateInfo-stage-00727", "The stage member of one element of pStages must be VK_SHADER_STAGE_VERTEX_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-stage-00727)"},
- {"VUID-VkGraphicsPipelineCreateInfo-stage-00728", "The stage member of each element of pStages must not be VK_SHADER_STAGE_COMPUTE_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-stage-00728)"},
- {"VUID-VkGraphicsPipelineCreateInfo-stage-02096", "The stage member of one element of pStages must be either VK_SHADER_STAGE_VERTEX_BIT or VK_SHADER_STAGE_MESH_BIT_NV. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-stage-02096)"},
- {"VUID-VkGraphicsPipelineCreateInfo-stageCount-arraylength", "stageCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-stageCount-arraylength)"},
- {"VUID-VkGraphicsPipelineCreateInfo-stippledLineEnable-02767", "If the stippledLineEnable member of VkPipelineRasterizationLineStateCreateInfoEXT is VK_TRUE and no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_LINE_STIPPLE_EXT, then the lineStippleFactor member of VkPipelineRasterizationLineStateCreateInfoEXT must be in the range [1,256] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-stippledLineEnable-02767)"},
- {"VUID-VkGraphicsPipelineCreateInfo-subpass-00743", "If rasterization is not disabled and subpass uses a depth/stencil attachment in renderPass that has a layout of VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL in the VkAttachmentReference defined by subpass, the depthWriteEnable member of pDepthStencilState must be VK_FALSE (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-subpass-00743)"},
- {"VUID-VkGraphicsPipelineCreateInfo-subpass-00744", "If rasterization is not disabled and subpass uses a depth/stencil attachment in renderPass that has a layout of VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL in the VkAttachmentReference defined by subpass, the failOp, passOp and depthFailOp members of each of the front and back members of pDepthStencilState must be VK_STENCIL_OP_KEEP (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-subpass-00744)"},
- {"VUID-VkGraphicsPipelineCreateInfo-subpass-00757", "If neither the VK_AMD_mixed_attachment_samples nor the VK_NV_framebuffer_mixed_samples extensions are enabled, and if subpass uses color and/or depth/stencil attachments, then the rasterizationSamples member of pMultisampleState must be the same as the sample count for those subpass attachments (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-subpass-00757)"},
- {"VUID-VkGraphicsPipelineCreateInfo-subpass-00758", "If subpass does not use any color and/or depth/stencil attachments, then the rasterizationSamples member of pMultisampleState must follow the rules for a zero-attachment subpass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-subpass-00758)"},
- {"VUID-VkGraphicsPipelineCreateInfo-subpass-00759", "subpass must be a valid subpass within renderPass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-subpass-00759)"},
- {"VUID-VkGraphicsPipelineCreateInfo-subpass-01411", "If the VK_NV_framebuffer_mixed_samples extension is enabled, and if subpass has a depth/stencil attachment and depth test, stencil test, or depth bounds test are enabled, then the rasterizationSamples member of pMultisampleState must be the same as the sample count of the depth/stencil attachment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-subpass-01411)"},
- {"VUID-VkGraphicsPipelineCreateInfo-subpass-01412", "If the VK_NV_framebuffer_mixed_samples extension is enabled, and if subpass has any color attachments, then the rasterizationSamples member of pMultisampleState must be greater than or equal to the sample count for those subpass attachments (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-subpass-01412)"},
- {"VUID-VkGraphicsPipelineCreateInfo-subpass-01505", "If the VK_AMD_mixed_attachment_samples extension is enabled, and if subpass uses color and/or depth/stencil attachments, then the rasterizationSamples member of pMultisampleState must equal the maximum of the sample counts of those subpass attachments (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-subpass-01505)"},
- {"VUID-VkGraphicsPipelineCreateInfo-subpass-01756", "If rasterization is not disabled and subpass uses a depth/stencil attachment in renderPass that has a layout of VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL in the VkAttachmentReference defined by subpass, the depthWriteEnable member of pDepthStencilState must be VK_FALSE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-subpass-01756)"},
- {"VUID-VkGraphicsPipelineCreateInfo-subpass-01757", "If rasterization is not disabled and subpass uses a depth/stencil attachment in renderPass that has a layout of VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL or VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL in the VkAttachmentReference defined by subpass, the failOp, passOp and depthFailOp members of each of the front and back members of pDepthStencilState must be VK_STENCIL_OP_KEEP (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-subpass-01757)"},
- {"VUID-VkGraphicsPipelineCreateInfo-topology-00737", "If the topology member of pInputAssembly is VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, pStages must include tessellation shader stages (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineCreateInfo-topology-00737)"},
- {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-deviceGeneratedCommands-02887", "The VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV->deviceGeneratedCommands feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-deviceGeneratedCommands-02887)"},
- {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-groupCount-02879", "groupCount must be at least 1 and as maximum VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxGraphicsShaderGroupCount. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-groupCount-02879)"},
- {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-groupCount-02880", "The sum of groupCount including those groups added from referenced pPipelines must also be as maximum VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxGraphicsShaderGroupCount. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-groupCount-02880)"},
- {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-groupCount-arraylength", "groupCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-groupCount-arraylength)"},
- {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02881", "The state of the first element of pGroups must match its equivalent within the parent's VkGraphicsPipelineCreateInfo. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02881)"},
- {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02882", "Each element of pGroups must in combination with the rest of the pipeline state yield a valid state configuration (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02882)"},
- {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02883", "All elements of pGroups must use the same shader stage combinations. (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02883)"},
- {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02884", "All elements of pGroups must use the same shader stage combinations unless any mesh shader stage is used, then either combination of task and mesh or just mesh shader is valid. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02884)"},
- {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02885", "Mesh and regular primitive shading stages cannot be mixed across pGroups. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02885)"},
- {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-parameter", "pGroups must be a valid pointer to an array of groupCount valid VkGraphicsShaderGroupCreateInfoNV structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-parameter)"},
- {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pPipelines-02886", "Each element of the pPipelines member of libraries must have been created with identical state to the pipeline currently created except the state that can be overriden by VkGraphicsShaderGroupCreateInfoNV. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pPipelines-02886)"},
- {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pPipelines-parameter", "If pipelineCount is not 0, pPipelines must be a valid pointer to an array of pipelineCount valid VkPipeline handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pPipelines-parameter)"},
- {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-sType-sType)"},
- {"VUID-VkGraphicsShaderGroupCreateInfoNV-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsShaderGroupCreateInfoNV-pNext-pNext)"},
- {"VUID-VkGraphicsShaderGroupCreateInfoNV-pStages-02889", "For pStages, the same restrictions as in VkGraphicsPipelineCreateInfo::pStages apply. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsShaderGroupCreateInfoNV-pStages-02889)"},
- {"VUID-VkGraphicsShaderGroupCreateInfoNV-pStages-parameter", "pStages must be a valid pointer to an array of stageCount valid VkPipelineShaderStageCreateInfo structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsShaderGroupCreateInfoNV-pStages-parameter)"},
- {"VUID-VkGraphicsShaderGroupCreateInfoNV-pTessellationState-02891", "For pTessellationState, the same restrictions as in VkGraphicsPipelineCreateInfo::pTessellationState apply. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsShaderGroupCreateInfoNV-pTessellationState-02891)"},
- {"VUID-VkGraphicsShaderGroupCreateInfoNV-pVertexInputState-02890", "For pVertexInputState, the same restrictions as in VkGraphicsPipelineCreateInfo::pVertexInputState apply. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsShaderGroupCreateInfoNV-pVertexInputState-02890)"},
- {"VUID-VkGraphicsShaderGroupCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_GRAPHICS_SHADER_GROUP_CREATE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsShaderGroupCreateInfoNV-sType-sType)"},
- {"VUID-VkGraphicsShaderGroupCreateInfoNV-stageCount-02888", "For stageCount, the same restrictions as in VkGraphicsPipelineCreateInfo::stageCount apply. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsShaderGroupCreateInfoNV-stageCount-02888)"},
- {"VUID-VkGraphicsShaderGroupCreateInfoNV-stageCount-arraylength", "stageCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkGraphicsShaderGroupCreateInfoNV-stageCount-arraylength)"},
- {"VUID-VkHdrMetadataEXT-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkHdrMetadataEXT-pNext-pNext)"},
- {"VUID-VkHdrMetadataEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_HDR_METADATA_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkHdrMetadataEXT-sType-sType)"},
- {"VUID-VkHeadlessSurfaceCreateInfoEXT-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkHeadlessSurfaceCreateInfoEXT-flags-zerobitmask)"},
- {"VUID-VkHeadlessSurfaceCreateInfoEXT-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkHeadlessSurfaceCreateInfoEXT-pNext-pNext)"},
- {"VUID-VkHeadlessSurfaceCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkHeadlessSurfaceCreateInfoEXT-sType-sType)"},
- {"VUID-VkIOSSurfaceCreateInfoMVK-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIOSSurfaceCreateInfoMVK-flags-zerobitmask)"},
- {"VUID-VkIOSSurfaceCreateInfoMVK-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIOSSurfaceCreateInfoMVK-pNext-pNext)"},
- {"VUID-VkIOSSurfaceCreateInfoMVK-pView-01316", "pView must be a valid UIView and must be backed by a CALayer instance of type CAMetalLayer. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIOSSurfaceCreateInfoMVK-pView-01316)"},
- {"VUID-VkIOSSurfaceCreateInfoMVK-sType-sType", "sType must be VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIOSSurfaceCreateInfoMVK-sType-sType)"},
- {"VUID-VkImageBlit-aspectMask-00238", "The aspectMask member of srcSubresource and dstSubresource must match (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageBlit-aspectMask-00238)"},
- {"VUID-VkImageBlit-aspectMask-00241", "The aspectMask member of srcSubresource must specify aspects present in the calling command's srcImage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageBlit-aspectMask-00241)"},
- {"VUID-VkImageBlit-aspectMask-00242", "The aspectMask member of dstSubresource must specify aspects present in the calling command's dstImage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageBlit-aspectMask-00242)"},
- {"VUID-VkImageBlit-dstImage-00250", "If the calling command's dstImage is of type VK_IMAGE_TYPE_1D, then dstOffset[0].y must be 0 and dstOffset[1].y must be 1. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageBlit-dstImage-00250)"},
- {"VUID-VkImageBlit-dstImage-00252", "If the calling command's dstImage is of type VK_IMAGE_TYPE_1D or VK_IMAGE_TYPE_2D, then dstOffset[0].z must be 0 and dstOffset[1].z must be 1. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageBlit-dstImage-00252)"},
- {"VUID-VkImageBlit-dstOffset-00248", "dstOffset[0].x and dstOffset[1].x must both be greater than or equal to 0 and less than or equal to the destination image subresource width (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageBlit-dstOffset-00248)"},
- {"VUID-VkImageBlit-dstOffset-00249", "dstOffset[0].y and dstOffset[1].y must both be greater than or equal to 0 and less than or equal to the destination image subresource height (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageBlit-dstOffset-00249)"},
- {"VUID-VkImageBlit-dstOffset-00251", "dstOffset[0].z and dstOffset[1].z must both be greater than or equal to 0 and less than or equal to the destination image subresource depth (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageBlit-dstOffset-00251)"},
- {"VUID-VkImageBlit-dstSubresource-parameter", "dstSubresource must be a valid VkImageSubresourceLayers structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageBlit-dstSubresource-parameter)"},
- {"VUID-VkImageBlit-layerCount-00239", "The layerCount member of srcSubresource and dstSubresource must match (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageBlit-layerCount-00239)"},
- {"VUID-VkImageBlit-srcImage-00240", "If either of the calling command's srcImage or dstImage parameters are of VkImageType VK_IMAGE_TYPE_3D, the baseArrayLayer and layerCount members of both srcSubresource and dstSubresource must be 0 and 1, respectively (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageBlit-srcImage-00240)"},
- {"VUID-VkImageBlit-srcImage-00245", "If the calling command's srcImage is of type VK_IMAGE_TYPE_1D, then srcOffset[0].y must be 0 and srcOffset[1].y must be 1. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageBlit-srcImage-00245)"},
- {"VUID-VkImageBlit-srcImage-00247", "If the calling command's srcImage is of type VK_IMAGE_TYPE_1D or VK_IMAGE_TYPE_2D, then srcOffset[0].z must be 0 and srcOffset[1].z must be 1. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageBlit-srcImage-00247)"},
- {"VUID-VkImageBlit-srcOffset-00243", "srcOffset[0].x and srcOffset[1].x must both be greater than or equal to 0 and less than or equal to the source image subresource width (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageBlit-srcOffset-00243)"},
- {"VUID-VkImageBlit-srcOffset-00244", "srcOffset[0].y and srcOffset[1].y must both be greater than or equal to 0 and less than or equal to the source image subresource height (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageBlit-srcOffset-00244)"},
- {"VUID-VkImageBlit-srcOffset-00246", "srcOffset[0].z and srcOffset[1].z must both be greater than or equal to 0 and less than or equal to the source image subresource depth (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageBlit-srcOffset-00246)"},
- {"VUID-VkImageBlit-srcSubresource-parameter", "srcSubresource must be a valid VkImageSubresourceLayers structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageBlit-srcSubresource-parameter)"},
- {"VUID-VkImageCopy-aspectMask-00137", "The aspectMask member of srcSubresource and dstSubresource must match (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCopy-aspectMask-00137)"},
- {"VUID-VkImageCopy-aspectMask-00142", "The aspectMask member of srcSubresource must specify aspects present in the calling command's srcImage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-aspectMask-00142)"},
- {"VUID-VkImageCopy-aspectMask-00143", "The aspectMask member of dstSubresource must specify aspects present in the calling command's dstImage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-aspectMask-00143)"},
- {"VUID-VkImageCopy-dstImage-00152", "If the calling command's dstImage is of type VK_IMAGE_TYPE_1D, then dstOffset.y must be 0 and extent.height must be 1. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-00152)"},
- {"VUID-VkImageCopy-dstImage-01554", "If the calling command's dstImage has a VkFormat with two planes then the dstSubresource aspectMask must be VK_IMAGE_ASPECT_PLANE_0_BIT or VK_IMAGE_ASPECT_PLANE_1_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01554)"},
- {"VUID-VkImageCopy-dstImage-01555", "If the calling command's dstImage has a VkFormat with three planes then the dstSubresource aspectMask must be VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT, or VK_IMAGE_ASPECT_PLANE_2_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01555)"},
- {"VUID-VkImageCopy-dstImage-01557", "If the calling command's dstImage has a multi-planar image format and the srcImage does not have a multi-planar image format, the srcSubresource aspectMask must be VK_IMAGE_ASPECT_COLOR_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01557)"},
- {"VUID-VkImageCopy-dstImage-01731", "If the calling command's dstImage is a compressed format image, or a single-plane, '_422' image format, all members of dstOffset must be a multiple of the corresponding dimensions of the compressed texel block (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01731)"},
- {"VUID-VkImageCopy-dstImage-01732", "If the calling command's dstImage is a compressed format image, or a single-plane, '_422' image format, extent.width must be a multiple of the compressed texel block width or (extent.width + dstOffset.x) must equal the destination image subresource width (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01732)"},
- {"VUID-VkImageCopy-dstImage-01733", "If the calling command's dstImage is a compressed format image, or a single-plane, '_422' image format, extent.height must be a multiple of the compressed texel block height or (extent.height + dstOffset.y) must equal the destination image subresource height (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01733)"},
- {"VUID-VkImageCopy-dstImage-01734", "If the calling command's dstImage is a compressed format image, or a single-plane, '_422' image format, extent.depth must be a multiple of the compressed texel block depth or (extent.depth + dstOffset.z) must equal the destination image subresource depth (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01734)"},
- {"VUID-VkImageCopy-dstImage-01786", "If the calling command's dstImage is of type VK_IMAGE_TYPE_1D, then dstOffset.z must be 0 and extent.depth must be 1. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01786)"},
- {"VUID-VkImageCopy-dstImage-01788", "If the calling command's dstImage is of type VK_IMAGE_TYPE_2D, then dstOffset.z must be 0. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01788)"},
- {"VUID-VkImageCopy-dstImage-01792", "If the calling command's dstImage is of type VK_IMAGE_TYPE_2D, and the srcImage is of type VK_IMAGE_TYPE_3D, then extent.depth must equal to the layerCount member of dstSubresource. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-dstImage-01792)"},
- {"VUID-VkImageCopy-dstOffset-00150", "dstOffset.x and (extent.width + dstOffset.x) must both be greater than or equal to 0 and less than or equal to the destination image subresource width (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-dstOffset-00150)"},
- {"VUID-VkImageCopy-dstOffset-00151", "dstOffset.y and (extent.height + dstOffset.y) must both be greater than or equal to 0 and less than or equal to the destination image subresource height (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-dstOffset-00151)"},
- {"VUID-VkImageCopy-dstOffset-00153", "dstOffset.z and (extent.depth + dstOffset.z) must both be greater than or equal to 0 and less than or equal to the destination image subresource depth (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-dstOffset-00153)"},
- {"VUID-VkImageCopy-dstOffset-00162", "If the calling command's dstImage is a compressed format image, all members of dstOffset must be a multiple of the corresponding dimensions of the compressed texel block (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCopy-dstOffset-00162)"},
- {"VUID-VkImageCopy-dstSubresource-parameter", "dstSubresource must be a valid VkImageSubresourceLayers structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-dstSubresource-parameter)"},
- {"VUID-VkImageCopy-extent-00140", "The number of slices of the extent (for 3D) or layers of the srcSubresource (for non-3D) must match the number of slices of the extent (for 3D) or layers of the dstSubresource (for non-3D) (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-extent-00140)"},
- {"VUID-VkImageCopy-extent-00158", "If the calling command's srcImage is a compressed image, extent.width must be a multiple of the compressed texel block width or (extent.width + srcOffset.x) must equal the source image subresource width (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCopy-extent-00158)"},
- {"VUID-VkImageCopy-extent-00159", "If the calling command's srcImage is a compressed image, extent.height must be a multiple of the compressed texel block height or (extent.height + srcOffset.y) must equal the source image subresource height (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCopy-extent-00159)"},
- {"VUID-VkImageCopy-extent-00160", "If the calling command's srcImage is a compressed image, extent.depth must be a multiple of the compressed texel block depth or (extent.depth + srcOffset.z) must equal the source image subresource depth (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCopy-extent-00160)"},
- {"VUID-VkImageCopy-extent-00163", "If the calling command's dstImage is a compressed format image, extent.width must be a multiple of the compressed texel block width or (extent.width + dstOffset.x) must equal the destination image subresource width (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCopy-extent-00163)"},
- {"VUID-VkImageCopy-extent-00164", "If the calling command's dstImage is a compressed format image, extent.height must be a multiple of the compressed texel block height or (extent.height + dstOffset.y) must equal the destination image subresource height (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCopy-extent-00164)"},
- {"VUID-VkImageCopy-extent-00165", "If the calling command's dstImage is a compressed format image, extent.depth must be a multiple of the compressed texel block depth or (extent.depth + dstOffset.z) must equal the destination image subresource depth (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCopy-extent-00165)"},
- {"VUID-VkImageCopy-layerCount-00138", "The layerCount member of srcSubresource and dstSubresource must match (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCopy-layerCount-00138)"},
- {"VUID-VkImageCopy-srcImage-00139", "If either of the calling command's srcImage or dstImage parameters are of VkImageType VK_IMAGE_TYPE_3D, the baseArrayLayer and layerCount members of both srcSubresource and dstSubresource must be 0 and 1, respectively (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCopy-srcImage-00139)"},
- {"VUID-VkImageCopy-srcImage-00141", "If either of the calling command's srcImage or dstImage parameters are of VkImageType VK_IMAGE_TYPE_3D, the baseArrayLayer and layerCount members of the corresponding subresource must be 0 and 1, respectively (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-00141)"},
- {"VUID-VkImageCopy-srcImage-00146", "If the calling command's srcImage is of type VK_IMAGE_TYPE_1D, then srcOffset.y must be 0 and extent.height must be 1. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-00146)"},
- {"VUID-VkImageCopy-srcImage-01551", "If neither the calling command's srcImage nor the calling command's dstImage has a multi-planar image format then the aspectMask member of srcSubresource and dstSubresource must match (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01551)"},
- {"VUID-VkImageCopy-srcImage-01552", "If the calling command's srcImage has a VkFormat with two planes then the srcSubresource aspectMask must be VK_IMAGE_ASPECT_PLANE_0_BIT or VK_IMAGE_ASPECT_PLANE_1_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01552)"},
- {"VUID-VkImageCopy-srcImage-01553", "If the calling command's srcImage has a VkFormat with three planes then the srcSubresource aspectMask must be VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT, or VK_IMAGE_ASPECT_PLANE_2_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01553)"},
- {"VUID-VkImageCopy-srcImage-01556", "If the calling command's srcImage has a multi-planar image format and the dstImage does not have a multi-planar image format, the dstSubresource aspectMask must be VK_IMAGE_ASPECT_COLOR_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01556)"},
- {"VUID-VkImageCopy-srcImage-01727", "If the calling command's srcImage is a compressed image, or a single-plane, '_422' image format, all members of srcOffset must be a multiple of the corresponding dimensions of the compressed texel block (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01727)"},
- {"VUID-VkImageCopy-srcImage-01728", "If the calling command's srcImage is a compressed image, or a single-plane, '_422' image format, extent.width must be a multiple of the compressed texel block width or (extent.width + srcOffset.x) must equal the source image subresource width (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01728)"},
- {"VUID-VkImageCopy-srcImage-01729", "If the calling command's srcImage is a compressed image, or a single-plane, '_422' image format, extent.height must be a multiple of the compressed texel block height or (extent.height + srcOffset.y) must equal the source image subresource height (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01729)"},
- {"VUID-VkImageCopy-srcImage-01730", "If the calling command's srcImage is a compressed image, or a single-plane, '_422' image format, extent.depth must be a multiple of the compressed texel block depth or (extent.depth + srcOffset.z) must equal the source image subresource depth (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01730)"},
- {"VUID-VkImageCopy-srcImage-01785", "If the calling command's srcImage is of type VK_IMAGE_TYPE_1D, then srcOffset.z must be 0 and extent.depth must be 1. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01785)"},
- {"VUID-VkImageCopy-srcImage-01787", "If the calling command's srcImage is of type VK_IMAGE_TYPE_2D, then srcOffset.z must be 0. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01787)"},
- {"VUID-VkImageCopy-srcImage-01789", "If the calling command's srcImage or dstImage is of type VK_IMAGE_TYPE_2D, then extent.depth must be 1. (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCopy-srcImage-01789)"},
- {"VUID-VkImageCopy-srcImage-01790", "If both srcImage and dstImage are of type VK_IMAGE_TYPE_2D then extent.depth must be 1. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01790)"},
- {"VUID-VkImageCopy-srcImage-01791", "If the calling command's srcImage is of type VK_IMAGE_TYPE_2D, and the dstImage is of type VK_IMAGE_TYPE_3D, then extent.depth must equal to the layerCount member of srcSubresource. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-srcImage-01791)"},
- {"VUID-VkImageCopy-srcOffset-00144", "srcOffset.x and (extent.width + srcOffset.x) must both be greater than or equal to 0 and less than or equal to the source image subresource width (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-srcOffset-00144)"},
- {"VUID-VkImageCopy-srcOffset-00145", "srcOffset.y and (extent.height + srcOffset.y) must both be greater than or equal to 0 and less than or equal to the source image subresource height (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-srcOffset-00145)"},
- {"VUID-VkImageCopy-srcOffset-00147", "srcOffset.z and (extent.depth + srcOffset.z) must both be greater than or equal to 0 and less than or equal to the source image subresource depth (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-srcOffset-00147)"},
- {"VUID-VkImageCopy-srcOffset-00157", "If the calling command's srcImage is a compressed image, all members of srcOffset must be a multiple of the corresponding dimensions of the compressed texel block (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCopy-srcOffset-00157)"},
- {"VUID-VkImageCopy-srcSubresource-parameter", "srcSubresource must be a valid VkImageSubresourceLayers structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCopy-srcSubresource-parameter)"},
- {"VUID-VkImageCreateInfo-Format-02536", "If Format is a depth-stencil format and the pNext chain includes a VkImageStencilUsageCreateInfo structure with its stencilUsage member including VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, extent.width must be less than or equal to VkPhysicalDeviceLimits::maxFramebufferWidth (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-Format-02536)"},
- {"VUID-VkImageCreateInfo-None-01891", "If any of the bits VK_IMAGE_CREATE_SPARSE_BINDING_BIT, VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT, or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT are set, VK_IMAGE_CREATE_PROTECTED_BIT must not also be set. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-None-01891)"},
- {"VUID-VkImageCreateInfo-None-01925", "If any of the bits VK_IMAGE_CREATE_SPARSE_BINDING_BIT, VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT, or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT are set, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT must not also be set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-None-01925)"},
- {"VUID-VkImageCreateInfo-arrayLayers-00948", "arrayLayers must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-arrayLayers-00948)"},
- {"VUID-VkImageCreateInfo-arrayLayers-02256", "arrayLayers must be less than or equal to imageCreateMaxArrayLayers (as defined in Image Creation Limits). (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-arrayLayers-02256)"},
- {"VUID-VkImageCreateInfo-extent-00944", "extent.width must be greater than 0. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-extent-00944)"},
- {"VUID-VkImageCreateInfo-extent-00945", "extent.height must be greater than 0. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-extent-00945)"},
- {"VUID-VkImageCreateInfo-extent-00946", "extent.depth must be greater than 0. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-extent-00946)"},
- {"VUID-VkImageCreateInfo-extent-02252", "extent.width must be less than or equal to imageCreateMaxExtent.width (as defined in Image Creation Limits). (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-extent-02252)"},
- {"VUID-VkImageCreateInfo-extent-02253", "extent.height must be less than or equal to imageCreateMaxExtent.height (as defined in Image Creation Limits). (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-extent-02253)"},
- {"VUID-VkImageCreateInfo-extent-02254", "extent.depth must be less than or equal to imageCreateMaxExtent.depth (as defined in Image Creation Limits). (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-extent-02254)"},
- {"VUID-VkImageCreateInfo-flags-00949", "If flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, imageType must be VK_IMAGE_TYPE_2D (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-00949)"},
- {"VUID-VkImageCreateInfo-flags-00950", "If flags contains VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT, imageType must be VK_IMAGE_TYPE_3D (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-00950)"},
- {"VUID-VkImageCreateInfo-flags-00969", "If the sparse bindings feature is not enabled, flags must not contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-00969)"},
- {"VUID-VkImageCreateInfo-flags-00987", "If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-00987)"},
- {"VUID-VkImageCreateInfo-flags-01533", "If flags contains VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT format must be a depth or depth/stencil format (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-01533)"},
- {"VUID-VkImageCreateInfo-flags-01572", "If flags contains VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT, then format must be a block-compressed image format, an ETC compressed image format, or an ASTC compressed image format. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-01572)"},
- {"VUID-VkImageCreateInfo-flags-01573", "If flags contains VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT, then flags must also contain VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-01573)"},
- {"VUID-VkImageCreateInfo-flags-01890", "If the protected memory feature is not enabled, flags must not contain VK_IMAGE_CREATE_PROTECTED_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-01890)"},
- {"VUID-VkImageCreateInfo-flags-01924", "If the sparse aliased residency feature is not enabled, flags must not contain VK_IMAGE_CREATE_SPARSE_ALIASED_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-01924)"},
- {"VUID-VkImageCreateInfo-flags-02050", "If flags contains VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV, imageType must be VK_IMAGE_TYPE_2D or VK_IMAGE_TYPE_3D (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-02050)"},
- {"VUID-VkImageCreateInfo-flags-02051", "If flags contains VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV, it must not contain VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT and the format must not be a depth/stencil format (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-02051)"},
- {"VUID-VkImageCreateInfo-flags-02052", "If flags contains VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV and imageType is VK_IMAGE_TYPE_2D, extent.width and extent.height must be greater than 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-02052)"},
- {"VUID-VkImageCreateInfo-flags-02053", "If flags contains VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV and imageType is VK_IMAGE_TYPE_3D, extent.width, extent.height, and extent.depth must be greater than 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-02053)"},
- {"VUID-VkImageCreateInfo-flags-02259", "If flags contains VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT, then mipLevels must be one, arrayLayers must be one, imageType must be VK_IMAGE_TYPE_2D. and imageCreateMaybeLinear (as defined in Image Creation Limits) must be false. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-02259)"},
- {"VUID-VkImageCreateInfo-flags-02557", "If flags contains VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT, imageType must be VK_IMAGE_TYPE_2D (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-02557)"},
- {"VUID-VkImageCreateInfo-flags-02565", "If flags contains VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT, tiling must be VK_IMAGE_TILING_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-02565)"},
- {"VUID-VkImageCreateInfo-flags-02566", "If flags contains VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT, imageType must be VK_IMAGE_TYPE_2D (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-02566)"},
- {"VUID-VkImageCreateInfo-flags-02567", "If flags contains VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT, flags must not contain VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-02567)"},
- {"VUID-VkImageCreateInfo-flags-02568", "If flags contains VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT, mipLevels must be 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-02568)"},
- {"VUID-VkImageCreateInfo-flags-parameter", "flags must be a valid combination of VkImageCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-flags-parameter)"},
- {"VUID-VkImageCreateInfo-format-00943", "format must not be VK_FORMAT_UNDEFINED (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkImageCreateInfo-format-00943)"},
- {"VUID-VkImageCreateInfo-format-01577", "If format is not a multi-planar format, and flags does not include VK_IMAGE_CREATE_ALIAS_BIT, flags must not contain VK_IMAGE_CREATE_DISJOINT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-format-01577)"},
- {"VUID-VkImageCreateInfo-format-02537", "If format is a depth-stencil format and the pNext chain includes a VkImageStencilUsageCreateInfo structure with its stencilUsage member including VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, extent.height must be less than or equal to VkPhysicalDeviceLimits::maxFramebufferHeight (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-format-02537)"},
- {"VUID-VkImageCreateInfo-format-02538", "If the multisampled storage images feature is not enabled, format is a depth-stencil format and the pNext chain includes a VkImageStencilUsageCreateInfo structure with its stencilUsage including VK_IMAGE_USAGE_STORAGE_BIT, samples must be VK_SAMPLE_COUNT_1_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-format-02538)"},
- {"VUID-VkImageCreateInfo-format-02561", "If the image format is one of those listed in Formats requiring sampler Y'CBCR conversion for VK_IMAGE_ASPECT_COLOR_BIT image views, then mipLevels must be 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-format-02561)"},
- {"VUID-VkImageCreateInfo-format-02562", "If the image format is one of those listed in Formats requiring sampler Y'CBCR conversion for VK_IMAGE_ASPECT_COLOR_BIT image views, samples must be VK_SAMPLE_COUNT_1_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-format-02562)"},
- {"VUID-VkImageCreateInfo-format-02563", "If the image format is one of those listed in Formats requiring sampler Y'CBCR conversion for VK_IMAGE_ASPECT_COLOR_BIT image views, imageType must be VK_IMAGE_TYPE_2D (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-format-02563)"},
- {"VUID-VkImageCreateInfo-format-02564", "If the image format is one of those listed in Formats requiring sampler Y'CBCR conversion for VK_IMAGE_ASPECT_COLOR_BIT image views, arrayLayers must be 1 (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkImageCreateInfo-format-02564)"},
- {"VUID-VkImageCreateInfo-format-02653", "If the image format is one of those listed in Formats requiring sampler Y'CBCR conversion for VK_IMAGE_ASPECT_COLOR_BIT image views, and the ycbcrImageArrays feature is not enabled, arrayLayers must be 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-format-02653)"},
- {"VUID-VkImageCreateInfo-format-02795", "If format is a depth-stencil format, usage includes VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, and the pNext chain includes a VkImageStencilUsageCreateInfo structure, then its VkImageStencilUsageCreateInfo::stencilUsage member must also include VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-format-02795)"},
- {"VUID-VkImageCreateInfo-format-02796", "If format is a depth-stencil format, usage does not include VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, and the pNext chain includes a VkImageStencilUsageCreateInfo structure, then its VkImageStencilUsageCreateInfo::stencilUsage member must also not include VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-format-02796)"},
- {"VUID-VkImageCreateInfo-format-02797", "If format is a depth-stencil format, usage includes VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, and the pNext chain includes a VkImageStencilUsageCreateInfo structure, then its VkImageStencilUsageCreateInfo::stencilUsage member must also include VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-format-02797)"},
- {"VUID-VkImageCreateInfo-format-02798", "If format is a depth-stencil format, usage does not include VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, and the pNext chain includes a VkImageStencilUsageCreateInfo structure, then its VkImageStencilUsageCreateInfo::stencilUsage member must also not include VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-format-02798)"},
- {"VUID-VkImageCreateInfo-format-parameter", "format must be a valid VkFormat value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-format-parameter)"},
- {"VUID-VkImageCreateInfo-imageCreateFormatFeatures-02260", "If format is a multi-planar format, and if imageCreateFormatFeatures (as defined in Image Creation Limits) does not contain VK_FORMAT_FEATURE_DISJOINT_BIT, then flags must not contain VK_IMAGE_CREATE_DISJOINT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-imageCreateFormatFeatures-02260)"},
- {"VUID-VkImageCreateInfo-imageCreateMaxMipLevels-02251", "Each of the following values (as described in Image Creation Limits) must not be undefined imageCreateMaxMipLevels, imageCreateMaxArrayLayers, imageCreateMaxExtent, and imageCreateSampleCounts. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-imageCreateMaxMipLevels-02251)"},
- {"VUID-VkImageCreateInfo-imageType-00954", "If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and extent.height must be equal and arrayLayers must be greater than or equal to 6 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00954)"},
- {"VUID-VkImageCreateInfo-imageType-00956", "If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00956)"},
- {"VUID-VkImageCreateInfo-imageType-00957", "If imageType is VK_IMAGE_TYPE_2D, extent.depth must be 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00957)"},
- {"VUID-VkImageCreateInfo-imageType-00961", "If imageType is VK_IMAGE_TYPE_3D, arrayLayers must be 1. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00961)"},
- {"VUID-VkImageCreateInfo-imageType-00970", "If imageType is VK_IMAGE_TYPE_1D, flags must not contain VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00970)"},
- {"VUID-VkImageCreateInfo-imageType-00971", "If the sparse residency for 2D images feature is not enabled, and imageType is VK_IMAGE_TYPE_2D, flags must not contain VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00971)"},
- {"VUID-VkImageCreateInfo-imageType-00972", "If the sparse residency for 3D images feature is not enabled, and imageType is VK_IMAGE_TYPE_3D, flags must not contain VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00972)"},
- {"VUID-VkImageCreateInfo-imageType-00973", "If the sparse residency for images with 2 samples feature is not enabled, imageType is VK_IMAGE_TYPE_2D, and samples is VK_SAMPLE_COUNT_2_BIT, flags must not contain VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00973)"},
- {"VUID-VkImageCreateInfo-imageType-00974", "If the sparse residency for images with 4 samples feature is not enabled, imageType is VK_IMAGE_TYPE_2D, and samples is VK_SAMPLE_COUNT_4_BIT, flags must not contain VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00974)"},
- {"VUID-VkImageCreateInfo-imageType-00975", "If the sparse residency for images with 8 samples feature is not enabled, imageType is VK_IMAGE_TYPE_2D, and samples is VK_SAMPLE_COUNT_8_BIT, flags must not contain VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00975)"},
- {"VUID-VkImageCreateInfo-imageType-00976", "If the sparse residency for images with 16 samples feature is not enabled, imageType is VK_IMAGE_TYPE_2D, and samples is VK_SAMPLE_COUNT_16_BIT, flags must not contain VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-imageType-00976)"},
- {"VUID-VkImageCreateInfo-imageType-02082", "If usage includes VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV, imageType must be VK_IMAGE_TYPE_2D. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-imageType-02082)"},
- {"VUID-VkImageCreateInfo-imageType-parameter", "imageType must be a valid VkImageType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-imageType-parameter)"},
- {"VUID-VkImageCreateInfo-initialLayout-00993", "initialLayout must be VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-initialLayout-00993)"},
- {"VUID-VkImageCreateInfo-initialLayout-parameter", "initialLayout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-initialLayout-parameter)"},
- {"VUID-VkImageCreateInfo-mipLevels-00947", "mipLevels must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-mipLevels-00947)"},
- {"VUID-VkImageCreateInfo-mipLevels-00958", "mipLevels must be less than or equal to the number of levels in the complete mipmap chain based on extent.width, extent.height, and extent.depth. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-mipLevels-00958)"},
- {"VUID-VkImageCreateInfo-mipLevels-02255", "mipLevels must be less than or equal to imageCreateMaxMipLevels (as defined in Image Creation Limits). (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-mipLevels-02255)"},
- {"VUID-VkImageCreateInfo-pNext-00988", "If the pNext chain includes a VkExternalMemoryImageCreateInfoNV structure, it must not contain a VkExternalMemoryImageCreateInfo structure. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-00988)"},
- {"VUID-VkImageCreateInfo-pNext-00990", "If the pNext chain includes a VkExternalMemoryImageCreateInfo structure, its handleTypes member must only contain bits that are also in VkExternalImageFormatProperties::externalMemoryProperties.compatibleHandleTypes, as returned by vkGetPhysicalDeviceImageFormatProperties2 with format, imageType, tiling, usage, and flags equal to those in this structure, and with a VkPhysicalDeviceExternalImageFormatInfo structure included in the pNext chain, with a handleType equal to any one of the handle types specified in VkExternalMemoryImageCreateInfo::handleTypes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-00990)"},
- {"VUID-VkImageCreateInfo-pNext-00991", "If the pNext chain includes a VkExternalMemoryImageCreateInfoNV structure, its handleTypes member must only contain bits that are also in VkExternalImageFormatPropertiesNV::externalMemoryProperties.compatibleHandleTypes, as returned by vkGetPhysicalDeviceExternalImageFormatPropertiesNV with format, imageType, tiling, usage, and flags equal to those in this structure, and with externalHandleType equal to any one of the handle types specified in VkExternalMemoryImageCreateInfoNV::handleTypes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-00991)"},
- {"VUID-VkImageCreateInfo-pNext-01443", "If the pNext chain includes a ifdef::VK_VERSION_1_1,VK_KHR_external_memory[VkExternalMemoryImageCreateInfo] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-01443)"},
- {"VUID-VkImageCreateInfo-pNext-01974", "If the pNext chain includes a VkExternalFormatANDROID structure, and its externalFormat member is non-zero the format must be VK_FORMAT_UNDEFINED. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-01974)"},
- {"VUID-VkImageCreateInfo-pNext-01975", "If the pNext chain does not include a VkExternalFormatANDROID structure, or does and its externalFormat member is 0, the format must not be VK_FORMAT_UNDEFINED. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-01975)"},
- {"VUID-VkImageCreateInfo-pNext-02262", "If the pNext chain includes a VkImageDrmFormatModifierListCreateInfoEXT or VkImageDrmFormatModifierExplicitCreateInfoEXT structure, then tiling must be VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-02262)"},
- {"VUID-VkImageCreateInfo-pNext-02393", "If the pNext chain includes a VkExternalMemoryImageCreateInfo structure whose handleTypes member includes VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, imageType must be VK_IMAGE_TYPE_2D. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-02393)"},
- {"VUID-VkImageCreateInfo-pNext-02394", "If the pNext chain includes a VkExternalMemoryImageCreateInfo structure whose handleTypes member includes VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, mipLevels must either be 1 or equal to the number of levels in the complete mipmap chain based on extent.width, extent.height, and extent.depth. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-02394)"},
- {"VUID-VkImageCreateInfo-pNext-02396", "If the pNext chain includes a VkExternalFormatANDROID structure whose externalFormat member is not 0, flags must not include VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-02396)"},
- {"VUID-VkImageCreateInfo-pNext-02397", "If the pNext chain includes a VkExternalFormatANDROID structure whose externalFormat member is not 0, usage must not include any usages except VK_IMAGE_USAGE_SAMPLED_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-02397)"},
- {"VUID-VkImageCreateInfo-pNext-02398", "If the pNext chain includes a VkExternalFormatANDROID structure whose externalFormat member is not 0, tiling must be VK_IMAGE_TILING_OPTIMAL. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-02398)"},
- {"VUID-VkImageCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkDedicatedAllocationImageCreateInfoNV, VkExternalFormatANDROID, VkExternalMemoryImageCreateInfo, VkExternalMemoryImageCreateInfoNV, VkImageDrmFormatModifierExplicitCreateInfoEXT, VkImageDrmFormatModifierListCreateInfoEXT, VkImageFormatListCreateInfo, VkImageStencilUsageCreateInfo, or VkImageSwapchainCreateInfoKHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-pNext-pNext)"},
- {"VUID-VkImageCreateInfo-physicalDeviceCount-01421", "If the logical device was created with VkDeviceGroupDeviceCreateInfo::physicalDeviceCount equal to 1, flags must not contain VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-physicalDeviceCount-01421)"},
- {"VUID-VkImageCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-sType-sType)"},
- {"VUID-VkImageCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-sType-unique)"},
- {"VUID-VkImageCreateInfo-samples-02083", "If usage includes VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV, samples must be VK_SAMPLE_COUNT_1_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-samples-02083)"},
- {"VUID-VkImageCreateInfo-samples-02257", "If samples is not VK_SAMPLE_COUNT_1_BIT, then imageType must be VK_IMAGE_TYPE_2D, flags must not contain VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, mipLevels must be equal to 1, and imageCreateMaybeLinear (as defined in Image Creation Limits) must be false, (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-samples-02257)"},
- {"VUID-VkImageCreateInfo-samples-02258", "samples must be a bit value that is set in imageCreateSampleCounts (as defined in Image Creation Limits). (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-samples-02258)"},
- {"VUID-VkImageCreateInfo-samples-02558", "If samples is not VK_SAMPLE_COUNT_1_BIT, usage must not contain VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-samples-02558)"},
- {"VUID-VkImageCreateInfo-samples-parameter", "samples must be a valid VkSampleCountFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-samples-parameter)"},
- {"VUID-VkImageCreateInfo-sharingMode-00941", "If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a valid pointer to an array of queueFamilyIndexCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-sharingMode-00941)"},
- {"VUID-VkImageCreateInfo-sharingMode-00942", "If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-sharingMode-00942)"},
- {"VUID-VkImageCreateInfo-sharingMode-01392", "If sharingMode is VK_SHARING_MODE_CONCURRENT, each element of pQueueFamilyIndices must be unique and must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the physicalDevice that was used to create device (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageCreateInfo-sharingMode-01392)"},
- {"VUID-VkImageCreateInfo-sharingMode-01420", "If sharingMode is VK_SHARING_MODE_CONCURRENT, each element of pQueueFamilyIndices must be unique and must be less than pQueueFamilyPropertyCount returned by either vkGetPhysicalDeviceQueueFamilyProperties or vkGetPhysicalDeviceQueueFamilyProperties2 for the physicalDevice that was used to create device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-sharingMode-01420)"},
- {"VUID-VkImageCreateInfo-sharingMode-parameter", "sharingMode must be a valid VkSharingMode value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-sharingMode-parameter)"},
- {"VUID-VkImageCreateInfo-tiling-02084", "If usage includes VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV, tiling must be VK_IMAGE_TILING_OPTIMAL. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-tiling-02084)"},
- {"VUID-VkImageCreateInfo-tiling-02261", "If tiling is VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then the pNext chain must include exactly one of VkImageDrmFormatModifierListCreateInfoEXT or VkImageDrmFormatModifierExplicitCreateInfoEXT structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-tiling-02261)"},
- {"VUID-VkImageCreateInfo-tiling-02353", "If tiling is VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT and flags contains VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT, then the pNext chain must include a VkImageFormatListCreateInfo structure with non-zero viewFormatCount. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-tiling-02353)"},
- {"VUID-VkImageCreateInfo-tiling-parameter", "tiling must be a valid VkImageTiling value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-tiling-parameter)"},
- {"VUID-VkImageCreateInfo-usage-00963", "If usage includes VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, then bits other than VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, and VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT must not be set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-usage-00963)"},
- {"VUID-VkImageCreateInfo-usage-00964", "If usage includes VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, extent.width must be less than or equal to VkPhysicalDeviceLimits::maxFramebufferWidth (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-usage-00964)"},
- {"VUID-VkImageCreateInfo-usage-00965", "If usage includes VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, extent.height must be less than or equal to VkPhysicalDeviceLimits::maxFramebufferHeight (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-usage-00965)"},
- {"VUID-VkImageCreateInfo-usage-00966", "If usage includes VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, usage must also contain at least one of VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-usage-00966)"},
- {"VUID-VkImageCreateInfo-usage-00968", "If the multisampled storage images feature is not enabled, and usage contains VK_IMAGE_USAGE_STORAGE_BIT, samples must be VK_SAMPLE_COUNT_1_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-usage-00968)"},
- {"VUID-VkImageCreateInfo-usage-02559", "If usage includes VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT, extent.width must be less than or equal to the ceiling of maxFramebufferWidth/minFragmentDensityTexelSize.width (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-usage-02559)"},
- {"VUID-VkImageCreateInfo-usage-02560", "If usage includes VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT, extent.height must be less than or equal to the ceiling of maxFramebufferHeight/minFragmentDensityTexelSize.height (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-usage-02560)"},
- {"VUID-VkImageCreateInfo-usage-parameter", "usage must be a valid combination of VkImageUsageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-usage-parameter)"},
- {"VUID-VkImageCreateInfo-usage-requiredbitmask", "usage must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageCreateInfo-usage-requiredbitmask)"},
- {"VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-arrayPitch-02268", "For each element of pPlaneLayouts, arrayPitch must be 0 if VkImageCreateInfo::arrayLayers is 1. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-arrayPitch-02268)"},
- {"VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-depthPitch-02269", "For each element of pPlaneLayouts, depthPitch must be 0 if VkImageCreateInfo::extent.depth is 1. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-depthPitch-02269)"},
- {"VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-drmFormatModifier-02264", "drmFormatModifier must be compatible with the parameters in VkImageCreateInfo and its pNext chain, as determined by querying VkPhysicalDeviceImageFormatInfo2 extended with VkPhysicalDeviceImageDrmFormatModifierInfoEXT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-drmFormatModifier-02264)"},
- {"VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-drmFormatModifierPlaneCount-02265", "drmFormatModifierPlaneCount must be equal to the VkDrmFormatModifierPropertiesEXT::drmFormatModifierPlaneCount associated with VkImageCreateInfo::format and drmFormatModifier, as found by querying VkDrmFormatModifierPropertiesListEXT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-drmFormatModifierPlaneCount-02265)"},
- {"VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-pPlaneLayouts-parameter", "If drmFormatModifierPlaneCount is not 0, pPlaneLayouts must be a valid pointer to an array of drmFormatModifierPlaneCount VkSubresourceLayout structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-pPlaneLayouts-parameter)"},
- {"VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-sType-sType)"},
- {"VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-size-02267", "For each element of pPlaneLayouts, size must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-size-02267)"},
- {"VUID-VkImageDrmFormatModifierListCreateInfoEXT-drmFormatModifierCount-arraylength", "drmFormatModifierCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageDrmFormatModifierListCreateInfoEXT-drmFormatModifierCount-arraylength)"},
- {"VUID-VkImageDrmFormatModifierListCreateInfoEXT-pDrmFormatModifiers-02263", "Each modifier in pDrmFormatModifiers must be compatible with the parameters in VkImageCreateInfo and its pNext chain, as determined by querying VkPhysicalDeviceImageFormatInfo2 extended with VkPhysicalDeviceImageDrmFormatModifierInfoEXT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageDrmFormatModifierListCreateInfoEXT-pDrmFormatModifiers-02263)"},
- {"VUID-VkImageDrmFormatModifierListCreateInfoEXT-pDrmFormatModifiers-parameter", "pDrmFormatModifiers must be a valid pointer to an array of drmFormatModifierCount uint64_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageDrmFormatModifierListCreateInfoEXT-pDrmFormatModifiers-parameter)"},
- {"VUID-VkImageDrmFormatModifierListCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageDrmFormatModifierListCreateInfoEXT-sType-sType)"},
- {"VUID-VkImageDrmFormatModifierPropertiesEXT-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageDrmFormatModifierPropertiesEXT-pNext-pNext)"},
- {"VUID-VkImageDrmFormatModifierPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageDrmFormatModifierPropertiesEXT-sType-sType)"},
- {"VUID-VkImageFormatListCreateInfo-flags-01579", "If VkImageCreateInfo::flags does not contain VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT, viewFormatCount must be 0 or 1. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageFormatListCreateInfo-flags-01579)"},
- {"VUID-VkImageFormatListCreateInfo-pViewFormats-parameter", "If viewFormatCount is not 0, pViewFormats must be a valid pointer to an array of viewFormatCount valid VkFormat values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageFormatListCreateInfo-pViewFormats-parameter)"},
- {"VUID-VkImageFormatListCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageFormatListCreateInfo-sType-sType)"},
- {"VUID-VkImageFormatListCreateInfo-viewFormatCount-01578", "If viewFormatCount is not 0, all of the formats in the pViewFormats array must be compatible with the format specified in the format field of VkImageCreateInfo, as described in the compatibility table. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageFormatListCreateInfo-viewFormatCount-01578)"},
- {"VUID-VkImageFormatListCreateInfo-viewFormatCount-01580", "If viewFormatCount is not 0, VkImageCreateInfo::format must be in pViewFormats. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageFormatListCreateInfo-viewFormatCount-01580)"},
- {"VUID-VkImageFormatProperties2-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkAndroidHardwareBufferUsageANDROID, VkExternalImageFormatProperties, VkFilterCubicImageViewImageFormatPropertiesEXT, VkSamplerYcbcrConversionImageFormatProperties, or VkTextureLODGatherFormatPropertiesAMD (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageFormatProperties2-pNext-pNext)"},
- {"VUID-VkImageFormatProperties2-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageFormatProperties2-sType-sType)"},
- {"VUID-VkImageFormatProperties2-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageFormatProperties2-sType-unique)"},
- {"VUID-VkImageMemoryBarrier-image-01199", "If image was created with a sharing mode of VK_SHARING_MODE_CONCURRENT, srcQueueFamilyIndex and dstQueueFamilyIndex must both be VK_QUEUE_FAMILY_IGNORED (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01199)"},
- {"VUID-VkImageMemoryBarrier-image-01200", "If image was created with a sharing mode of VK_SHARING_MODE_EXCLUSIVE, srcQueueFamilyIndex and dstQueueFamilyIndex must either both be VK_QUEUE_FAMILY_IGNORED, or both be a valid queue family (see Queue Family Properties). (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01200)"},
- {"VUID-VkImageMemoryBarrier-image-01201", "If image was created with a sharing mode of VK_SHARING_MODE_EXCLUSIVE and srcQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, dstQueueFamilyIndex must also be VK_QUEUE_FAMILY_IGNORED. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01201)"},
- {"VUID-VkImageMemoryBarrier-image-01205", "If image was created with a sharing mode of VK_SHARING_MODE_EXCLUSIVE, and srcQueueFamilyIndex and dstQueueFamilyIndex are not VK_QUEUE_FAMILY_IGNORED, at least one of them must be the same as the family of the queue that will execute this barrier (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01205)"},
- {"VUID-VkImageMemoryBarrier-image-01207", "If image has a depth/stencil format with both depth and stencil components, then the aspectMask member of subresourceRange must include both VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT (https://www.khronos.org/registry/vulkan/specs/1.1/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01207)"},
- {"VUID-VkImageMemoryBarrier-image-01381", "If image was created with a sharing mode of VK_SHARING_MODE_CONCURRENT, at least one of srcQueueFamilyIndex and dstQueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01381)"},
- {"VUID-VkImageMemoryBarrier-image-01671", "If image has a color format and either the format is single-plane or the image is not disjoint then the aspectMask member of subresourceRange must only include VK_IMAGE_ASPECT_COLOR_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01671)"},
- {"VUID-VkImageMemoryBarrier-image-01672", "If image has a multi-planar format and the image is disjoint, then the aspectMask member of subresourceRange must include either at least one of VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT, and VK_IMAGE_ASPECT_PLANE_2_BIT; or must include VK_IMAGE_ASPECT_COLOR_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01672)"},
- {"VUID-VkImageMemoryBarrier-image-01673", "If image has a multi-planar format with only two planes, then the aspectMask member of subresourceRange must not include VK_IMAGE_ASPECT_PLANE_2_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01673)"},
- {"VUID-VkImageMemoryBarrier-image-01766", "If image was created with a sharing mode of VK_SHARING_MODE_CONCURRENT, and one of srcQueueFamilyIndex and dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, the other must be VK_QUEUE_FAMILY_IGNORED or a special queue family reserved for external memory transfers, as described in Queue Family Ownership Transfer. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01766)"},
- {"VUID-VkImageMemoryBarrier-image-01767", "If image was created with a sharing mode of VK_SHARING_MODE_EXCLUSIVE and srcQueueFamilyIndex is not VK_QUEUE_FAMILY_IGNORED, it must be a valid queue family or a special queue family reserved for external memory transfers, as described in Queue Family Ownership Transfer. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01767)"},
- {"VUID-VkImageMemoryBarrier-image-01768", "If image was created with a sharing mode of VK_SHARING_MODE_EXCLUSIVE and dstQueueFamilyIndex is not VK_QUEUE_FAMILY_IGNORED, it must be a valid queue family or a special queue family reserved for external memory transfers, as described in Queue Family Ownership Transfer. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01768)"},
- {"VUID-VkImageMemoryBarrier-image-01932", "If image is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-01932)"},
- {"VUID-VkImageMemoryBarrier-image-02902", "If image has a color format, then the aspectMask member of subresourceRange must only include VK_IMAGE_ASPECT_COLOR_BIT (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageMemoryBarrier-image-02902)"},
- {"VUID-VkImageMemoryBarrier-image-03319", "If image has a depth/stencil format with both depth and stencil and the separateDepthStencilLayouts feature is enabled, then the aspectMask member of subresourceRange must include either or both VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-03319)"},
- {"VUID-VkImageMemoryBarrier-image-03320", "If image has a depth/stencil format with both depth and stencil and the separateDepthStencilLayouts feature is not enabled, then the aspectMask member of subresourceRange must include both VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-03320)"},
- {"VUID-VkImageMemoryBarrier-image-parameter", "image must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-image-parameter)"},
- {"VUID-VkImageMemoryBarrier-newLayout-01198", "newLayout must not be VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-newLayout-01198)"},
- {"VUID-VkImageMemoryBarrier-newLayout-parameter", "newLayout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-newLayout-parameter)"},
- {"VUID-VkImageMemoryBarrier-oldLayout-01197", "oldLayout must be VK_IMAGE_LAYOUT_UNDEFINED or the current layout of the image subresources affected by the barrier (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-01197)"},
- {"VUID-VkImageMemoryBarrier-oldLayout-01208", "If either oldLayout or newLayout is VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL then image must have been created with VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-01208)"},
- {"VUID-VkImageMemoryBarrier-oldLayout-01209", "If either oldLayout or newLayout is VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL then image must have been created with VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-01209)"},
- {"VUID-VkImageMemoryBarrier-oldLayout-01210", "If either oldLayout or newLayout is VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL then image must have been created with VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-01210)"},
- {"VUID-VkImageMemoryBarrier-oldLayout-01211", "If either oldLayout or newLayout is VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL then image must have been created with VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-01211)"},
- {"VUID-VkImageMemoryBarrier-oldLayout-01212", "If either oldLayout or newLayout is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL then image must have been created with VK_IMAGE_USAGE_TRANSFER_SRC_BIT set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-01212)"},
- {"VUID-VkImageMemoryBarrier-oldLayout-01213", "If either oldLayout or newLayout is VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL then image must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-01213)"},
- {"VUID-VkImageMemoryBarrier-oldLayout-01658", "If either oldLayout or newLayout is VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL then image must have been created with VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-01658)"},
- {"VUID-VkImageMemoryBarrier-oldLayout-01659", "If either oldLayout or newLayout is VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL then image must have been created with VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-01659)"},
- {"VUID-VkImageMemoryBarrier-oldLayout-02088", "If either oldLayout or newLayout is VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV then image must have been created with VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-02088)"},
- {"VUID-VkImageMemoryBarrier-oldLayout-parameter", "oldLayout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-oldLayout-parameter)"},
- {"VUID-VkImageMemoryBarrier-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkSampleLocationsInfoEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-pNext-pNext)"},
- {"VUID-VkImageMemoryBarrier-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-sType-sType)"},
- {"VUID-VkImageMemoryBarrier-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-sType-unique)"},
- {"VUID-VkImageMemoryBarrier-subresourceRange-01486", "subresourceRange.baseMipLevel must be less than the mipLevels specified in VkImageCreateInfo when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-subresourceRange-01486)"},
- {"VUID-VkImageMemoryBarrier-subresourceRange-01488", "subresourceRange.baseArrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-subresourceRange-01488)"},
- {"VUID-VkImageMemoryBarrier-subresourceRange-01724", "If subresourceRange.levelCount is not VK_REMAINING_MIP_LEVELS, subresourceRange.baseMipLevel + subresourceRange.levelCount must be less than or equal to the mipLevels specified in VkImageCreateInfo when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-subresourceRange-01724)"},
- {"VUID-VkImageMemoryBarrier-subresourceRange-01725", "If subresourceRange.layerCount is not VK_REMAINING_ARRAY_LAYERS, subresourceRange.baseArrayLayer + subresourceRange.layerCount must be less than or equal to the arrayLayers specified in VkImageCreateInfo when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-subresourceRange-01725)"},
- {"VUID-VkImageMemoryBarrier-subresourceRange-parameter", "subresourceRange must be a valid VkImageSubresourceRange structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryBarrier-subresourceRange-parameter)"},
- {"VUID-VkImageMemoryRequirementsInfo2-image-01589", "If image was created with a multi-planar format and the VK_IMAGE_CREATE_DISJOINT_BIT flag, there must be a VkImagePlaneMemoryRequirementsInfo included in the pNext chain of the VkImageMemoryRequirementsInfo2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-image-01589)"},
- {"VUID-VkImageMemoryRequirementsInfo2-image-01590", "If image was not created with the VK_IMAGE_CREATE_DISJOINT_BIT flag, there must not be a VkImagePlaneMemoryRequirementsInfo included in the pNext chain of the VkImageMemoryRequirementsInfo2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-image-01590)"},
- {"VUID-VkImageMemoryRequirementsInfo2-image-01591", "If image was created with a single-plane format, there must not be a VkImagePlaneMemoryRequirementsInfo included in the pNext chain of the VkImageMemoryRequirementsInfo2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-image-01591)"},
- {"VUID-VkImageMemoryRequirementsInfo2-image-01897", "If image was created with the VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID external memory handle type, then image must be bound to memory. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-image-01897)"},
- {"VUID-VkImageMemoryRequirementsInfo2-image-02279", "If image was created with VK_IMAGE_CREATE_DISJOINT_BIT and with VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then there must be a VkImagePlaneMemoryRequirementsInfo included in the pNext chain of the VkImageMemoryRequirementsInfo2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-image-02279)"},
- {"VUID-VkImageMemoryRequirementsInfo2-image-02280", "If image was created with a single-plane format and with any tiling other than VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then there must not be a VkImagePlaneMemoryRequirementsInfo included in the pNext chain of the VkImageMemoryRequirementsInfo2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-image-02280)"},
- {"VUID-VkImageMemoryRequirementsInfo2-image-parameter", "image must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-image-parameter)"},
- {"VUID-VkImageMemoryRequirementsInfo2-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkImagePlaneMemoryRequirementsInfo (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-pNext-pNext)"},
- {"VUID-VkImageMemoryRequirementsInfo2-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-sType-sType)"},
- {"VUID-VkImageMemoryRequirementsInfo2-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageMemoryRequirementsInfo2-sType-unique)"},
- {"VUID-VkImagePipeSurfaceCreateInfoFUCHSIA-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImagePipeSurfaceCreateInfoFUCHSIA-flags-zerobitmask)"},
- {"VUID-VkImagePipeSurfaceCreateInfoFUCHSIA-imagePipeHandle-00000", "imagePipeHandle must be a valid zx_handle_t (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImagePipeSurfaceCreateInfoFUCHSIA-imagePipeHandle-00000)"},
- {"VUID-VkImagePipeSurfaceCreateInfoFUCHSIA-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImagePipeSurfaceCreateInfoFUCHSIA-pNext-pNext)"},
- {"VUID-VkImagePipeSurfaceCreateInfoFUCHSIA-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGEPIPE_SURFACE_CREATE_INFO_FUCHSIA (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImagePipeSurfaceCreateInfoFUCHSIA-sType-sType)"},
- {"VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-02281", "If the image's tiling is VK_IMAGE_TILING_LINEAR or VK_IMAGE_TILING_OPTIMAL, then planeAspect must be a single valid format plane for the image. (That is, for a two-plane image planeAspect must be VK_IMAGE_ASPECT_PLANE_0_BIT or VK_IMAGE_ASPECT_PLANE_1_BIT, and for a three-plane image planeAspect must be VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT or VK_IMAGE_ASPECT_PLANE_2_BIT). (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-02281)"},
- {"VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-02282", "If the image's tiling is VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then planeAspect must be a single valid memory plane for the image. (That is, aspectMask must specify a plane index that is less than the drmFormatModifierPlaneCount associated with the image's format and drmFormatModifier.) (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-02282)"},
- {"VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-parameter", "planeAspect must be a valid VkImageAspectFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-parameter)"},
- {"VUID-VkImagePlaneMemoryRequirementsInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImagePlaneMemoryRequirementsInfo-sType-sType)"},
- {"VUID-VkImageResolve-aspectMask-00266", "The aspectMask member of srcSubresource and dstSubresource must only contain VK_IMAGE_ASPECT_COLOR_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageResolve-aspectMask-00266)"},
- {"VUID-VkImageResolve-dstImage-00276", "If the calling command's dstImage is of type VK_IMAGE_TYPE_1D, then dstOffset.y must be 0 and extent.height must be 1. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageResolve-dstImage-00276)"},
- {"VUID-VkImageResolve-dstImage-00278", "If the calling command's dstImage is of type VK_IMAGE_TYPE_1D or VK_IMAGE_TYPE_2D, then dstOffset.z must be 0 and extent.depth must be 1. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageResolve-dstImage-00278)"},
- {"VUID-VkImageResolve-dstOffset-00274", "dstOffset.x and (extent.width + dstOffset.x) must both be greater than or equal to 0 and less than or equal to the destination image subresource width (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageResolve-dstOffset-00274)"},
- {"VUID-VkImageResolve-dstOffset-00275", "dstOffset.y and (extent.height + dstOffset.y) must both be greater than or equal to 0 and less than or equal to the destination image subresource height (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageResolve-dstOffset-00275)"},
- {"VUID-VkImageResolve-dstOffset-00277", "dstOffset.z and (extent.depth + dstOffset.z) must both be greater than or equal to 0 and less than or equal to the destination image subresource depth (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageResolve-dstOffset-00277)"},
- {"VUID-VkImageResolve-dstSubresource-parameter", "dstSubresource must be a valid VkImageSubresourceLayers structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageResolve-dstSubresource-parameter)"},
- {"VUID-VkImageResolve-layerCount-00267", "The layerCount member of srcSubresource and dstSubresource must match (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageResolve-layerCount-00267)"},
- {"VUID-VkImageResolve-srcImage-00268", "If either of the calling command's srcImage or dstImage parameters are of VkImageType VK_IMAGE_TYPE_3D, the baseArrayLayer and layerCount members of both srcSubresource and dstSubresource must be 0 and 1, respectively (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageResolve-srcImage-00268)"},
- {"VUID-VkImageResolve-srcImage-00271", "If the calling command's srcImage is of type VK_IMAGE_TYPE_1D, then srcOffset.y must be 0 and extent.height must be 1. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageResolve-srcImage-00271)"},
- {"VUID-VkImageResolve-srcImage-00273", "If the calling command's srcImage is of type VK_IMAGE_TYPE_1D or VK_IMAGE_TYPE_2D, then srcOffset.z must be 0 and extent.depth must be 1. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageResolve-srcImage-00273)"},
- {"VUID-VkImageResolve-srcOffset-00269", "srcOffset.x and (extent.width + srcOffset.x) must both be greater than or equal to 0 and less than or equal to the source image subresource width (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageResolve-srcOffset-00269)"},
- {"VUID-VkImageResolve-srcOffset-00270", "srcOffset.y and (extent.height + srcOffset.y) must both be greater than or equal to 0 and less than or equal to the source image subresource height (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageResolve-srcOffset-00270)"},
- {"VUID-VkImageResolve-srcOffset-00272", "srcOffset.z and (extent.depth + srcOffset.z) must both be greater than or equal to 0 and less than or equal to the source image subresource depth (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageResolve-srcOffset-00272)"},
- {"VUID-VkImageResolve-srcSubresource-parameter", "srcSubresource must be a valid VkImageSubresourceLayers structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageResolve-srcSubresource-parameter)"},
- {"VUID-VkImageSparseMemoryRequirementsInfo2-image-parameter", "image must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageSparseMemoryRequirementsInfo2-image-parameter)"},
- {"VUID-VkImageSparseMemoryRequirementsInfo2-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageSparseMemoryRequirementsInfo2-pNext-pNext)"},
- {"VUID-VkImageSparseMemoryRequirementsInfo2-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageSparseMemoryRequirementsInfo2-sType-sType)"},
- {"VUID-VkImageStencilUsageCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageStencilUsageCreateInfo-sType-sType)"},
- {"VUID-VkImageStencilUsageCreateInfo-stencilUsage-02539", "If stencilUsage includes VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, it must not include bits other than VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageStencilUsageCreateInfo-stencilUsage-02539)"},
- {"VUID-VkImageStencilUsageCreateInfo-stencilUsage-parameter", "stencilUsage must be a valid combination of VkImageUsageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageStencilUsageCreateInfo-stencilUsage-parameter)"},
- {"VUID-VkImageStencilUsageCreateInfo-stencilUsage-requiredbitmask", "stencilUsage must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageStencilUsageCreateInfo-stencilUsage-requiredbitmask)"},
- {"VUID-VkImageSubresource-aspectMask-parameter", "aspectMask must be a valid combination of VkImageAspectFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageSubresource-aspectMask-parameter)"},
- {"VUID-VkImageSubresource-aspectMask-requiredbitmask", "aspectMask must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageSubresource-aspectMask-requiredbitmask)"},
- {"VUID-VkImageSubresourceLayers-aspectMask-00167", "If aspectMask contains VK_IMAGE_ASPECT_COLOR_BIT, it must not contain either of VK_IMAGE_ASPECT_DEPTH_BIT or VK_IMAGE_ASPECT_STENCIL_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageSubresourceLayers-aspectMask-00167)"},
- {"VUID-VkImageSubresourceLayers-aspectMask-00168", "aspectMask must not contain VK_IMAGE_ASPECT_METADATA_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageSubresourceLayers-aspectMask-00168)"},
- {"VUID-VkImageSubresourceLayers-aspectMask-02247", "aspectMask must not include VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT for any index i. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageSubresourceLayers-aspectMask-02247)"},
- {"VUID-VkImageSubresourceLayers-aspectMask-parameter", "aspectMask must be a valid combination of VkImageAspectFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageSubresourceLayers-aspectMask-parameter)"},
- {"VUID-VkImageSubresourceLayers-aspectMask-requiredbitmask", "aspectMask must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageSubresourceLayers-aspectMask-requiredbitmask)"},
- {"VUID-VkImageSubresourceLayers-layerCount-01700", "layerCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageSubresourceLayers-layerCount-01700)"},
- {"VUID-VkImageSubresourceRange-aspectMask-01670", "If aspectMask includes VK_IMAGE_ASPECT_COLOR_BIT, then it must not include any of VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT, or VK_IMAGE_ASPECT_PLANE_2_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageSubresourceRange-aspectMask-01670)"},
- {"VUID-VkImageSubresourceRange-aspectMask-02278", "aspectMask must not include VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT for any index i (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageSubresourceRange-aspectMask-02278)"},
- {"VUID-VkImageSubresourceRange-aspectMask-parameter", "aspectMask must be a valid combination of VkImageAspectFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageSubresourceRange-aspectMask-parameter)"},
- {"VUID-VkImageSubresourceRange-aspectMask-requiredbitmask", "aspectMask must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageSubresourceRange-aspectMask-requiredbitmask)"},
- {"VUID-VkImageSubresourceRange-layerCount-01721", "If layerCount is not VK_REMAINING_ARRAY_LAYERS, it must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageSubresourceRange-layerCount-01721)"},
- {"VUID-VkImageSubresourceRange-levelCount-01720", "If levelCount is not VK_REMAINING_MIP_LEVELS, it must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageSubresourceRange-levelCount-01720)"},
- {"VUID-VkImageSwapchainCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageSwapchainCreateInfoKHR-sType-sType)"},
- {"VUID-VkImageSwapchainCreateInfoKHR-swapchain-00995", "If swapchain is not VK_NULL_HANDLE, the fields of VkImageCreateInfo must match the implied image creation parameters of the swapchain (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageSwapchainCreateInfoKHR-swapchain-00995)"},
- {"VUID-VkImageSwapchainCreateInfoKHR-swapchain-parameter", "If swapchain is not VK_NULL_HANDLE, swapchain must be a valid VkSwapchainKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageSwapchainCreateInfoKHR-swapchain-parameter)"},
- {"VUID-VkImageViewASTCDecodeModeEXT-decodeMode-02230", "decodeMode must be one of VK_FORMAT_R16G16B16A16_SFLOAT, VK_FORMAT_R8G8B8A8_UNORM, or VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewASTCDecodeModeEXT-decodeMode-02230)"},
- {"VUID-VkImageViewASTCDecodeModeEXT-decodeMode-02231", "If the decodeModeSharedExponent feature is not enabled, decodeMode must not be VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewASTCDecodeModeEXT-decodeMode-02231)"},
- {"VUID-VkImageViewASTCDecodeModeEXT-decodeMode-02232", "If decodeMode is VK_FORMAT_R8G8B8A8_UNORM the image view must not include blocks using any of the ASTC HDR modes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewASTCDecodeModeEXT-decodeMode-02232)"},
- {"VUID-VkImageViewASTCDecodeModeEXT-decodeMode-parameter", "decodeMode must be a valid VkFormat value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewASTCDecodeModeEXT-decodeMode-parameter)"},
- {"VUID-VkImageViewASTCDecodeModeEXT-format-02233", "format of the image view must be one of VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_FORMAT_ASTC_4x4_SRGB_BLOCK, VK_FORMAT_ASTC_5x4_UNORM_BLOCK, VK_FORMAT_ASTC_5x4_SRGB_BLOCK, VK_FORMAT_ASTC_5x5_UNORM_BLOCK, VK_FORMAT_ASTC_5x5_SRGB_BLOCK, VK_FORMAT_ASTC_6x5_UNORM_BLOCK, VK_FORMAT_ASTC_6x5_SRGB_BLOCK, VK_FORMAT_ASTC_6x6_UNORM_BLOCK, VK_FORMAT_ASTC_6x6_SRGB_BLOCK, VK_FORMAT_ASTC_8x5_UNORM_BLOCK, VK_FORMAT_ASTC_8x5_SRGB_BLOCK, VK_FORMAT_ASTC_8x6_UNORM_BLOCK, VK_FORMAT_ASTC_8x6_SRGB_BLOCK, VK_FORMAT_ASTC_8x8_UNORM_BLOCK, VK_FORMAT_ASTC_8x8_SRGB_BLOCK, VK_FORMAT_ASTC_10x5_UNORM_BLOCK, VK_FORMAT_ASTC_10x5_SRGB_BLOCK, VK_FORMAT_ASTC_10x6_UNORM_BLOCK, VK_FORMAT_ASTC_10x6_SRGB_BLOCK, VK_FORMAT_ASTC_10x8_UNORM_BLOCK, VK_FORMAT_ASTC_10x8_SRGB_BLOCK, VK_FORMAT_ASTC_10x10_UNORM_BLOCK, VK_FORMAT_ASTC_10x10_SRGB_BLOCK, VK_FORMAT_ASTC_12x10_UNORM_BLOCK, VK_FORMAT_ASTC_12x10_SRGB_BLOCK, VK_FORMAT_ASTC_12x12_UNORM_BLOCK, or VK_FORMAT_ASTC_12x12_SRGB_BLOCK (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewASTCDecodeModeEXT-format-02233)"},
- {"VUID-VkImageViewASTCDecodeModeEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewASTCDecodeModeEXT-sType-sType)"},
- {"VUID-VkImageViewCreateInfo-None-02273", "The format features of the resultant image view must contain at least one bit. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-None-02273)"},
- {"VUID-VkImageViewCreateInfo-components-parameter", "components must be a valid VkComponentMapping structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-components-parameter)"},
- {"VUID-VkImageViewCreateInfo-flags-02572", "If dynamic fragment density map feature is not enabled, flags must not contain VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-flags-02572)"},
- {"VUID-VkImageViewCreateInfo-flags-parameter", "flags must be a valid combination of VkImageViewCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-flags-parameter)"},
- {"VUID-VkImageViewCreateInfo-format-parameter", "format must be a valid VkFormat value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-format-parameter)"},
- {"VUID-VkImageViewCreateInfo-image-01003", "If image was not created with VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT then viewType must not be VK_IMAGE_VIEW_TYPE_CUBE or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01003)"},
- {"VUID-VkImageViewCreateInfo-image-01005", "If image was created with VK_IMAGE_TYPE_3D but without VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT set then viewType must not be VK_IMAGE_VIEW_TYPE_2D or VK_IMAGE_VIEW_TYPE_2D_ARRAY (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01005)"},
- {"VUID-VkImageViewCreateInfo-image-01007", "image must have been created with a usage value containing at least one of VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_USAGE_STORAGE_BIT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01007)"},
- {"VUID-VkImageViewCreateInfo-image-01018", "If image was created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag, format must be compatible with the format used to create image, as defined in Format Compatibility Classes (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01018)"},
- {"VUID-VkImageViewCreateInfo-image-01019", "If image was not created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag, format must be identical to the format used to create image (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01019)"},
- {"VUID-VkImageViewCreateInfo-image-01020", "If image is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01020)"},
- {"VUID-VkImageViewCreateInfo-image-01482", "If image is not a 3D image created with VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT set, or viewType is not VK_IMAGE_VIEW_TYPE_2D or VK_IMAGE_VIEW_TYPE_2D_ARRAY, subresourceRange.baseArrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01482)"},
- {"VUID-VkImageViewCreateInfo-image-01583", "If image was created with the VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT flag, format must be compatible with, or must be an uncompressed format that is size-compatible with, the format used to create image. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01583)"},
- {"VUID-VkImageViewCreateInfo-image-01584", "If image was created with the VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT flag, the levelCount and layerCount members of subresourceRange must both be 1. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01584)"},
- {"VUID-VkImageViewCreateInfo-image-01586", "If image was created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag, if the format of the image is a multi-planar format, and if subresourceRange.aspectMask is one of VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT, or VK_IMAGE_ASPECT_PLANE_2_BIT, then format must be compatible with the VkFormat for the plane of the image format indicated by subresourceRange.aspectMask, as defined in Compatible formats of planes of multi-planar formats (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01586)"},
- {"VUID-VkImageViewCreateInfo-image-01759", "If image was created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag, but without the VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT flag, format must be compatible with the format used to create image, as defined in Format Compatibility Classes (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkImageViewCreateInfo-image-01759)"},
- {"VUID-VkImageViewCreateInfo-image-01760", "If image was created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag, and if the format of the image is not a multi-planar format, format must be compatible with the format used to create image, as defined in Format Compatibility Classes (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkImageViewCreateInfo-image-01760)"},
- {"VUID-VkImageViewCreateInfo-image-01761", "If image was created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag, but without the VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT flag, and if the format of the image is not a multi-planar format, format must be compatible with the format used to create image, as defined in Format Compatibility Classes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01761)"},
- {"VUID-VkImageViewCreateInfo-image-01762", "If image was not created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag, or if the format of the image is a multi-planar format and if subresourceRange.aspectMask is VK_IMAGE_ASPECT_COLOR_BIT, format must be identical to the format used to create image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-01762)"},
- {"VUID-VkImageViewCreateInfo-image-02085", "image must have been created with a usage value containing at least one of VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_USAGE_STORAGE_BIT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, or VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkImageViewCreateInfo-image-02085)"},
- {"VUID-VkImageViewCreateInfo-image-02086", "If image was created with usage containing VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV, viewType must be VK_IMAGE_VIEW_TYPE_2D or VK_IMAGE_VIEW_TYPE_2D_ARRAY (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-02086)"},
- {"VUID-VkImageViewCreateInfo-image-02087", "If image was created with usage containing VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV, format must be VK_FORMAT_R8_UINT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-02087)"},
- {"VUID-VkImageViewCreateInfo-image-02399", "If image has an external format, format must be VK_FORMAT_UNDEFINED. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-02399)"},
- {"VUID-VkImageViewCreateInfo-image-02400", "If image has an external format, the pNext chain must include a VkSamplerYcbcrConversionInfo structure with a conversion object created with the same external format as image. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-02400)"},
- {"VUID-VkImageViewCreateInfo-image-02401", "If image has an external format, all members of components must be VK_COMPONENT_SWIZZLE_IDENTITY. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-02401)"},
- {"VUID-VkImageViewCreateInfo-image-02569", "image must have been created with a usage value containing at least one of VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_USAGE_STORAGE_BIT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, or VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkImageViewCreateInfo-image-02569)"},
- {"VUID-VkImageViewCreateInfo-image-02570", "image must have been created with a usage value containing at least one of VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_USAGE_STORAGE_BIT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV, or VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-02570)"},
- {"VUID-VkImageViewCreateInfo-image-02571", "If image was created with usage containing VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT, subresourceRange.levelCount must be 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-02571)"},
- {"VUID-VkImageViewCreateInfo-image-02573", "If dynamic fragment density map feature is not enabled and image was created with usage containing VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT, flags must not contain any of VK_IMAGE_CREATE_PROTECTED_BIT, VK_IMAGE_CREATE_SPARSE_BINDING_BIT, VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT, or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-02573)"},
- {"VUID-VkImageViewCreateInfo-image-02724", "If image is a 3D image created with VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT set, and viewType is VK_IMAGE_VIEW_TYPE_2D or VK_IMAGE_VIEW_TYPE_2D_ARRAY, subresourceRange.baseArrayLayer must be less than the depth computed from baseMipLevel and extent.depth specified in VkImageCreateInfo when image was created, according to the formula defined in Image Miplevel Sizing. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-02724)"},
- {"VUID-VkImageViewCreateInfo-image-parameter", "image must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-image-parameter)"},
- {"VUID-VkImageViewCreateInfo-pNext-01585", "If a VkImageFormatListCreateInfo structure was included in the pNext chain of the VkImageCreateInfo structure used when creating image and the viewFormatCount field of VkImageFormatListCreateInfo is not zero then format must be one of the formats in VkImageFormatListCreateInfo::pViewFormats. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-pNext-01585)"},
- {"VUID-VkImageViewCreateInfo-pNext-01970", "If the pNext chain includes a VkSamplerYcbcrConversionInfo structure with a conversion value other than VK_NULL_HANDLE, all members of components must have the value VK_COMPONENT_SWIZZLE_IDENTITY. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-pNext-01970)"},
- {"VUID-VkImageViewCreateInfo-pNext-02661", "If the pNext chain includes a VkImageViewUsageCreateInfo structure, its usage member must not include any bits that were not set in the usage member of the VkImageCreateInfo structure used to create image. (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-pNext-02661)"},
- {"VUID-VkImageViewCreateInfo-pNext-02662", "If the pNext chain includes a VkImageViewUsageCreateInfo structure, and image was not created with a VkImageStencilUsageCreateInfo structure included in the pNext chain of VkImageCreateInfo, its usage member must not include any bits that were not set in the usage member of the VkImageCreateInfo structure used to create image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-pNext-02662)"},
- {"VUID-VkImageViewCreateInfo-pNext-02663", "If the pNext chain includes a VkImageViewUsageCreateInfo structure, image was created with a VkImageStencilUsageCreateInfo structure included in the pNext chain of VkImageCreateInfo, and subResourceRange.aspectMask includes VK_IMAGE_ASPECT_STENCIL_BIT, the usage member of the VkImageViewUsageCreateInfo instance must not include any bits that were not set in the usage member of the VkImageStencilUsageCreateInfo structure used to create image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-pNext-02663)"},
- {"VUID-VkImageViewCreateInfo-pNext-02664", "If the pNext chain includes a VkImageViewUsageCreateInfo structure, image was created with a VkImageStencilUsageCreateInfo structure included in the pNext chain of VkImageCreateInfo, and subResourceRange.aspectMask includes bits other than VK_IMAGE_ASPECT_STENCIL_BIT, the usage member of the VkImageViewUsageCreateInfo structure must not include any bits that were not set in the usage member of the VkImageCreateInfo structure used to create image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-pNext-02664)"},
- {"VUID-VkImageViewCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkImageViewASTCDecodeModeEXT, VkImageViewUsageCreateInfo, or VkSamplerYcbcrConversionInfo (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-pNext-pNext)"},
- {"VUID-VkImageViewCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-sType-sType)"},
- {"VUID-VkImageViewCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-sType-unique)"},
- {"VUID-VkImageViewCreateInfo-subResourceRange-01021", "subresourceRange and viewType must be compatible with the image, as described in the compatibility table (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-subResourceRange-01021)"},
- {"VUID-VkImageViewCreateInfo-subresourceRange-01478", "subresourceRange.baseMipLevel must be less than the mipLevels specified in VkImageCreateInfo when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-subresourceRange-01478)"},
- {"VUID-VkImageViewCreateInfo-subresourceRange-01480", "subresourceRange.baseArrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when image was created (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-subresourceRange-01480)"},
- {"VUID-VkImageViewCreateInfo-subresourceRange-01483", "If subresourceRange.layerCount is not VK_REMAINING_ARRAY_LAYERS, image is not a 3D image created with VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT set, or viewType is not VK_IMAGE_VIEW_TYPE_2D or VK_IMAGE_VIEW_TYPE_2D_ARRAY, subresourceRange.layerCount must be non-zero and subresourceRange.baseArrayLayer + subresourceRange.layerCount must be less than or equal to the arrayLayers specified in VkImageCreateInfo when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-subresourceRange-01483)"},
- {"VUID-VkImageViewCreateInfo-subresourceRange-01718", "If subresourceRange.levelCount is not VK_REMAINING_MIP_LEVELS, subresourceRange.baseMipLevel + subresourceRange.levelCount must be less than or equal to the mipLevels specified in VkImageCreateInfo when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-subresourceRange-01718)"},
- {"VUID-VkImageViewCreateInfo-subresourceRange-01719", "If subresourceRange.layerCount is not VK_REMAINING_ARRAY_LAYERS, subresourceRange.baseArrayLayer + subresourceRange.layerCount must be less than or equal to the arrayLayers specified in VkImageCreateInfo when image was created (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkImageViewCreateInfo-subresourceRange-01719)"},
- {"VUID-VkImageViewCreateInfo-subresourceRange-02725", "If subresourceRange.layerCount is not VK_REMAINING_ARRAY_LAYERS, image is a 3D image created with VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT set, and viewType is VK_IMAGE_VIEW_TYPE_2D or VK_IMAGE_VIEW_TYPE_2D_ARRAY, subresourceRange.layerCount must be non-zero and subresourceRange.baseArrayLayer + subresourceRange.layerCount must be less than or equal to the depth computed from baseMipLevel and extent.depth specified in VkImageCreateInfo when image was created, according to the formula defined in Image Miplevel Sizing. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-subresourceRange-02725)"},
- {"VUID-VkImageViewCreateInfo-subresourceRange-parameter", "subresourceRange must be a valid VkImageSubresourceRange structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-subresourceRange-parameter)"},
- {"VUID-VkImageViewCreateInfo-usage-02274", "If usage contains VK_IMAGE_USAGE_SAMPLED_BIT, then the format features of the resultant image view must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-usage-02274)"},
- {"VUID-VkImageViewCreateInfo-usage-02275", "If usage contains VK_IMAGE_USAGE_STORAGE_BIT, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-usage-02275)"},
- {"VUID-VkImageViewCreateInfo-usage-02276", "If usage contains VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, then the image view's format features must contain VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-usage-02276)"},
- {"VUID-VkImageViewCreateInfo-usage-02277", "If usage contains VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, then the image view's format features must contain VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-usage-02277)"},
- {"VUID-VkImageViewCreateInfo-usage-02652", "If usage contains VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, then the image view's format features must contain at least one of VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT or VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-usage-02652)"},
- {"VUID-VkImageViewCreateInfo-viewType-01004", "If the image cubemap arrays feature is not enabled, viewType must not be VK_IMAGE_VIEW_TYPE_CUBE_ARRAY (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-viewType-01004)"},
- {"VUID-VkImageViewCreateInfo-viewType-parameter", "viewType must be a valid VkImageViewType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewCreateInfo-viewType-parameter)"},
- {"VUID-VkImageViewHandleInfoNVX-commonparent", "Both of imageView, and sampler that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewHandleInfoNVX-commonparent)"},
- {"VUID-VkImageViewHandleInfoNVX-descriptorType-02654", "descriptorType must be VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewHandleInfoNVX-descriptorType-02654)"},
- {"VUID-VkImageViewHandleInfoNVX-descriptorType-parameter", "descriptorType must be a valid VkDescriptorType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewHandleInfoNVX-descriptorType-parameter)"},
- {"VUID-VkImageViewHandleInfoNVX-imageView-02656", "If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, the image that imageView was created from must have been created with the VK_IMAGE_USAGE_SAMPLED_BIT usage bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewHandleInfoNVX-imageView-02656)"},
- {"VUID-VkImageViewHandleInfoNVX-imageView-02657", "If descriptorType is VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, the image that imageView was created from must have been created with the VK_IMAGE_USAGE_STORAGE_BIT usage bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewHandleInfoNVX-imageView-02657)"},
- {"VUID-VkImageViewHandleInfoNVX-imageView-parameter", "imageView must be a valid VkImageView handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewHandleInfoNVX-imageView-parameter)"},
- {"VUID-VkImageViewHandleInfoNVX-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewHandleInfoNVX-pNext-pNext)"},
- {"VUID-VkImageViewHandleInfoNVX-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_VIEW_HANDLE_INFO_NVX (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewHandleInfoNVX-sType-sType)"},
- {"VUID-VkImageViewHandleInfoNVX-sampler-02655", "sampler must be a valid VkSampler if descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewHandleInfoNVX-sampler-02655)"},
- {"VUID-VkImageViewHandleInfoNVX-sampler-parameter", "If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewHandleInfoNVX-sampler-parameter)"},
- {"VUID-VkImageViewUsageCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewUsageCreateInfo-sType-sType)"},
- {"VUID-VkImageViewUsageCreateInfo-usage-parameter", "usage must be a valid combination of VkImageUsageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewUsageCreateInfo-usage-parameter)"},
- {"VUID-VkImageViewUsageCreateInfo-usage-requiredbitmask", "usage must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImageViewUsageCreateInfo-usage-requiredbitmask)"},
- {"VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01880", "If buffer is not NULL, Android hardware buffers must be supported for import, as reported by VkExternalImageFormatProperties or VkExternalBufferProperties. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01880)"},
- {"VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01881", "If buffer is not NULL, it must be a valid Android hardware buffer object with AHardwareBuffer_Desc::format and AHardwareBuffer_Desc::usage compatible with Vulkan as described in Android Hardware Buffers. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01881)"},
- {"VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-parameter", "buffer must be a valid pointer to an AHardwareBuffer value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-parameter)"},
- {"VUID-VkImportAndroidHardwareBufferInfoANDROID-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportAndroidHardwareBufferInfoANDROID-sType-sType)"},
- {"VUID-VkImportFenceFdInfoKHR-fd-01541", "fd must obey any requirements listed for handleType in external fence handle types compatibility. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportFenceFdInfoKHR-fd-01541)"},
- {"VUID-VkImportFenceFdInfoKHR-fence-parameter", "fence must be a valid VkFence handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportFenceFdInfoKHR-fence-parameter)"},
- {"VUID-VkImportFenceFdInfoKHR-flags-parameter", "flags must be a valid combination of VkFenceImportFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportFenceFdInfoKHR-flags-parameter)"},
- {"VUID-VkImportFenceFdInfoKHR-handleType-01464", "handleType must be a value included in the Handle Types Supported by VkImportFenceFdInfoKHR table. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportFenceFdInfoKHR-handleType-01464)"},
- {"VUID-VkImportFenceFdInfoKHR-handleType-parameter", "handleType must be a valid VkExternalFenceHandleTypeFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportFenceFdInfoKHR-handleType-parameter)"},
- {"VUID-VkImportFenceFdInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportFenceFdInfoKHR-pNext-pNext)"},
- {"VUID-VkImportFenceFdInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportFenceFdInfoKHR-sType-sType)"},
- {"VUID-VkImportFenceWin32HandleInfoKHR-fence-parameter", "fence must be a valid VkFence handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportFenceWin32HandleInfoKHR-fence-parameter)"},
- {"VUID-VkImportFenceWin32HandleInfoKHR-flags-parameter", "flags must be a valid combination of VkFenceImportFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportFenceWin32HandleInfoKHR-flags-parameter)"},
- {"VUID-VkImportFenceWin32HandleInfoKHR-handle-01462", "If handle is not NULL, name must be NULL. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportFenceWin32HandleInfoKHR-handle-01462)"},
- {"VUID-VkImportFenceWin32HandleInfoKHR-handle-01539", "If handle is not NULL, it must obey any requirements listed for handleType in external fence handle types compatibility. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportFenceWin32HandleInfoKHR-handle-01539)"},
- {"VUID-VkImportFenceWin32HandleInfoKHR-handleType-01457", "handleType must be a value included in the Handle Types Supported by VkImportFenceWin32HandleInfoKHR table. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportFenceWin32HandleInfoKHR-handleType-01457)"},
- {"VUID-VkImportFenceWin32HandleInfoKHR-handleType-01459", "If handleType is not VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT, name must be NULL. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportFenceWin32HandleInfoKHR-handleType-01459)"},
- {"VUID-VkImportFenceWin32HandleInfoKHR-handleType-01460", "If handleType is not 0 and handle is NULL, name must name a valid synchronization primitive of the type specified by handleType. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportFenceWin32HandleInfoKHR-handleType-01460)"},
- {"VUID-VkImportFenceWin32HandleInfoKHR-handleType-01461", "If handleType is not 0 and name is NULL, handle must be a valid handle of the type specified by handleType. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportFenceWin32HandleInfoKHR-handleType-01461)"},
- {"VUID-VkImportFenceWin32HandleInfoKHR-handleType-parameter", "If handleType is not 0, handleType must be a valid VkExternalFenceHandleTypeFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportFenceWin32HandleInfoKHR-handleType-parameter)"},
- {"VUID-VkImportFenceWin32HandleInfoKHR-name-01540", "If name is not NULL, it must obey any requirements listed for handleType in external fence handle types compatibility. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportFenceWin32HandleInfoKHR-name-01540)"},
- {"VUID-VkImportFenceWin32HandleInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportFenceWin32HandleInfoKHR-pNext-pNext)"},
- {"VUID-VkImportFenceWin32HandleInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportFenceWin32HandleInfoKHR-sType-sType)"},
- {"VUID-VkImportMemoryFdInfoKHR-fd-00668", "The memory from which fd was exported must have been created on the same underlying physical device as device. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryFdInfoKHR-fd-00668)"},
- {"VUID-VkImportMemoryFdInfoKHR-fd-01520", "fd must obey any requirements listed for handleType in external memory handle types compatibility. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryFdInfoKHR-fd-01520)"},
- {"VUID-VkImportMemoryFdInfoKHR-fd-01746", "The memory represented by fd must have been created from a physical device and driver that is compatible with device and handleType, as described in External memory handle types compatibility. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryFdInfoKHR-fd-01746)"},
- {"VUID-VkImportMemoryFdInfoKHR-handleType-00667", "If handleType is not 0, it must be supported for import, as reported by VkExternalImageFormatProperties or VkExternalBufferProperties. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryFdInfoKHR-handleType-00667)"},
- {"VUID-VkImportMemoryFdInfoKHR-handleType-00669", "If handleType is not 0, it must be defined as a POSIX file descriptor handle. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryFdInfoKHR-handleType-00669)"},
- {"VUID-VkImportMemoryFdInfoKHR-handleType-00670", "If handleType is not 0, fd must be a valid handle of the type specified by handleType. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryFdInfoKHR-handleType-00670)"},
- {"VUID-VkImportMemoryFdInfoKHR-handleType-parameter", "If handleType is not 0, handleType must be a valid VkExternalMemoryHandleTypeFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryFdInfoKHR-handleType-parameter)"},
- {"VUID-VkImportMemoryFdInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryFdInfoKHR-sType-sType)"},
- {"VUID-VkImportMemoryHostPointerInfoEXT-handleType-01747", "If handleType is not 0, it must be supported for import, as reported in VkExternalMemoryProperties (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryHostPointerInfoEXT-handleType-01747)"},
- {"VUID-VkImportMemoryHostPointerInfoEXT-handleType-01748", "If handleType is not 0, it must be VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT or VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryHostPointerInfoEXT-handleType-01748)"},
- {"VUID-VkImportMemoryHostPointerInfoEXT-handleType-01750", "If handleType is VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT, pHostPointer must be a pointer to allocationSize number of bytes of host memory, where allocationSize is the member of the VkMemoryAllocateInfo structure this structure is chained to (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryHostPointerInfoEXT-handleType-01750)"},
- {"VUID-VkImportMemoryHostPointerInfoEXT-handleType-01751", "If handleType is VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT, pHostPointer must be a pointer to allocationSize number of bytes of host mapped foreign memory, where allocationSize is the member of the VkMemoryAllocateInfo structure this structure is chained to (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryHostPointerInfoEXT-handleType-01751)"},
- {"VUID-VkImportMemoryHostPointerInfoEXT-handleType-parameter", "handleType must be a valid VkExternalMemoryHandleTypeFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryHostPointerInfoEXT-handleType-parameter)"},
- {"VUID-VkImportMemoryHostPointerInfoEXT-pHostPointer-01749", "pHostPointer must be a pointer aligned to an integer multiple of VkPhysicalDeviceExternalMemoryHostPropertiesEXT::minImportedHostPointerAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryHostPointerInfoEXT-pHostPointer-01749)"},
- {"VUID-VkImportMemoryHostPointerInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryHostPointerInfoEXT-sType-sType)"},
- {"VUID-VkImportMemoryWin32HandleInfoKHR-handle-00659", "The memory from which handle was exported, or the memory named by name must have been created on the same underlying physical device as device. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-handle-00659)"},
- {"VUID-VkImportMemoryWin32HandleInfoKHR-handle-01441", "if handle is not NULL, name must be NULL. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-handle-01441)"},
- {"VUID-VkImportMemoryWin32HandleInfoKHR-handle-01518", "If handle is not NULL, it must obey any requirements listed for handleType in external memory handle types compatibility. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-handle-01518)"},
- {"VUID-VkImportMemoryWin32HandleInfoKHR-handleType-00658", "If handleType is not 0, it must be supported for import, as reported by VkExternalImageFormatProperties or VkExternalBufferProperties. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-handleType-00658)"},
- {"VUID-VkImportMemoryWin32HandleInfoKHR-handleType-00660", "If handleType is not 0, it must be defined as an NT handle or a global share handle. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-handleType-00660)"},
- {"VUID-VkImportMemoryWin32HandleInfoKHR-handleType-00661", "If handleType is not 0 and name is NULL, handle must be a valid handle of the type specified by handleType. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-handleType-00661)"},
- {"VUID-VkImportMemoryWin32HandleInfoKHR-handleType-01439", "If handleType is not VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT, or VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT, name must be NULL. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-handleType-01439)"},
- {"VUID-VkImportMemoryWin32HandleInfoKHR-handleType-01440", "If handleType is not 0 and handle is NULL, name must name a valid memory resource of the type specified by handleType. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-handleType-01440)"},
- {"VUID-VkImportMemoryWin32HandleInfoKHR-handleType-parameter", "If handleType is not 0, handleType must be a valid VkExternalMemoryHandleTypeFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-handleType-parameter)"},
- {"VUID-VkImportMemoryWin32HandleInfoKHR-name-01519", "If name is not NULL, it must obey any requirements listed for handleType in external memory handle types compatibility. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-name-01519)"},
- {"VUID-VkImportMemoryWin32HandleInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoKHR-sType-sType)"},
- {"VUID-VkImportMemoryWin32HandleInfoNV-handle-01328", "handle must be a valid handle to memory, obtained as specified by handleType. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoNV-handle-01328)"},
- {"VUID-VkImportMemoryWin32HandleInfoNV-handleType-01327", "handleType must not have more than one bit set. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoNV-handleType-01327)"},
- {"VUID-VkImportMemoryWin32HandleInfoNV-handleType-parameter", "handleType must be a valid combination of VkExternalMemoryHandleTypeFlagBitsNV values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoNV-handleType-parameter)"},
- {"VUID-VkImportMemoryWin32HandleInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportMemoryWin32HandleInfoNV-sType-sType)"},
- {"VUID-VkImportSemaphoreFdInfoKHR-fd-01544", "fd must obey any requirements listed for handleType in external semaphore handle types compatibility. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreFdInfoKHR-fd-01544)"},
- {"VUID-VkImportSemaphoreFdInfoKHR-flags-03323", "If flags contains VK_SEMAPHORE_IMPORT_TEMPORARY_BIT, the VkSemaphoreTypeCreateInfo::semaphoreType field of the semaphore from which fd was exported must not be VK_SEMAPHORE_TYPE_TIMELINE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreFdInfoKHR-flags-03323)"},
- {"VUID-VkImportSemaphoreFdInfoKHR-flags-parameter", "flags must be a valid combination of VkSemaphoreImportFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreFdInfoKHR-flags-parameter)"},
- {"VUID-VkImportSemaphoreFdInfoKHR-handleType-01143", "handleType must be a value included in the Handle Types Supported by VkImportSemaphoreFdInfoKHR table. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreFdInfoKHR-handleType-01143)"},
- {"VUID-VkImportSemaphoreFdInfoKHR-handleType-03263", "If handleType is VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT, the VkSemaphoreCreateInfo::flags field must match that of the semaphore from which fd was exported. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreFdInfoKHR-handleType-03263)"},
- {"VUID-VkImportSemaphoreFdInfoKHR-handleType-03264", "If handleType is VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT, the VkSemaphoreTypeCreateInfo::semaphoreType field must match that of the semaphore from which fd was exported. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreFdInfoKHR-handleType-03264)"},
- {"VUID-VkImportSemaphoreFdInfoKHR-handleType-parameter", "handleType must be a valid VkExternalSemaphoreHandleTypeFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreFdInfoKHR-handleType-parameter)"},
- {"VUID-VkImportSemaphoreFdInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreFdInfoKHR-pNext-pNext)"},
- {"VUID-VkImportSemaphoreFdInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreFdInfoKHR-sType-sType)"},
- {"VUID-VkImportSemaphoreFdInfoKHR-semaphore-parameter", "semaphore must be a valid VkSemaphore handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreFdInfoKHR-semaphore-parameter)"},
- {"VUID-VkImportSemaphoreWin32HandleInfoKHR-flags-03322", "If flags contains VK_SEMAPHORE_IMPORT_TEMPORARY_BIT, the VkSemaphoreTypeCreateInfo::semaphoreType field of the semaphore from which handle or name was exported must not be VK_SEMAPHORE_TYPE_TIMELINE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreWin32HandleInfoKHR-flags-03322)"},
- {"VUID-VkImportSemaphoreWin32HandleInfoKHR-flags-parameter", "flags must be a valid combination of VkSemaphoreImportFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreWin32HandleInfoKHR-flags-parameter)"},
- {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handle-01469", "If handle is not NULL, name must be NULL. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreWin32HandleInfoKHR-handle-01469)"},
- {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handle-01542", "If handle is not NULL, it must obey any requirements listed for handleType in external semaphore handle types compatibility. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreWin32HandleInfoKHR-handle-01542)"},
- {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01140", "handleType must be a value included in the Handle Types Supported by VkImportSemaphoreWin32HandleInfoKHR table. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01140)"},
- {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01466", "If handleType is not VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT or VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT, name must be NULL. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01466)"},
- {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01467", "If handleType is not 0 and handle is NULL, name must name a valid synchronization primitive of the type specified by handleType. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01467)"},
- {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01468", "If handleType is not 0 and name is NULL, handle must be a valid handle of the type specified by handleType. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01468)"},
- {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-03261", "If handleType is VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT or VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT, the VkSemaphoreCreateInfo::flags field must match that of the semaphore from which handle or name was exported. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-03261)"},
- {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-03262", "If handleType is VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT or VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT, the VkSemaphoreTypeCreateInfo::semaphoreType field must match that of the semaphore from which handle or name was exported. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-03262)"},
- {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-parameter", "If handleType is not 0, handleType must be a valid VkExternalSemaphoreHandleTypeFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-parameter)"},
- {"VUID-VkImportSemaphoreWin32HandleInfoKHR-name-01543", "If name is not NULL, it must obey any requirements listed for handleType in external semaphore handle types compatibility. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreWin32HandleInfoKHR-name-01543)"},
- {"VUID-VkImportSemaphoreWin32HandleInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreWin32HandleInfoKHR-pNext-pNext)"},
- {"VUID-VkImportSemaphoreWin32HandleInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreWin32HandleInfoKHR-sType-sType)"},
- {"VUID-VkImportSemaphoreWin32HandleInfoKHR-semaphore-parameter", "semaphore must be a valid VkSemaphore handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkImportSemaphoreWin32HandleInfoKHR-semaphore-parameter)"},
- {"VUID-VkIndirectCommandsLayoutCreateInfoNV-flags-parameter", "flags must be a valid combination of VkIndirectCommandsLayoutUsageFlagBitsNV values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutCreateInfoNV-flags-parameter)"},
- {"VUID-VkIndirectCommandsLayoutCreateInfoNV-flags-requiredbitmask", "flags must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutCreateInfoNV-flags-requiredbitmask)"},
- {"VUID-VkIndirectCommandsLayoutCreateInfoNV-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutCreateInfoNV-pNext-pNext)"},
- {"VUID-VkIndirectCommandsLayoutCreateInfoNV-pStreamStrides-02937", "each element of pStreamStrides must be greater than `0`and less than or equal to VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectCommandsStreamStride. Furthermore the alignment of each token input must be ensured. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutCreateInfoNV-pStreamStrides-02937)"},
- {"VUID-VkIndirectCommandsLayoutCreateInfoNV-pStreamStrides-parameter", "pStreamStrides must be a valid pointer to an array of streamCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutCreateInfoNV-pStreamStrides-parameter)"},
- {"VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02932", "If pTokens contains an entry of VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV it must be the first element of the array and there must be only a single element of such token type. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02932)"},
- {"VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02933", "If pTokens contains an entry of VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV there must be only a single element of such token type. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02933)"},
- {"VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02934", "All state tokens in pTokens must occur prior work provoking tokens (VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NV, VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV, VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV). (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02934)"},
- {"VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02935", "The content of pTokens must include one single work provoking token that is compatible with the pipelineBindPoint. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02935)"},
- {"VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-parameter", "pTokens must be a valid pointer to an array of tokenCount valid VkIndirectCommandsLayoutTokenNV structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-parameter)"},
- {"VUID-VkIndirectCommandsLayoutCreateInfoNV-pipelineBindPoint-02930", "The pipelineBindPoint must be VK_PIPELINE_BIND_POINT_GRAPHICS (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutCreateInfoNV-pipelineBindPoint-02930)"},
- {"VUID-VkIndirectCommandsLayoutCreateInfoNV-pipelineBindPoint-parameter", "pipelineBindPoint must be a valid VkPipelineBindPoint value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutCreateInfoNV-pipelineBindPoint-parameter)"},
- {"VUID-VkIndirectCommandsLayoutCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutCreateInfoNV-sType-sType)"},
- {"VUID-VkIndirectCommandsLayoutCreateInfoNV-streamCount-02936", "streamCount must be greater than 0 and less or equal to VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectCommandsStreamCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutCreateInfoNV-streamCount-02936)"},
- {"VUID-VkIndirectCommandsLayoutCreateInfoNV-streamCount-arraylength", "streamCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutCreateInfoNV-streamCount-arraylength)"},
- {"VUID-VkIndirectCommandsLayoutCreateInfoNV-tokenCount-02931", "tokenCount must be greater than 0 and less than or equal to VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectCommandsTokenCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutCreateInfoNV-tokenCount-02931)"},
- {"VUID-VkIndirectCommandsLayoutCreateInfoNV-tokenCount-arraylength", "tokenCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutCreateInfoNV-tokenCount-arraylength)"},
- {"VUID-VkIndirectCommandsLayoutTokenNV-indirectStateFlags-02956", "indirectStateFlags must not be '0'. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutTokenNV-indirectStateFlags-02956)"},
- {"VUID-VkIndirectCommandsLayoutTokenNV-indirectStateFlags-parameter", "indirectStateFlags must be a valid combination of VkIndirectStateFlagBitsNV values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutTokenNV-indirectStateFlags-parameter)"},
- {"VUID-VkIndirectCommandsLayoutTokenNV-offset-02952", "offset must be less than or equal to VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectCommandsTokenOffset. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutTokenNV-offset-02952)"},
- {"VUID-VkIndirectCommandsLayoutTokenNV-pIndexTypeValues-parameter", "If indexTypeCount is not 0, pIndexTypeValues must be a valid pointer to an array of indexTypeCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutTokenNV-pIndexTypeValues-parameter)"},
- {"VUID-VkIndirectCommandsLayoutTokenNV-pIndexTypes-parameter", "If indexTypeCount is not 0, pIndexTypes must be a valid pointer to an array of indexTypeCount valid VkIndexType values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutTokenNV-pIndexTypes-parameter)"},
- {"VUID-VkIndirectCommandsLayoutTokenNV-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutTokenNV-pNext-pNext)"},
- {"VUID-VkIndirectCommandsLayoutTokenNV-pushconstantOffset-02954", "pushconstantOffset must stay within device supported limits for the appropriate commands. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutTokenNV-pushconstantOffset-02954)"},
- {"VUID-VkIndirectCommandsLayoutTokenNV-pushconstantPipelineLayout-parameter", "If pushconstantPipelineLayout is not VK_NULL_HANDLE, pushconstantPipelineLayout must be a valid VkPipelineLayout handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutTokenNV-pushconstantPipelineLayout-parameter)"},
- {"VUID-VkIndirectCommandsLayoutTokenNV-pushconstantShaderStageFlags-parameter", "pushconstantShaderStageFlags must be a valid combination of VkShaderStageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutTokenNV-pushconstantShaderStageFlags-parameter)"},
- {"VUID-VkIndirectCommandsLayoutTokenNV-pushconstantSize-02955", "pushconstantSize must stay within device supported limits for the appropriate commands. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutTokenNV-pushconstantSize-02955)"},
- {"VUID-VkIndirectCommandsLayoutTokenNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_TOKEN_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutTokenNV-sType-sType)"},
- {"VUID-VkIndirectCommandsLayoutTokenNV-stream-02951", "stream must be smaller than VkIndirectCommandsLayoutCreateInfoNV::streamCount. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutTokenNV-stream-02951)"},
- {"VUID-VkIndirectCommandsLayoutTokenNV-tokenType-parameter", "tokenType must be a valid VkIndirectCommandsTokenTypeNV value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutTokenNV-tokenType-parameter)"},
- {"VUID-VkIndirectCommandsLayoutTokenNV-vertexBindingUnit-02953", "vertexBindingUnit must stay within device supported limits for the appropriate commands. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsLayoutTokenNV-vertexBindingUnit-02953)"},
- {"VUID-VkIndirectCommandsStreamNV-buffer-02942", "The buffer's usage flag must have the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsStreamNV-buffer-02942)"},
- {"VUID-VkIndirectCommandsStreamNV-buffer-parameter", "buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsStreamNV-buffer-parameter)"},
- {"VUID-VkIndirectCommandsStreamNV-offset-02943", "The offset must be aligned to VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::minIndirectCommandsBufferOffsetAlignment. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkIndirectCommandsStreamNV-offset-02943)"},
- {"VUID-VkInitializePerformanceApiInfoINTEL-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkInitializePerformanceApiInfoINTEL-pNext-pNext)"},
- {"VUID-VkInitializePerformanceApiInfoINTEL-sType-sType", "sType must be VK_STRUCTURE_TYPE_INITIALIZE_PERFORMANCE_API_INFO_INTEL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkInitializePerformanceApiInfoINTEL-sType-sType)"},
- {"VUID-VkInputAttachmentAspectReference-aspectMask-01964", "aspectMask must not include VK_IMAGE_ASPECT_METADATA_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkInputAttachmentAspectReference-aspectMask-01964)"},
- {"VUID-VkInputAttachmentAspectReference-aspectMask-02250", "aspectMask must not include VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT for any index i. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkInputAttachmentAspectReference-aspectMask-02250)"},
- {"VUID-VkInputAttachmentAspectReference-aspectMask-parameter", "aspectMask must be a valid combination of VkImageAspectFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkInputAttachmentAspectReference-aspectMask-parameter)"},
- {"VUID-VkInputAttachmentAspectReference-aspectMask-requiredbitmask", "aspectMask must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkInputAttachmentAspectReference-aspectMask-requiredbitmask)"},
- {"VUID-VkInstanceCreateInfo-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkInstanceCreateInfo-flags-zerobitmask)"},
- {"VUID-VkInstanceCreateInfo-pApplicationInfo-parameter", "If pApplicationInfo is not NULL, pApplicationInfo must be a valid pointer to a valid VkApplicationInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkInstanceCreateInfo-pApplicationInfo-parameter)"},
- {"VUID-VkInstanceCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkDebugReportCallbackCreateInfoEXT, VkDebugUtilsMessengerCreateInfoEXT, VkValidationFeaturesEXT, or VkValidationFlagsEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkInstanceCreateInfo-pNext-pNext)"},
- {"VUID-VkInstanceCreateInfo-ppEnabledExtensionNames-parameter", "If enabledExtensionCount is not 0, ppEnabledExtensionNames must be a valid pointer to an array of enabledExtensionCount null-terminated UTF-8 strings (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkInstanceCreateInfo-ppEnabledExtensionNames-parameter)"},
- {"VUID-VkInstanceCreateInfo-ppEnabledLayerNames-parameter", "If enabledLayerCount is not 0, ppEnabledLayerNames must be a valid pointer to an array of enabledLayerCount null-terminated UTF-8 strings (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkInstanceCreateInfo-ppEnabledLayerNames-parameter)"},
- {"VUID-VkInstanceCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkInstanceCreateInfo-sType-sType)"},
- {"VUID-VkInstanceCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkInstanceCreateInfo-sType-unique)"},
- {"VUID-VkMacOSSurfaceCreateInfoMVK-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMacOSSurfaceCreateInfoMVK-flags-zerobitmask)"},
- {"VUID-VkMacOSSurfaceCreateInfoMVK-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMacOSSurfaceCreateInfoMVK-pNext-pNext)"},
- {"VUID-VkMacOSSurfaceCreateInfoMVK-pView-01317", "pView must be a valid NSView and must be backed by a CALayer instance of type CAMetalLayer. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMacOSSurfaceCreateInfoMVK-pView-01317)"},
- {"VUID-VkMacOSSurfaceCreateInfoMVK-sType-sType", "sType must be VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMacOSSurfaceCreateInfoMVK-sType-sType)"},
- {"VUID-VkMappedMemoryRange-memory-00684", "memory must be currently host mapped (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMappedMemoryRange-memory-00684)"},
- {"VUID-VkMappedMemoryRange-memory-parameter", "memory must be a valid VkDeviceMemory handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMappedMemoryRange-memory-parameter)"},
- {"VUID-VkMappedMemoryRange-offset-00687", "offset must be a multiple of VkPhysicalDeviceLimits::nonCoherentAtomSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMappedMemoryRange-offset-00687)"},
- {"VUID-VkMappedMemoryRange-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMappedMemoryRange-pNext-pNext)"},
- {"VUID-VkMappedMemoryRange-sType-sType", "sType must be VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMappedMemoryRange-sType-sType)"},
- {"VUID-VkMappedMemoryRange-size-00685", "If size is not equal to VK_WHOLE_SIZE, offset and size must specify a range contained within the currently mapped range of memory (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMappedMemoryRange-size-00685)"},
- {"VUID-VkMappedMemoryRange-size-00686", "If size is equal to VK_WHOLE_SIZE, offset must be within the currently mapped range of memory (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMappedMemoryRange-size-00686)"},
- {"VUID-VkMappedMemoryRange-size-01389", "If size is equal to VK_WHOLE_SIZE, the end of the current mapping of memory must be a multiple of VkPhysicalDeviceLimits::nonCoherentAtomSize bytes from the beginning of the memory object. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMappedMemoryRange-size-01389)"},
- {"VUID-VkMappedMemoryRange-size-01390", "If size is not equal to VK_WHOLE_SIZE, size must either be a multiple of VkPhysicalDeviceLimits::nonCoherentAtomSize, or offset plus size must equal the size of memory. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMappedMemoryRange-size-01390)"},
- {"VUID-VkMemoryAllocateFlagsInfo-deviceMask-00675", "If VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT is set, deviceMask must be a valid device mask. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateFlagsInfo-deviceMask-00675)"},
- {"VUID-VkMemoryAllocateFlagsInfo-deviceMask-00676", "If VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT is set, deviceMask must not be zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateFlagsInfo-deviceMask-00676)"},
- {"VUID-VkMemoryAllocateFlagsInfo-flags-parameter", "flags must be a valid combination of VkMemoryAllocateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateFlagsInfo-flags-parameter)"},
- {"VUID-VkMemoryAllocateFlagsInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateFlagsInfo-sType-sType)"},
- {"VUID-VkMemoryAllocateInfo-None-00643", "If the parameters define an import operation and the external handle specified was created by the Vulkan API, the device mask specified by VkMemoryAllocateFlagsInfo must match that specified when the memory object being imported was allocated. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-None-00643)"},
- {"VUID-VkMemoryAllocateInfo-None-00644", "If the parameters define an import operation and the external handle specified was created by the Vulkan API, the list of physical devices that comprise the logical device passed to vkAllocateMemory must match the list of physical devices that comprise the logical device on which the memory was originally allocated. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-None-00644)"},
- {"VUID-VkMemoryAllocateInfo-allocationSize-00638", "allocationSize must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-allocationSize-00638)"},
- {"VUID-VkMemoryAllocateInfo-allocationSize-00646", "If the parameters define an import operation and the external handle type is VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT, or VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT, allocationSize must match the size reported in the memory requirements of the image or buffer member of the VkDedicatedAllocationMemoryAllocateInfoNV structure included in the pNext chain. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-allocationSize-00646)"},
- {"VUID-VkMemoryAllocateInfo-allocationSize-00647", "If the parameters define an import operation and the external handle type is VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT, allocationSize must match the size specified when creating the Direct3D 12 heap from which the external handle was extracted. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-allocationSize-00647)"},
- {"VUID-VkMemoryAllocateInfo-allocationSize-01742", "If the parameters define an import operation, the external handle specified was created by the Vulkan API, and the external handle type is VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR, then the values of allocationSize and memoryTypeIndex must match those specified when the memory object being imported was created. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-allocationSize-01742)"},
- {"VUID-VkMemoryAllocateInfo-allocationSize-01743", "If the parameters define an import operation, the external handle was created by the Vulkan API, and the external handle type is VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR or VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR, then the values of allocationSize and memoryTypeIndex must match those specified when the memory object being imported was created. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-allocationSize-01743)"},
- {"VUID-VkMemoryAllocateInfo-allocationSize-01745", "If the parameters define an import operation and the external handle is a host pointer, allocationSize must be an integer multiple of VkPhysicalDeviceExternalMemoryHostPropertiesEXT::minImportedHostPointerAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-allocationSize-01745)"},
- {"VUID-VkMemoryAllocateInfo-allocationSize-02383", "If the parameters define an import operation and the external handle type is VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, allocationSize must be the size returned by vkGetAndroidHardwareBufferPropertiesANDROID for the Android hardware buffer. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-allocationSize-02383)"},
- {"VUID-VkMemoryAllocateInfo-flags-03330", "If VkMemoryAllocateFlagsInfo::flags includes VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT, the bufferDeviceAddressCaptureReplay feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-flags-03330)"},
- {"VUID-VkMemoryAllocateInfo-flags-03331", "If VkMemoryAllocateFlagsInfo::flags includes VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT, the bufferDeviceAddress feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-flags-03331)"},
- {"VUID-VkMemoryAllocateInfo-memoryTypeIndex-00645", "If the parameters define an import operation and the external handle is an NT handle or a global share handle created outside of the Vulkan API, the value of memoryTypeIndex must be one of those returned by vkGetMemoryWin32HandlePropertiesKHR. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-memoryTypeIndex-00645)"},
- {"VUID-VkMemoryAllocateInfo-memoryTypeIndex-00648", "If the parameters define an import operation and the external handle is a POSIX file descriptor created outside of the Vulkan API, the value of memoryTypeIndex must be one of those returned by vkGetMemoryFdPropertiesKHR. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-memoryTypeIndex-00648)"},
- {"VUID-VkMemoryAllocateInfo-memoryTypeIndex-01744", "If the parameters define an import operation and the external handle is a host pointer, the value of memoryTypeIndex must be one of those returned by vkGetMemoryHostPointerPropertiesEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-memoryTypeIndex-01744)"},
- {"VUID-VkMemoryAllocateInfo-memoryTypeIndex-01872", "If the protected memory feature is not enabled, the VkMemoryAllocateInfo::memoryTypeIndex must not indicate a memory type that reports VK_MEMORY_PROPERTY_PROTECTED_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-memoryTypeIndex-01872)"},
- {"VUID-VkMemoryAllocateInfo-memoryTypeIndex-02385", "If the parameters define an import operation and the external handle type is VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, memoryTypeIndex must be one of those returned by vkGetAndroidHardwareBufferPropertiesANDROID for the Android hardware buffer. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-memoryTypeIndex-02385)"},
- {"VUID-VkMemoryAllocateInfo-opaqueCaptureAddress-03329", "If VkMemoryOpaqueCaptureAddressAllocateInfo::opaqueCaptureAddress is not zero, VkMemoryAllocateFlagsInfo::flags must include VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-opaqueCaptureAddress-03329)"},
- {"VUID-VkMemoryAllocateInfo-opaqueCaptureAddress-03333", "If the parameters define an import operation, VkMemoryOpaqueCaptureAddressAllocateInfo::opaqueCaptureAddress must be zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-opaqueCaptureAddress-03333)"},
- {"VUID-VkMemoryAllocateInfo-pNext-00639", "If the pNext chain includes a VkExportMemoryAllocateInfo structure, and any of the handle types specified in VkExportMemoryAllocateInfo::handleTypes require a dedicated allocation, as reported by vkGetPhysicalDeviceImageFormatProperties2 in VkExternalImageFormatProperties::externalMemoryProperties.externalMemoryFeatures or VkExternalBufferProperties::externalMemoryProperties.externalMemoryFeatures, the pNext chain must include a ifdef::VK_KHR_dedicated_allocation[VkMemoryDedicatedAllocateInfo] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-00639)"},
- {"VUID-VkMemoryAllocateInfo-pNext-00640", "If the pNext chain includes a VkExportMemoryAllocateInfo structure, it must not include a VkExportMemoryAllocateInfoNV or VkExportMemoryWin32HandleInfoNV structure. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-00640)"},
- {"VUID-VkMemoryAllocateInfo-pNext-00641", "If the pNext chain includes a VkImportMemoryWin32HandleInfoKHR structure, it must not include a VkImportMemoryWin32HandleInfoNV structure. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-00641)"},
- {"VUID-VkMemoryAllocateInfo-pNext-01874", "If the parameters do not define an import operation, and the pNext chain includes a VkExportMemoryAllocateInfo structure with VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID included in its handleTypes member, and the pNext chain includes a VkMemoryDedicatedAllocateInfo structure with image not equal to VK_NULL_HANDLE, then allocationSize must be 0, otherwise allocationSize must be greater than 0. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-01874)"},
- {"VUID-VkMemoryAllocateInfo-pNext-02384", "If the parameters define an import operation and the external handle type is VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, and the pNext chain does not include a VkMemoryDedicatedAllocateInfo structure or VkMemoryDedicatedAllocateInfo::image is VK_NULL_HANDLE, the Android hardware buffer must have a AHardwareBuffer_Desc::format of AHARDWAREBUFFER_FORMAT_BLOB and a AHardwareBuffer_Desc::usage that includes AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-02384)"},
- {"VUID-VkMemoryAllocateInfo-pNext-02386", "If the parameters define an import operation, the external handle is an Android hardware buffer, and the pNext chain includes a VkMemoryDedicatedAllocateInfo with image that is not VK_NULL_HANDLE, the Android hardware buffer's AHardwareBuffer::usage must include at least one of AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT or AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-02386)"},
- {"VUID-VkMemoryAllocateInfo-pNext-02387", "If the parameters define an import operation, the external handle is an Android hardware buffer, and the pNext chain includes a VkMemoryDedicatedAllocateInfo with image that is not VK_NULL_HANDLE, the format of image must be VK_FORMAT_UNDEFINED or the format returned by vkGetAndroidHardwareBufferPropertiesANDROID in VkAndroidHardwareBufferFormatPropertiesANDROID::format for the Android hardware buffer. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-02387)"},
- {"VUID-VkMemoryAllocateInfo-pNext-02388", "If the parameters define an import operation, the external handle is an Android hardware buffer, and the pNext chain includes a VkMemoryDedicatedAllocateInfo structure with image that is not VK_NULL_HANDLE, the width, height, and array layer dimensions of image and the Android hardware buffer's AHardwareBuffer_Desc must be identical. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-02388)"},
- {"VUID-VkMemoryAllocateInfo-pNext-02389", "If the parameters define an import operation, the external handle is an Android hardware buffer, and the pNext chain includes a VkMemoryDedicatedAllocateInfo structure with image that is not VK_NULL_HANDLE, and the Android hardware buffer's AHardwareBuffer::usage includes AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE, the image must have a complete mipmap chain. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-02389)"},
- {"VUID-VkMemoryAllocateInfo-pNext-02390", "If the parameters define an import operation, the external handle is an Android hardware buffer, and the pNext chain includes a VkMemoryDedicatedAllocateInfo structure with image that is not VK_NULL_HANDLE, each bit set in the usage of image must be listed in AHardwareBuffer Usage Equivalence, and if there is a corresponding AHARDWAREBUFFER_USAGE bit listed that bit must be included in the Android hardware buffer's AHardwareBuffer_Desc::usage. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-02390)"},
- {"VUID-VkMemoryAllocateInfo-pNext-02586", "If the parameters define an import operation, the external handle is an Android hardware buffer, and the pNext chain includes a VkMemoryDedicatedAllocateInfo structure with image that is not VK_NULL_HANDLE, and the Android hardware buffer's AHardwareBuffer::usage does not include AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE, the image must have exactly one mipmap level. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-02586)"},
- {"VUID-VkMemoryAllocateInfo-pNext-02805", "If the parameters define an import operation and the external handle is a host pointer, the pNext chain must not include a VkDedicatedAllocationMemoryAllocateInfoNV structure with either its image or buffer field set to a value other than VK_NULL_HANDLE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-02805)"},
- {"VUID-VkMemoryAllocateInfo-pNext-02806", "If the parameters define an import operation and the external handle is a host pointer, the pNext chain must not include a VkMemoryDedicatedAllocateInfo structure with either its image or buffer field set to a value other than VK_NULL_HANDLE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-02806)"},
- {"VUID-VkMemoryAllocateInfo-pNext-03332", "If the pNext chain includes a VkImportMemoryHostPointerInfoEXT structure, VkMemoryOpaqueCaptureAddressAllocateInfo::opaqueCaptureAddress must be zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-03332)"},
- {"VUID-VkMemoryAllocateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkDedicatedAllocationMemoryAllocateInfoNV, VkExportMemoryAllocateInfo, VkExportMemoryAllocateInfoNV, VkExportMemoryWin32HandleInfoKHR, VkExportMemoryWin32HandleInfoNV, VkImportAndroidHardwareBufferInfoANDROID, VkImportMemoryFdInfoKHR, VkImportMemoryHostPointerInfoEXT, VkImportMemoryWin32HandleInfoKHR, VkImportMemoryWin32HandleInfoNV, VkMemoryAllocateFlagsInfo, VkMemoryDedicatedAllocateInfo, VkMemoryOpaqueCaptureAddressAllocateInfo, or VkMemoryPriorityAllocateInfoEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-pNext-pNext)"},
- {"VUID-VkMemoryAllocateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-sType-sType)"},
- {"VUID-VkMemoryAllocateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryAllocateInfo-sType-unique)"},
- {"VUID-VkMemoryBarrier-dstAccessMask-parameter", "dstAccessMask must be a valid combination of VkAccessFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryBarrier-dstAccessMask-parameter)"},
- {"VUID-VkMemoryBarrier-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryBarrier-pNext-pNext)"},
- {"VUID-VkMemoryBarrier-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_BARRIER (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryBarrier-sType-sType)"},
- {"VUID-VkMemoryBarrier-srcAccessMask-parameter", "srcAccessMask must be a valid combination of VkAccessFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryBarrier-srcAccessMask-parameter)"},
- {"VUID-VkMemoryDedicatedAllocateInfo-buffer-01435", "If buffer is not VK_NULL_HANDLE, VkMemoryAllocateInfo::allocationSize must equal the VkMemoryRequirements::size of the buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-buffer-01435)"},
- {"VUID-VkMemoryDedicatedAllocateInfo-buffer-01436", "If buffer is not VK_NULL_HANDLE, buffer must have been created without VK_BUFFER_CREATE_SPARSE_BINDING_BIT set in VkBufferCreateInfo::flags (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-buffer-01436)"},
- {"VUID-VkMemoryDedicatedAllocateInfo-buffer-01877", "If buffer is not VK_NULL_HANDLE and VkMemoryAllocateInfo defines a memory import operation with handle type VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT, or VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT, and the external handle was created by the Vulkan API, then the memory being imported must also be a dedicated buffer allocation and buffer must be identical to the buffer associated with the imported memory. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-buffer-01877)"},
- {"VUID-VkMemoryDedicatedAllocateInfo-buffer-01879", "If buffer is not VK_NULL_HANDLE and VkMemoryAllocateInfo defines a memory import operation with handle type VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT, the memory being imported must also be a dedicated buffer allocation and buffer must be identical to the buffer associated with the imported memory. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-buffer-01879)"},
- {"VUID-VkMemoryDedicatedAllocateInfo-buffer-parameter", "If buffer is not VK_NULL_HANDLE, buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-buffer-parameter)"},
- {"VUID-VkMemoryDedicatedAllocateInfo-commonparent", "Both of buffer, and image that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-commonparent)"},
- {"VUID-VkMemoryDedicatedAllocateInfo-image-01432", "At least one of image and buffer must be VK_NULL_HANDLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-image-01432)"},
- {"VUID-VkMemoryDedicatedAllocateInfo-image-01433", "If image is not VK_NULL_HANDLE, VkMemoryAllocateInfo::allocationSize must equal the VkMemoryRequirements::size of the image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-image-01433)"},
- {"VUID-VkMemoryDedicatedAllocateInfo-image-01434", "If image is not VK_NULL_HANDLE, image must have been created without VK_IMAGE_CREATE_SPARSE_BINDING_BIT set in VkImageCreateInfo::flags (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-image-01434)"},
- {"VUID-VkMemoryDedicatedAllocateInfo-image-01797", "If image is not VK_NULL_HANDLE, image must not have been created with VK_IMAGE_CREATE_DISJOINT_BIT set in VkImageCreateInfo::flags (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-image-01797)"},
- {"VUID-VkMemoryDedicatedAllocateInfo-image-01876", "If image is not VK_NULL_HANDLE and VkMemoryAllocateInfo defines a memory import operation with handle type VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT, or VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT, and the external handle was created by the Vulkan API, then the memory being imported must also be a dedicated image allocation and image must be identical to the image associated with the imported memory. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-image-01876)"},
- {"VUID-VkMemoryDedicatedAllocateInfo-image-01878", "If image is not VK_NULL_HANDLE and VkMemoryAllocateInfo defines a memory import operation with handle type VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT, the memory being imported must also be a dedicated image allocation and image must be identical to the image associated with the imported memory. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-image-01878)"},
- {"VUID-VkMemoryDedicatedAllocateInfo-image-parameter", "If image is not VK_NULL_HANDLE, image must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-image-parameter)"},
- {"VUID-VkMemoryDedicatedAllocateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryDedicatedAllocateInfo-sType-sType)"},
- {"VUID-VkMemoryDedicatedRequirements-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryDedicatedRequirements-sType-sType)"},
- {"VUID-VkMemoryFdPropertiesKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryFdPropertiesKHR-pNext-pNext)"},
- {"VUID-VkMemoryFdPropertiesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryFdPropertiesKHR-sType-sType)"},
- {"VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-handleTypes-01882", "VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID must have been included in VkExportMemoryAllocateInfo::handleTypes when memory was created. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-handleTypes-01882)"},
- {"VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-memory-parameter", "memory must be a valid VkDeviceMemory handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-memory-parameter)"},
- {"VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-pNext-01883", "If the pNext chain of the VkMemoryAllocateInfo used to allocate memory included a VkMemoryDedicatedAllocateInfo with non-NULL image member, then that image must already be bound to memory. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-pNext-01883)"},
- {"VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-pNext-pNext)"},
- {"VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-sType-sType)"},
- {"VUID-VkMemoryGetFdInfoKHR-handleType-00671", "handleType must have been included in VkExportMemoryAllocateInfo::handleTypes when memory was created. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryGetFdInfoKHR-handleType-00671)"},
- {"VUID-VkMemoryGetFdInfoKHR-handleType-00672", "handleType must be defined as a POSIX file descriptor handle. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryGetFdInfoKHR-handleType-00672)"},
- {"VUID-VkMemoryGetFdInfoKHR-handleType-parameter", "handleType must be a valid VkExternalMemoryHandleTypeFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryGetFdInfoKHR-handleType-parameter)"},
- {"VUID-VkMemoryGetFdInfoKHR-memory-parameter", "memory must be a valid VkDeviceMemory handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryGetFdInfoKHR-memory-parameter)"},
- {"VUID-VkMemoryGetFdInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryGetFdInfoKHR-pNext-pNext)"},
- {"VUID-VkMemoryGetFdInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryGetFdInfoKHR-sType-sType)"},
- {"VUID-VkMemoryGetWin32HandleInfoKHR-handleType-00662", "handleType must have been included in VkExportMemoryAllocateInfo::handleTypes when memory was created. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryGetWin32HandleInfoKHR-handleType-00662)"},
- {"VUID-VkMemoryGetWin32HandleInfoKHR-handleType-00663", "If handleType is defined as an NT handle, vkGetMemoryWin32HandleKHR must be called no more than once for each valid unique combination of memory and handleType. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryGetWin32HandleInfoKHR-handleType-00663)"},
- {"VUID-VkMemoryGetWin32HandleInfoKHR-handleType-00664", "handleType must be defined as an NT handle or a global share handle. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryGetWin32HandleInfoKHR-handleType-00664)"},
- {"VUID-VkMemoryGetWin32HandleInfoKHR-handleType-parameter", "handleType must be a valid VkExternalMemoryHandleTypeFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryGetWin32HandleInfoKHR-handleType-parameter)"},
- {"VUID-VkMemoryGetWin32HandleInfoKHR-memory-parameter", "memory must be a valid VkDeviceMemory handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryGetWin32HandleInfoKHR-memory-parameter)"},
- {"VUID-VkMemoryGetWin32HandleInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryGetWin32HandleInfoKHR-pNext-pNext)"},
- {"VUID-VkMemoryGetWin32HandleInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryGetWin32HandleInfoKHR-sType-sType)"},
- {"VUID-VkMemoryHostPointerPropertiesEXT-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryHostPointerPropertiesEXT-pNext-pNext)"},
- {"VUID-VkMemoryHostPointerPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryHostPointerPropertiesEXT-sType-sType)"},
- {"VUID-VkMemoryOpaqueCaptureAddressAllocateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryOpaqueCaptureAddressAllocateInfo-sType-sType)"},
- {"VUID-VkMemoryPriorityAllocateInfoEXT-priority-02602", "priority must be between 0 and 1, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryPriorityAllocateInfoEXT-priority-02602)"},
- {"VUID-VkMemoryPriorityAllocateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryPriorityAllocateInfoEXT-sType-sType)"},
- {"VUID-VkMemoryRequirements2-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkMemoryDedicatedRequirements (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryRequirements2-pNext-pNext)"},
- {"VUID-VkMemoryRequirements2-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryRequirements2-sType-sType)"},
- {"VUID-VkMemoryRequirements2-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryRequirements2-sType-unique)"},
- {"VUID-VkMemoryWin32HandlePropertiesKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryWin32HandlePropertiesKHR-pNext-pNext)"},
- {"VUID-VkMemoryWin32HandlePropertiesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMemoryWin32HandlePropertiesKHR-sType-sType)"},
- {"VUID-VkMetalSurfaceCreateInfoEXT-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMetalSurfaceCreateInfoEXT-flags-zerobitmask)"},
- {"VUID-VkMetalSurfaceCreateInfoEXT-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMetalSurfaceCreateInfoEXT-pNext-pNext)"},
- {"VUID-VkMetalSurfaceCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMetalSurfaceCreateInfoEXT-sType-sType)"},
- {"VUID-VkMultisamplePropertiesEXT-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMultisamplePropertiesEXT-pNext-pNext)"},
- {"VUID-VkMultisamplePropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkMultisamplePropertiesEXT-sType-sType)"},
- {"VUID-VkPerformanceConfigurationAcquireInfoINTEL-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPerformanceConfigurationAcquireInfoINTEL-pNext-pNext)"},
- {"VUID-VkPerformanceConfigurationAcquireInfoINTEL-sType-sType", "sType must be VK_STRUCTURE_TYPE_PERFORMANCE_CONFIGURATION_ACQUIRE_INFO_INTEL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPerformanceConfigurationAcquireInfoINTEL-sType-sType)"},
- {"VUID-VkPerformanceConfigurationAcquireInfoINTEL-type-parameter", "type must be a valid VkPerformanceConfigurationTypeINTEL value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPerformanceConfigurationAcquireInfoINTEL-type-parameter)"},
- {"VUID-VkPerformanceCounterDescriptionKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPerformanceCounterDescriptionKHR-pNext-pNext)"},
- {"VUID-VkPerformanceCounterDescriptionKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_DESCRIPTION_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPerformanceCounterDescriptionKHR-sType-sType)"},
- {"VUID-VkPerformanceCounterKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPerformanceCounterKHR-pNext-pNext)"},
- {"VUID-VkPerformanceCounterKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPerformanceCounterKHR-sType-sType)"},
- {"VUID-VkPerformanceMarkerInfoINTEL-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPerformanceMarkerInfoINTEL-pNext-pNext)"},
- {"VUID-VkPerformanceMarkerInfoINTEL-sType-sType", "sType must be VK_STRUCTURE_TYPE_PERFORMANCE_MARKER_INFO_INTEL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPerformanceMarkerInfoINTEL-sType-sType)"},
- {"VUID-VkPerformanceOverrideInfoINTEL-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPerformanceOverrideInfoINTEL-pNext-pNext)"},
- {"VUID-VkPerformanceOverrideInfoINTEL-sType-sType", "sType must be VK_STRUCTURE_TYPE_PERFORMANCE_OVERRIDE_INFO_INTEL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPerformanceOverrideInfoINTEL-sType-sType)"},
- {"VUID-VkPerformanceOverrideInfoINTEL-type-parameter", "type must be a valid VkPerformanceOverrideTypeINTEL value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPerformanceOverrideInfoINTEL-type-parameter)"},
- {"VUID-VkPerformanceQuerySubmitInfoKHR-counterPassIndex-03221", "counterPassIndex must be less than the number of counter passes required by any queries within the batch. The required number of counter passes for a performance query is obtained by calling vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPerformanceQuerySubmitInfoKHR-counterPassIndex-03221)"},
- {"VUID-VkPerformanceQuerySubmitInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPerformanceQuerySubmitInfoKHR-sType-sType)"},
- {"VUID-VkPerformanceStreamMarkerInfoINTEL-marker-02735", "The value written by the application into marker must only used the valid bits as reported by vkGetPerformanceParameterINTEL with the VK_PERFORMANCE_PARAMETER_TYPE_STREAM_MARKER_VALID_BITS_INTEL. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPerformanceStreamMarkerInfoINTEL-marker-02735)"},
- {"VUID-VkPerformanceStreamMarkerInfoINTEL-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPerformanceStreamMarkerInfoINTEL-pNext-pNext)"},
- {"VUID-VkPerformanceStreamMarkerInfoINTEL-sType-sType", "sType must be VK_STRUCTURE_TYPE_PERFORMANCE_STREAM_MARKER_INFO_INTEL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPerformanceStreamMarkerInfoINTEL-sType-sType)"},
- {"VUID-VkPerformanceValueDataINTEL-valueString-parameter", "valueString must be a valid pointer to a valid (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPerformanceValueDataINTEL-valueString-parameter)"},
- {"VUID-VkPerformanceValueINTEL-data-parameter", "data must be a valid VkPerformanceValueDataINTEL union (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPerformanceValueINTEL-data-parameter)"},
- {"VUID-VkPerformanceValueINTEL-type-parameter", "type must be a valid VkPerformanceValueTypeINTEL value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPerformanceValueINTEL-type-parameter)"},
- {"VUID-VkPhysicalDevice16BitStorageFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDevice16BitStorageFeatures-sType-sType)"},
- {"VUID-VkPhysicalDevice8BitStorageFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDevice8BitStorageFeatures-sType-sType)"},
- {"VUID-VkPhysicalDeviceASTCDecodeFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceASTCDecodeFeaturesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceBufferDeviceAddressFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceBufferDeviceAddressFeatures-sType-sType)"},
- {"VUID-VkPhysicalDeviceBufferDeviceAddressFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceBufferDeviceAddressFeaturesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceCoherentMemoryFeaturesAMD-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceCoherentMemoryFeaturesAMD-sType-sType)"},
- {"VUID-VkPhysicalDeviceComputeShaderDerivativesFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceComputeShaderDerivativesFeaturesNV-sType-sType)"},
- {"VUID-VkPhysicalDeviceConditionalRenderingFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceConditionalRenderingFeaturesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceConservativeRasterizationPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceConservativeRasterizationPropertiesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceCooperativeMatrixFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceCooperativeMatrixFeaturesNV-sType-sType)"},
- {"VUID-VkPhysicalDeviceCooperativeMatrixPropertiesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceCooperativeMatrixPropertiesNV-sType-sType)"},
- {"VUID-VkPhysicalDeviceCornerSampledImageFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceCornerSampledImageFeaturesNV-sType-sType)"},
- {"VUID-VkPhysicalDeviceCoverageReductionModeFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceCoverageReductionModeFeaturesNV-sType-sType)"},
- {"VUID-VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV-sType-sType)"},
- {"VUID-VkPhysicalDeviceDepthClipEnableFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceDepthClipEnableFeaturesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceDepthStencilResolveProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceDepthStencilResolveProperties-sType-sType)"},
- {"VUID-VkPhysicalDeviceDescriptorIndexingFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceDescriptorIndexingFeatures-sType-sType)"},
- {"VUID-VkPhysicalDeviceDescriptorIndexingProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceDescriptorIndexingProperties-sType-sType)"},
- {"VUID-VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV-sType-sType)"},
- {"VUID-VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV-sType-sType)"},
- {"VUID-VkPhysicalDeviceDiagnosticsConfigFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceDiagnosticsConfigFeaturesNV-sType-sType)"},
- {"VUID-VkPhysicalDeviceDiscardRectanglePropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceDiscardRectanglePropertiesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceDriverProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceDriverProperties-sType-sType)"},
- {"VUID-VkPhysicalDeviceExclusiveScissorFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExclusiveScissorFeaturesNV-sType-sType)"},
- {"VUID-VkPhysicalDeviceExternalBufferInfo-flags-parameter", "flags must be a valid combination of VkBufferCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalBufferInfo-flags-parameter)"},
- {"VUID-VkPhysicalDeviceExternalBufferInfo-handleType-parameter", "handleType must be a valid VkExternalMemoryHandleTypeFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalBufferInfo-handleType-parameter)"},
- {"VUID-VkPhysicalDeviceExternalBufferInfo-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalBufferInfo-pNext-pNext)"},
- {"VUID-VkPhysicalDeviceExternalBufferInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalBufferInfo-sType-sType)"},
- {"VUID-VkPhysicalDeviceExternalBufferInfo-usage-parameter", "usage must be a valid combination of VkBufferUsageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalBufferInfo-usage-parameter)"},
- {"VUID-VkPhysicalDeviceExternalBufferInfo-usage-requiredbitmask", "usage must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalBufferInfo-usage-requiredbitmask)"},
- {"VUID-VkPhysicalDeviceExternalFenceInfo-handleType-parameter", "handleType must be a valid VkExternalFenceHandleTypeFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalFenceInfo-handleType-parameter)"},
- {"VUID-VkPhysicalDeviceExternalFenceInfo-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalFenceInfo-pNext-pNext)"},
- {"VUID-VkPhysicalDeviceExternalFenceInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalFenceInfo-sType-sType)"},
- {"VUID-VkPhysicalDeviceExternalImageFormatInfo-handleType-parameter", "If handleType is not 0, handleType must be a valid VkExternalMemoryHandleTypeFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalImageFormatInfo-handleType-parameter)"},
- {"VUID-VkPhysicalDeviceExternalImageFormatInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalImageFormatInfo-sType-sType)"},
- {"VUID-VkPhysicalDeviceExternalMemoryHostPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalMemoryHostPropertiesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceExternalSemaphoreInfo-handleType-parameter", "handleType must be a valid VkExternalSemaphoreHandleTypeFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalSemaphoreInfo-handleType-parameter)"},
- {"VUID-VkPhysicalDeviceExternalSemaphoreInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkSemaphoreTypeCreateInfo (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalSemaphoreInfo-pNext-pNext)"},
- {"VUID-VkPhysicalDeviceExternalSemaphoreInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalSemaphoreInfo-sType-sType)"},
- {"VUID-VkPhysicalDeviceExternalSemaphoreInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceExternalSemaphoreInfo-sType-unique)"},
- {"VUID-VkPhysicalDeviceFeatures2-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceFeatures2-sType-sType)"},
- {"VUID-VkPhysicalDeviceFloatControlsProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceFloatControlsProperties-sType-sType)"},
- {"VUID-VkPhysicalDeviceFragmentDensityMapFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceFragmentDensityMapFeaturesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceFragmentDensityMapPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceFragmentDensityMapPropertiesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV-sType-sType)"},
- {"VUID-VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceGroupProperties-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceGroupProperties-pNext-pNext)"},
- {"VUID-VkPhysicalDeviceGroupProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceGroupProperties-sType-sType)"},
- {"VUID-VkPhysicalDeviceHostQueryResetFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceHostQueryResetFeatures-sType-sType)"},
- {"VUID-VkPhysicalDeviceIDProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceIDProperties-sType-sType)"},
- {"VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sharingMode-02314", "If sharingMode is VK_SHARING_MODE_CONCURRENT, then pQueueFamilyIndices must be a valid pointer to an array of queueFamilyIndexCount uint32_t values. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sharingMode-02314)"},
- {"VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sharingMode-02315", "If sharingMode is VK_SHARING_MODE_CONCURRENT, then queueFamilyIndexCount must be greater than 1. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sharingMode-02315)"},
- {"VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sharingMode-02316", "If sharingMode is VK_SHARING_MODE_CONCURRENT, each element of pQueueFamilyIndices must be unique and must be less than the pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties2 for the physicalDevice that was used to create device. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sharingMode-02316)"},
- {"VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sharingMode-parameter", "sharingMode must be a valid VkSharingMode value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sharingMode-parameter)"},
- {"VUID-VkPhysicalDeviceImageFormatInfo2-flags-parameter", "flags must be a valid combination of VkImageCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-flags-parameter)"},
- {"VUID-VkPhysicalDeviceImageFormatInfo2-format-parameter", "format must be a valid VkFormat value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-format-parameter)"},
- {"VUID-VkPhysicalDeviceImageFormatInfo2-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkImageFormatListCreateInfo, VkImageStencilUsageCreateInfo, VkPhysicalDeviceExternalImageFormatInfo, VkPhysicalDeviceImageDrmFormatModifierInfoEXT, or VkPhysicalDeviceImageViewImageFormatInfoEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-pNext-pNext)"},
- {"VUID-VkPhysicalDeviceImageFormatInfo2-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-sType-sType)"},
- {"VUID-VkPhysicalDeviceImageFormatInfo2-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-sType-unique)"},
- {"VUID-VkPhysicalDeviceImageFormatInfo2-tiling-02249", "tiling must be VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT if and only if the pNext chain includes VkPhysicalDeviceImageDrmFormatModifierInfoEXT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-tiling-02249)"},
- {"VUID-VkPhysicalDeviceImageFormatInfo2-tiling-02313", "If tiling is VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT and flags contains VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT, then the pNext chain must include a VkImageFormatListCreateInfo structure with non-zero viewFormatCount. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-tiling-02313)"},
- {"VUID-VkPhysicalDeviceImageFormatInfo2-tiling-parameter", "tiling must be a valid VkImageTiling value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-tiling-parameter)"},
- {"VUID-VkPhysicalDeviceImageFormatInfo2-type-parameter", "type must be a valid VkImageType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-type-parameter)"},
- {"VUID-VkPhysicalDeviceImageFormatInfo2-usage-parameter", "usage must be a valid combination of VkImageUsageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-usage-parameter)"},
- {"VUID-VkPhysicalDeviceImageFormatInfo2-usage-requiredbitmask", "usage must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageFormatInfo2-usage-requiredbitmask)"},
- {"VUID-VkPhysicalDeviceImageViewImageFormatInfoEXT-imageViewType-parameter", "imageViewType must be a valid VkImageViewType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageViewImageFormatInfoEXT-imageViewType-parameter)"},
- {"VUID-VkPhysicalDeviceImageViewImageFormatInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImageViewImageFormatInfoEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceImagelessFramebufferFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceImagelessFramebufferFeatures-sType-sType)"},
- {"VUID-VkPhysicalDeviceIndexTypeUint8FeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceIndexTypeUint8FeaturesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceInlineUniformBlockFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceInlineUniformBlockFeaturesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceInlineUniformBlockPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceInlineUniformBlockPropertiesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceLineRasterizationFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceLineRasterizationFeaturesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceLineRasterizationPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceLineRasterizationPropertiesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceMaintenance3Properties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMaintenance3Properties-sType-sType)"},
- {"VUID-VkPhysicalDeviceMemoryBudgetPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMemoryBudgetPropertiesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceMemoryPriorityFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMemoryPriorityFeaturesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceMemoryProperties2-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkPhysicalDeviceMemoryBudgetPropertiesEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMemoryProperties2-pNext-pNext)"},
- {"VUID-VkPhysicalDeviceMemoryProperties2-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMemoryProperties2-sType-sType)"},
- {"VUID-VkPhysicalDeviceMemoryProperties2-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMemoryProperties2-sType-unique)"},
- {"VUID-VkPhysicalDeviceMeshShaderFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMeshShaderFeaturesNV-sType-sType)"},
- {"VUID-VkPhysicalDeviceMeshShaderPropertiesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMeshShaderPropertiesNV-sType-sType)"},
- {"VUID-VkPhysicalDeviceMultiviewFeatures-multiviewGeometryShader-00580", "If multiviewGeometryShader is enabled then multiview must also be enabled. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMultiviewFeatures-multiviewGeometryShader-00580)"},
- {"VUID-VkPhysicalDeviceMultiviewFeatures-multiviewTessellationShader-00581", "If multiviewTessellationShader is enabled then multiview must also be enabled. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMultiviewFeatures-multiviewTessellationShader-00581)"},
- {"VUID-VkPhysicalDeviceMultiviewFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMultiviewFeatures-sType-sType)"},
- {"VUID-VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX-sType-sType)"},
- {"VUID-VkPhysicalDeviceMultiviewProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceMultiviewProperties-sType-sType)"},
- {"VUID-VkPhysicalDevicePCIBusInfoPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDevicePCIBusInfoPropertiesEXT-sType-sType)"},
- {"VUID-VkPhysicalDevicePerformanceQueryFeaturesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDevicePerformanceQueryFeaturesKHR-sType-sType)"},
- {"VUID-VkPhysicalDevicePerformanceQueryPropertiesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDevicePerformanceQueryPropertiesKHR-sType-sType)"},
- {"VUID-VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT-sType-sType)"},
- {"VUID-VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR-sType-sType)"},
- {"VUID-VkPhysicalDevicePointClippingProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDevicePointClippingProperties-sType-sType)"},
- {"VUID-VkPhysicalDeviceProperties2-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT, VkPhysicalDeviceConservativeRasterizationPropertiesEXT, VkPhysicalDeviceCooperativeMatrixPropertiesNV, VkPhysicalDeviceDepthStencilResolveProperties, VkPhysicalDeviceDescriptorIndexingProperties, VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV, VkPhysicalDeviceDiscardRectanglePropertiesEXT, VkPhysicalDeviceDriverProperties, VkPhysicalDeviceExternalMemoryHostPropertiesEXT, VkPhysicalDeviceFloatControlsProperties, VkPhysicalDeviceFragmentDensityMapPropertiesEXT, VkPhysicalDeviceIDProperties, VkPhysicalDeviceInlineUniformBlockPropertiesEXT, VkPhysicalDeviceLineRasterizationPropertiesEXT, VkPhysicalDeviceMaintenance3Properties, VkPhysicalDeviceMeshShaderPropertiesNV, VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX, VkPhysicalDeviceMultiviewProperties, VkPhysicalDevicePCIBusInfoPropertiesEXT, VkPhysicalDevicePerformanceQueryPropertiesKHR, VkPhysicalDevicePointClippingProperties, VkPhysicalDeviceProtectedMemoryProperties, VkPhysicalDevicePushDescriptorPropertiesKHR, VkPhysicalDeviceRayTracingPropertiesKHR, VkPhysicalDeviceRayTracingPropertiesNV, VkPhysicalDeviceSampleLocationsPropertiesEXT, VkPhysicalDeviceSamplerFilterMinmaxProperties, VkPhysicalDeviceShaderCoreProperties2AMD, VkPhysicalDeviceShaderCorePropertiesAMD, VkPhysicalDeviceShaderSMBuiltinsPropertiesNV, VkPhysicalDeviceShadingRateImagePropertiesNV, VkPhysicalDeviceSubgroupProperties, VkPhysicalDeviceSubgroupSizeControlPropertiesEXT, VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT, VkPhysicalDeviceTimelineSemaphoreProperties, VkPhysicalDeviceTransformFeedbackPropertiesEXT, VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT, VkPhysicalDeviceVulkan11Properties, or VkPhysicalDeviceVulkan12Properties (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProperties2-pNext-pNext)"},
- {"VUID-VkPhysicalDeviceProperties2-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProperties2-sType-sType)"},
- {"VUID-VkPhysicalDeviceProperties2-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProperties2-sType-unique)"},
- {"VUID-VkPhysicalDeviceProtectedMemoryFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProtectedMemoryFeatures-sType-sType)"},
- {"VUID-VkPhysicalDeviceProtectedMemoryProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceProtectedMemoryProperties-sType-sType)"},
- {"VUID-VkPhysicalDevicePushDescriptorPropertiesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDevicePushDescriptorPropertiesKHR-sType-sType)"},
- {"VUID-VkPhysicalDeviceRayTracingFeaturesKHR-rayTracingShaderGroupHandleCaptureReplayMixed-03348", "If rayTracingShaderGroupHandleCaptureReplayMixed is VK_TRUE, rayTracingShaderGroupHandleCaptureReplay must also be VK_TRUE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceRayTracingFeaturesKHR-rayTracingShaderGroupHandleCaptureReplayMixed-03348)"},
- {"VUID-VkPhysicalDeviceRayTracingFeaturesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_FEATURES_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceRayTracingFeaturesKHR-sType-sType)"},
- {"VUID-VkPhysicalDeviceRayTracingPropertiesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceRayTracingPropertiesKHR-sType-sType)"},
- {"VUID-VkPhysicalDeviceRayTracingPropertiesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceRayTracingPropertiesNV-sType-sType)"},
- {"VUID-VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV-sType-sType)"},
- {"VUID-VkPhysicalDeviceSampleLocationsPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSampleLocationsPropertiesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceSamplerFilterMinmaxProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSamplerFilterMinmaxProperties-sType-sType)"},
- {"VUID-VkPhysicalDeviceSamplerYcbcrConversionFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSamplerYcbcrConversionFeatures-sType-sType)"},
- {"VUID-VkPhysicalDeviceScalarBlockLayoutFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceScalarBlockLayoutFeatures-sType-sType)"},
- {"VUID-VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures-sType-sType)"},
- {"VUID-VkPhysicalDeviceShaderAtomicInt64Features-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceShaderAtomicInt64Features-sType-sType)"},
- {"VUID-VkPhysicalDeviceShaderClockFeaturesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceShaderClockFeaturesKHR-sType-sType)"},
- {"VUID-VkPhysicalDeviceShaderCoreProperties2AMD-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceShaderCoreProperties2AMD-sType-sType)"},
- {"VUID-VkPhysicalDeviceShaderCorePropertiesAMD-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceShaderCorePropertiesAMD-sType-sType)"},
- {"VUID-VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceShaderDrawParametersFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceShaderDrawParametersFeatures-sType-sType)"},
- {"VUID-VkPhysicalDeviceShaderFloat16Int8Features-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceShaderFloat16Int8Features-sType-sType)"},
- {"VUID-VkPhysicalDeviceShaderImageFootprintFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceShaderImageFootprintFeaturesNV-sType-sType)"},
- {"VUID-VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL-sType-sType)"},
- {"VUID-VkPhysicalDeviceShaderSMBuiltinsFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceShaderSMBuiltinsFeaturesNV-sType-sType)"},
- {"VUID-VkPhysicalDeviceShaderSMBuiltinsPropertiesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceShaderSMBuiltinsPropertiesNV-sType-sType)"},
- {"VUID-VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures-sType-sType)"},
- {"VUID-VkPhysicalDeviceShadingRateImageFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceShadingRateImageFeaturesNV-sType-sType)"},
- {"VUID-VkPhysicalDeviceShadingRateImagePropertiesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceShadingRateImagePropertiesNV-sType-sType)"},
- {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-format-parameter", "format must be a valid VkFormat value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-format-parameter)"},
- {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-pNext-pNext)"},
- {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-sType-sType)"},
- {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-samples-01095", "samples must be a bit value that is set in VkImageFormatProperties::sampleCounts returned by vkGetPhysicalDeviceImageFormatProperties with format, type, tiling, and usage equal to those in this command and flags equal to the value that is set in VkImageCreateInfo::flags when the image is created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-samples-01095)"},
- {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-samples-parameter", "samples must be a valid VkSampleCountFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-samples-parameter)"},
- {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-tiling-parameter", "tiling must be a valid VkImageTiling value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-tiling-parameter)"},
- {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-type-parameter", "type must be a valid VkImageType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-type-parameter)"},
- {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-usage-parameter", "usage must be a valid combination of VkImageUsageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-usage-parameter)"},
- {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-usage-requiredbitmask", "usage must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSparseImageFormatInfo2-usage-requiredbitmask)"},
- {"VUID-VkPhysicalDeviceSubgroupProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSubgroupProperties-sType-sType)"},
- {"VUID-VkPhysicalDeviceSubgroupSizeControlFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSubgroupSizeControlFeaturesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceSubgroupSizeControlPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSubgroupSizeControlPropertiesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceSurfaceInfo2KHR-pNext-02672", "If the pNext chain includes a VkSurfaceFullScreenExclusiveInfoEXT structure with its fullScreenExclusive member set to VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT, and surface was created using vkCreateWin32SurfaceKHR, a VkSurfaceFullScreenExclusiveWin32InfoEXT structure must be included in the pNext chain (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSurfaceInfo2KHR-pNext-02672)"},
- {"VUID-VkPhysicalDeviceSurfaceInfo2KHR-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkSurfaceFullScreenExclusiveInfoEXT or VkSurfaceFullScreenExclusiveWin32InfoEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSurfaceInfo2KHR-pNext-pNext)"},
- {"VUID-VkPhysicalDeviceSurfaceInfo2KHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSurfaceInfo2KHR-sType-sType)"},
- {"VUID-VkPhysicalDeviceSurfaceInfo2KHR-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSurfaceInfo2KHR-sType-unique)"},
- {"VUID-VkPhysicalDeviceSurfaceInfo2KHR-surface-parameter", "surface must be a valid VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceSurfaceInfo2KHR-surface-parameter)"},
- {"VUID-VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceTimelineSemaphoreFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceTimelineSemaphoreFeatures-sType-sType)"},
- {"VUID-VkPhysicalDeviceTimelineSemaphoreProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceTimelineSemaphoreProperties-sType-sType)"},
- {"VUID-VkPhysicalDeviceToolPropertiesEXT-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceToolPropertiesEXT-pNext-pNext)"},
- {"VUID-VkPhysicalDeviceToolPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceToolPropertiesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceTransformFeedbackFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceTransformFeedbackFeaturesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceTransformFeedbackPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceTransformFeedbackPropertiesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceUniformBufferStandardLayoutFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceUniformBufferStandardLayoutFeatures-sType-sType)"},
- {"VUID-VkPhysicalDeviceVariablePointersFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceVariablePointersFeatures-sType-sType)"},
- {"VUID-VkPhysicalDeviceVariablePointersFeatures-variablePointers-01431", "If variablePointers is enabled then variablePointersStorageBuffer must also be enabled. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceVariablePointersFeatures-variablePointers-01431)"},
- {"VUID-VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT-sType-sType)"},
- {"VUID-VkPhysicalDeviceVulkan11Features-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkPhysicalDeviceVulkan11Features-sType-sType)"},
- {"VUID-VkPhysicalDeviceVulkan11Properties-pointClippingBehavior-parameter", "pointClippingBehavior must be a valid VkPointClippingBehavior value (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkPhysicalDeviceVulkan11Properties-pointClippingBehavior-parameter)"},
- {"VUID-VkPhysicalDeviceVulkan11Properties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkPhysicalDeviceVulkan11Properties-sType-sType)"},
- {"VUID-VkPhysicalDeviceVulkan12Features-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkPhysicalDeviceVulkan12Features-sType-sType)"},
- {"VUID-VkPhysicalDeviceVulkan12Properties-denormBehaviorIndependence-parameter", "denormBehaviorIndependence must be a valid VkShaderFloatControlsIndependence value (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkPhysicalDeviceVulkan12Properties-denormBehaviorIndependence-parameter)"},
- {"VUID-VkPhysicalDeviceVulkan12Properties-driverID-parameter", "driverID must be a valid VkDriverId value (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkPhysicalDeviceVulkan12Properties-driverID-parameter)"},
- {"VUID-VkPhysicalDeviceVulkan12Properties-driverInfo-parameter", "driverInfo must be a null-terminated UTF-8 string whose length is less than or equal to VK_MAX_DRIVER_INFO_SIZE (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkPhysicalDeviceVulkan12Properties-driverInfo-parameter)"},
- {"VUID-VkPhysicalDeviceVulkan12Properties-driverName-parameter", "driverName must be a null-terminated UTF-8 string whose length is less than or equal to VK_MAX_DRIVER_NAME_SIZE (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkPhysicalDeviceVulkan12Properties-driverName-parameter)"},
- {"VUID-VkPhysicalDeviceVulkan12Properties-framebufferIntegerColorSampleCounts-parameter", "framebufferIntegerColorSampleCounts must be a valid combination of VkSampleCountFlagBits values (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkPhysicalDeviceVulkan12Properties-framebufferIntegerColorSampleCounts-parameter)"},
- {"VUID-VkPhysicalDeviceVulkan12Properties-roundingModeIndependence-parameter", "roundingModeIndependence must be a valid VkShaderFloatControlsIndependence value (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkPhysicalDeviceVulkan12Properties-roundingModeIndependence-parameter)"},
- {"VUID-VkPhysicalDeviceVulkan12Properties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkPhysicalDeviceVulkan12Properties-sType-sType)"},
- {"VUID-VkPhysicalDeviceVulkan12Properties-supportedDepthResolveModes-parameter", "supportedDepthResolveModes must be a valid combination of VkResolveModeFlagBits values (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkPhysicalDeviceVulkan12Properties-supportedDepthResolveModes-parameter)"},
- {"VUID-VkPhysicalDeviceVulkan12Properties-supportedDepthResolveModes-requiredbitmask", "supportedDepthResolveModes must not be 0 (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkPhysicalDeviceVulkan12Properties-supportedDepthResolveModes-requiredbitmask)"},
- {"VUID-VkPhysicalDeviceVulkan12Properties-supportedStencilResolveModes-parameter", "supportedStencilResolveModes must be a valid combination of VkResolveModeFlagBits values (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkPhysicalDeviceVulkan12Properties-supportedStencilResolveModes-parameter)"},
- {"VUID-VkPhysicalDeviceVulkan12Properties-supportedStencilResolveModes-requiredbitmask", "supportedStencilResolveModes must not be 0 (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkPhysicalDeviceVulkan12Properties-supportedStencilResolveModes-requiredbitmask)"},
- {"VUID-VkPhysicalDeviceVulkanMemoryModelFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceVulkanMemoryModelFeatures-sType-sType)"},
- {"VUID-VkPhysicalDeviceYcbcrImageArraysFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPhysicalDeviceYcbcrImageArraysFeaturesEXT-sType-sType)"},
- {"VUID-VkPipelineCacheCreateInfo-flags-parameter", "flags must be a valid combination of VkPipelineCacheCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCacheCreateInfo-flags-parameter)"},
- {"VUID-VkPipelineCacheCreateInfo-initialDataSize-00768", "If initialDataSize is not 0, it must be equal to the size of pInitialData, as returned by vkGetPipelineCacheData when pInitialData was originally retrieved (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCacheCreateInfo-initialDataSize-00768)"},
- {"VUID-VkPipelineCacheCreateInfo-initialDataSize-00769", "If initialDataSize is not 0, pInitialData must have been retrieved from a previous call to vkGetPipelineCacheData (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCacheCreateInfo-initialDataSize-00769)"},
- {"VUID-VkPipelineCacheCreateInfo-pInitialData-parameter", "If initialDataSize is not 0, pInitialData must be a valid pointer to an array of initialDataSize bytes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCacheCreateInfo-pInitialData-parameter)"},
- {"VUID-VkPipelineCacheCreateInfo-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCacheCreateInfo-pNext-pNext)"},
- {"VUID-VkPipelineCacheCreateInfo-pipelineCreationCacheControl-02892", "If the pipelineCreationCacheControl feature is not enabled, flags must not include VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCacheCreateInfo-pipelineCreationCacheControl-02892)"},
- {"VUID-VkPipelineCacheCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCacheCreateInfo-sType-sType)"},
- {"VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-blendOverlap-01426", "If the correlated overlap property is not supported, blendOverlap must be VK_BLEND_OVERLAP_UNCORRELATED_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-blendOverlap-01426)"},
- {"VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-blendOverlap-parameter", "blendOverlap must be a valid VkBlendOverlapEXT value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-blendOverlap-parameter)"},
- {"VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-dstPremultiplied-01425", "If the non-premultiplied destination color property is not supported, dstPremultiplied must be VK_TRUE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-dstPremultiplied-01425)"},
- {"VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-sType-sType)"},
- {"VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-srcPremultiplied-01424", "If the non-premultiplied source color property is not supported, srcPremultiplied must be VK_TRUE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-srcPremultiplied-01424)"},
- {"VUID-VkPipelineColorBlendAttachmentState-advancedBlendAllOperations-01409", "If VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT::advancedBlendAllOperations is VK_FALSE, then colorBlendOp must not be VK_BLEND_OP_ZERO_EXT, VK_BLEND_OP_SRC_EXT, VK_BLEND_OP_DST_EXT, VK_BLEND_OP_SRC_OVER_EXT, VK_BLEND_OP_DST_OVER_EXT, VK_BLEND_OP_SRC_IN_EXT, VK_BLEND_OP_DST_IN_EXT, VK_BLEND_OP_SRC_OUT_EXT, VK_BLEND_OP_DST_OUT_EXT, VK_BLEND_OP_SRC_ATOP_EXT, VK_BLEND_OP_DST_ATOP_EXT, VK_BLEND_OP_XOR_EXT, VK_BLEND_OP_INVERT_EXT, VK_BLEND_OP_INVERT_RGB_EXT, VK_BLEND_OP_LINEARDODGE_EXT, VK_BLEND_OP_LINEARBURN_EXT, VK_BLEND_OP_VIVIDLIGHT_EXT, VK_BLEND_OP_LINEARLIGHT_EXT, VK_BLEND_OP_PINLIGHT_EXT, VK_BLEND_OP_HARDMIX_EXT, VK_BLEND_OP_PLUS_EXT, VK_BLEND_OP_PLUS_CLAMPED_EXT, VK_BLEND_OP_PLUS_CLAMPED_ALPHA_EXT, VK_BLEND_OP_PLUS_DARKER_EXT, VK_BLEND_OP_MINUS_EXT, VK_BLEND_OP_MINUS_CLAMPED_EXT, VK_BLEND_OP_CONTRAST_EXT, VK_BLEND_OP_INVERT_OVG_EXT, VK_BLEND_OP_RED_EXT, VK_BLEND_OP_GREEN_EXT, or VK_BLEND_OP_BLUE_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAttachmentState-advancedBlendAllOperations-01409)"},
- {"VUID-VkPipelineColorBlendAttachmentState-advancedBlendIndependentBlend-01407", "If VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT::advancedBlendIndependentBlend is VK_FALSE and colorBlendOp is an advanced blend operation, then colorBlendOp must be the same for all attachments. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAttachmentState-advancedBlendIndependentBlend-01407)"},
- {"VUID-VkPipelineColorBlendAttachmentState-advancedBlendIndependentBlend-01408", "If VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT::advancedBlendIndependentBlend is VK_FALSE and alphaBlendOp is an advanced blend operation, then alphaBlendOp must be the same for all attachments. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAttachmentState-advancedBlendIndependentBlend-01408)"},
- {"VUID-VkPipelineColorBlendAttachmentState-alphaBlendOp-parameter", "alphaBlendOp must be a valid VkBlendOp value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAttachmentState-alphaBlendOp-parameter)"},
- {"VUID-VkPipelineColorBlendAttachmentState-colorBlendOp-01406", "If either of colorBlendOp or alphaBlendOp is an advanced blend operation, then colorBlendOp must equal alphaBlendOp (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAttachmentState-colorBlendOp-01406)"},
- {"VUID-VkPipelineColorBlendAttachmentState-colorBlendOp-01410", "If colorBlendOp or alphaBlendOp is an advanced blend operation, then VkSubpassDescription::colorAttachmentCount of the subpass this pipeline is compiled against must be less than or equal to VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT::advancedBlendMaxColorAttachments (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAttachmentState-colorBlendOp-01410)"},
- {"VUID-VkPipelineColorBlendAttachmentState-colorBlendOp-parameter", "colorBlendOp must be a valid VkBlendOp value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAttachmentState-colorBlendOp-parameter)"},
- {"VUID-VkPipelineColorBlendAttachmentState-colorWriteMask-parameter", "colorWriteMask must be a valid combination of VkColorComponentFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAttachmentState-colorWriteMask-parameter)"},
- {"VUID-VkPipelineColorBlendAttachmentState-dstAlphaBlendFactor-00611", "If the dual source blending feature is not enabled, dstAlphaBlendFactor must not be VK_BLEND_FACTOR_SRC1_COLOR, VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR, VK_BLEND_FACTOR_SRC1_ALPHA, or VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAttachmentState-dstAlphaBlendFactor-00611)"},
- {"VUID-VkPipelineColorBlendAttachmentState-dstAlphaBlendFactor-parameter", "dstAlphaBlendFactor must be a valid VkBlendFactor value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAttachmentState-dstAlphaBlendFactor-parameter)"},
- {"VUID-VkPipelineColorBlendAttachmentState-dstColorBlendFactor-00609", "If the dual source blending feature is not enabled, dstColorBlendFactor must not be VK_BLEND_FACTOR_SRC1_COLOR, VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR, VK_BLEND_FACTOR_SRC1_ALPHA, or VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAttachmentState-dstColorBlendFactor-00609)"},
- {"VUID-VkPipelineColorBlendAttachmentState-dstColorBlendFactor-parameter", "dstColorBlendFactor must be a valid VkBlendFactor value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAttachmentState-dstColorBlendFactor-parameter)"},
- {"VUID-VkPipelineColorBlendAttachmentState-srcAlphaBlendFactor-00610", "If the dual source blending feature is not enabled, srcAlphaBlendFactor must not be VK_BLEND_FACTOR_SRC1_COLOR, VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR, VK_BLEND_FACTOR_SRC1_ALPHA, or VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAttachmentState-srcAlphaBlendFactor-00610)"},
- {"VUID-VkPipelineColorBlendAttachmentState-srcAlphaBlendFactor-parameter", "srcAlphaBlendFactor must be a valid VkBlendFactor value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAttachmentState-srcAlphaBlendFactor-parameter)"},
- {"VUID-VkPipelineColorBlendAttachmentState-srcColorBlendFactor-00608", "If the dual source blending feature is not enabled, srcColorBlendFactor must not be VK_BLEND_FACTOR_SRC1_COLOR, VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR, VK_BLEND_FACTOR_SRC1_ALPHA, or VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAttachmentState-srcColorBlendFactor-00608)"},
- {"VUID-VkPipelineColorBlendAttachmentState-srcColorBlendFactor-parameter", "srcColorBlendFactor must be a valid VkBlendFactor value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendAttachmentState-srcColorBlendFactor-parameter)"},
- {"VUID-VkPipelineColorBlendStateCreateInfo-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendStateCreateInfo-flags-zerobitmask)"},
- {"VUID-VkPipelineColorBlendStateCreateInfo-logicOpEnable-00606", "If the logic operations feature is not enabled, logicOpEnable must be VK_FALSE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendStateCreateInfo-logicOpEnable-00606)"},
- {"VUID-VkPipelineColorBlendStateCreateInfo-logicOpEnable-00607", "If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendStateCreateInfo-logicOpEnable-00607)"},
- {"VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605", "If the independent blending feature is not enabled, all elements of pAttachments must be identical (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605)"},
- {"VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-parameter", "If attachmentCount is not 0, pAttachments must be a valid pointer to an array of attachmentCount valid VkPipelineColorBlendAttachmentState structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-parameter)"},
- {"VUID-VkPipelineColorBlendStateCreateInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkPipelineColorBlendAdvancedStateCreateInfoEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendStateCreateInfo-pNext-pNext)"},
- {"VUID-VkPipelineColorBlendStateCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendStateCreateInfo-sType-sType)"},
- {"VUID-VkPipelineColorBlendStateCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineColorBlendStateCreateInfo-sType-unique)"},
- {"VUID-VkPipelineCompilerControlCreateInfoAMD-compilerControlFlags-zerobitmask", "compilerControlFlags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCompilerControlCreateInfoAMD-compilerControlFlags-zerobitmask)"},
- {"VUID-VkPipelineCompilerControlCreateInfoAMD-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCompilerControlCreateInfoAMD-sType-sType)"},
- {"VUID-VkPipelineCoverageModulationStateCreateInfoNV-coverageModulationMode-parameter", "coverageModulationMode must be a valid VkCoverageModulationModeNV value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCoverageModulationStateCreateInfoNV-coverageModulationMode-parameter)"},
- {"VUID-VkPipelineCoverageModulationStateCreateInfoNV-coverageModulationTableEnable-01405", "If coverageModulationTableEnable is VK_TRUE, coverageModulationTableCount must be equal to the number of rasterization samples divided by the number of color samples in the subpass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCoverageModulationStateCreateInfoNV-coverageModulationTableEnable-01405)"},
- {"VUID-VkPipelineCoverageModulationStateCreateInfoNV-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCoverageModulationStateCreateInfoNV-flags-zerobitmask)"},
- {"VUID-VkPipelineCoverageModulationStateCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCoverageModulationStateCreateInfoNV-sType-sType)"},
- {"VUID-VkPipelineCoverageReductionStateCreateInfoNV-coverageReductionMode-parameter", "coverageReductionMode must be a valid VkCoverageReductionModeNV value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCoverageReductionStateCreateInfoNV-coverageReductionMode-parameter)"},
- {"VUID-VkPipelineCoverageReductionStateCreateInfoNV-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCoverageReductionStateCreateInfoNV-flags-zerobitmask)"},
- {"VUID-VkPipelineCoverageReductionStateCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCoverageReductionStateCreateInfoNV-sType-sType)"},
- {"VUID-VkPipelineCoverageToColorStateCreateInfoNV-coverageToColorEnable-01404", "If coverageToColorEnable is VK_TRUE, then the render pass subpass indicated by VkGraphicsPipelineCreateInfo::renderPass and VkGraphicsPipelineCreateInfo::subpass must have a color attachment at the location selected by coverageToColorLocation, with a VkFormat of VK_FORMAT_R8_UINT, VK_FORMAT_R8_SINT, VK_FORMAT_R16_UINT, VK_FORMAT_R16_SINT, VK_FORMAT_R32_UINT, or VK_FORMAT_R32_SINT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCoverageToColorStateCreateInfoNV-coverageToColorEnable-01404)"},
- {"VUID-VkPipelineCoverageToColorStateCreateInfoNV-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCoverageToColorStateCreateInfoNV-flags-zerobitmask)"},
- {"VUID-VkPipelineCoverageToColorStateCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCoverageToColorStateCreateInfoNV-sType-sType)"},
- {"VUID-VkPipelineCreationFeedbackCreateInfoEXT-pPipelineCreationFeedback-parameter", "pPipelineCreationFeedback must be a valid pointer to a VkPipelineCreationFeedbackEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCreationFeedbackCreateInfoEXT-pPipelineCreationFeedback-parameter)"},
- {"VUID-VkPipelineCreationFeedbackCreateInfoEXT-pPipelineStageCreationFeedbacks-parameter", "pPipelineStageCreationFeedbacks must be a valid pointer to an array of pipelineStageCreationFeedbackCount VkPipelineCreationFeedbackEXT structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCreationFeedbackCreateInfoEXT-pPipelineStageCreationFeedbacks-parameter)"},
- {"VUID-VkPipelineCreationFeedbackCreateInfoEXT-pipelineStageCreationFeedbackCount-02668", "When chained to VkGraphicsPipelineCreateInfo, VkPipelineCreationFeedbackEXT::pipelineStageCreationFeedbackCount must equal VkGraphicsPipelineCreateInfo::stageCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCreationFeedbackCreateInfoEXT-pipelineStageCreationFeedbackCount-02668)"},
- {"VUID-VkPipelineCreationFeedbackCreateInfoEXT-pipelineStageCreationFeedbackCount-02669", "When chained to VkComputePipelineCreateInfo, VkPipelineCreationFeedbackEXT::pipelineStageCreationFeedbackCount must equal 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCreationFeedbackCreateInfoEXT-pipelineStageCreationFeedbackCount-02669)"},
- {"VUID-VkPipelineCreationFeedbackCreateInfoEXT-pipelineStageCreationFeedbackCount-02670", "When chained to VkRayTracingPipelineCreateInfoKHR, VkPipelineCreationFeedbackEXT::pipelineStageCreationFeedbackCount must equal VkRayTracingPipelineCreateInfoKHR::stageCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCreationFeedbackCreateInfoEXT-pipelineStageCreationFeedbackCount-02670)"},
- {"VUID-VkPipelineCreationFeedbackCreateInfoEXT-pipelineStageCreationFeedbackCount-arraylength", "pipelineStageCreationFeedbackCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCreationFeedbackCreateInfoEXT-pipelineStageCreationFeedbackCount-arraylength)"},
- {"VUID-VkPipelineCreationFeedbackCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineCreationFeedbackCreateInfoEXT-sType-sType)"},
- {"VUID-VkPipelineDepthStencilStateCreateInfo-back-parameter", "back must be a valid VkStencilOpState structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineDepthStencilStateCreateInfo-back-parameter)"},
- {"VUID-VkPipelineDepthStencilStateCreateInfo-depthBoundsTestEnable-00598", "If the depth bounds testing feature is not enabled, depthBoundsTestEnable must be VK_FALSE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineDepthStencilStateCreateInfo-depthBoundsTestEnable-00598)"},
- {"VUID-VkPipelineDepthStencilStateCreateInfo-depthCompareOp-parameter", "depthCompareOp must be a valid VkCompareOp value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineDepthStencilStateCreateInfo-depthCompareOp-parameter)"},
- {"VUID-VkPipelineDepthStencilStateCreateInfo-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineDepthStencilStateCreateInfo-flags-zerobitmask)"},
- {"VUID-VkPipelineDepthStencilStateCreateInfo-front-parameter", "front must be a valid VkStencilOpState structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineDepthStencilStateCreateInfo-front-parameter)"},
- {"VUID-VkPipelineDepthStencilStateCreateInfo-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineDepthStencilStateCreateInfo-pNext-pNext)"},
- {"VUID-VkPipelineDepthStencilStateCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineDepthStencilStateCreateInfo-sType-sType)"},
- {"VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-discardRectangleCount-00582", "discardRectangleCount must be between 0 and VkPhysicalDeviceDiscardRectanglePropertiesEXT::maxDiscardRectangles, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-discardRectangleCount-00582)"},
- {"VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-discardRectangleMode-parameter", "discardRectangleMode must be a valid VkDiscardRectangleModeEXT value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-discardRectangleMode-parameter)"},
- {"VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-flags-zerobitmask)"},
- {"VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-sType-sType)"},
- {"VUID-VkPipelineDynamicStateCreateInfo-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineDynamicStateCreateInfo-flags-zerobitmask)"},
- {"VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442", "Each element of pDynamicStates must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442)"},
- {"VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-parameter", "If dynamicStateCount is not 0, pDynamicStates must be a valid pointer to an array of dynamicStateCount valid VkDynamicState values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-parameter)"},
- {"VUID-VkPipelineDynamicStateCreateInfo-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineDynamicStateCreateInfo-pNext-pNext)"},
- {"VUID-VkPipelineDynamicStateCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineDynamicStateCreateInfo-sType-sType)"},
- {"VUID-VkPipelineExecutableInfoKHR-executableIndex-03275", "executableIndex must be less than the number of executables associated with pipeline as returned in the pExecutableCount parameter of vkGetPipelineExecutablePropertiesKHR. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineExecutableInfoKHR-executableIndex-03275)"},
- {"VUID-VkPipelineExecutableInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineExecutableInfoKHR-pNext-pNext)"},
- {"VUID-VkPipelineExecutableInfoKHR-pipeline-parameter", "pipeline must be a valid VkPipeline handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineExecutableInfoKHR-pipeline-parameter)"},
- {"VUID-VkPipelineExecutableInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineExecutableInfoKHR-sType-sType)"},
- {"VUID-VkPipelineExecutableInternalRepresentationKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineExecutableInternalRepresentationKHR-pNext-pNext)"},
- {"VUID-VkPipelineExecutableInternalRepresentationKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineExecutableInternalRepresentationKHR-sType-sType)"},
- {"VUID-VkPipelineExecutablePropertiesKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineExecutablePropertiesKHR-pNext-pNext)"},
- {"VUID-VkPipelineExecutablePropertiesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_PROPERTIES_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineExecutablePropertiesKHR-sType-sType)"},
- {"VUID-VkPipelineExecutableStatisticKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineExecutableStatisticKHR-pNext-pNext)"},
- {"VUID-VkPipelineExecutableStatisticKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineExecutableStatisticKHR-sType-sType)"},
- {"VUID-VkPipelineInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineInfoKHR-pNext-pNext)"},
- {"VUID-VkPipelineInfoKHR-pipeline-parameter", "pipeline must be a valid VkPipeline handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineInfoKHR-pipeline-parameter)"},
- {"VUID-VkPipelineInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineInfoKHR-sType-sType)"},
- {"VUID-VkPipelineInputAssemblyStateCreateInfo-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineInputAssemblyStateCreateInfo-flags-zerobitmask)"},
- {"VUID-VkPipelineInputAssemblyStateCreateInfo-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineInputAssemblyStateCreateInfo-pNext-pNext)"},
- {"VUID-VkPipelineInputAssemblyStateCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineInputAssemblyStateCreateInfo-sType-sType)"},
- {"VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00428", "If topology is VK_PRIMITIVE_TOPOLOGY_POINT_LIST, VK_PRIMITIVE_TOPOLOGY_LINE_LIST, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY or VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, primitiveRestartEnable must be VK_FALSE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00428)"},
- {"VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00429", "If the geometry shaders feature is not enabled, topology must not be any of VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY, VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY or VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00429)"},
- {"VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00430", "If the tessellation shaders feature is not enabled, topology must not be VK_PRIMITIVE_TOPOLOGY_PATCH_LIST (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00430)"},
- {"VUID-VkPipelineInputAssemblyStateCreateInfo-topology-parameter", "topology must be a valid VkPrimitiveTopology value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineInputAssemblyStateCreateInfo-topology-parameter)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-02212", "The total number of bindings with a descriptorType of VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxPerStageDescriptorInlineUniformBlocks (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkPipelineLayoutCreateInfo-descriptorType-02212)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-02213", "The total number of bindings with a descriptorType of VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxDescriptorSetInlineUniformBlocks (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkPipelineLayoutCreateInfo-descriptorType-02213)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-02214", "The total number of bindings in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxPerStageDescriptorInlineUniformBlocks (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-02214)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-02215", "The total number of bindings with a descriptorType of VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-02215)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-02216", "The total number of bindings in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxDescriptorSetInlineUniformBlocks (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-02216)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-02217", "The total number of bindings with a descriptorType of VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxDescriptorSetUpdateAfterBindInlineUniformBlocks (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-02217)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-02381", "The total number of bindings with a descriptorType of VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxDescriptorSetAccelerationStructures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-02381)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03016", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_SAMPLER and VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorSamplers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03016)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03017", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER and VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorUniformBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03017)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03018", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_STORAGE_BUFFER and VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorStorageBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03018)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03019", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorSampledImages (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03019)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03020", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, and VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorStorageImages (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03020)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03021", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorInputAttachments (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03021)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03022", "The total number of descriptors with a descriptorType of VK_DESCRIPTOR_TYPE_SAMPLER and VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxPerStageDescriptorUpdateAfterBindSamplers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03022)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03023", "The total number of descriptors with a descriptorType of VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER and VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxPerStageDescriptorUpdateAfterBindUniformBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03023)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03024", "The total number of descriptors with a descriptorType of VK_DESCRIPTOR_TYPE_STORAGE_BUFFER and VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxPerStageDescriptorUpdateAfterBindStorageBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03024)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03025", "The total number of descriptors with a descriptorType of VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxPerStageDescriptorUpdateAfterBindSampledImages (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03025)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03026", "The total number of descriptors with a descriptorType of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, and VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxPerStageDescriptorUpdateAfterBindStorageImages (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03026)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03027", "The total number of descriptors with a descriptorType of VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxPerStageDescriptorUpdateAfterBindInputAttachments (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03027)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03028", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_SAMPLER and VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetSamplers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03028)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03029", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetUniformBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03029)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03030", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetUniformBuffersDynamic (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03030)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03031", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_STORAGE_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetStorageBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03031)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03032", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetStorageBuffersDynamic (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03032)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03033", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetSampledImages (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03033)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03034", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, and VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetStorageImages (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03034)"},
- {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03035", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetInputAttachments (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-descriptorType-03035)"},
- {"VUID-VkPipelineLayoutCreateInfo-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-flags-zerobitmask)"},
- {"VUID-VkPipelineLayoutCreateInfo-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pNext-pNext)"},
- {"VUID-VkPipelineLayoutCreateInfo-pPushConstantRanges-00292", "Any two elements of pPushConstantRanges must not include the same stage in stageFlags (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pPushConstantRanges-00292)"},
- {"VUID-VkPipelineLayoutCreateInfo-pPushConstantRanges-parameter", "If pushConstantRangeCount is not 0, pPushConstantRanges must be a valid pointer to an array of pushConstantRangeCount valid VkPushConstantRange structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pPushConstantRanges-parameter)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00287", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_SAMPLER and VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible to any shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorSamplers (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00287)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00288", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER and VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible to any shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorUniformBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00288)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00289", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_STORAGE_BUFFER and VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible to any shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorStorageBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00289)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00290", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible to any shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorSampledImages (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00290)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00291", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, and VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible to any shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorStorageImages (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00291)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00293", "pSetLayouts must not contain more than one descriptor set layout that was created with VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00293)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01676", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorInputAttachments (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01676)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01677", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_SAMPLER and VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetSamplers (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01677)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01678", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetUniformBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01678)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01679", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetUniformBuffersDynamic (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01679)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01680", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_STORAGE_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetStorageBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01680)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01681", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetStorageBuffersDynamic (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01681)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01682", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetSampledImages (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01682)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01683", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, and VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetStorageImages (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01683)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01684", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetInputAttachments (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01684)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03036", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_SAMPLER and VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxDescriptorSetUpdateAfterBindSamplers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03036)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03037", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxDescriptorSetUpdateAfterBindUniformBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03037)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03038", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxDescriptorSetUpdateAfterBindUniformBuffersDynamic (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03038)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03039", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_STORAGE_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxDescriptorSetUpdateAfterBindStorageBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03039)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03040", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxDescriptorSetUpdateAfterBindStorageBuffersDynamic (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03040)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03041", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxDescriptorSetUpdateAfterBindSampledImages (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03041)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03042", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, and VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxDescriptorSetUpdateAfterBindStorageImages (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03042)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03043", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxDescriptorSetUpdateAfterBindInputAttachments (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03043)"},
- {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-parameter", "If setLayoutCount is not 0, pSetLayouts must be a valid pointer to an array of setLayoutCount valid VkDescriptorSetLayout handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-pSetLayouts-parameter)"},
- {"VUID-VkPipelineLayoutCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-sType-sType)"},
- {"VUID-VkPipelineLayoutCreateInfo-setLayoutCount-00286", "setLayoutCount must be less than or equal to VkPhysicalDeviceLimits::maxBoundDescriptorSets (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLayoutCreateInfo-setLayoutCount-00286)"},
- {"VUID-VkPipelineLibraryCreateInfoKHR-pLibraries-03381", "Each element of pLibraries must have been created with VK_PIPELINE_CREATE_LIBRARY_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLibraryCreateInfoKHR-pLibraries-03381)"},
- {"VUID-VkPipelineLibraryCreateInfoKHR-pLibraries-parameter", "If libraryCount is not 0, pLibraries must be a valid pointer to an array of libraryCount valid VkPipeline handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLibraryCreateInfoKHR-pLibraries-parameter)"},
- {"VUID-VkPipelineLibraryCreateInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLibraryCreateInfoKHR-pNext-pNext)"},
- {"VUID-VkPipelineLibraryCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineLibraryCreateInfoKHR-sType-sType)"},
- {"VUID-VkPipelineMultisampleStateCreateInfo-alphaToOneEnable-00785", "If the alpha to one feature is not enabled, alphaToOneEnable must be VK_FALSE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineMultisampleStateCreateInfo-alphaToOneEnable-00785)"},
- {"VUID-VkPipelineMultisampleStateCreateInfo-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineMultisampleStateCreateInfo-flags-zerobitmask)"},
- {"VUID-VkPipelineMultisampleStateCreateInfo-minSampleShading-00786", "minSampleShading must be in the range [0,1] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineMultisampleStateCreateInfo-minSampleShading-00786)"},
- {"VUID-VkPipelineMultisampleStateCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkPipelineCoverageModulationStateCreateInfoNV, VkPipelineCoverageReductionStateCreateInfoNV, VkPipelineCoverageToColorStateCreateInfoNV, or VkPipelineSampleLocationsStateCreateInfoEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineMultisampleStateCreateInfo-pNext-pNext)"},
- {"VUID-VkPipelineMultisampleStateCreateInfo-pSampleMask-parameter", "If pSampleMask is not NULL, pSampleMask must be a valid pointer to an array of (rasterizationSamples/32) VkSampleMask values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineMultisampleStateCreateInfo-pSampleMask-parameter)"},
- {"VUID-VkPipelineMultisampleStateCreateInfo-rasterizationSamples-01415", "If the VK_NV_framebuffer_mixed_samples extension is enabled, and if the subpass has any color attachments and rasterizationSamples is greater than the number of color samples, then sampleShadingEnable must be VK_FALSE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineMultisampleStateCreateInfo-rasterizationSamples-01415)"},
- {"VUID-VkPipelineMultisampleStateCreateInfo-rasterizationSamples-parameter", "rasterizationSamples must be a valid VkSampleCountFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineMultisampleStateCreateInfo-rasterizationSamples-parameter)"},
- {"VUID-VkPipelineMultisampleStateCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineMultisampleStateCreateInfo-sType-sType)"},
- {"VUID-VkPipelineMultisampleStateCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineMultisampleStateCreateInfo-sType-unique)"},
- {"VUID-VkPipelineMultisampleStateCreateInfo-sampleShadingEnable-00784", "If the sample rate shading feature is not enabled, sampleShadingEnable must be VK_FALSE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineMultisampleStateCreateInfo-sampleShadingEnable-00784)"},
- {"VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-conservativeRasterizationMode-parameter", "conservativeRasterizationMode must be a valid VkConservativeRasterizationModeEXT value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-conservativeRasterizationMode-parameter)"},
- {"VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-extraPrimitiveOverestimationSize-01769", "extraPrimitiveOverestimationSize must be in the range of 0.0 to VkPhysicalDeviceConservativeRasterizationPropertiesEXT::maxExtraPrimitiveOverestimationSize inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-extraPrimitiveOverestimationSize-01769)"},
- {"VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-flags-zerobitmask)"},
- {"VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-sType-sType)"},
- {"VUID-VkPipelineRasterizationDepthClipStateCreateInfoEXT-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationDepthClipStateCreateInfoEXT-flags-zerobitmask)"},
- {"VUID-VkPipelineRasterizationDepthClipStateCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationDepthClipStateCreateInfoEXT-sType-sType)"},
- {"VUID-VkPipelineRasterizationLineStateCreateInfoEXT-lineRasterizationMode-02768", "If lineRasterizationMode is VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT, then the rectangularLines feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationLineStateCreateInfoEXT-lineRasterizationMode-02768)"},
- {"VUID-VkPipelineRasterizationLineStateCreateInfoEXT-lineRasterizationMode-02769", "If lineRasterizationMode is VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT, then the bresenhamLines feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationLineStateCreateInfoEXT-lineRasterizationMode-02769)"},
- {"VUID-VkPipelineRasterizationLineStateCreateInfoEXT-lineRasterizationMode-02770", "If lineRasterizationMode is VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT, then the smoothLines feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationLineStateCreateInfoEXT-lineRasterizationMode-02770)"},
- {"VUID-VkPipelineRasterizationLineStateCreateInfoEXT-lineRasterizationMode-parameter", "lineRasterizationMode must be a valid VkLineRasterizationModeEXT value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationLineStateCreateInfoEXT-lineRasterizationMode-parameter)"},
- {"VUID-VkPipelineRasterizationLineStateCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationLineStateCreateInfoEXT-sType-sType)"},
- {"VUID-VkPipelineRasterizationLineStateCreateInfoEXT-stippledLineEnable-02771", "If stippledLineEnable is VK_TRUE and lineRasterizationMode is VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT, then the stippledRectangularLines feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationLineStateCreateInfoEXT-stippledLineEnable-02771)"},
- {"VUID-VkPipelineRasterizationLineStateCreateInfoEXT-stippledLineEnable-02772", "If stippledLineEnable is VK_TRUE and lineRasterizationMode is VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT, then the stippledBresenhamLines feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationLineStateCreateInfoEXT-stippledLineEnable-02772)"},
- {"VUID-VkPipelineRasterizationLineStateCreateInfoEXT-stippledLineEnable-02773", "If stippledLineEnable is VK_TRUE and lineRasterizationMode is VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT, then the stippledSmoothLines feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationLineStateCreateInfoEXT-stippledLineEnable-02773)"},
- {"VUID-VkPipelineRasterizationLineStateCreateInfoEXT-stippledLineEnable-02774", "If stippledLineEnable is VK_TRUE and lineRasterizationMode is VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT, then the stippledRectangularLines feature must be enabled and VkPhysicalDeviceLimits::strictLines must be VK_TRUE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationLineStateCreateInfoEXT-stippledLineEnable-02774)"},
- {"VUID-VkPipelineRasterizationStateCreateInfo-cullMode-parameter", "cullMode must be a valid combination of VkCullModeFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationStateCreateInfo-cullMode-parameter)"},
- {"VUID-VkPipelineRasterizationStateCreateInfo-depthClampEnable-00782", "If the depth clamping feature is not enabled, depthClampEnable must be VK_FALSE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationStateCreateInfo-depthClampEnable-00782)"},
- {"VUID-VkPipelineRasterizationStateCreateInfo-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationStateCreateInfo-flags-zerobitmask)"},
- {"VUID-VkPipelineRasterizationStateCreateInfo-frontFace-parameter", "frontFace must be a valid VkFrontFace value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationStateCreateInfo-frontFace-parameter)"},
- {"VUID-VkPipelineRasterizationStateCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkPipelineRasterizationConservativeStateCreateInfoEXT, VkPipelineRasterizationDepthClipStateCreateInfoEXT, VkPipelineRasterizationLineStateCreateInfoEXT, VkPipelineRasterizationStateRasterizationOrderAMD, or VkPipelineRasterizationStateStreamCreateInfoEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationStateCreateInfo-pNext-pNext)"},
- {"VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-01413", "If the non-solid fill modes feature is not enabled, polygonMode must be VK_POLYGON_MODE_FILL (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-01413)"},
- {"VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-01414", "If the VK_NV_fill_rectangle extension is not enabled, polygonMode must not be VK_POLYGON_MODE_FILL_RECTANGLE_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-01414)"},
- {"VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-01507", "If the non-solid fill modes feature is not enabled, polygonMode must be VK_POLYGON_MODE_FILL or VK_POLYGON_MODE_FILL_RECTANGLE_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-01507)"},
- {"VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-parameter", "polygonMode must be a valid VkPolygonMode value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-parameter)"},
- {"VUID-VkPipelineRasterizationStateCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationStateCreateInfo-sType-sType)"},
- {"VUID-VkPipelineRasterizationStateCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationStateCreateInfo-sType-unique)"},
- {"VUID-VkPipelineRasterizationStateRasterizationOrderAMD-rasterizationOrder-parameter", "rasterizationOrder must be a valid VkRasterizationOrderAMD value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationStateRasterizationOrderAMD-rasterizationOrder-parameter)"},
- {"VUID-VkPipelineRasterizationStateRasterizationOrderAMD-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationStateRasterizationOrderAMD-sType-sType)"},
- {"VUID-VkPipelineRasterizationStateStreamCreateInfoEXT-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationStateStreamCreateInfoEXT-flags-zerobitmask)"},
- {"VUID-VkPipelineRasterizationStateStreamCreateInfoEXT-geometryStreams-02324", "VkPhysicalDeviceTransformFeedbackFeaturesEXT::geometryStreams must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationStateStreamCreateInfoEXT-geometryStreams-02324)"},
- {"VUID-VkPipelineRasterizationStateStreamCreateInfoEXT-rasterizationStream-02325", "rasterizationStream must be less than VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackStreams (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationStateStreamCreateInfoEXT-rasterizationStream-02325)"},
- {"VUID-VkPipelineRasterizationStateStreamCreateInfoEXT-rasterizationStream-02326", "rasterizationStream must be zero if VkPhysicalDeviceTransformFeedbackPropertiesEXT::transformFeedbackRasterizationStreamSelect is VK_FALSE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationStateStreamCreateInfoEXT-rasterizationStream-02326)"},
- {"VUID-VkPipelineRasterizationStateStreamCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRasterizationStateStreamCreateInfoEXT-sType-sType)"},
- {"VUID-VkPipelineRepresentativeFragmentTestStateCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineRepresentativeFragmentTestStateCreateInfoNV-sType-sType)"},
- {"VUID-VkPipelineSampleLocationsStateCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineSampleLocationsStateCreateInfoEXT-sType-sType)"},
- {"VUID-VkPipelineSampleLocationsStateCreateInfoEXT-sampleLocationsInfo-parameter", "sampleLocationsInfo must be a valid VkSampleLocationsInfoEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineSampleLocationsStateCreateInfoEXT-sampleLocationsInfo-parameter)"},
- {"VUID-VkPipelineShaderStageCreateInfo-flags-02758", "If flags has both the VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT and VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT flags set, the local workgroup size in the X dimension of the pipeline must be a multiple of maxSubgroupSize. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-flags-02758)"},
- {"VUID-VkPipelineShaderStageCreateInfo-flags-02759", "If flags has the VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT flag set and flags does not have the VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT flag set and no VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT structure is included in the pNext chain, the local workgroup size in the X dimension of the pipeline must be a multiple of subgroupSize. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-flags-02759)"},
- {"VUID-VkPipelineShaderStageCreateInfo-flags-02784", "If flags has the VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT flag set, the subgroupSizeControl feature must be enabled. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-flags-02784)"},
- {"VUID-VkPipelineShaderStageCreateInfo-flags-02785", "If flags has the VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT flag set, the computeFullSubgroups feature must be enabled. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-flags-02785)"},
- {"VUID-VkPipelineShaderStageCreateInfo-flags-parameter", "flags must be a valid combination of VkPipelineShaderStageCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-flags-parameter)"},
- {"VUID-VkPipelineShaderStageCreateInfo-maxClipDistances-00708", "If the identified entry point includes any variable in its interface that is declared with the ClipDistance BuiltIn decoration, that variable must not have an array size greater than VkPhysicalDeviceLimits::maxClipDistances (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-maxClipDistances-00708)"},
- {"VUID-VkPipelineShaderStageCreateInfo-maxCombinedClipAndCullDistances-00710", "If the identified entry point includes any variables in its interface that are declared with the ClipDistance or CullDistance BuiltIn decoration, those variables must not have array sizes which sum to more than VkPhysicalDeviceLimits::maxCombinedClipAndCullDistances (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-maxCombinedClipAndCullDistances-00710)"},
- {"VUID-VkPipelineShaderStageCreateInfo-maxCullDistances-00709", "If the identified entry point includes any variable in its interface that is declared with the CullDistance BuiltIn decoration, that variable must not have an array size greater than VkPhysicalDeviceLimits::maxCullDistances (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-maxCullDistances-00709)"},
- {"VUID-VkPipelineShaderStageCreateInfo-maxSampleMaskWords-00711", "If the identified entry point includes any variable in its interface that is declared with the SampleMask BuiltIn decoration, that variable must not have an array size greater than VkPhysicalDeviceLimits::maxSampleMaskWords (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-maxSampleMaskWords-00711)"},
- {"VUID-VkPipelineShaderStageCreateInfo-module-parameter", "module must be a valid VkShaderModule handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-module-parameter)"},
- {"VUID-VkPipelineShaderStageCreateInfo-pName-00707", "pName must be the name of an OpEntryPoint in module with an execution model that matches stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-pName-00707)"},
- {"VUID-VkPipelineShaderStageCreateInfo-pName-parameter", "pName must be a null-terminated UTF-8 string (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-pName-parameter)"},
- {"VUID-VkPipelineShaderStageCreateInfo-pNext-02754", "If a VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT structure is included in the pNext chain, flags must not have the VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT flag set. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-pNext-02754)"},
- {"VUID-VkPipelineShaderStageCreateInfo-pNext-02755", "If a VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT structure is included in the pNext chain, the subgroupSizeControl feature must be enabled, and stage must be a valid bit specified in requiredSubgroupSizeStages. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-pNext-02755)"},
- {"VUID-VkPipelineShaderStageCreateInfo-pNext-02756", "If a VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT structure is included in the pNext chain and stage is VK_SHADER_STAGE_COMPUTE_BIT, the local workgroup size of the shader must be less than or equal to the product of VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT::requiredSubgroupSize and maxComputeWorkgroupSubgroups. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-pNext-02756)"},
- {"VUID-VkPipelineShaderStageCreateInfo-pNext-02757", "If a VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT structure is included in the pNext chain, and flags has the VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT flag set, the local workgroup size in the X dimension of the pipeline must be a multiple of VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT::requiredSubgroupSize. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-pNext-02757)"},
- {"VUID-VkPipelineShaderStageCreateInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-pNext-pNext)"},
- {"VUID-VkPipelineShaderStageCreateInfo-pSpecializationInfo-parameter", "If pSpecializationInfo is not NULL, pSpecializationInfo must be a valid pointer to a valid VkSpecializationInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-pSpecializationInfo-parameter)"},
- {"VUID-VkPipelineShaderStageCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-sType-sType)"},
- {"VUID-VkPipelineShaderStageCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-sType-unique)"},
- {"VUID-VkPipelineShaderStageCreateInfo-stage-00704", "If the geometry shaders feature is not enabled, stage must not be VK_SHADER_STAGE_GEOMETRY_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-stage-00704)"},
- {"VUID-VkPipelineShaderStageCreateInfo-stage-00705", "If the tessellation shaders feature is not enabled, stage must not be VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT or VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-stage-00705)"},
- {"VUID-VkPipelineShaderStageCreateInfo-stage-00706", "stage must not be VK_SHADER_STAGE_ALL_GRAPHICS, or VK_SHADER_STAGE_ALL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-stage-00706)"},
- {"VUID-VkPipelineShaderStageCreateInfo-stage-00712", "If stage is VK_SHADER_STAGE_VERTEX_BIT, the identified entry point must not include any input variable in its interface that is decorated with CullDistance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-stage-00712)"},
- {"VUID-VkPipelineShaderStageCreateInfo-stage-00713", "If stage is VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT or VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, and the identified entry point has an OpExecutionMode instruction that specifies a patch size with OutputVertices, the patch size must be greater than 0 and less than or equal to VkPhysicalDeviceLimits::maxTessellationPatchSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-stage-00713)"},
- {"VUID-VkPipelineShaderStageCreateInfo-stage-00714", "If stage is VK_SHADER_STAGE_GEOMETRY_BIT, the identified entry point must have an OpExecutionMode instruction that specifies a maximum output vertex count that is greater than 0 and less than or equal to VkPhysicalDeviceLimits::maxGeometryOutputVertices (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-stage-00714)"},
- {"VUID-VkPipelineShaderStageCreateInfo-stage-00715", "If stage is VK_SHADER_STAGE_GEOMETRY_BIT, the identified entry point must have an OpExecutionMode instruction that specifies an invocation count that is greater than 0 and less than or equal to VkPhysicalDeviceLimits::maxGeometryShaderInvocations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-stage-00715)"},
- {"VUID-VkPipelineShaderStageCreateInfo-stage-00718", "If stage is VK_SHADER_STAGE_FRAGMENT_BIT, the identified entry point must not include any output variables in its interface decorated with CullDistance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-stage-00718)"},
- {"VUID-VkPipelineShaderStageCreateInfo-stage-00719", "If stage is VK_SHADER_STAGE_FRAGMENT_BIT, and the identified entry point writes to FragDepth in any execution path, it must write to FragDepth in all execution paths (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-stage-00719)"},
- {"VUID-VkPipelineShaderStageCreateInfo-stage-01511", "If stage is VK_SHADER_STAGE_FRAGMENT_BIT, and the identified entry point writes to FragStencilRefEXT in any execution path, it must write to FragStencilRefEXT in all execution paths (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-stage-01511)"},
- {"VUID-VkPipelineShaderStageCreateInfo-stage-02091", "If the mesh shader feature is not enabled, stage must not be VK_SHADER_STAGE_MESH_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-stage-02091)"},
- {"VUID-VkPipelineShaderStageCreateInfo-stage-02092", "If the task shader feature is not enabled, stage must not be VK_SHADER_STAGE_TASK_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-stage-02092)"},
- {"VUID-VkPipelineShaderStageCreateInfo-stage-02093", "If stage is VK_SHADER_STAGE_MESH_BIT_NV, the identified entry point must have an OpExecutionMode instruction that specifies a maximum output vertex count, OutputVertices, that is greater than 0 and less than or equal to VkPhysicalDeviceMeshShaderPropertiesNV::maxMeshOutputVertices. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-stage-02093)"},
- {"VUID-VkPipelineShaderStageCreateInfo-stage-02094", "If stage is VK_SHADER_STAGE_MESH_BIT_NV, the identified entry point must have an OpExecutionMode instruction that specifies a maximum output primitive count, OutputPrimitivesNV, that is greater than 0 and less than or equal to VkPhysicalDeviceMeshShaderPropertiesNV::maxMeshOutputPrimitives. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-stage-02094)"},
- {"VUID-VkPipelineShaderStageCreateInfo-stage-02596", "If stage is a vertex processing stage, and the identified entry point writes to Layer for any primitive, it must write the same value to Layer for all vertices of a given primitive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-stage-02596)"},
- {"VUID-VkPipelineShaderStageCreateInfo-stage-02597", "If stage is a vertex processing stage, and the identified entry point writes to ViewportIndex for any primitive, it must write the same value to ViewportIndex for all vertices of a given primitive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-stage-02597)"},
- {"VUID-VkPipelineShaderStageCreateInfo-stage-parameter", "stage must be a valid VkShaderStageFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageCreateInfo-stage-parameter)"},
- {"VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT-requiredSubgroupSize-02760", "requiredSubgroupSize must be a power-of-two integer. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT-requiredSubgroupSize-02760)"},
- {"VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT-requiredSubgroupSize-02761", "requiredSubgroupSize must be greater or equal to minSubgroupSize. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT-requiredSubgroupSize-02761)"},
- {"VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT-requiredSubgroupSize-02762", "requiredSubgroupSize must be less than or equal to maxSubgroupSize. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT-requiredSubgroupSize-02762)"},
- {"VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT-sType-sType)"},
- {"VUID-VkPipelineTessellationDomainOriginStateCreateInfo-domainOrigin-parameter", "domainOrigin must be a valid VkTessellationDomainOrigin value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineTessellationDomainOriginStateCreateInfo-domainOrigin-parameter)"},
- {"VUID-VkPipelineTessellationDomainOriginStateCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineTessellationDomainOriginStateCreateInfo-sType-sType)"},
- {"VUID-VkPipelineTessellationStateCreateInfo-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineTessellationStateCreateInfo-flags-zerobitmask)"},
- {"VUID-VkPipelineTessellationStateCreateInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkPipelineTessellationDomainOriginStateCreateInfo (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineTessellationStateCreateInfo-pNext-pNext)"},
- {"VUID-VkPipelineTessellationStateCreateInfo-patchControlPoints-01214", "patchControlPoints must be greater than zero and less than or equal to VkPhysicalDeviceLimits::maxTessellationPatchSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineTessellationStateCreateInfo-patchControlPoints-01214)"},
- {"VUID-VkPipelineTessellationStateCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineTessellationStateCreateInfo-sType-sType)"},
- {"VUID-VkPipelineTessellationStateCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineTessellationStateCreateInfo-sType-unique)"},
- {"VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-pVertexBindingDivisors-parameter", "pVertexBindingDivisors must be a valid pointer to an array of vertexBindingDivisorCount VkVertexInputBindingDivisorDescriptionEXT structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-pVertexBindingDivisors-parameter)"},
- {"VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-sType-sType)"},
- {"VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-vertexBindingDivisorCount-arraylength", "vertexBindingDivisorCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-vertexBindingDivisorCount-arraylength)"},
- {"VUID-VkPipelineVertexInputStateCreateInfo-binding-00615", "For every binding specified by each element of pVertexAttributeDescriptions, a VkVertexInputBindingDescription must exist in pVertexBindingDescriptions with the same value of binding (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineVertexInputStateCreateInfo-binding-00615)"},
- {"VUID-VkPipelineVertexInputStateCreateInfo-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineVertexInputStateCreateInfo-flags-zerobitmask)"},
- {"VUID-VkPipelineVertexInputStateCreateInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkPipelineVertexInputDivisorStateCreateInfoEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineVertexInputStateCreateInfo-pNext-pNext)"},
- {"VUID-VkPipelineVertexInputStateCreateInfo-pVertexAttributeDescriptions-00617", "All elements of pVertexAttributeDescriptions must describe distinct attribute locations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineVertexInputStateCreateInfo-pVertexAttributeDescriptions-00617)"},
- {"VUID-VkPipelineVertexInputStateCreateInfo-pVertexAttributeDescriptions-parameter", "If vertexAttributeDescriptionCount is not 0, pVertexAttributeDescriptions must be a valid pointer to an array of vertexAttributeDescriptionCount valid VkVertexInputAttributeDescription structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineVertexInputStateCreateInfo-pVertexAttributeDescriptions-parameter)"},
- {"VUID-VkPipelineVertexInputStateCreateInfo-pVertexBindingDescriptions-00616", "All elements of pVertexBindingDescriptions must describe distinct binding numbers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineVertexInputStateCreateInfo-pVertexBindingDescriptions-00616)"},
- {"VUID-VkPipelineVertexInputStateCreateInfo-pVertexBindingDescriptions-parameter", "If vertexBindingDescriptionCount is not 0, pVertexBindingDescriptions must be a valid pointer to an array of vertexBindingDescriptionCount valid VkVertexInputBindingDescription structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineVertexInputStateCreateInfo-pVertexBindingDescriptions-parameter)"},
- {"VUID-VkPipelineVertexInputStateCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineVertexInputStateCreateInfo-sType-sType)"},
- {"VUID-VkPipelineVertexInputStateCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineVertexInputStateCreateInfo-sType-unique)"},
- {"VUID-VkPipelineVertexInputStateCreateInfo-vertexAttributeDescriptionCount-00614", "vertexAttributeDescriptionCount must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputAttributes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineVertexInputStateCreateInfo-vertexAttributeDescriptionCount-00614)"},
- {"VUID-VkPipelineVertexInputStateCreateInfo-vertexBindingDescriptionCount-00613", "vertexBindingDescriptionCount must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineVertexInputStateCreateInfo-vertexBindingDescriptionCount-00613)"},
- {"VUID-VkPipelineViewportCoarseSampleOrderStateCreateInfoNV-pCustomSampleOrders-02234", "The array pCustomSampleOrders must not contain two structures with matching values for both the shadingRate and sampleCount members. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportCoarseSampleOrderStateCreateInfoNV-pCustomSampleOrders-02234)"},
- {"VUID-VkPipelineViewportCoarseSampleOrderStateCreateInfoNV-pCustomSampleOrders-parameter", "If customSampleOrderCount is not 0, pCustomSampleOrders must be a valid pointer to an array of customSampleOrderCount valid VkCoarseSampleOrderCustomNV structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportCoarseSampleOrderStateCreateInfoNV-pCustomSampleOrders-parameter)"},
- {"VUID-VkPipelineViewportCoarseSampleOrderStateCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportCoarseSampleOrderStateCreateInfoNV-sType-sType)"},
- {"VUID-VkPipelineViewportCoarseSampleOrderStateCreateInfoNV-sampleOrderType-02072", "If sampleOrderType is not VK_COARSE_SAMPLE_ORDER_TYPE_CUSTOM_NV, customSamplerOrderCount must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportCoarseSampleOrderStateCreateInfoNV-sampleOrderType-02072)"},
- {"VUID-VkPipelineViewportCoarseSampleOrderStateCreateInfoNV-sampleOrderType-parameter", "sampleOrderType must be a valid VkCoarseSampleOrderTypeNV value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportCoarseSampleOrderStateCreateInfoNV-sampleOrderType-parameter)"},
- {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027", "If the multiple viewports feature is not enabled, exclusiveScissorCount must be 0 or 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027)"},
- {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02028", "exclusiveScissorCount must be less than or equal to VkPhysicalDeviceLimits::maxViewports (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02028)"},
- {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029", "exclusiveScissorCount must be 0 or identical to the viewportCount member of VkPipelineViewportStateCreateInfo (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029)"},
- {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-pDynamicStates-02030", "If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV and exclusiveScissorCount is not 0, pExclusiveScissors must be a valid pointer to an array of exclusiveScissorCount VkRect2D structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-pDynamicStates-02030)"},
- {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-pExclusiveScissors-parameter", "If exclusiveScissorCount is not 0, and pExclusiveScissors is not NULL, pExclusiveScissors must be a valid pointer to an array of exclusiveScissorCount VkRect2D structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-pExclusiveScissors-parameter)"},
- {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-sType-sType)"},
- {"VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-pDynamicStates-02057", "If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV, pShadingRatePalettes must be a valid pointer to an array of viewportCount VkShadingRatePaletteNV structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-pDynamicStates-02057)"},
- {"VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-pShadingRatePalettes-parameter", "If viewportCount is not 0, and pShadingRatePalettes is not NULL, pShadingRatePalettes must be a valid pointer to an array of viewportCount valid VkShadingRatePaletteNV structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-pShadingRatePalettes-parameter)"},
- {"VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-sType-sType)"},
- {"VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-shadingRateImageEnable-02056", "If shadingRateImageEnable is VK_TRUE, viewportCount must be equal to the viewportCount member of VkPipelineViewportStateCreateInfo (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-shadingRateImageEnable-02056)"},
- {"VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-viewportCount-02054", "If the multiple viewports feature is not enabled, viewportCount must be 0 or 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-viewportCount-02054)"},
- {"VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-viewportCount-02055", "viewportCount must be less than or equal to VkPhysicalDeviceLimits::maxViewports (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-viewportCount-02055)"},
- {"VUID-VkPipelineViewportStateCreateInfo-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-flags-zerobitmask)"},
- {"VUID-VkPipelineViewportStateCreateInfo-offset-02822", "Evaluation of (offset.x + extent.width) must not cause a signed integer addition overflow for any element of pScissors (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-offset-02822)"},
- {"VUID-VkPipelineViewportStateCreateInfo-offset-02823", "Evaluation of (offset.y + extent.height) must not cause a signed integer addition overflow for any element of pScissors (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-offset-02823)"},
- {"VUID-VkPipelineViewportStateCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkPipelineViewportCoarseSampleOrderStateCreateInfoNV, VkPipelineViewportExclusiveScissorStateCreateInfoNV, VkPipelineViewportShadingRateImageStateCreateInfoNV, VkPipelineViewportSwizzleStateCreateInfoNV, or VkPipelineViewportWScalingStateCreateInfoNV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-pNext-pNext)"},
- {"VUID-VkPipelineViewportStateCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-sType-sType)"},
- {"VUID-VkPipelineViewportStateCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-sType-unique)"},
- {"VUID-VkPipelineViewportStateCreateInfo-scissorCount-01217", "If the multiple viewports feature is not enabled, scissorCount must be 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-scissorCount-01217)"},
- {"VUID-VkPipelineViewportStateCreateInfo-scissorCount-01219", "scissorCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-scissorCount-01219)"},
- {"VUID-VkPipelineViewportStateCreateInfo-scissorCount-01220", "scissorCount and viewportCount must be identical (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-scissorCount-01220)"},
- {"VUID-VkPipelineViewportStateCreateInfo-scissorCount-arraylength", "scissorCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-scissorCount-arraylength)"},
- {"VUID-VkPipelineViewportStateCreateInfo-viewportCount-01216", "If the multiple viewports feature is not enabled, viewportCount must be 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-viewportCount-01216)"},
- {"VUID-VkPipelineViewportStateCreateInfo-viewportCount-01218", "viewportCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-viewportCount-01218)"},
- {"VUID-VkPipelineViewportStateCreateInfo-viewportCount-arraylength", "viewportCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-viewportCount-arraylength)"},
- {"VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726", "If the viewportWScalingEnable member of a VkPipelineViewportWScalingStateCreateInfoNV structure included in the pNext chain is VK_TRUE, the viewportCount member of the VkPipelineViewportWScalingStateCreateInfoNV structure must be equal to viewportCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726)"},
- {"VUID-VkPipelineViewportStateCreateInfo-x-02821", "The x and y members of offset member of any element of pScissors must be greater than or equal to 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-x-02821)"},
- {"VUID-VkPipelineViewportSwizzleStateCreateInfoNV-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportSwizzleStateCreateInfoNV-flags-zerobitmask)"},
- {"VUID-VkPipelineViewportSwizzleStateCreateInfoNV-pViewportSwizzles-parameter", "pViewportSwizzles must be a valid pointer to an array of viewportCount valid VkViewportSwizzleNV structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportSwizzleStateCreateInfoNV-pViewportSwizzles-parameter)"},
- {"VUID-VkPipelineViewportSwizzleStateCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportSwizzleStateCreateInfoNV-sType-sType)"},
- {"VUID-VkPipelineViewportSwizzleStateCreateInfoNV-viewportCount-01215", "viewportCount must match the viewportCount set in VkPipelineViewportStateCreateInfo (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportSwizzleStateCreateInfoNV-viewportCount-01215)"},
- {"VUID-VkPipelineViewportSwizzleStateCreateInfoNV-viewportCount-arraylength", "viewportCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportSwizzleStateCreateInfoNV-viewportCount-arraylength)"},
- {"VUID-VkPipelineViewportWScalingStateCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportWScalingStateCreateInfoNV-sType-sType)"},
- {"VUID-VkPipelineViewportWScalingStateCreateInfoNV-viewportCount-arraylength", "viewportCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPipelineViewportWScalingStateCreateInfoNV-viewportCount-arraylength)"},
- {"VUID-VkPresentFrameTokenGGP-frameToken-02680", "frameToken must be a valid GgpFrameToken (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentFrameTokenGGP-frameToken-02680)"},
- {"VUID-VkPresentFrameTokenGGP-sType-sType", "sType must be VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentFrameTokenGGP-sType-sType)"},
- {"VUID-VkPresentInfoKHR-commonparent", "Both of the elements of pSwapchains, and the elements of pWaitSemaphores that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkInstance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentInfoKHR-commonparent)"},
- {"VUID-VkPresentInfoKHR-pImageIndices-01296", "Each element of pImageIndices must be the index of a presentable image acquired from the swapchain specified by the corresponding element of the pSwapchains array, and the presented image subresource must be in the VK_IMAGE_LAYOUT_PRESENT_SRC_KHR layout at the time the operation is executed on a VkDevice (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkPresentInfoKHR-pImageIndices-01296)"},
- {"VUID-VkPresentInfoKHR-pImageIndices-01430", "Each element of pImageIndices must be the index of a presentable image acquired from the swapchain specified by the corresponding element of the pSwapchains array, and the presented image subresource must be in the VK_IMAGE_LAYOUT_PRESENT_SRC_KHR or VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR layout at the time the operation is executed on a VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentInfoKHR-pImageIndices-01430)"},
- {"VUID-VkPresentInfoKHR-pImageIndices-parameter", "pImageIndices must be a valid pointer to an array of swapchainCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentInfoKHR-pImageIndices-parameter)"},
- {"VUID-VkPresentInfoKHR-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkDeviceGroupPresentInfoKHR, VkDisplayPresentInfoKHR, VkPresentFrameTokenGGP, VkPresentRegionsKHR, or VkPresentTimesInfoGOOGLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentInfoKHR-pNext-pNext)"},
- {"VUID-VkPresentInfoKHR-pResults-parameter", "If pResults is not NULL, pResults must be a valid pointer to an array of swapchainCount VkResult values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentInfoKHR-pResults-parameter)"},
- {"VUID-VkPresentInfoKHR-pSwapchains-parameter", "pSwapchains must be a valid pointer to an array of swapchainCount valid VkSwapchainKHR handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentInfoKHR-pSwapchains-parameter)"},
- {"VUID-VkPresentInfoKHR-pWaitSemaphores-03269", "All elements of the pWaitSemaphores must have a VkSemaphoreType of VK_SEMAPHORE_TYPE_BINARY (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentInfoKHR-pWaitSemaphores-03269)"},
- {"VUID-VkPresentInfoKHR-pWaitSemaphores-parameter", "If waitSemaphoreCount is not 0, pWaitSemaphores must be a valid pointer to an array of waitSemaphoreCount valid VkSemaphore handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentInfoKHR-pWaitSemaphores-parameter)"},
- {"VUID-VkPresentInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PRESENT_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentInfoKHR-sType-sType)"},
- {"VUID-VkPresentInfoKHR-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentInfoKHR-sType-unique)"},
- {"VUID-VkPresentInfoKHR-swapchainCount-arraylength", "swapchainCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentInfoKHR-swapchainCount-arraylength)"},
- {"VUID-VkPresentRegionKHR-pRectangles-parameter", "If rectangleCount is not 0, and pRectangles is not NULL, pRectangles must be a valid pointer to an array of rectangleCount valid VkRectLayerKHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentRegionKHR-pRectangles-parameter)"},
- {"VUID-VkPresentRegionsKHR-pRegions-parameter", "If pRegions is not NULL, pRegions must be a valid pointer to an array of swapchainCount valid VkPresentRegionKHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentRegionsKHR-pRegions-parameter)"},
- {"VUID-VkPresentRegionsKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentRegionsKHR-sType-sType)"},
- {"VUID-VkPresentRegionsKHR-swapchainCount-01260", "swapchainCount must be the same value as VkPresentInfoKHR::swapchainCount, where VkPresentInfoKHR is included in the pNext chain of this VkPresentRegionsKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentRegionsKHR-swapchainCount-01260)"},
- {"VUID-VkPresentRegionsKHR-swapchainCount-arraylength", "swapchainCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentRegionsKHR-swapchainCount-arraylength)"},
- {"VUID-VkPresentTimesInfoGOOGLE-pTimes-parameter", "If pTimes is not NULL, pTimes must be a valid pointer to an array of swapchainCount VkPresentTimeGOOGLE structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentTimesInfoGOOGLE-pTimes-parameter)"},
- {"VUID-VkPresentTimesInfoGOOGLE-sType-sType", "sType must be VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentTimesInfoGOOGLE-sType-sType)"},
- {"VUID-VkPresentTimesInfoGOOGLE-swapchainCount-01247", "swapchainCount must be the same value as VkPresentInfoKHR::swapchainCount, where VkPresentInfoKHR is included in the pNext chain of this VkPresentTimesInfoGOOGLE structure. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentTimesInfoGOOGLE-swapchainCount-01247)"},
- {"VUID-VkPresentTimesInfoGOOGLE-swapchainCount-arraylength", "swapchainCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentTimesInfoGOOGLE-swapchainCount-arraylength)"},
- {"VUID-VkProtectedSubmitInfo-pNext-01819", "If the VkSubmitInfo::pNext chain does not include a VkProtectedSubmitInfo structure, then each element of the command buffer of the pCommandBuffers array must be an unprotected command buffer. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkProtectedSubmitInfo-pNext-01819)"},
- {"VUID-VkProtectedSubmitInfo-protectedSubmit-01816", "If the protected memory feature is not enabled, protectedSubmit must not be VK_TRUE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkProtectedSubmitInfo-protectedSubmit-01816)"},
- {"VUID-VkProtectedSubmitInfo-protectedSubmit-01817", "If protectedSubmit is VK_TRUE, then each element of the pCommandBuffers array must be a protected command buffer. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkProtectedSubmitInfo-protectedSubmit-01817)"},
- {"VUID-VkProtectedSubmitInfo-protectedSubmit-01818", "If protectedSubmit is VK_FALSE, then each element of the pCommandBuffers array must be an unprotected command buffer. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkProtectedSubmitInfo-protectedSubmit-01818)"},
- {"VUID-VkProtectedSubmitInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkProtectedSubmitInfo-sType-sType)"},
- {"VUID-VkPushConstantRange-offset-00294", "offset must be less than VkPhysicalDeviceLimits::maxPushConstantsSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPushConstantRange-offset-00294)"},
- {"VUID-VkPushConstantRange-offset-00295", "offset must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPushConstantRange-offset-00295)"},
- {"VUID-VkPushConstantRange-size-00296", "size must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPushConstantRange-size-00296)"},
- {"VUID-VkPushConstantRange-size-00297", "size must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPushConstantRange-size-00297)"},
- {"VUID-VkPushConstantRange-size-00298", "size must be less than or equal to VkPhysicalDeviceLimits::maxPushConstantsSize minus offset (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPushConstantRange-size-00298)"},
- {"VUID-VkPushConstantRange-stageFlags-parameter", "stageFlags must be a valid combination of VkShaderStageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPushConstantRange-stageFlags-parameter)"},
- {"VUID-VkPushConstantRange-stageFlags-requiredbitmask", "stageFlags must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPushConstantRange-stageFlags-requiredbitmask)"},
- {"VUID-VkQueryPoolCreateInfo-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkQueryPoolCreateInfo-flags-zerobitmask)"},
- {"VUID-VkQueryPoolCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkQueryPoolPerformanceCreateInfoKHR or VkQueryPoolPerformanceQueryCreateInfoINTEL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkQueryPoolCreateInfo-pNext-pNext)"},
- {"VUID-VkQueryPoolCreateInfo-queryCount-02763", "queryCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkQueryPoolCreateInfo-queryCount-02763)"},
- {"VUID-VkQueryPoolCreateInfo-queryType-00791", "If the pipeline statistics queries feature is not enabled, queryType must not be VK_QUERY_TYPE_PIPELINE_STATISTICS (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkQueryPoolCreateInfo-queryType-00791)"},
- {"VUID-VkQueryPoolCreateInfo-queryType-00792", "If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of VkQueryPipelineStatisticFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkQueryPoolCreateInfo-queryType-00792)"},
- {"VUID-VkQueryPoolCreateInfo-queryType-03222", "If queryType is VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, the pNext chain must include a structure of type VkQueryPoolPerformanceCreateInfoKHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkQueryPoolCreateInfo-queryType-03222)"},
- {"VUID-VkQueryPoolCreateInfo-queryType-parameter", "queryType must be a valid VkQueryType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkQueryPoolCreateInfo-queryType-parameter)"},
- {"VUID-VkQueryPoolCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkQueryPoolCreateInfo-sType-sType)"},
- {"VUID-VkQueryPoolCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkQueryPoolCreateInfo-sType-unique)"},
- {"VUID-VkQueryPoolPerformanceCreateInfoKHR-counterIndexCount-arraylength", "counterIndexCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkQueryPoolPerformanceCreateInfoKHR-counterIndexCount-arraylength)"},
- {"VUID-VkQueryPoolPerformanceCreateInfoKHR-pCounterIndices-03321", "Each element of pCounterIndices must be in the range of counters reported by vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR for the queue family specified in queueFamilyIndex (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkQueryPoolPerformanceCreateInfoKHR-pCounterIndices-03321)"},
- {"VUID-VkQueryPoolPerformanceCreateInfoKHR-pCounterIndices-parameter", "pCounterIndices must be a valid pointer to an array of counterIndexCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkQueryPoolPerformanceCreateInfoKHR-pCounterIndices-parameter)"},
- {"VUID-VkQueryPoolPerformanceCreateInfoKHR-performanceCounterQueryPools-03237", "The performanceCounterQueryPools feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkQueryPoolPerformanceCreateInfoKHR-performanceCounterQueryPools-03237)"},
- {"VUID-VkQueryPoolPerformanceCreateInfoKHR-queueFamilyIndex-03236", "queueFamilyIndex must be a valid queue family index of the device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkQueryPoolPerformanceCreateInfoKHR-queueFamilyIndex-03236)"},
- {"VUID-VkQueryPoolPerformanceCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkQueryPoolPerformanceCreateInfoKHR-sType-sType)"},
- {"VUID-VkQueryPoolPerformanceQueryCreateInfoINTEL-performanceCountersSampling-parameter", "performanceCountersSampling must be a valid VkQueryPoolSamplingModeINTEL value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkQueryPoolPerformanceQueryCreateInfoINTEL-performanceCountersSampling-parameter)"},
- {"VUID-VkQueryPoolPerformanceQueryCreateInfoINTEL-sType-sType", "sType must be VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkQueryPoolPerformanceQueryCreateInfoINTEL-sType-sType)"},
- {"VUID-VkQueueFamilyCheckpointPropertiesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkQueueFamilyCheckpointPropertiesNV-sType-sType)"},
- {"VUID-VkQueueFamilyProperties2-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkQueueFamilyCheckpointPropertiesNV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkQueueFamilyProperties2-pNext-pNext)"},
- {"VUID-VkQueueFamilyProperties2-sType-sType", "sType must be VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkQueueFamilyProperties2-sType-sType)"},
- {"VUID-VkQueueFamilyProperties2-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkQueueFamilyProperties2-sType-unique)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-commonparent", "Both of basePipelineHandle, and layout that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-commonparent)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-flags-02904", "flags must not include VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-flags-02904)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-flags-03421", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineIndex is -1, basePipelineHandle must be a valid handle to a ray tracing VkPipeline (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-flags-03421)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-flags-03422", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineHandle is VK_NULL_HANDLE, basePipelineIndex must be a valid index into the calling command's pCreateInfos parameter (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-flags-03422)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-flags-03423", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineIndex is not -1, basePipelineHandle must be VK_NULL_HANDLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-flags-03423)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-flags-03424", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineHandle is not VK_NULL_HANDLE, basePipelineIndex must be -1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-flags-03424)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-flags-03465", "If flags includes VK_PIPELINE_CREATE_LIBRARY_BIT_KHR, pLibraryInterface must not be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-flags-03465)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-flags-03470", "If flags includes VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR, for any element of pGroups with a type of VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR or VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR, the anyHitShader of that element must not be VK_SHADER_UNUSED_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-flags-03470)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-flags-03471", "If flags includes VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, for any element of pGroups with a type of VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR or VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR, the closestHitShader of that element must not be VK_SHADER_UNUSED_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-flags-03471)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-flags-parameter", "flags must be a valid combination of VkPipelineCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-flags-parameter)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-layout-03427", "layout must be consistent with all shaders specified in pStages (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-layout-03427)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-layout-03428", "The number of resources in layout accessible to each shader stage that is used by the pipeline must be less than or equal to VkPhysicalDeviceLimits::maxPerStageResources (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-layout-03428)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-layout-parameter", "layout must be a valid VkPipelineLayout handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-layout-parameter)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-libraries-02958", "If libraries.pname:libraryCount is zero, then stageCount must not be zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-libraries-02958)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-libraries-02959", "If libraries.pname:libraryCount is zero, then groupCount must not be zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-libraries-02959)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-libraries-parameter", "libraries must be a valid VkPipelineLibraryCreateInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-libraries-parameter)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-libraryCount-03466", "If the libraryCount member of libraries is greater than 0, pLibraryInterface must not be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-libraryCount-03466)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-maxRecursionDepth-03464", "maxRecursionDepth must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxRecursionDepth (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-maxRecursionDepth-03464)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-pGroups-parameter", "If groupCount is not 0, pGroups must be a valid pointer to an array of groupCount valid VkRayTracingShaderGroupCreateInfoKHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-pGroups-parameter)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-pLibraries-03467", "Each element of the pLibraries member of libraries must have been created with the value of maxRecursionDepth equal to that in this pipeline (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-pLibraries-03467)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-pLibraries-03468", "Each element of the pLibraries member of libraries must have been created with a layout that is compatible with the layout in this pipeline (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-pLibraries-03468)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-pLibraries-03469", "Each element of the pLibraries member of libraries must have been created with values of the maxPayloadSize, maxAttributeSize, and maxCallableSize members of pLibraryInterface equal to those in this pipeline (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-pLibraries-03469)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInterface-parameter", "If pLibraryInterface is not NULL, pLibraryInterface must be a valid pointer to a valid VkRayTracingPipelineInterfaceCreateInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInterface-parameter)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkDeferredOperationInfoKHR or VkPipelineCreationFeedbackCreateInfoEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-pNext-pNext)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-pStages-03426", "The shader code for the entry points identified by pStages, and the rest of the state identified by this structure must adhere to the pipeline linking rules described in the Shader Interfaces chapter (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-pStages-03426)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-pStages-parameter", "If stageCount is not 0, pStages must be a valid pointer to an array of stageCount valid VkPipelineShaderStageCreateInfo structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-pStages-parameter)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-pipelineCreationCacheControl-02905", "If the pipelineCreationCacheControl feature is not enabled, flags must not include VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT or VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-pipelineCreationCacheControl-02905)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-rayTracingPrimitiveCulling-03472", "If the rayTracingPrimitiveCulling feature is not enabled, flags must not include VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-rayTracingPrimitiveCulling-03472)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-rayTracingPrimitiveCulling-03473", "If the rayTracingPrimitiveCulling feature is not enabled, flags must not include VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-rayTracingPrimitiveCulling-03473)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-sType-sType)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-sType-unique)"},
- {"VUID-VkRayTracingPipelineCreateInfoKHR-stage-03425", "The stage member of at least one element of pStages must be VK_SHADER_STAGE_RAYGEN_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoKHR-stage-03425)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-commonparent", "Both of basePipelineHandle, and layout that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-commonparent)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-flags-02904", "flags must not include VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-flags-02904)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-flags-02957", "flags must not include both VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV and VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT at the same time. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-flags-02957)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-flags-03421", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineIndex is -1, basePipelineHandle must be a valid handle to a ray tracing VkPipeline (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-flags-03421)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-flags-03422", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineHandle is VK_NULL_HANDLE, basePipelineIndex must be a valid index into the calling command's pCreateInfos parameter (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-flags-03422)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-flags-03423", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineIndex is not -1, basePipelineHandle must be VK_NULL_HANDLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-flags-03423)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-flags-03424", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineHandle is not VK_NULL_HANDLE, basePipelineIndex must be -1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-flags-03424)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-flags-03456", "flags must not include VK_PIPELINE_CREATE_LIBRARY_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-flags-03456)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-flags-03458", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-flags-03458)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-flags-03459", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-flags-03459)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-flags-03460", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-flags-03460)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-flags-03461", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-flags-03461)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-flags-03462", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-flags-03462)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-flags-03463", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-flags-03463)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-flags-parameter", "flags must be a valid combination of VkPipelineCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-flags-parameter)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-groupCount-arraylength", "groupCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-groupCount-arraylength)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-layout-03427", "layout must be consistent with all shaders specified in pStages (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-layout-03427)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-layout-03428", "The number of resources in layout accessible to each shader stage that is used by the pipeline must be less than or equal to VkPhysicalDeviceLimits::maxPerStageResources (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-layout-03428)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-layout-parameter", "layout must be a valid VkPipelineLayout handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-layout-parameter)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-maxRecursionDepth-03457", "maxRecursionDepth must be less than or equal to VkPhysicalDeviceRayTracingPropertiesNV::maxRecursionDepth (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-maxRecursionDepth-03457)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-pGroups-parameter", "pGroups must be a valid pointer to an array of groupCount valid VkRayTracingShaderGroupCreateInfoNV structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-pGroups-parameter)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkPipelineCreationFeedbackCreateInfoEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-pNext-pNext)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-pStages-03426", "The shader code for the entry points identified by pStages, and the rest of the state identified by this structure must adhere to the pipeline linking rules described in the Shader Interfaces chapter (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-pStages-03426)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-pStages-parameter", "pStages must be a valid pointer to an array of stageCount valid VkPipelineShaderStageCreateInfo structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-pStages-parameter)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-pipelineCreationCacheControl-02905", "If the pipelineCreationCacheControl feature is not enabled, flags must not include VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT or VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-pipelineCreationCacheControl-02905)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-sType-sType)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-sType-unique)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-stage-03425", "The stage member of at least one element of pStages must be VK_SHADER_STAGE_RAYGEN_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-stage-03425)"},
- {"VUID-VkRayTracingPipelineCreateInfoNV-stageCount-arraylength", "stageCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineCreateInfoNV-stageCount-arraylength)"},
- {"VUID-VkRayTracingPipelineInterfaceCreateInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineInterfaceCreateInfoKHR-pNext-pNext)"},
- {"VUID-VkRayTracingPipelineInterfaceCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_INTERFACE_CREATE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingPipelineInterfaceCreateInfoKHR-sType-sType)"},
- {"VUID-VkRayTracingShaderGroupCreateInfoKHR-anyHitShader-03479", "anyHitShader must be either VK_SHADER_UNUSED_KHR or a valid index into VkRayTracingPipelineCreateInfoKHR::pStages referring to a shader of VK_SHADER_STAGE_ANY_HIT_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingShaderGroupCreateInfoKHR-anyHitShader-03479)"},
- {"VUID-VkRayTracingShaderGroupCreateInfoKHR-closestHitShader-03478", "closestHitShader must be either VK_SHADER_UNUSED_KHR or a valid index into VkRayTracingPipelineCreateInfoKHR::pStages referring to a shader of VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingShaderGroupCreateInfoKHR-closestHitShader-03478)"},
- {"VUID-VkRayTracingShaderGroupCreateInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingShaderGroupCreateInfoKHR-pNext-pNext)"},
- {"VUID-VkRayTracingShaderGroupCreateInfoKHR-rayTracingShaderGroupHandleCaptureReplayMixed-03480", "If VkPhysicalDeviceRayTracingFeaturesKHR::rayTracingShaderGroupHandleCaptureReplayMixed is VK_FALSE then pShaderGroupCaptureReplayHandle must not be provided if it has not been provided on a previous call to ray tracing pipeline creation (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingShaderGroupCreateInfoKHR-rayTracingShaderGroupHandleCaptureReplayMixed-03480)"},
- {"VUID-VkRayTracingShaderGroupCreateInfoKHR-rayTracingShaderGroupHandleCaptureReplayMixed-03481", "If VkPhysicalDeviceRayTracingFeaturesKHR::rayTracingShaderGroupHandleCaptureReplayMixed is VK_FALSE then the caller must guarantee that no ray tracing pipeline creation commands with pShaderGroupCaptureReplayHandle provided execute simultaneously with ray tracing pipeline creation commands without pShaderGroupCaptureReplayHandle provided (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingShaderGroupCreateInfoKHR-rayTracingShaderGroupHandleCaptureReplayMixed-03481)"},
- {"VUID-VkRayTracingShaderGroupCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingShaderGroupCreateInfoKHR-sType-sType)"},
- {"VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03474", "If type is VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR then generalShader must be a valid index into VkRayTracingPipelineCreateInfoKHR::pStages referring to a shader of VK_SHADER_STAGE_RAYGEN_BIT_KHR, VK_SHADER_STAGE_MISS_BIT_KHR, or VK_SHADER_STAGE_CALLABLE_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03474)"},
- {"VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03475", "If type is VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR then closestHitShader, anyHitShader, and intersectionShader must be VK_SHADER_UNUSED_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03475)"},
- {"VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03476", "If type is VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR then intersectionShader must be a valid index into VkRayTracingPipelineCreateInfoKHR::pStages referring to a shader of VK_SHADER_STAGE_INTERSECTION_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03476)"},
- {"VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03477", "If type is VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR then intersectionShader must be VK_SHADER_UNUSED_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03477)"},
- {"VUID-VkRayTracingShaderGroupCreateInfoKHR-type-parameter", "type must be a valid VkRayTracingShaderGroupTypeKHR value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingShaderGroupCreateInfoKHR-type-parameter)"},
- {"VUID-VkRayTracingShaderGroupCreateInfoNV-anyHitShader-02418", "anyHitShader must be either VK_SHADER_UNUSED_NV or a valid index into VkRayTracingPipelineCreateInfoNV::pStages referring to a shader of VK_SHADER_STAGE_ANY_HIT_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingShaderGroupCreateInfoNV-anyHitShader-02418)"},
- {"VUID-VkRayTracingShaderGroupCreateInfoNV-closestHitShader-02417", "closestHitShader must be either VK_SHADER_UNUSED_NV or a valid index into VkRayTracingPipelineCreateInfoNV::pStages referring to a shader of VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingShaderGroupCreateInfoNV-closestHitShader-02417)"},
- {"VUID-VkRayTracingShaderGroupCreateInfoNV-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingShaderGroupCreateInfoNV-pNext-pNext)"},
- {"VUID-VkRayTracingShaderGroupCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingShaderGroupCreateInfoNV-sType-sType)"},
- {"VUID-VkRayTracingShaderGroupCreateInfoNV-type-02413", "If type is VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV then generalShader must be a valid index into VkRayTracingPipelineCreateInfoNV::pStages referring to a shader of VK_SHADER_STAGE_RAYGEN_BIT_NV, VK_SHADER_STAGE_MISS_BIT_NV, or VK_SHADER_STAGE_CALLABLE_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingShaderGroupCreateInfoNV-type-02413)"},
- {"VUID-VkRayTracingShaderGroupCreateInfoNV-type-02414", "If type is VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV then closestHitShader, anyHitShader, and intersectionShader must be VK_SHADER_UNUSED_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingShaderGroupCreateInfoNV-type-02414)"},
- {"VUID-VkRayTracingShaderGroupCreateInfoNV-type-02415", "If type is VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_NV then intersectionShader must be a valid index into VkRayTracingPipelineCreateInfoNV::pStages referring to a shader of VK_SHADER_STAGE_INTERSECTION_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingShaderGroupCreateInfoNV-type-02415)"},
- {"VUID-VkRayTracingShaderGroupCreateInfoNV-type-02416", "If type is VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_NV then intersectionShader must be VK_SHADER_UNUSED_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingShaderGroupCreateInfoNV-type-02416)"},
- {"VUID-VkRayTracingShaderGroupCreateInfoNV-type-parameter", "type must be a valid VkRayTracingShaderGroupTypeKHR value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRayTracingShaderGroupCreateInfoNV-type-parameter)"},
- {"VUID-VkRectLayerKHR-layer-01262", "layer must be less than imageArrayLayers member of the VkSwapchainCreateInfoKHR structure given to vkCreateSwapchainKHR. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRectLayerKHR-layer-01262)"},
- {"VUID-VkRectLayerKHR-offset-01261", "The sum of offset and extent must be no greater than the imageExtent member of the VkSwapchainCreateInfoKHR structure given to vkCreateSwapchainKHR. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRectLayerKHR-offset-01261)"},
- {"VUID-VkRenderPassAttachmentBeginInfo-pAttachments-03218", "Each element of pAttachments must only specify a single mip level (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassAttachmentBeginInfo-pAttachments-03218)"},
- {"VUID-VkRenderPassAttachmentBeginInfo-pAttachments-03219", "Each element of pAttachments must have been created with the identity swizzle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassAttachmentBeginInfo-pAttachments-03219)"},
- {"VUID-VkRenderPassAttachmentBeginInfo-pAttachments-parameter", "If attachmentCount is not 0, pAttachments must be a valid pointer to an array of attachmentCount valid VkImageView handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassAttachmentBeginInfo-pAttachments-parameter)"},
- {"VUID-VkRenderPassAttachmentBeginInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassAttachmentBeginInfo-sType-sType)"},
- {"VUID-VkRenderPassBeginInfo-clearValueCount-00902", "clearValueCount must be greater than the largest attachment index in renderPass that specifies a loadOp (or stencilLoadOp, if the attachment has a depth/stencil format) of VK_ATTACHMENT_LOAD_OP_CLEAR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-clearValueCount-00902)"},
- {"VUID-VkRenderPassBeginInfo-commonparent", "Both of framebuffer, and renderPass must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-commonparent)"},
- {"VUID-VkRenderPassBeginInfo-framebuffer-02780", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that included VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR, each element of the pAttachments member of a VkRenderPassAttachmentBeginInfo structure included in the pNext chain must have been created on the same VkDevice as framebuffer and renderPass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-framebuffer-02780)"},
- {"VUID-VkRenderPassBeginInfo-framebuffer-03207", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that did not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, and the pNext chain includes a VkRenderPassAttachmentBeginInfo structure, its attachmentCount must be zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-framebuffer-03207)"},
- {"VUID-VkRenderPassBeginInfo-framebuffer-03208", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that included VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the attachmentCount of a VkRenderPassAttachmentBeginInfo structure included in the pNext chain must be equal to the value of VkFramebufferAttachmentsCreateInfo::attachmentImageInfoCount used to create framebuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-framebuffer-03208)"},
- {"VUID-VkRenderPassBeginInfo-framebuffer-03209", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that included VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the pAttachments member of a VkRenderPassAttachmentBeginInfo structure included in the pNext chain must be a VkImageView of an image created with a value of VkImageCreateInfo::flags equal to the flags member of the corresponding element of VkFramebufferAttachmentsCreateInfoKHR::pAttachments used to create framebuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-framebuffer-03209)"},
- {"VUID-VkRenderPassBeginInfo-framebuffer-03210", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that included VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the pAttachments member of a VkRenderPassAttachmentBeginInfo structure included in the pNext chain must be a VkImageView of an image created with a value of VkImageCreateInfo::usage equal to the usage member of the corresponding element of VkFramebufferAttachmentsCreateInfo::pAttachments used to create framebuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-framebuffer-03210)"},
- {"VUID-VkRenderPassBeginInfo-framebuffer-03211", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that included VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the pAttachments member of a VkRenderPassAttachmentBeginInfo structure included in the pNext chain must be a VkImageView with a width equal to the width member of the corresponding element of VkFramebufferAttachmentsCreateInfo::pAttachments used to create framebuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-framebuffer-03211)"},
- {"VUID-VkRenderPassBeginInfo-framebuffer-03212", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that included VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the pAttachments member of a VkRenderPassAttachmentBeginInfo structure included in the pNext chain must be a VkImageView with a height equal to the height member of the corresponding element of VkFramebufferAttachmentsCreateInfo::pAttachments used to create framebuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-framebuffer-03212)"},
- {"VUID-VkRenderPassBeginInfo-framebuffer-03213", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that included VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the pAttachments member of a VkRenderPassAttachmentBeginInfo structure included in the pNext chain must be a VkImageView of an image created with a value of VkImageViewCreateInfo::subresourceRange.layerCount equal to the layerCount member of the corresponding element of VkFramebufferAttachmentsCreateInfo::pAttachments used to create framebuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-framebuffer-03213)"},
- {"VUID-VkRenderPassBeginInfo-framebuffer-03214", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that included VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the pAttachments member of a VkRenderPassAttachmentBeginInfo structure included in the pNext chain must be a VkImageView of an image created with a value of VkImageFormatListCreateInfo::viewFormatCount equal to the viewFormatCount member of the corresponding element of VkFramebufferAttachmentsCreateInfo::pAttachments used to create framebuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-framebuffer-03214)"},
- {"VUID-VkRenderPassBeginInfo-framebuffer-03215", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that included VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the pAttachments member of a VkRenderPassAttachmentBeginInfo structure included in the pNext chain must be a VkImageView of an image created with a set of elements in VkImageFormatListCreateInfo::pViewFormats equal to the set of elements in the pViewFormats member of the corresponding element of VkFramebufferAttachmentsCreateInfo::pAttachments used to create framebuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-framebuffer-03215)"},
- {"VUID-VkRenderPassBeginInfo-framebuffer-03216", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that included VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the pAttachments member of a VkRenderPassAttachmentBeginInfo structure included in the pNext chain must be a VkImageView of an image created with a value of VkImageViewCreateInfo::format equal to the corresponding value of VkAttachmentDescription::format in renderPass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-framebuffer-03216)"},
- {"VUID-VkRenderPassBeginInfo-framebuffer-03217", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that included VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the pAttachments member of a VkRenderPassAttachmentBeginInfo structure included in the pNext chain must be a VkImageView of an image created with a value of VkImageCreateInfo::samples equal to the corresponding value of VkAttachmentDescription::samples in renderPass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-framebuffer-03217)"},
- {"VUID-VkRenderPassBeginInfo-framebuffer-parameter", "framebuffer must be a valid VkFramebuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-framebuffer-parameter)"},
- {"VUID-VkRenderPassBeginInfo-pClearValues-parameter", "If clearValueCount is not 0, pClearValues must be a valid pointer to an array of clearValueCount VkClearValue unions (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-pClearValues-parameter)"},
- {"VUID-VkRenderPassBeginInfo-pNext-02850", "If the pNext chain does not contain VkDeviceGroupRenderPassBeginInfo or its deviceRenderAreaCount member is equal to 0, renderArea.offset.x must be greater than or equal to 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-pNext-02850)"},
- {"VUID-VkRenderPassBeginInfo-pNext-02851", "If the pNext chain does not contain VkDeviceGroupRenderPassBeginInfo or its deviceRenderAreaCount member is equal to 0, renderArea.offset.y must be greater than or equal to 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-pNext-02851)"},
- {"VUID-VkRenderPassBeginInfo-pNext-02852", "If the pNext chain does not contain VkDeviceGroupRenderPassBeginInfo or its deviceRenderAreaCount member is equal to 0, renderArea.offset.x + renderArea.offset.width must be less than or equal to VkFramebufferCreateInfo::width the framebuffer was created with (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-pNext-02852)"},
- {"VUID-VkRenderPassBeginInfo-pNext-02853", "If the pNext chain does not contain VkDeviceGroupRenderPassBeginInfo or its deviceRenderAreaCount member is equal to 0, renderArea.offset.y + renderArea.offset.height must be less than or equal to VkFramebufferCreateInfo::height the framebuffer was created with (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-pNext-02853)"},
- {"VUID-VkRenderPassBeginInfo-pNext-02854", "If the pNext chain contains VkDeviceGroupRenderPassBeginInfo, the offset.x member of each element of pDeviceRenderAreas must be greater than or equal to 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-pNext-02854)"},
- {"VUID-VkRenderPassBeginInfo-pNext-02855", "If the pNext chain contains VkDeviceGroupRenderPassBeginInfo, the offset.y member of each element of pDeviceRenderAreas must be greater than or equal to 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-pNext-02855)"},
- {"VUID-VkRenderPassBeginInfo-pNext-02856", "If the pNext chain contains VkDeviceGroupRenderPassBeginInfo, offset.x + offset.width of each element of pDeviceRenderAreas must be less than or equal to VkFramebufferCreateInfo::width the framebuffer was created with (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-pNext-02856)"},
- {"VUID-VkRenderPassBeginInfo-pNext-02857", "If the pNext chain contains VkDeviceGroupRenderPassBeginInfo, offset.y + offset.height of each element of pDeviceRenderAreas must be less than or equal to VkFramebufferCreateInfo::height the framebuffer was created with (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-pNext-02857)"},
- {"VUID-VkRenderPassBeginInfo-pNext-02869", "If the pNext chain includes VkRenderPassTransformBeginInfoQCOM, renderArea::offset must equal (0,0). (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-pNext-02869)"},
- {"VUID-VkRenderPassBeginInfo-pNext-02870", "If the pNext chain includes VkRenderPassTransformBeginInfoQCOM, renderArea::extent transformed by VkRenderPassTransformBeginInfoQCOM::transform must equal the framebuffer dimensions. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-pNext-02870)"},
- {"VUID-VkRenderPassBeginInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkDeviceGroupRenderPassBeginInfo, VkRenderPassAttachmentBeginInfo, VkRenderPassSampleLocationsBeginInfoEXT, or VkRenderPassTransformBeginInfoQCOM (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-pNext-pNext)"},
- {"VUID-VkRenderPassBeginInfo-renderArea-02846", "renderArea.offset.x must be greater than or equal to 0 (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkRenderPassBeginInfo-renderArea-02846)"},
- {"VUID-VkRenderPassBeginInfo-renderArea-02847", "renderArea.offset.y must be greater than or equal to 0 (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkRenderPassBeginInfo-renderArea-02847)"},
- {"VUID-VkRenderPassBeginInfo-renderArea-02848", "renderArea.offset.x + renderArea.offset.width must be less than or equal to VkFramebufferCreateInfo::width the framebuffer was created with (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkRenderPassBeginInfo-renderArea-02848)"},
- {"VUID-VkRenderPassBeginInfo-renderArea-02849", "renderArea.offset.y + renderArea.offset.height must be less than or equal to VkFramebufferCreateInfo::height the framebuffer was created with (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkRenderPassBeginInfo-renderArea-02849)"},
- {"VUID-VkRenderPassBeginInfo-renderPass-00904", "renderPass must be compatible with the renderPass member of the VkFramebufferCreateInfo structure specified when creating framebuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-renderPass-00904)"},
- {"VUID-VkRenderPassBeginInfo-renderPass-parameter", "renderPass must be a valid VkRenderPass handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-renderPass-parameter)"},
- {"VUID-VkRenderPassBeginInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-sType-sType)"},
- {"VUID-VkRenderPassBeginInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassBeginInfo-sType-unique)"},
- {"VUID-VkRenderPassCreateInfo-attachment-00834", "If the attachment member of any element of pInputAttachments, pColorAttachments, pResolveAttachments or pDepthStencilAttachment, or any element of pPreserveAttachments in any element of pSubpasses is not VK_ATTACHMENT_UNUSED, it must be less than attachmentCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-attachment-00834)"},
- {"VUID-VkRenderPassCreateInfo-dstSubpass-02518", "The dstSubpass member of each element of pDependencies must be less than subpassCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-dstSubpass-02518)"},
- {"VUID-VkRenderPassCreateInfo-flags-parameter", "flags must be a valid combination of VkRenderPassCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-flags-parameter)"},
- {"VUID-VkRenderPassCreateInfo-pAttachments-00836", "For any member of pAttachments with a loadOp equal to VK_ATTACHMENT_LOAD_OP_CLEAR, the first use of that attachment must not specify a layout equal to VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL or VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pAttachments-00836)"},
- {"VUID-VkRenderPassCreateInfo-pAttachments-01566", "For any member of pAttachments with a loadOp equal to VK_ATTACHMENT_LOAD_OP_CLEAR, the first use of that attachment must not specify a layout equal to VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pAttachments-01566)"},
- {"VUID-VkRenderPassCreateInfo-pAttachments-01567", "For any member of pAttachments with a stencilLoadOp equal to VK_ATTACHMENT_LOAD_OP_CLEAR, the first use of that attachment must not specify a layout equal to VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pAttachments-01567)"},
- {"VUID-VkRenderPassCreateInfo-pAttachments-02511", "For any member of pAttachments with a stencilLoadOp equal to VK_ATTACHMENT_LOAD_OP_CLEAR, the first use of that attachment must not specify a layout equal to VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL or VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pAttachments-02511)"},
- {"VUID-VkRenderPassCreateInfo-pAttachments-parameter", "If attachmentCount is not 0, pAttachments must be a valid pointer to an array of attachmentCount valid VkAttachmentDescription structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pAttachments-parameter)"},
- {"VUID-VkRenderPassCreateInfo-pDependencies-00837", "For any element of pDependencies, if the srcSubpass is not VK_SUBPASS_EXTERNAL, all stage flags included in the srcStageMask member of that dependency must be a pipeline stage supported by the pipeline identified by the pipelineBindPoint member of the source subpass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pDependencies-00837)"},
- {"VUID-VkRenderPassCreateInfo-pDependencies-00838", "For any element of pDependencies, if the dstSubpass is not VK_SUBPASS_EXTERNAL, all stage flags included in the dstStageMask member of that dependency must be a pipeline stage supported by the pipeline identified by the pipelineBindPoint member of the destination subpass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pDependencies-00838)"},
- {"VUID-VkRenderPassCreateInfo-pDependencies-parameter", "If dependencyCount is not 0, pDependencies must be a valid pointer to an array of dependencyCount valid VkSubpassDependency structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pDependencies-parameter)"},
- {"VUID-VkRenderPassCreateInfo-pNext-01926", "If the pNext chain includes a VkRenderPassInputAttachmentAspectCreateInfo structure, the subpass member of each element of its pAspectReferences member must be less than subpassCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pNext-01926)"},
- {"VUID-VkRenderPassCreateInfo-pNext-01927", "If the pNext chain includes a VkRenderPassInputAttachmentAspectCreateInfo structure, the inputAttachmentIndex member of each element of its pAspectReferences member must be less than the value of inputAttachmentCount in the member of pSubpasses identified by its subpass member (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pNext-01927)"},
- {"VUID-VkRenderPassCreateInfo-pNext-01928", "If the pNext chain includes a VkRenderPassMultiviewCreateInfo structure, and its subpassCount member is not zero, that member must be equal to the value of subpassCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pNext-01928)"},
- {"VUID-VkRenderPassCreateInfo-pNext-01929", "If the pNext chain includes a VkRenderPassMultiviewCreateInfo structure, if its dependencyCount member is not zero, it must be equal to dependencyCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pNext-01929)"},
- {"VUID-VkRenderPassCreateInfo-pNext-01930", "If the pNext chain includes a VkRenderPassMultiviewCreateInfo structure, for each non-zero element of pViewOffsets, the srcSubpass and dstSubpass members of pDependencies at the same index must not be equal (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pNext-01930)"},
- {"VUID-VkRenderPassCreateInfo-pNext-01963", "If the pNext chain includes a VkRenderPassInputAttachmentAspectCreateInfo structure, for any element of the pInputAttachments member of any element of pSubpasses where the attachment member is not VK_ATTACHMENT_UNUSED, the aspectMask member of the corresponding element of VkRenderPassInputAttachmentAspectCreateInfo::pAspectReferences must only include aspects that are present in images of the format specified by the element of pAttachments at attachment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pNext-01963)"},
- {"VUID-VkRenderPassCreateInfo-pNext-02512", "If the pNext chain includes a VkRenderPassMultiviewCreateInfo structure, for any element of pDependencies with a dependencyFlags member that does not include VK_DEPENDENCY_VIEW_LOCAL_BIT, the corresponding element of the pViewOffsets member of that VkRenderPassMultiviewCreateInfo instance must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pNext-02512)"},
- {"VUID-VkRenderPassCreateInfo-pNext-02513", "If the pNext chain includes a VkRenderPassMultiviewCreateInfo structure, elements of its pViewMasks member must either all be 0, or all not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pNext-02513)"},
- {"VUID-VkRenderPassCreateInfo-pNext-02514", "If the pNext chain includes a VkRenderPassMultiviewCreateInfo structure, and each element of its pViewMasks member is 0, the dependencyFlags member of each element of pDependencies must not include VK_DEPENDENCY_VIEW_LOCAL_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pNext-02514)"},
- {"VUID-VkRenderPassCreateInfo-pNext-02515", "If the pNext chain includes a VkRenderPassMultiviewCreateInfo structure, and each element of its pViewMasks member is 0, correlatedViewMaskCount must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pNext-02515)"},
- {"VUID-VkRenderPassCreateInfo-pNext-02516", "If the pNext chain includes a VkRenderPassMultiviewCreateInfo structure, each element of its pViewMask member must not have a bit set at an index greater than or equal to VkPhysicalDeviceLimits::maxFramebufferLayers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pNext-02516)"},
- {"VUID-VkRenderPassCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkRenderPassFragmentDensityMapCreateInfoEXT, VkRenderPassInputAttachmentAspectCreateInfo, or VkRenderPassMultiviewCreateInfo (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pNext-pNext)"},
- {"VUID-VkRenderPassCreateInfo-pSubpasses-parameter", "pSubpasses must be a valid pointer to an array of subpassCount valid VkSubpassDescription structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-pSubpasses-parameter)"},
- {"VUID-VkRenderPassCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-sType-sType)"},
- {"VUID-VkRenderPassCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-sType-unique)"},
- {"VUID-VkRenderPassCreateInfo-srcSubpass-02517", "The srcSubpass member of each element of pDependencies must be less than subpassCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-srcSubpass-02517)"},
- {"VUID-VkRenderPassCreateInfo-subpassCount-arraylength", "subpassCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo-subpassCount-arraylength)"},
- {"VUID-VkRenderPassCreateInfo2-None-03049", "If any two subpasses operate on attachments with overlapping ranges of the same VkDeviceMemory object, and at least one subpass writes to that area of VkDeviceMemory, a subpass dependency must be included (either directly or via some intermediate subpasses) between them (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-None-03049)"},
- {"VUID-VkRenderPassCreateInfo2-attachment-02525", "If the attachment member of any element of the pInputAttachments member of any element of pSubpasses is not VK_ATTACHMENT_UNUSED, the aspectMask member of that element of pInputAttachments must only include aspects that are present in images of the format specified by the element of pAttachments specified by attachment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-attachment-02525)"},
- {"VUID-VkRenderPassCreateInfo2-attachment-03050", "If the attachment member of any element of pInputAttachments, pColorAttachments, pResolveAttachments or pDepthStencilAttachment, or the attachment indexed by any element of pPreserveAttachments in any given element of pSubpasses is bound to a range of a VkDeviceMemory object that overlaps with any other attachment in any subpass (including the same subpass), the VkAttachmentDescription2 structures describing them must include VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT in flags (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-attachment-03050)"},
- {"VUID-VkRenderPassCreateInfo2-attachment-03051", "If the attachment member of any element of pInputAttachments, pColorAttachments, pResolveAttachments or pDepthStencilAttachment, or any element of pPreserveAttachments in any given element of pSubpasses is not VK_ATTACHMENT_UNUSED, it must be less than attachmentCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-attachment-03051)"},
- {"VUID-VkRenderPassCreateInfo2-dstSubpass-02527", "The dstSubpass member of each element of pDependencies must be less than subpassCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-dstSubpass-02527)"},
- {"VUID-VkRenderPassCreateInfo2-flags-parameter", "flags must be a valid combination of VkRenderPassCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-flags-parameter)"},
- {"VUID-VkRenderPassCreateInfo2-pAttachments-02522", "For any member of pAttachments with a loadOp equal to VK_ATTACHMENT_LOAD_OP_CLEAR, the first use of that attachment must not specify a layout equal to VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-pAttachments-02522)"},
- {"VUID-VkRenderPassCreateInfo2-pAttachments-02523", "For any member of pAttachments with a stencilLoadOp equal to VK_ATTACHMENT_LOAD_OP_CLEAR, the first use of that attachment must not specify a layout equal to VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-pAttachments-02523)"},
- {"VUID-VkRenderPassCreateInfo2-pAttachments-parameter", "If attachmentCount is not 0, pAttachments must be a valid pointer to an array of attachmentCount valid VkAttachmentDescription2 structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-pAttachments-parameter)"},
- {"VUID-VkRenderPassCreateInfo2-pCorrelatedViewMasks-03056", "The set of bits included in any element of pCorrelatedViewMasks must not overlap with the set of bits included in any other element of pCorrelatedViewMasks (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-pCorrelatedViewMasks-03056)"},
- {"VUID-VkRenderPassCreateInfo2-pCorrelatedViewMasks-parameter", "If correlatedViewMaskCount is not 0, pCorrelatedViewMasks must be a valid pointer to an array of correlatedViewMaskCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-pCorrelatedViewMasks-parameter)"},
- {"VUID-VkRenderPassCreateInfo2-pDependencies-03054", "For any element of pDependencies, if the srcSubpass is not VK_SUBPASS_EXTERNAL, all stage flags included in the srcStageMask member of that dependency must be a pipeline stage supported by the pipeline identified by the pipelineBindPoint member of the source subpass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-pDependencies-03054)"},
- {"VUID-VkRenderPassCreateInfo2-pDependencies-03055", "For any element of pDependencies, if the dstSubpass is not VK_SUBPASS_EXTERNAL, all stage flags included in the dstStageMask member of that dependency must be a pipeline stage supported by the pipeline identified by the pipelineBindPoint member of the destination subpass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-pDependencies-03055)"},
- {"VUID-VkRenderPassCreateInfo2-pDependencies-03060", "For any element of pDependencies where its srcSubpass member equals its dstSubpass member, if the viewMask member of the corresponding element of pSubpasses includes more than one bit, its dependencyFlags member must include VK_DEPENDENCY_VIEW_LOCAL_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-pDependencies-03060)"},
- {"VUID-VkRenderPassCreateInfo2-pDependencies-parameter", "If dependencyCount is not 0, pDependencies must be a valid pointer to an array of dependencyCount valid VkSubpassDependency2 structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-pDependencies-parameter)"},
- {"VUID-VkRenderPassCreateInfo2-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkRenderPassFragmentDensityMapCreateInfoEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-pNext-pNext)"},
- {"VUID-VkRenderPassCreateInfo2-pSubpasses-parameter", "pSubpasses must be a valid pointer to an array of subpassCount valid VkSubpassDescription2 structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-pSubpasses-parameter)"},
- {"VUID-VkRenderPassCreateInfo2-sType-sType", "sType must be VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-sType-sType)"},
- {"VUID-VkRenderPassCreateInfo2-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-sType-unique)"},
- {"VUID-VkRenderPassCreateInfo2-srcSubpass-02526", "The srcSubpass member of each element of pDependencies must be less than subpassCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-srcSubpass-02526)"},
- {"VUID-VkRenderPassCreateInfo2-subpassCount-arraylength", "subpassCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-subpassCount-arraylength)"},
- {"VUID-VkRenderPassCreateInfo2-viewMask-02524", "The viewMask member must not have a bit set at an index greater than or equal to VkPhysicalDeviceLimits::maxFramebufferLayers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-viewMask-02524)"},
- {"VUID-VkRenderPassCreateInfo2-viewMask-03057", "If the VkSubpassDescription2::viewMask member of all elements of pSubpasses is 0, correlatedViewMaskCount must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-viewMask-03057)"},
- {"VUID-VkRenderPassCreateInfo2-viewMask-03058", "The VkSubpassDescription2::viewMask member of all elements of pSubpasses must either all be 0, or all not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-viewMask-03058)"},
- {"VUID-VkRenderPassCreateInfo2-viewMask-03059", "If the VkSubpassDescription2::viewMask member of all elements of pSubpasses is 0, the dependencyFlags member of any element of pDependencies must not include VK_DEPENDENCY_VIEW_LOCAL_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassCreateInfo2-viewMask-03059)"},
- {"VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02547", "If fragmentDensityMapAttachment is not VK_ATTACHMENT_UNUSED, fragmentDensityMapAttachment must be less than VkRenderPassCreateInfo::attachmentCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02547)"},
- {"VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02548", "If fragmentDensityMapAttachment is not VK_ATTACHMENT_UNUSED, fragmentDensityMapAttachment must not be an element of VkSubpassDescription::pInputAttachments, VkSubpassDescription::pColorAttachments, VkSubpassDescription::pResolveAttachments, VkSubpassDescription::pDepthStencilAttachment, or VkSubpassDescription::pPreserveAttachments for any subpass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02548)"},
- {"VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02549", "If fragmentDensityMapAttachment is not VK_ATTACHMENT_UNUSED, layout must be equal to VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT, or VK_IMAGE_LAYOUT_GENERAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02549)"},
- {"VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02550", "If fragmentDensityMapAttachment is not VK_ATTACHMENT_UNUSED, fragmentDensityMapAttachment must reference an attachment with a loadOp equal to VK_ATTACHMENT_LOAD_OP_LOAD or VK_ATTACHMENT_LOAD_OP_DONT_CARE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02550)"},
- {"VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02551", "If fragmentDensityMapAttachment is not VK_ATTACHMENT_UNUSED, fragmentDensityMapAttachment must reference an attachment with a storeOp equal to VK_ATTACHMENT_STORE_OP_DONT_CARE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02551)"},
- {"VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-parameter", "fragmentDensityMapAttachment must be a valid VkAttachmentReference structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-parameter)"},
- {"VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-sType-sType)"},
- {"VUID-VkRenderPassInputAttachmentAspectCreateInfo-aspectReferenceCount-arraylength", "aspectReferenceCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassInputAttachmentAspectCreateInfo-aspectReferenceCount-arraylength)"},
- {"VUID-VkRenderPassInputAttachmentAspectCreateInfo-pAspectReferences-parameter", "pAspectReferences must be a valid pointer to an array of aspectReferenceCount valid VkInputAttachmentAspectReference structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassInputAttachmentAspectCreateInfo-pAspectReferences-parameter)"},
- {"VUID-VkRenderPassInputAttachmentAspectCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassInputAttachmentAspectCreateInfo-sType-sType)"},
- {"VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-00841", "Each view index must not be set in more than one element of pCorrelationMasks (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-00841)"},
- {"VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-parameter", "If correlationMaskCount is not 0, pCorrelationMasks must be a valid pointer to an array of correlationMaskCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-parameter)"},
- {"VUID-VkRenderPassMultiviewCreateInfo-pViewMasks-parameter", "If subpassCount is not 0, pViewMasks must be a valid pointer to an array of subpassCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-pViewMasks-parameter)"},
- {"VUID-VkRenderPassMultiviewCreateInfo-pViewOffsets-parameter", "If dependencyCount is not 0, pViewOffsets must be a valid pointer to an array of dependencyCount int32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-pViewOffsets-parameter)"},
- {"VUID-VkRenderPassMultiviewCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassMultiviewCreateInfo-sType-sType)"},
- {"VUID-VkRenderPassSampleLocationsBeginInfoEXT-pAttachmentInitialSampleLocations-parameter", "If attachmentInitialSampleLocationsCount is not 0, pAttachmentInitialSampleLocations must be a valid pointer to an array of attachmentInitialSampleLocationsCount valid VkAttachmentSampleLocationsEXT structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassSampleLocationsBeginInfoEXT-pAttachmentInitialSampleLocations-parameter)"},
- {"VUID-VkRenderPassSampleLocationsBeginInfoEXT-pPostSubpassSampleLocations-parameter", "If postSubpassSampleLocationsCount is not 0, pPostSubpassSampleLocations must be a valid pointer to an array of postSubpassSampleLocationsCount valid VkSubpassSampleLocationsEXT structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassSampleLocationsBeginInfoEXT-pPostSubpassSampleLocations-parameter)"},
- {"VUID-VkRenderPassSampleLocationsBeginInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassSampleLocationsBeginInfoEXT-sType-sType)"},
- {"VUID-VkRenderPassTransformBeginInfoQCOM-flags-02872", "The renderpass must have been created with VkRenderPassCreateInfo::flags containing VK_RENDER_PASS_CREATE_TRANSFORM_BIT_QCOM. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassTransformBeginInfoQCOM-flags-02872)"},
- {"VUID-VkRenderPassTransformBeginInfoQCOM-sType-sType", "sType must be VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassTransformBeginInfoQCOM-sType-sType)"},
- {"VUID-VkRenderPassTransformBeginInfoQCOM-transform-02871", "transform must be VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR, VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR, VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR, or VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkRenderPassTransformBeginInfoQCOM-transform-02871)"},
- {"VUID-VkSampleLocationsInfoEXT-pSampleLocations-parameter", "If sampleLocationsCount is not 0, pSampleLocations must be a valid pointer to an array of sampleLocationsCount VkSampleLocationEXT structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSampleLocationsInfoEXT-pSampleLocations-parameter)"},
- {"VUID-VkSampleLocationsInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSampleLocationsInfoEXT-sType-sType)"},
- {"VUID-VkSampleLocationsInfoEXT-sampleLocationsCount-01527", "sampleLocationsCount must equal sampleLocationsPerPixel {times} sampleLocationGridSize.width {times} sampleLocationGridSize.height (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSampleLocationsInfoEXT-sampleLocationsCount-01527)"},
- {"VUID-VkSampleLocationsInfoEXT-sampleLocationsPerPixel-01526", "sampleLocationsPerPixel must be a bit value that is set in VkPhysicalDeviceSampleLocationsPropertiesEXT::sampleLocationSampleCounts (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSampleLocationsInfoEXT-sampleLocationsPerPixel-01526)"},
- {"VUID-VkSampleLocationsInfoEXT-sampleLocationsPerPixel-parameter", "If sampleLocationsPerPixel is not 0, sampleLocationsPerPixel must be a valid VkSampleCountFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSampleLocationsInfoEXT-sampleLocationsPerPixel-parameter)"},
- {"VUID-VkSamplerCreateInfo-None-01647", "The sampler reduction mode must be set to VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE if sampler {YCbCr} conversion is enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-None-01647)"},
- {"VUID-VkSamplerCreateInfo-addressModeU-01078", "If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a valid VkBorderColor value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-addressModeU-01078)"},
- {"VUID-VkSamplerCreateInfo-addressModeU-01079", "If ifdef::VK_VERSION_1_2[samplerMirrorClampToEdge is not enabled, and if] the VK_KHR_sampler_mirror_clamp_to_edge extension is not enabled, addressModeU, addressModeV and addressModeW must not be VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-addressModeU-01079)"},
- {"VUID-VkSamplerCreateInfo-addressModeU-01646", "If sampler {YCbCr} conversion is enabled, addressModeU, addressModeV, and addressModeW must be VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, anisotropyEnable must be VK_FALSE, and unnormalizedCoordinates must be VK_FALSE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-addressModeU-01646)"},
- {"VUID-VkSamplerCreateInfo-addressModeU-parameter", "addressModeU must be a valid VkSamplerAddressMode value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-addressModeU-parameter)"},
- {"VUID-VkSamplerCreateInfo-addressModeV-parameter", "addressModeV must be a valid VkSamplerAddressMode value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-addressModeV-parameter)"},
- {"VUID-VkSamplerCreateInfo-addressModeW-parameter", "addressModeW must be a valid VkSamplerAddressMode value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-addressModeW-parameter)"},
- {"VUID-VkSamplerCreateInfo-anisotropyEnable-01070", "If the anisotropic sampling feature is not enabled, anisotropyEnable must be VK_FALSE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-anisotropyEnable-01070)"},
- {"VUID-VkSamplerCreateInfo-anisotropyEnable-01071", "If anisotropyEnable is VK_TRUE, maxAnisotropy must be between 1.0 and VkPhysicalDeviceLimits::maxSamplerAnisotropy, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-anisotropyEnable-01071)"},
- {"VUID-VkSamplerCreateInfo-compareEnable-01080", "If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-compareEnable-01080)"},
- {"VUID-VkSamplerCreateInfo-compareEnable-01423", "If compareEnable is VK_TRUE, the reductionMode member of VkSamplerReductionModeCreateInfo must be VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-compareEnable-01423)"},
- {"VUID-VkSamplerCreateInfo-flags-02574", "If flags includes VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, then minFilter and magFilter must be equal. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-flags-02574)"},
- {"VUID-VkSamplerCreateInfo-flags-02575", "If flags includes VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, then mipmapMode must be VK_SAMPLER_MIPMAP_MODE_NEAREST. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-flags-02575)"},
- {"VUID-VkSamplerCreateInfo-flags-02576", "If flags includes VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, then minLod and maxLod must be zero. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-flags-02576)"},
- {"VUID-VkSamplerCreateInfo-flags-02577", "If flags includes VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, then addressModeU and addressModeV must each be either VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE or VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-flags-02577)"},
- {"VUID-VkSamplerCreateInfo-flags-02578", "If flags includes VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, then anisotropyEnable must be VK_FALSE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-flags-02578)"},
- {"VUID-VkSamplerCreateInfo-flags-02579", "If flags includes VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, then compareEnable must be VK_FALSE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-flags-02579)"},
- {"VUID-VkSamplerCreateInfo-flags-02580", "If flags includes VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, then unnormalizedCoordinates must be VK_FALSE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-flags-02580)"},
- {"VUID-VkSamplerCreateInfo-flags-parameter", "flags must be a valid combination of VkSamplerCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-flags-parameter)"},
- {"VUID-VkSamplerCreateInfo-magFilter-01081", "If either magFilter or minFilter is VK_FILTER_CUBIC_EXT, anisotropyEnable must be VK_FALSE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-magFilter-01081)"},
- {"VUID-VkSamplerCreateInfo-magFilter-01422", "If either magFilter or minFilter is VK_FILTER_CUBIC_EXT, the reductionMode member of VkSamplerReductionModeCreateInfo must be VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkSamplerCreateInfo-magFilter-01422)"},
- {"VUID-VkSamplerCreateInfo-magFilter-parameter", "magFilter must be a valid VkFilter value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-magFilter-parameter)"},
- {"VUID-VkSamplerCreateInfo-maxLod-01973", "maxLod must be greater than or equal to minLod (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-maxLod-01973)"},
- {"VUID-VkSamplerCreateInfo-minFilter-01645", "If sampler {YCbCr} conversion is enabled and VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT is not set for the format, minFilter and magFilter must be equal to the sampler {YCbCr} conversion's chromaFilter (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-minFilter-01645)"},
- {"VUID-VkSamplerCreateInfo-minFilter-parameter", "minFilter must be a valid VkFilter value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-minFilter-parameter)"},
- {"VUID-VkSamplerCreateInfo-mipLodBias-01069", "The absolute value of mipLodBias must be less than or equal to VkPhysicalDeviceLimits::maxSamplerLodBias (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-mipLodBias-01069)"},
- {"VUID-VkSamplerCreateInfo-mipmapMode-parameter", "mipmapMode must be a valid VkSamplerMipmapMode value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-mipmapMode-parameter)"},
- {"VUID-VkSamplerCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkSamplerReductionModeCreateInfo or VkSamplerYcbcrConversionInfo (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-pNext-pNext)"},
- {"VUID-VkSamplerCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-sType-sType)"},
- {"VUID-VkSamplerCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-sType-unique)"},
- {"VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01072", "If unnormalizedCoordinates is VK_TRUE, minFilter and magFilter must be equal (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01072)"},
- {"VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01073", "If unnormalizedCoordinates is VK_TRUE, mipmapMode must be VK_SAMPLER_MIPMAP_MODE_NEAREST (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01073)"},
- {"VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01074", "If unnormalizedCoordinates is VK_TRUE, minLod and maxLod must be zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01074)"},
- {"VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01075", "If unnormalizedCoordinates is VK_TRUE, addressModeU and addressModeV must each be either VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE or VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01075)"},
- {"VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01076", "If unnormalizedCoordinates is VK_TRUE, anisotropyEnable must be VK_FALSE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01076)"},
- {"VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01077", "If unnormalizedCoordinates is VK_TRUE, compareEnable must be VK_FALSE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01077)"},
- {"VUID-VkSamplerReductionModeCreateInfo-reductionMode-parameter", "reductionMode must be a valid VkSamplerReductionMode value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerReductionModeCreateInfo-reductionMode-parameter)"},
- {"VUID-VkSamplerReductionModeCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerReductionModeCreateInfo-sType-sType)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-01657", "If the format does not support VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT, chromaFilter must not be VK_FILTER_LINEAR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-01657)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-parameter", "chromaFilter must be a valid VkFilter value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-parameter)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-components-02581", "If the format has a _422 or _420 suffix, then components.g must be VK_COMPONENT_SWIZZLE_IDENTITY (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-components-02581)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-components-02582", "If the format has a _422 or _420 suffix, then components.a must be VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_ONE, or VK_COMPONENT_SWIZZLE_ZERO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-components-02582)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-components-02583", "If the format has a _422 or _420 suffix, then components.r must be VK_COMPONENT_SWIZZLE_IDENTITY or VK_COMPONENT_SWIZZLE_B (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-components-02583)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-components-02584", "If the format has a _422 or _420 suffix, then components.b must be VK_COMPONENT_SWIZZLE_IDENTITY or VK_COMPONENT_SWIZZLE_R (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-components-02584)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-components-02585", "If the format has a _422 or _420 suffix, and if either components.r or components.b is VK_COMPONENT_SWIZZLE_IDENTITY, both values must be VK_COMPONENT_SWIZZLE_IDENTITY (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-components-02585)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-components-parameter", "components must be a valid VkComponentMapping structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-components-parameter)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-forceExplicitReconstruction-01656", "If the format does not support VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT forceExplicitReconstruction must be VK_FALSE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-forceExplicitReconstruction-01656)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-format-01649", "format must not be VK_FORMAT_UNDEFINED (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-format-01649)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-format-01650", "format must support VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT or VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-format-01650)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-format-01653", "If an external format conversion is not being created, format must represent unsigned normalized values (i.e. the format must be a UNORM format) (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-format-01653)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-format-01904", "If an external format conversion is being created, format must be VK_FORMAT_UNDEFINED, otherwise it must not be VK_FORMAT_UNDEFINED. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-format-01904)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-format-parameter", "format must be a valid VkFormat value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-format-parameter)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkExternalFormatANDROID (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-pNext-pNext)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-sType-sType)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-sType-unique)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01651", "If the format does not support VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT, xChromaOffset and yChromaOffset must not be VK_CHROMA_LOCATION_COSITED_EVEN (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01651)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01652", "If the format does not support VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT, xChromaOffset and yChromaOffset must not be VK_CHROMA_LOCATION_MIDPOINT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01652)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-parameter", "xChromaOffset must be a valid VkChromaLocation value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-parameter)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-yChromaOffset-parameter", "yChromaOffset must be a valid VkChromaLocation value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-yChromaOffset-parameter)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-01655", "If ycbcrModel is not VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY, then components.r, components.g, and components.b must correspond to channels of the format; that is, components.r, components.g, and components.b must not be VK_COMPONENT_SWIZZLE_ZERO or VK_COMPONENT_SWIZZLE_ONE, and must not correspond to a channel which contains zero or one as a consequence of conversion to RGBA (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-01655)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-parameter", "ycbcrModel must be a valid VkSamplerYcbcrModelConversion value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-parameter)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrRange-02748", "If ycbcrRange is VK_SAMPLER_YCBCR_RANGE_ITU_NARROW then the R, G and B channels obtained by applying the component swizzle to format must each have a bit-depth greater than or equal to 8. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrRange-02748)"},
- {"VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrRange-parameter", "ycbcrRange must be a valid VkSamplerYcbcrRange value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrRange-parameter)"},
- {"VUID-VkSamplerYcbcrConversionImageFormatProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionImageFormatProperties-sType-sType)"},
- {"VUID-VkSamplerYcbcrConversionInfo-conversion-parameter", "conversion must be a valid VkSamplerYcbcrConversion handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionInfo-conversion-parameter)"},
- {"VUID-VkSamplerYcbcrConversionInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSamplerYcbcrConversionInfo-sType-sType)"},
- {"VUID-VkSemaphoreCreateInfo-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreCreateInfo-flags-zerobitmask)"},
- {"VUID-VkSemaphoreCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkExportSemaphoreCreateInfo, VkExportSemaphoreWin32HandleInfoKHR, or VkSemaphoreTypeCreateInfo (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreCreateInfo-pNext-pNext)"},
- {"VUID-VkSemaphoreCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreCreateInfo-sType-sType)"},
- {"VUID-VkSemaphoreCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreCreateInfo-sType-unique)"},
- {"VUID-VkSemaphoreGetFdInfoKHR-handleType-01132", "handleType must have been included in VkExportSemaphoreCreateInfo::handleTypes when semaphore's current payload was created. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreGetFdInfoKHR-handleType-01132)"},
- {"VUID-VkSemaphoreGetFdInfoKHR-handleType-01134", "If handleType refers to a handle type with copy payload transference semantics, as defined below in Importing Semaphore Payloads, there must be no queue waiting on semaphore. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreGetFdInfoKHR-handleType-01134)"},
- {"VUID-VkSemaphoreGetFdInfoKHR-handleType-01135", "If handleType refers to a handle type with copy payload transference semantics, semaphore must be signaled, or have an associated semaphore signal operation pending execution. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreGetFdInfoKHR-handleType-01135)"},
- {"VUID-VkSemaphoreGetFdInfoKHR-handleType-01136", "handleType must be defined as a POSIX file descriptor handle. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreGetFdInfoKHR-handleType-01136)"},
- {"VUID-VkSemaphoreGetFdInfoKHR-handleType-03253", "If handleType refers to a handle type with copy payload transference semantics, semaphore must have been created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_BINARY. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreGetFdInfoKHR-handleType-03253)"},
- {"VUID-VkSemaphoreGetFdInfoKHR-handleType-03254", "If handleType refers to a handle type with copy payload transference semantics, semaphore must have an associated semaphore signal operation that has been submitted for execution and any semaphore signal operations on which it depends (if any) must have also been submitted for execution. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreGetFdInfoKHR-handleType-03254)"},
- {"VUID-VkSemaphoreGetFdInfoKHR-handleType-parameter", "handleType must be a valid VkExternalSemaphoreHandleTypeFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreGetFdInfoKHR-handleType-parameter)"},
- {"VUID-VkSemaphoreGetFdInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreGetFdInfoKHR-pNext-pNext)"},
- {"VUID-VkSemaphoreGetFdInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreGetFdInfoKHR-sType-sType)"},
- {"VUID-VkSemaphoreGetFdInfoKHR-semaphore-01133", "semaphore must not currently have its payload replaced by an imported payload as described below in Importing Semaphore Payloads unless that imported payload's handle type was included in VkExternalSemaphoreProperties::exportFromImportedHandleTypes for handleType. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreGetFdInfoKHR-semaphore-01133)"},
- {"VUID-VkSemaphoreGetFdInfoKHR-semaphore-parameter", "semaphore must be a valid VkSemaphore handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreGetFdInfoKHR-semaphore-parameter)"},
- {"VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01126", "handleType must have been included in VkExportSemaphoreCreateInfo::handleTypes when the semaphore's current payload was created. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01126)"},
- {"VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01127", "If handleType is defined as an NT handle, vkGetSemaphoreWin32HandleKHR must be called no more than once for each valid unique combination of semaphore and handleType. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01127)"},
- {"VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01129", "If handleType refers to a handle type with copy payload transference semantics, as defined below in Importing Semaphore Payloads, there must be no queue waiting on semaphore. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01129)"},
- {"VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01130", "If handleType refers to a handle type with copy payload transference semantics, semaphore must be signaled, or have an associated semaphore signal operation pending execution. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01130)"},
- {"VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01131", "handleType must be defined as an NT handle or a global share handle. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01131)"},
- {"VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-parameter", "handleType must be a valid VkExternalSemaphoreHandleTypeFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-parameter)"},
- {"VUID-VkSemaphoreGetWin32HandleInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreGetWin32HandleInfoKHR-pNext-pNext)"},
- {"VUID-VkSemaphoreGetWin32HandleInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreGetWin32HandleInfoKHR-sType-sType)"},
- {"VUID-VkSemaphoreGetWin32HandleInfoKHR-semaphore-01128", "semaphore must not currently have its payload replaced by an imported payload as described below in Importing Semaphore Payloads unless that imported payload's handle type was included in VkExternalSemaphoreProperties::exportFromImportedHandleTypes for handleType. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreGetWin32HandleInfoKHR-semaphore-01128)"},
- {"VUID-VkSemaphoreGetWin32HandleInfoKHR-semaphore-parameter", "semaphore must be a valid VkSemaphore handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreGetWin32HandleInfoKHR-semaphore-parameter)"},
- {"VUID-VkSemaphoreSignalInfo-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreSignalInfo-pNext-pNext)"},
- {"VUID-VkSemaphoreSignalInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreSignalInfo-sType-sType)"},
- {"VUID-VkSemaphoreSignalInfo-semaphore-03257", "semaphore must have been created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreSignalInfo-semaphore-03257)"},
- {"VUID-VkSemaphoreSignalInfo-semaphore-parameter", "semaphore must be a valid VkSemaphore handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreSignalInfo-semaphore-parameter)"},
- {"VUID-VkSemaphoreSignalInfo-value-03258", "value must have a value greater than the current value of the semaphore (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreSignalInfo-value-03258)"},
- {"VUID-VkSemaphoreSignalInfo-value-03259", "value must be less than the value of any pending semaphore signal operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreSignalInfo-value-03259)"},
- {"VUID-VkSemaphoreSignalInfo-value-03260", "value must have a value which does not differ from the current value of the semaphore or the value of any outstanding semaphore wait or signal operation on semaphore by more than maxTimelineSemaphoreValueDifference. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreSignalInfo-value-03260)"},
- {"VUID-VkSemaphoreTypeCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreTypeCreateInfo-sType-sType)"},
- {"VUID-VkSemaphoreTypeCreateInfo-semaphoreType-03279", "If semaphoreType is VK_SEMAPHORE_TYPE_BINARY, initialValue must be zero. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreTypeCreateInfo-semaphoreType-03279)"},
- {"VUID-VkSemaphoreTypeCreateInfo-semaphoreType-parameter", "semaphoreType must be a valid VkSemaphoreType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreTypeCreateInfo-semaphoreType-parameter)"},
- {"VUID-VkSemaphoreTypeCreateInfo-timelineSemaphore-03252", "If the timelineSemaphore feature is not enabled, semaphoreType must not equal VK_SEMAPHORE_TYPE_TIMELINE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreTypeCreateInfo-timelineSemaphore-03252)"},
- {"VUID-VkSemaphoreWaitInfo-flags-parameter", "flags must be a valid combination of VkSemaphoreWaitFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreWaitInfo-flags-parameter)"},
- {"VUID-VkSemaphoreWaitInfo-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreWaitInfo-pNext-pNext)"},
- {"VUID-VkSemaphoreWaitInfo-pSemaphores-03256", "All of the elements of pSemaphores must reference a semaphore that was created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreWaitInfo-pSemaphores-03256)"},
- {"VUID-VkSemaphoreWaitInfo-pSemaphores-parameter", "pSemaphores must be a valid pointer to an array of semaphoreCount valid VkSemaphore handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreWaitInfo-pSemaphores-parameter)"},
- {"VUID-VkSemaphoreWaitInfo-pValues-parameter", "pValues must be a valid pointer to an array of semaphoreCount uint64_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreWaitInfo-pValues-parameter)"},
- {"VUID-VkSemaphoreWaitInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreWaitInfo-sType-sType)"},
- {"VUID-VkSemaphoreWaitInfo-semaphoreCount-arraylength", "semaphoreCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSemaphoreWaitInfo-semaphoreCount-arraylength)"},
- {"VUID-VkShaderModuleCreateInfo-codeSize-01085", "codeSize must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkShaderModuleCreateInfo-codeSize-01085)"},
- {"VUID-VkShaderModuleCreateInfo-codeSize-01086", "codeSize must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkShaderModuleCreateInfo-codeSize-01086)"},
- {"VUID-VkShaderModuleCreateInfo-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkShaderModuleCreateInfo-flags-zerobitmask)"},
- {"VUID-VkShaderModuleCreateInfo-pCode-01087", "pCode must point to valid SPIR-V code, formatted and packed as described by the Khronos SPIR-V Specification (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkShaderModuleCreateInfo-pCode-01087)"},
- {"VUID-VkShaderModuleCreateInfo-pCode-01088", "pCode must adhere to the validation rules described by the Validation Rules within a Module section of the SPIR-V Environment appendix (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkShaderModuleCreateInfo-pCode-01088)"},
- {"VUID-VkShaderModuleCreateInfo-pCode-01089", "pCode must declare the Shader capability for SPIR-V code (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkShaderModuleCreateInfo-pCode-01089)"},
- {"VUID-VkShaderModuleCreateInfo-pCode-01090", "pCode must not declare any capability that is not supported by the API, as described by the Capabilities section of the SPIR-V Environment appendix (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkShaderModuleCreateInfo-pCode-01090)"},
- {"VUID-VkShaderModuleCreateInfo-pCode-01091", "If pCode declares any of the capabilities listed as optional in the SPIR-V Environment appendix, the corresponding feature(s) must be enabled. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkShaderModuleCreateInfo-pCode-01091)"},
- {"VUID-VkShaderModuleCreateInfo-pCode-01376", "If pCode is a pointer to SPIR-V code, codeSize must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkShaderModuleCreateInfo-pCode-01376)"},
- {"VUID-VkShaderModuleCreateInfo-pCode-01377", "pCode must point to either valid SPIR-V code, formatted and packed as described by the Khronos SPIR-V Specification or valid GLSL code which must be written to the GL_KHR_vulkan_glsl extension specification (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkShaderModuleCreateInfo-pCode-01377)"},
- {"VUID-VkShaderModuleCreateInfo-pCode-01378", "If pCode is a pointer to SPIR-V code, that code must adhere to the validation rules described by the Validation Rules within a Module section of the SPIR-V Environment appendix (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkShaderModuleCreateInfo-pCode-01378)"},
- {"VUID-VkShaderModuleCreateInfo-pCode-01379", "If pCode is a pointer to GLSL code, it must be valid GLSL code written to the GL_KHR_vulkan_glsl GLSL extension specification (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkShaderModuleCreateInfo-pCode-01379)"},
- {"VUID-VkShaderModuleCreateInfo-pCode-parameter", "pCode must be a valid pointer to an array of (codeSize/4) uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkShaderModuleCreateInfo-pCode-parameter)"},
- {"VUID-VkShaderModuleCreateInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkShaderModuleValidationCacheCreateInfoEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkShaderModuleCreateInfo-pNext-pNext)"},
- {"VUID-VkShaderModuleCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkShaderModuleCreateInfo-sType-sType)"},
- {"VUID-VkShaderModuleCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkShaderModuleCreateInfo-sType-unique)"},
- {"VUID-VkShaderModuleValidationCacheCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkShaderModuleValidationCacheCreateInfoEXT-sType-sType)"},
- {"VUID-VkShaderModuleValidationCacheCreateInfoEXT-validationCache-parameter", "validationCache must be a valid VkValidationCacheEXT handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkShaderModuleValidationCacheCreateInfoEXT-validationCache-parameter)"},
- {"VUID-VkShadingRatePaletteNV-pShadingRatePaletteEntries-parameter", "pShadingRatePaletteEntries must be a valid pointer to an array of shadingRatePaletteEntryCount valid VkShadingRatePaletteEntryNV values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkShadingRatePaletteNV-pShadingRatePaletteEntries-parameter)"},
- {"VUID-VkShadingRatePaletteNV-shadingRatePaletteEntryCount-02071", "shadingRatePaletteEntryCount must be between 1 and VkPhysicalDeviceShadingRateImagePropertiesNV::shadingRatePaletteSize, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkShadingRatePaletteNV-shadingRatePaletteEntryCount-02071)"},
- {"VUID-VkShadingRatePaletteNV-shadingRatePaletteEntryCount-arraylength", "shadingRatePaletteEntryCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkShadingRatePaletteNV-shadingRatePaletteEntryCount-arraylength)"},
- {"VUID-VkSharedPresentSurfaceCapabilitiesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSharedPresentSurfaceCapabilitiesKHR-sType-sType)"},
- {"VUID-VkSparseBufferMemoryBindInfo-bindCount-arraylength", "bindCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseBufferMemoryBindInfo-bindCount-arraylength)"},
- {"VUID-VkSparseBufferMemoryBindInfo-buffer-parameter", "buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseBufferMemoryBindInfo-buffer-parameter)"},
- {"VUID-VkSparseBufferMemoryBindInfo-pBinds-parameter", "pBinds must be a valid pointer to an array of bindCount valid VkSparseMemoryBind structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseBufferMemoryBindInfo-pBinds-parameter)"},
- {"VUID-VkSparseImageFormatProperties2-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageFormatProperties2-pNext-pNext)"},
- {"VUID-VkSparseImageFormatProperties2-sType-sType", "sType must be VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageFormatProperties2-sType-sType)"},
- {"VUID-VkSparseImageMemoryBind-extent-01108", "extent.width must either be a multiple of the sparse image block width of the image, or else (extent.width + offset.x) must equal the width of the image subresource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageMemoryBind-extent-01108)"},
- {"VUID-VkSparseImageMemoryBind-extent-01110", "extent.height must either be a multiple of the sparse image block height of the image, or else (extent.height + offset.y) must equal the height of the image subresource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageMemoryBind-extent-01110)"},
- {"VUID-VkSparseImageMemoryBind-extent-01112", "extent.depth must either be a multiple of the sparse image block depth of the image, or else (extent.depth + offset.z) must equal the depth of the image subresource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageMemoryBind-extent-01112)"},
- {"VUID-VkSparseImageMemoryBind-flags-parameter", "flags must be a valid combination of VkSparseMemoryBindFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageMemoryBind-flags-parameter)"},
- {"VUID-VkSparseImageMemoryBind-memory-01104", "If the sparse aliased residency feature is not enabled, and if any other resources are bound to ranges of memory, the range of memory being bound must not overlap with those bound ranges (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageMemoryBind-memory-01104)"},
- {"VUID-VkSparseImageMemoryBind-memory-01105", "memory and memoryOffset must match the memory requirements of the calling command's image, as described in section Resource Memory Association (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageMemoryBind-memory-01105)"},
- {"VUID-VkSparseImageMemoryBind-memory-02732", "If memory was created with VkExportMemoryAllocateInfo::handleTypes not equal to 0, at least one handle type it contained must also have been set in VkExternalMemoryImageCreateInfo::handleTypes when the image was created. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageMemoryBind-memory-02732)"},
- {"VUID-VkSparseImageMemoryBind-memory-02733", "If memory was created by a memory import operation, the external handle type of the imported memory must also have been set in VkExternalMemoryImageCreateInfo::handleTypes when image was created. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageMemoryBind-memory-02733)"},
- {"VUID-VkSparseImageMemoryBind-memory-parameter", "If memory is not VK_NULL_HANDLE, memory must be a valid VkDeviceMemory handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageMemoryBind-memory-parameter)"},
- {"VUID-VkSparseImageMemoryBind-offset-01107", "offset.x must be a multiple of the sparse image block width (VkSparseImageFormatProperties::imageGranularity.width) of the image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageMemoryBind-offset-01107)"},
- {"VUID-VkSparseImageMemoryBind-offset-01109", "offset.y must be a multiple of the sparse image block height (VkSparseImageFormatProperties::imageGranularity.height) of the image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageMemoryBind-offset-01109)"},
- {"VUID-VkSparseImageMemoryBind-offset-01111", "offset.z must be a multiple of the sparse image block depth (VkSparseImageFormatProperties::imageGranularity.depth) of the image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageMemoryBind-offset-01111)"},
- {"VUID-VkSparseImageMemoryBind-subresource-01106", "subresource must be a valid image subresource for image (see Image Views) (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageMemoryBind-subresource-01106)"},
- {"VUID-VkSparseImageMemoryBind-subresource-parameter", "subresource must be a valid VkImageSubresource structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageMemoryBind-subresource-parameter)"},
- {"VUID-VkSparseImageMemoryBindInfo-bindCount-arraylength", "bindCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageMemoryBindInfo-bindCount-arraylength)"},
- {"VUID-VkSparseImageMemoryBindInfo-image-02901", "image must have been created with VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageMemoryBindInfo-image-02901)"},
- {"VUID-VkSparseImageMemoryBindInfo-image-parameter", "image must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageMemoryBindInfo-image-parameter)"},
- {"VUID-VkSparseImageMemoryBindInfo-pBinds-parameter", "pBinds must be a valid pointer to an array of bindCount valid VkSparseImageMemoryBind structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageMemoryBindInfo-pBinds-parameter)"},
- {"VUID-VkSparseImageMemoryBindInfo-subresource-01722", "The subresource.mipLevel member of each element of pBinds must be less than the mipLevels specified in VkImageCreateInfo when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageMemoryBindInfo-subresource-01722)"},
- {"VUID-VkSparseImageMemoryBindInfo-subresource-01723", "The subresource.arrayLayer member of each element of pBinds must be less than the arrayLayers specified in VkImageCreateInfo when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageMemoryBindInfo-subresource-01723)"},
- {"VUID-VkSparseImageMemoryRequirements2-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageMemoryRequirements2-pNext-pNext)"},
- {"VUID-VkSparseImageMemoryRequirements2-sType-sType", "sType must be VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageMemoryRequirements2-sType-sType)"},
- {"VUID-VkSparseImageOpaqueMemoryBindInfo-bindCount-arraylength", "bindCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageOpaqueMemoryBindInfo-bindCount-arraylength)"},
- {"VUID-VkSparseImageOpaqueMemoryBindInfo-image-parameter", "image must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageOpaqueMemoryBindInfo-image-parameter)"},
- {"VUID-VkSparseImageOpaqueMemoryBindInfo-pBinds-01103", "If the flags member of any element of pBinds contains VK_SPARSE_MEMORY_BIND_METADATA_BIT, the binding range defined must be within the mip tail region of the metadata aspect of image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageOpaqueMemoryBindInfo-pBinds-01103)"},
- {"VUID-VkSparseImageOpaqueMemoryBindInfo-pBinds-parameter", "pBinds must be a valid pointer to an array of bindCount valid VkSparseMemoryBind structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseImageOpaqueMemoryBindInfo-pBinds-parameter)"},
- {"VUID-VkSparseMemoryBind-flags-parameter", "flags must be a valid combination of VkSparseMemoryBindFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseMemoryBind-flags-parameter)"},
- {"VUID-VkSparseMemoryBind-memory-01096", "If memory is not VK_NULL_HANDLE, memory and memoryOffset must match the memory requirements of the resource, as described in section Resource Memory Association (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseMemoryBind-memory-01096)"},
- {"VUID-VkSparseMemoryBind-memory-01097", "If memory is not VK_NULL_HANDLE, memory must not have been created with a memory type that reports VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseMemoryBind-memory-01097)"},
- {"VUID-VkSparseMemoryBind-memory-02730", "If memory was created with VkExportMemoryAllocateInfo::handleTypes not equal to 0, at least one handle type it contained must also have been set in VkExternalMemoryBufferCreateInfo::handleTypes or VkExternalMemoryImageCreateInfo::handleTypes when the resource was created. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseMemoryBind-memory-02730)"},
- {"VUID-VkSparseMemoryBind-memory-02731", "If memory was created by a memory import operation, the external handle type of the imported memory must also have been set in VkExternalMemoryBufferCreateInfo::handleTypes or VkExternalMemoryImageCreateInfo::handleTypes when the resource was created. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseMemoryBind-memory-02731)"},
- {"VUID-VkSparseMemoryBind-memory-parameter", "If memory is not VK_NULL_HANDLE, memory must be a valid VkDeviceMemory handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseMemoryBind-memory-parameter)"},
- {"VUID-VkSparseMemoryBind-memoryOffset-01101", "memoryOffset must be less than the size of memory (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseMemoryBind-memoryOffset-01101)"},
- {"VUID-VkSparseMemoryBind-resourceOffset-01099", "resourceOffset must be less than the size of the resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseMemoryBind-resourceOffset-01099)"},
- {"VUID-VkSparseMemoryBind-size-01098", "size must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseMemoryBind-size-01098)"},
- {"VUID-VkSparseMemoryBind-size-01100", "size must be less than or equal to the size of the resource minus resourceOffset (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseMemoryBind-size-01100)"},
- {"VUID-VkSparseMemoryBind-size-01102", "size must be less than or equal to the size of memory minus memoryOffset (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSparseMemoryBind-size-01102)"},
- {"VUID-VkSpecializationInfo-offset-00773", "The offset member of each element of pMapEntries must be less than dataSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSpecializationInfo-offset-00773)"},
- {"VUID-VkSpecializationInfo-pData-parameter", "If dataSize is not 0, pData must be a valid pointer to an array of dataSize bytes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSpecializationInfo-pData-parameter)"},
- {"VUID-VkSpecializationInfo-pMapEntries-00774", "The size member of each element of pMapEntries must be less than or equal to dataSize minus offset (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSpecializationInfo-pMapEntries-00774)"},
- {"VUID-VkSpecializationInfo-pMapEntries-parameter", "If mapEntryCount is not 0, pMapEntries must be a valid pointer to an array of mapEntryCount valid VkSpecializationMapEntry structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSpecializationInfo-pMapEntries-parameter)"},
- {"VUID-VkSpecializationMapEntry-constantID-00776", "For a constantID specialization constant declared in a shader, size must match the byte size of the constantID. If the specialization constant is of type boolean, size must be the byte size of VkBool32 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSpecializationMapEntry-constantID-00776)"},
- {"VUID-VkStencilOpState-compareOp-parameter", "compareOp must be a valid VkCompareOp value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkStencilOpState-compareOp-parameter)"},
- {"VUID-VkStencilOpState-depthFailOp-parameter", "depthFailOp must be a valid VkStencilOp value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkStencilOpState-depthFailOp-parameter)"},
- {"VUID-VkStencilOpState-failOp-parameter", "failOp must be a valid VkStencilOp value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkStencilOpState-failOp-parameter)"},
- {"VUID-VkStencilOpState-passOp-parameter", "passOp must be a valid VkStencilOp value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkStencilOpState-passOp-parameter)"},
- {"VUID-VkStreamDescriptorSurfaceCreateInfoGGP-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkStreamDescriptorSurfaceCreateInfoGGP-flags-zerobitmask)"},
- {"VUID-VkStreamDescriptorSurfaceCreateInfoGGP-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkStreamDescriptorSurfaceCreateInfoGGP-pNext-pNext)"},
- {"VUID-VkStreamDescriptorSurfaceCreateInfoGGP-sType-sType", "sType must be VK_STRUCTURE_TYPE_STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkStreamDescriptorSurfaceCreateInfoGGP-sType-sType)"},
- {"VUID-VkStreamDescriptorSurfaceCreateInfoGGP-streamDescriptor-02681", "streamDescriptor must be a valid GgpStreamDescriptor (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkStreamDescriptorSurfaceCreateInfoGGP-streamDescriptor-02681)"},
- {"VUID-VkStridedBufferRegionKHR-buffer-03515", "If buffer is not VK_NULL_HANDLE, size plus offset must be less than or equal to the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkStridedBufferRegionKHR-buffer-03515)"},
- {"VUID-VkStridedBufferRegionKHR-buffer-03516", "If buffer is not VK_NULL_HANDLE, stride must be less than the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkStridedBufferRegionKHR-buffer-03516)"},
- {"VUID-VkStridedBufferRegionKHR-buffer-parameter", "If buffer is not VK_NULL_HANDLE, buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkStridedBufferRegionKHR-buffer-parameter)"},
- {"VUID-VkSubmitInfo-commonparent", "Each of the elements of pCommandBuffers, the elements of pSignalSemaphores, and the elements of pWaitSemaphores that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubmitInfo-commonparent)"},
- {"VUID-VkSubmitInfo-pCommandBuffers-00075", "Each element of pCommandBuffers must not have been allocated with VK_COMMAND_BUFFER_LEVEL_SECONDARY (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubmitInfo-pCommandBuffers-00075)"},
- {"VUID-VkSubmitInfo-pCommandBuffers-parameter", "If commandBufferCount is not 0, pCommandBuffers must be a valid pointer to an array of commandBufferCount valid VkCommandBuffer handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubmitInfo-pCommandBuffers-parameter)"},
- {"VUID-VkSubmitInfo-pNext-03240", "If the pNext chain of this structure includes a VkTimelineSemaphoreSubmitInfo structure and any element of pWaitSemaphores was created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE, then its waitSemaphoreValueCount member must equal waitSemaphoreCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubmitInfo-pNext-03240)"},
- {"VUID-VkSubmitInfo-pNext-03241", "If the pNext chain of this structure includes a VkTimelineSemaphoreSubmitInfo structure and any element of pSignalSemaphores was created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE, then its signalSemaphoreValueCount member must equal signalSemaphoreCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubmitInfo-pNext-03241)"},
- {"VUID-VkSubmitInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkD3D12FenceSubmitInfoKHR, VkDeviceGroupSubmitInfo, VkPerformanceQuerySubmitInfoKHR, VkProtectedSubmitInfo, VkTimelineSemaphoreSubmitInfo, VkWin32KeyedMutexAcquireReleaseInfoKHR, or VkWin32KeyedMutexAcquireReleaseInfoNV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubmitInfo-pNext-pNext)"},
- {"VUID-VkSubmitInfo-pSignalSemaphores-03242", "For each element of pSignalSemaphores created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE the corresponding element of VkTimelineSemaphoreSubmitInfo::pSignalSemaphoreValues must have a value greater than the current value of the semaphore when the semaphore signal operation is executed (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubmitInfo-pSignalSemaphores-03242)"},
- {"VUID-VkSubmitInfo-pSignalSemaphores-03244", "For each element of pSignalSemaphores created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE the corresponding element of VkTimelineSemaphoreSubmitInfo::pSignalSemaphoreValues must have a value which does not differ from the current value of the semaphore or the value of any outstanding semaphore wait or signal operation on that semaphore by more than maxTimelineSemaphoreValueDifference. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubmitInfo-pSignalSemaphores-03244)"},
- {"VUID-VkSubmitInfo-pSignalSemaphores-parameter", "If signalSemaphoreCount is not 0, pSignalSemaphores must be a valid pointer to an array of signalSemaphoreCount valid VkSemaphore handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubmitInfo-pSignalSemaphores-parameter)"},
- {"VUID-VkSubmitInfo-pWaitDstStageMask-00076", "If the geometry shaders feature is not enabled, each element of pWaitDstStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubmitInfo-pWaitDstStageMask-00076)"},
- {"VUID-VkSubmitInfo-pWaitDstStageMask-00077", "If the tessellation shaders feature is not enabled, each element of pWaitDstStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubmitInfo-pWaitDstStageMask-00077)"},
- {"VUID-VkSubmitInfo-pWaitDstStageMask-00078", "Each element of pWaitDstStageMask must not include VK_PIPELINE_STAGE_HOST_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubmitInfo-pWaitDstStageMask-00078)"},
- {"VUID-VkSubmitInfo-pWaitDstStageMask-02089", "If the mesh shaders feature is not enabled, each element of pWaitDstStageMask must not contain VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubmitInfo-pWaitDstStageMask-02089)"},
- {"VUID-VkSubmitInfo-pWaitDstStageMask-02090", "If the task shaders feature is not enabled, each element of pWaitDstStageMask must not contain VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubmitInfo-pWaitDstStageMask-02090)"},
- {"VUID-VkSubmitInfo-pWaitDstStageMask-parameter", "If waitSemaphoreCount is not 0, pWaitDstStageMask must be a valid pointer to an array of waitSemaphoreCount valid combinations of VkPipelineStageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubmitInfo-pWaitDstStageMask-parameter)"},
- {"VUID-VkSubmitInfo-pWaitDstStageMask-requiredbitmask", "Each element of pWaitDstStageMask must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubmitInfo-pWaitDstStageMask-requiredbitmask)"},
- {"VUID-VkSubmitInfo-pWaitSemaphores-03239", "If any element of pWaitSemaphores or pSignalSemaphores was created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE, then the pNext chain must include a VkTimelineSemaphoreSubmitInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubmitInfo-pWaitSemaphores-03239)"},
- {"VUID-VkSubmitInfo-pWaitSemaphores-03243", "For each element of pWaitSemaphores created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE the corresponding element of VkTimelineSemaphoreSubmitInfo::pWaitSemaphoreValues must have a value which does not differ from the current value of the semaphore or the value of any outstanding semaphore wait or signal operation on that semaphore by more than maxTimelineSemaphoreValueDifference. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubmitInfo-pWaitSemaphores-03243)"},
- {"VUID-VkSubmitInfo-pWaitSemaphores-parameter", "If waitSemaphoreCount is not 0, pWaitSemaphores must be a valid pointer to an array of waitSemaphoreCount valid VkSemaphore handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubmitInfo-pWaitSemaphores-parameter)"},
- {"VUID-VkSubmitInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SUBMIT_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubmitInfo-sType-sType)"},
- {"VUID-VkSubmitInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubmitInfo-sType-unique)"},
- {"VUID-VkSubpassBeginInfo-contents-parameter", "contents must be a valid VkSubpassContents value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassBeginInfo-contents-parameter)"},
- {"VUID-VkSubpassBeginInfo-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassBeginInfo-pNext-pNext)"},
- {"VUID-VkSubpassBeginInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassBeginInfo-sType-sType)"},
- {"VUID-VkSubpassDependency-dependencyFlags-02520", "If dependencyFlags includes VK_DEPENDENCY_VIEW_LOCAL_BIT, srcSubpass must not be equal to VK_SUBPASS_EXTERNAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-dependencyFlags-02520)"},
- {"VUID-VkSubpassDependency-dependencyFlags-02521", "If dependencyFlags includes VK_DEPENDENCY_VIEW_LOCAL_BIT, dstSubpass must not be equal to VK_SUBPASS_EXTERNAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-dependencyFlags-02521)"},
- {"VUID-VkSubpassDependency-dependencyFlags-parameter", "dependencyFlags must be a valid combination of VkDependencyFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-dependencyFlags-parameter)"},
- {"VUID-VkSubpassDependency-dstAccessMask-00869", "Any access flag included in dstAccessMask must be supported by one of the pipeline stages in dstStageMask, as specified in the table of supported access types (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-dstAccessMask-00869)"},
- {"VUID-VkSubpassDependency-dstAccessMask-parameter", "dstAccessMask must be a valid combination of VkAccessFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-dstAccessMask-parameter)"},
- {"VUID-VkSubpassDependency-dstStageMask-00861", "If the geometry shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-dstStageMask-00861)"},
- {"VUID-VkSubpassDependency-dstStageMask-00863", "If the tessellation shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-dstStageMask-00863)"},
- {"VUID-VkSubpassDependency-dstStageMask-02101", "If the mesh shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-dstStageMask-02101)"},
- {"VUID-VkSubpassDependency-dstStageMask-02102", "If the task shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-dstStageMask-02102)"},
- {"VUID-VkSubpassDependency-dstStageMask-parameter", "dstStageMask must be a valid combination of VkPipelineStageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-dstStageMask-parameter)"},
- {"VUID-VkSubpassDependency-dstStageMask-requiredbitmask", "dstStageMask must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-dstStageMask-requiredbitmask)"},
- {"VUID-VkSubpassDependency-srcAccessMask-00868", "Any access flag included in srcAccessMask must be supported by one of the pipeline stages in srcStageMask, as specified in the table of supported access types (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-srcAccessMask-00868)"},
- {"VUID-VkSubpassDependency-srcAccessMask-parameter", "srcAccessMask must be a valid combination of VkAccessFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-srcAccessMask-parameter)"},
- {"VUID-VkSubpassDependency-srcStageMask-00860", "If the geometry shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-srcStageMask-00860)"},
- {"VUID-VkSubpassDependency-srcStageMask-00862", "If the tessellation shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-srcStageMask-00862)"},
- {"VUID-VkSubpassDependency-srcStageMask-02099", "If the mesh shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-srcStageMask-02099)"},
- {"VUID-VkSubpassDependency-srcStageMask-02100", "If the task shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-srcStageMask-02100)"},
- {"VUID-VkSubpassDependency-srcStageMask-parameter", "srcStageMask must be a valid combination of VkPipelineStageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-srcStageMask-parameter)"},
- {"VUID-VkSubpassDependency-srcStageMask-requiredbitmask", "srcStageMask must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-srcStageMask-requiredbitmask)"},
- {"VUID-VkSubpassDependency-srcSubpass-00864", "srcSubpass must be less than or equal to dstSubpass, unless one of them is VK_SUBPASS_EXTERNAL, to avoid cyclic dependencies and ensure a valid execution order (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-srcSubpass-00864)"},
- {"VUID-VkSubpassDependency-srcSubpass-00865", "srcSubpass and dstSubpass must not both be equal to VK_SUBPASS_EXTERNAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-srcSubpass-00865)"},
- {"VUID-VkSubpassDependency-srcSubpass-00867", "If srcSubpass is equal to dstSubpass and not all of the stages in srcStageMask and dstStageMask are framebuffer-space stages, the logically latest pipeline stage in srcStageMask must be logically earlier than or equal to the logically earliest pipeline stage in dstStageMask (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-srcSubpass-00867)"},
- {"VUID-VkSubpassDependency-srcSubpass-00872", "If srcSubpass equals dstSubpass and that subpass has more than one bit set in the view mask, then dependencyFlags must include VK_DEPENDENCY_VIEW_LOCAL_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-srcSubpass-00872)"},
- {"VUID-VkSubpassDependency-srcSubpass-02243", "If srcSubpass equals dstSubpass, and srcStageMask and dstStageMask both include a framebuffer-space stage, then dependencyFlags must include VK_DEPENDENCY_BY_REGION_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency-srcSubpass-02243)"},
- {"VUID-VkSubpassDependency2-dependencyFlags-03090", "If dependencyFlags includes VK_DEPENDENCY_VIEW_LOCAL_BIT, srcSubpass must not be equal to VK_SUBPASS_EXTERNAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-dependencyFlags-03090)"},
- {"VUID-VkSubpassDependency2-dependencyFlags-03091", "If dependencyFlags includes VK_DEPENDENCY_VIEW_LOCAL_BIT, dstSubpass must not be equal to VK_SUBPASS_EXTERNAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-dependencyFlags-03091)"},
- {"VUID-VkSubpassDependency2-dependencyFlags-03092", "If dependencyFlags does not include VK_DEPENDENCY_VIEW_LOCAL_BIT, viewOffset must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-dependencyFlags-03092)"},
- {"VUID-VkSubpassDependency2-dependencyFlags-parameter", "dependencyFlags must be a valid combination of VkDependencyFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-dependencyFlags-parameter)"},
- {"VUID-VkSubpassDependency2-dstAccessMask-03089", "Any access flag included in dstAccessMask must be supported by one of the pipeline stages in dstStageMask, as specified in the table of supported access types (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-dstAccessMask-03089)"},
- {"VUID-VkSubpassDependency2-dstAccessMask-parameter", "dstAccessMask must be a valid combination of VkAccessFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-dstAccessMask-parameter)"},
- {"VUID-VkSubpassDependency2-dstStageMask-02105", "If the mesh shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-dstStageMask-02105)"},
- {"VUID-VkSubpassDependency2-dstStageMask-02106", "If the task shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-dstStageMask-02106)"},
- {"VUID-VkSubpassDependency2-dstStageMask-03081", "If the geometry shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-dstStageMask-03081)"},
- {"VUID-VkSubpassDependency2-dstStageMask-03083", "If the tessellation shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-dstStageMask-03083)"},
- {"VUID-VkSubpassDependency2-dstStageMask-parameter", "dstStageMask must be a valid combination of VkPipelineStageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-dstStageMask-parameter)"},
- {"VUID-VkSubpassDependency2-dstStageMask-requiredbitmask", "dstStageMask must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-dstStageMask-requiredbitmask)"},
- {"VUID-VkSubpassDependency2-sType-sType", "sType must be VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-sType-sType)"},
- {"VUID-VkSubpassDependency2-srcAccessMask-03088", "Any access flag included in srcAccessMask must be supported by one of the pipeline stages in srcStageMask, as specified in the table of supported access types (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-srcAccessMask-03088)"},
- {"VUID-VkSubpassDependency2-srcAccessMask-parameter", "srcAccessMask must be a valid combination of VkAccessFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-srcAccessMask-parameter)"},
- {"VUID-VkSubpassDependency2-srcStageMask-02103", "If the mesh shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-srcStageMask-02103)"},
- {"VUID-VkSubpassDependency2-srcStageMask-02104", "If the task shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-srcStageMask-02104)"},
- {"VUID-VkSubpassDependency2-srcStageMask-03080", "If the geometry shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-srcStageMask-03080)"},
- {"VUID-VkSubpassDependency2-srcStageMask-03082", "If the tessellation shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-srcStageMask-03082)"},
- {"VUID-VkSubpassDependency2-srcStageMask-parameter", "srcStageMask must be a valid combination of VkPipelineStageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-srcStageMask-parameter)"},
- {"VUID-VkSubpassDependency2-srcStageMask-requiredbitmask", "srcStageMask must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-srcStageMask-requiredbitmask)"},
- {"VUID-VkSubpassDependency2-srcSubpass-02245", "If srcSubpass equals dstSubpass, and srcStageMask and dstStageMask both include a framebuffer-space stage, then dependencyFlags must include VK_DEPENDENCY_BY_REGION_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-srcSubpass-02245)"},
- {"VUID-VkSubpassDependency2-srcSubpass-03084", "srcSubpass must be less than or equal to dstSubpass, unless one of them is VK_SUBPASS_EXTERNAL, to avoid cyclic dependencies and ensure a valid execution order (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-srcSubpass-03084)"},
- {"VUID-VkSubpassDependency2-srcSubpass-03085", "srcSubpass and dstSubpass must not both be equal to VK_SUBPASS_EXTERNAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-srcSubpass-03085)"},
- {"VUID-VkSubpassDependency2-srcSubpass-03087", "If srcSubpass is equal to dstSubpass and not all of the stages in srcStageMask and dstStageMask are framebuffer-space stages, the logically latest pipeline stage in srcStageMask must be logically earlier than or equal to the logically earliest pipeline stage in dstStageMask (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-srcSubpass-03087)"},
- {"VUID-VkSubpassDependency2-viewOffset-02530", "If viewOffset is not equal to 0, srcSubpass must not be equal to dstSubpass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-viewOffset-02530)"},
- {"VUID-VkSubpassDependency2-viewOffset-03093", "If viewOffset is not 0, srcSubpass must not be equal to dstSubpass. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDependency2-viewOffset-03093)"},
- {"VUID-VkSubpassDescription-attachment-00853", "The attachment member of each element of pPreserveAttachments must not be VK_ATTACHMENT_UNUSED (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-attachment-00853)"},
- {"VUID-VkSubpassDescription-colorAttachmentCount-00845", "colorAttachmentCount must be less than or equal to VkPhysicalDeviceLimits::maxColorAttachments (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-colorAttachmentCount-00845)"},
- {"VUID-VkSubpassDescription-flags-00856", "If flags includes VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX, it must also include VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-flags-00856)"},
- {"VUID-VkSubpassDescription-flags-parameter", "flags must be a valid combination of VkSubpassDescriptionFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-flags-parameter)"},
- {"VUID-VkSubpassDescription-layout-02519", "If any attachment is used by more than one VkAttachmentReference member, then each use must use the same layout (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-layout-02519)"},
- {"VUID-VkSubpassDescription-loadOp-00846", "If the first use of an attachment in this render pass is as an input attachment, and the attachment is not also used as a color or depth/stencil attachment in the same subpass, then loadOp must not be VK_ATTACHMENT_LOAD_OP_CLEAR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-loadOp-00846)"},
- {"VUID-VkSubpassDescription-pColorAttachments-01417", "All attachments in pColorAttachments that are not VK_ATTACHMENT_UNUSED must have the same sample count (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-pColorAttachments-01417)"},
- {"VUID-VkSubpassDescription-pColorAttachments-01506", "If the VK_AMD_mixed_attachment_samples extension is enabled, and all attachments in pColorAttachments that are not VK_ATTACHMENT_UNUSED must have a sample count that is smaller than or equal to the sample count of pDepthStencilAttachment if it is not VK_ATTACHMENT_UNUSED (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-pColorAttachments-01506)"},
- {"VUID-VkSubpassDescription-pColorAttachments-02648", "All attachments in pColorAttachments that are not VK_ATTACHMENT_UNUSED must have formats whose features contain VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-pColorAttachments-02648)"},
- {"VUID-VkSubpassDescription-pColorAttachments-parameter", "If colorAttachmentCount is not 0, pColorAttachments must be a valid pointer to an array of colorAttachmentCount valid VkAttachmentReference structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-pColorAttachments-parameter)"},
- {"VUID-VkSubpassDescription-pDepthStencilAttachment-01418", "If neither the VK_AMD_mixed_attachment_samples nor the VK_NV_framebuffer_mixed_samples extensions are enabled, and if pDepthStencilAttachment is not VK_ATTACHMENT_UNUSED and any attachments in pColorAttachments are not VK_ATTACHMENT_UNUSED, they must have the same sample count (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-pDepthStencilAttachment-01418)"},
- {"VUID-VkSubpassDescription-pDepthStencilAttachment-02650", "If pDepthStencilAttachment is not NULL and the attachment is not VK_ATTACHMENT_UNUSED then it must have a format whose features contain VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-pDepthStencilAttachment-02650)"},
- {"VUID-VkSubpassDescription-pDepthStencilAttachment-parameter", "If pDepthStencilAttachment is not NULL, pDepthStencilAttachment must be a valid pointer to a valid VkAttachmentReference structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-pDepthStencilAttachment-parameter)"},
- {"VUID-VkSubpassDescription-pInputAttachments-02647", "All attachments in pInputAttachments that are not VK_ATTACHMENT_UNUSED must have formats whose features contain at least one of VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT or VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-pInputAttachments-02647)"},
- {"VUID-VkSubpassDescription-pInputAttachments-02868", "If the render pass is created with VK_RENDER_PASS_CREATE_TRANSFORM_BIT_QCOM each of the elements of pInputAttachments must be VK_ATTACHMENT_UNUSED. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-pInputAttachments-02868)"},
- {"VUID-VkSubpassDescription-pInputAttachments-parameter", "If inputAttachmentCount is not 0, pInputAttachments must be a valid pointer to an array of inputAttachmentCount valid VkAttachmentReference structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-pInputAttachments-parameter)"},
- {"VUID-VkSubpassDescription-pPreserveAttachments-00854", "Each element of pPreserveAttachments must not also be an element of any other member of the subpass description (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-pPreserveAttachments-00854)"},
- {"VUID-VkSubpassDescription-pPreserveAttachments-parameter", "If preserveAttachmentCount is not 0, pPreserveAttachments must be a valid pointer to an array of preserveAttachmentCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-pPreserveAttachments-parameter)"},
- {"VUID-VkSubpassDescription-pResolveAttachments-00847", "If pResolveAttachments is not NULL, for each resolve attachment that is not VK_ATTACHMENT_UNUSED, the corresponding color attachment must not be VK_ATTACHMENT_UNUSED (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-pResolveAttachments-00847)"},
- {"VUID-VkSubpassDescription-pResolveAttachments-00848", "If pResolveAttachments is not NULL, for each resolve attachment that is not VK_ATTACHMENT_UNUSED, the corresponding color attachment must not have a sample count of VK_SAMPLE_COUNT_1_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-pResolveAttachments-00848)"},
- {"VUID-VkSubpassDescription-pResolveAttachments-00849", "If pResolveAttachments is not NULL, each resolve attachment that is not VK_ATTACHMENT_UNUSED must have a sample count of VK_SAMPLE_COUNT_1_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-pResolveAttachments-00849)"},
- {"VUID-VkSubpassDescription-pResolveAttachments-00850", "If pResolveAttachments is not NULL, each resolve attachment that is not VK_ATTACHMENT_UNUSED must have the same VkFormat as its corresponding color attachment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-pResolveAttachments-00850)"},
- {"VUID-VkSubpassDescription-pResolveAttachments-02649", "All attachments in pResolveAttachments that are not VK_ATTACHMENT_UNUSED must have formats whose features contain VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-pResolveAttachments-02649)"},
- {"VUID-VkSubpassDescription-pResolveAttachments-parameter", "If colorAttachmentCount is not 0, and pResolveAttachments is not NULL, pResolveAttachments must be a valid pointer to an array of colorAttachmentCount valid VkAttachmentReference structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-pResolveAttachments-parameter)"},
- {"VUID-VkSubpassDescription-pipelineBindPoint-00844", "pipelineBindPoint must be VK_PIPELINE_BIND_POINT_GRAPHICS (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-pipelineBindPoint-00844)"},
- {"VUID-VkSubpassDescription-pipelineBindPoint-parameter", "pipelineBindPoint must be a valid VkPipelineBindPoint value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription-pipelineBindPoint-parameter)"},
- {"VUID-VkSubpassDescription2-attachment-02799", "If the attachment member of any element of pInputAttachments is not VK_ATTACHMENT_UNUSED, then the aspectMask member must be a valid combination of VkImageAspectFlagBits (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-attachment-02799)"},
- {"VUID-VkSubpassDescription2-attachment-02800", "If the attachment member of any element of pInputAttachments is not VK_ATTACHMENT_UNUSED, then the aspectMask member must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-attachment-02800)"},
- {"VUID-VkSubpassDescription2-attachment-02801", "If the attachment member of any element of pInputAttachments is not VK_ATTACHMENT_UNUSED, then the aspectMask member must not include VK_IMAGE_ASPECT_METADATA_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-attachment-02801)"},
- {"VUID-VkSubpassDescription2-attachment-03073", "The attachment member of any element of pPreserveAttachments must not be VK_ATTACHMENT_UNUSED (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-attachment-03073)"},
- {"VUID-VkSubpassDescription2-colorAttachmentCount-03063", "colorAttachmentCount must be less than or equal to VkPhysicalDeviceLimits::maxColorAttachments (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-colorAttachmentCount-03063)"},
- {"VUID-VkSubpassDescription2-flags-03076", "If flags includes VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX, it must also include VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-flags-03076)"},
- {"VUID-VkSubpassDescription2-flags-parameter", "flags must be a valid combination of VkSubpassDescriptionFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-flags-parameter)"},
- {"VUID-VkSubpassDescription2-layout-02528", "If any attachment is used by more than one VkAttachmentReference member, then each use must use the same layout (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-layout-02528)"},
- {"VUID-VkSubpassDescription2-loadOp-03064", "If the first use of an attachment in this render pass is as an input attachment, and the attachment is not also used as a color or depth/stencil attachment in the same subpass, then loadOp must not be VK_ATTACHMENT_LOAD_OP_CLEAR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-loadOp-03064)"},
- {"VUID-VkSubpassDescription2-pColorAttachments-02898", "All attachments in pColorAttachments that are not VK_ATTACHMENT_UNUSED must have formats whose features contain VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-pColorAttachments-02898)"},
- {"VUID-VkSubpassDescription2-pColorAttachments-03069", "All attachments in pColorAttachments that are not VK_ATTACHMENT_UNUSED must have the same sample count (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-pColorAttachments-03069)"},
- {"VUID-VkSubpassDescription2-pColorAttachments-03070", "If the VK_AMD_mixed_attachment_samples extension is enabled, all attachments in pColorAttachments that are not VK_ATTACHMENT_UNUSED must have a sample count that is smaller than or equal to the sample count of pDepthStencilAttachment if it is not VK_ATTACHMENT_UNUSED (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-pColorAttachments-03070)"},
- {"VUID-VkSubpassDescription2-pColorAttachments-parameter", "If colorAttachmentCount is not 0, pColorAttachments must be a valid pointer to an array of colorAttachmentCount valid VkAttachmentReference2 structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-pColorAttachments-parameter)"},
- {"VUID-VkSubpassDescription2-pDepthStencilAttachment-02900", "If pDepthStencilAttachment is not NULL and the attachment is not VK_ATTACHMENT_UNUSED then it must have a format whose features contain VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-pDepthStencilAttachment-02900)"},
- {"VUID-VkSubpassDescription2-pDepthStencilAttachment-03071", "If neither the VK_AMD_mixed_attachment_samples nor the VK_NV_framebuffer_mixed_samples extensions are enabled, and if pDepthStencilAttachment is not VK_ATTACHMENT_UNUSED and any attachments in pColorAttachments are not VK_ATTACHMENT_UNUSED, they must have the same sample count (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-pDepthStencilAttachment-03071)"},
- {"VUID-VkSubpassDescription2-pDepthStencilAttachment-parameter", "If pDepthStencilAttachment is not NULL, pDepthStencilAttachment must be a valid pointer to a valid VkAttachmentReference2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-pDepthStencilAttachment-parameter)"},
- {"VUID-VkSubpassDescription2-pInputAttachments-02897", "All attachments in pInputAttachments that are not VK_ATTACHMENT_UNUSED must have formats whose features contain at least one of VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT or VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-pInputAttachments-02897)"},
- {"VUID-VkSubpassDescription2-pInputAttachments-parameter", "If inputAttachmentCount is not 0, pInputAttachments must be a valid pointer to an array of inputAttachmentCount valid VkAttachmentReference2 structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-pInputAttachments-parameter)"},
- {"VUID-VkSubpassDescription2-pPreserveAttachments-03074", "Any given element of pPreserveAttachments must not also be an element of any other member of the subpass description (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-pPreserveAttachments-03074)"},
- {"VUID-VkSubpassDescription2-pPreserveAttachments-parameter", "If preserveAttachmentCount is not 0, pPreserveAttachments must be a valid pointer to an array of preserveAttachmentCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-pPreserveAttachments-parameter)"},
- {"VUID-VkSubpassDescription2-pResolveAttachments-02899", "All attachments in pResolveAttachments that are not VK_ATTACHMENT_UNUSED must have formats whose features contain VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-pResolveAttachments-02899)"},
- {"VUID-VkSubpassDescription2-pResolveAttachments-03065", "If pResolveAttachments is not NULL, for each resolve attachment that does not have the value VK_ATTACHMENT_UNUSED, the corresponding color attachment must not have the value VK_ATTACHMENT_UNUSED (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-pResolveAttachments-03065)"},
- {"VUID-VkSubpassDescription2-pResolveAttachments-03066", "If pResolveAttachments is not NULL, for each resolve attachment that is not VK_ATTACHMENT_UNUSED, the corresponding color attachment must not have a sample count of VK_SAMPLE_COUNT_1_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-pResolveAttachments-03066)"},
- {"VUID-VkSubpassDescription2-pResolveAttachments-03067", "If pResolveAttachments is not NULL, each resolve attachment that is not VK_ATTACHMENT_UNUSED must have a sample count of VK_SAMPLE_COUNT_1_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-pResolveAttachments-03067)"},
- {"VUID-VkSubpassDescription2-pResolveAttachments-03068", "Any given element of pResolveAttachments must have the same VkFormat as its corresponding color attachment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-pResolveAttachments-03068)"},
- {"VUID-VkSubpassDescription2-pResolveAttachments-parameter", "If colorAttachmentCount is not 0, and pResolveAttachments is not NULL, pResolveAttachments must be a valid pointer to an array of colorAttachmentCount valid VkAttachmentReference2 structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-pResolveAttachments-parameter)"},
- {"VUID-VkSubpassDescription2-pipelineBindPoint-03062", "pipelineBindPoint must be VK_PIPELINE_BIND_POINT_GRAPHICS (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-pipelineBindPoint-03062)"},
- {"VUID-VkSubpassDescription2-pipelineBindPoint-parameter", "pipelineBindPoint must be a valid VkPipelineBindPoint value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-pipelineBindPoint-parameter)"},
- {"VUID-VkSubpassDescription2-sType-sType", "sType must be VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescription2-sType-sType)"},
- {"VUID-VkSubpassDescriptionDepthStencilResolve-depthResolveMode-03183", "The value of depthResolveMode must be one of the bits set in VkPhysicalDeviceDepthStencilResolveProperties::supportedDepthResolveModes or VK_RESOLVE_MODE_NONE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescriptionDepthStencilResolve-depthResolveMode-03183)"},
- {"VUID-VkSubpassDescriptionDepthStencilResolve-depthResolveMode-parameter", "depthResolveMode must be a valid VkResolveModeFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescriptionDepthStencilResolve-depthResolveMode-parameter)"},
- {"VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-02651", "If pDepthStencilResolveAttachment is not NULL and does not have the value VK_ATTACHMENT_UNUSED then it must have a format whose features contain VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-02651)"},
- {"VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03177", "If pDepthStencilResolveAttachment is not NULL and does not have the value VK_ATTACHMENT_UNUSED, pDepthStencilAttachment must not have the value VK_ATTACHMENT_UNUSED (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03177)"},
- {"VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03178", "If pDepthStencilResolveAttachment is not NULL and does not have the value VK_ATTACHMENT_UNUSED, depthResolveMode and stencilResolveMode must not both be VK_RESOLVE_MODE_NONE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03178)"},
- {"VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03179", "If pDepthStencilResolveAttachment is not NULL and does not have the value VK_ATTACHMENT_UNUSED, pDepthStencilAttachment must not have a sample count of VK_SAMPLE_COUNT_1_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03179)"},
- {"VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03180", "If pDepthStencilResolveAttachment is not NULL and does not have the value VK_ATTACHMENT_UNUSED, pDepthStencilResolveAttachment must have a sample count of VK_SAMPLE_COUNT_1_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03180)"},
- {"VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03181", "If the VkFormat of pDepthStencilResolveAttachment has a depth component, then the VkFormat of pDepthStencilAttachment must have a depth component with the same number of bits and numerical type (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03181)"},
- {"VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03182", "If the VkFormat of pDepthStencilResolveAttachment has a stencil component, then the VkFormat of pDepthStencilAttachment must have a stencil component with the same number of bits and numerical type (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03182)"},
- {"VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03185", "If the VkFormat of pDepthStencilResolveAttachment has both depth and stencil components, VkPhysicalDeviceDepthStencilResolveProperties::independentResolve is VK_FALSE, and VkPhysicalDeviceDepthStencilResolveProperties::independentResolveNone is VK_FALSE, then the values of depthResolveMode and stencilResolveMode must be identical (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03185)"},
- {"VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03186", "If the VkFormat of pDepthStencilResolveAttachment has both depth and stencil components, VkPhysicalDeviceDepthStencilResolveProperties::independentResolve is VK_FALSE and VkPhysicalDeviceDepthStencilResolveProperties::independentResolveNone is VK_TRUE, then the values of depthResolveMode and stencilResolveMode must be identical or one of them must be VK_RESOLVE_MODE_NONE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03186)"},
- {"VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-parameter", "If pDepthStencilResolveAttachment is not NULL, pDepthStencilResolveAttachment must be a valid pointer to a valid VkAttachmentReference2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-parameter)"},
- {"VUID-VkSubpassDescriptionDepthStencilResolve-sType-sType", "sType must be VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescriptionDepthStencilResolve-sType-sType)"},
- {"VUID-VkSubpassDescriptionDepthStencilResolve-stencilResolveMode-03184", "The value of stencilResolveMode must be one of the bits set in VkPhysicalDeviceDepthStencilResolveProperties::supportedStencilResolveModes or VK_RESOLVE_MODE_NONE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescriptionDepthStencilResolve-stencilResolveMode-03184)"},
- {"VUID-VkSubpassDescriptionDepthStencilResolve-stencilResolveMode-parameter", "stencilResolveMode must be a valid VkResolveModeFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassDescriptionDepthStencilResolve-stencilResolveMode-parameter)"},
- {"VUID-VkSubpassEndInfo-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassEndInfo-pNext-pNext)"},
- {"VUID-VkSubpassEndInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SUBPASS_END_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassEndInfo-sType-sType)"},
- {"VUID-VkSubpassSampleLocationsEXT-sampleLocationsInfo-parameter", "sampleLocationsInfo must be a valid VkSampleLocationsInfoEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassSampleLocationsEXT-sampleLocationsInfo-parameter)"},
- {"VUID-VkSubpassSampleLocationsEXT-subpassIndex-01532", "subpassIndex must be less than the subpassCount specified in VkRenderPassCreateInfo the render pass specified by VkRenderPassBeginInfo::renderPass was created with (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSubpassSampleLocationsEXT-subpassIndex-01532)"},
- {"VUID-VkSurfaceCapabilities2EXT-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSurfaceCapabilities2EXT-pNext-pNext)"},
- {"VUID-VkSurfaceCapabilities2EXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSurfaceCapabilities2EXT-sType-sType)"},
- {"VUID-VkSurfaceCapabilities2EXT-supportedSurfaceCounters-01246", "supportedSurfaceCounters must not include VK_SURFACE_COUNTER_VBLANK_EXT unless the surface queried is a display surface. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSurfaceCapabilities2EXT-supportedSurfaceCounters-01246)"},
- {"VUID-VkSurfaceCapabilities2KHR-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkDisplayNativeHdrSurfaceCapabilitiesAMD, VkSharedPresentSurfaceCapabilitiesKHR, VkSurfaceCapabilitiesFullScreenExclusiveEXT, or VkSurfaceProtectedCapabilitiesKHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSurfaceCapabilities2KHR-pNext-pNext)"},
- {"VUID-VkSurfaceCapabilities2KHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSurfaceCapabilities2KHR-sType-sType)"},
- {"VUID-VkSurfaceCapabilities2KHR-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSurfaceCapabilities2KHR-sType-unique)"},
- {"VUID-VkSurfaceCapabilitiesFullScreenExclusiveEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSurfaceCapabilitiesFullScreenExclusiveEXT-sType-sType)"},
- {"VUID-VkSurfaceFormat2KHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSurfaceFormat2KHR-pNext-pNext)"},
- {"VUID-VkSurfaceFormat2KHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSurfaceFormat2KHR-sType-sType)"},
- {"VUID-VkSurfaceFullScreenExclusiveInfoEXT-fullScreenExclusive-parameter", "fullScreenExclusive must be a valid VkFullScreenExclusiveEXT value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSurfaceFullScreenExclusiveInfoEXT-fullScreenExclusive-parameter)"},
- {"VUID-VkSurfaceFullScreenExclusiveInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSurfaceFullScreenExclusiveInfoEXT-sType-sType)"},
- {"VUID-VkSurfaceFullScreenExclusiveWin32InfoEXT-hmonitor-02673", "hmonitor must be a valid HMONITOR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSurfaceFullScreenExclusiveWin32InfoEXT-hmonitor-02673)"},
- {"VUID-VkSurfaceFullScreenExclusiveWin32InfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSurfaceFullScreenExclusiveWin32InfoEXT-sType-sType)"},
- {"VUID-VkSurfaceProtectedCapabilitiesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSurfaceProtectedCapabilitiesKHR-sType-sType)"},
- {"VUID-VkSwapchainCounterCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCounterCreateInfoEXT-sType-sType)"},
- {"VUID-VkSwapchainCounterCreateInfoEXT-surfaceCounters-01244", "The bits in surfaceCounters must be supported by VkSwapchainCreateInfoKHR::surface, as reported by vkGetPhysicalDeviceSurfaceCapabilities2EXT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCounterCreateInfoEXT-surfaceCounters-01244)"},
- {"VUID-VkSwapchainCounterCreateInfoEXT-surfaceCounters-parameter", "surfaceCounters must be a valid combination of VkSurfaceCounterFlagBitsEXT values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCounterCreateInfoEXT-surfaceCounters-parameter)"},
- {"VUID-VkSwapchainCreateInfoKHR-commonparent", "Both of oldSwapchain, and surface that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkInstance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-commonparent)"},
- {"VUID-VkSwapchainCreateInfoKHR-compositeAlpha-01280", "compositeAlpha must be one of the bits present in the supportedCompositeAlpha member of the VkSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-compositeAlpha-01280)"},
- {"VUID-VkSwapchainCreateInfoKHR-compositeAlpha-parameter", "compositeAlpha must be a valid VkCompositeAlphaFlagBitsKHR value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-compositeAlpha-parameter)"},
- {"VUID-VkSwapchainCreateInfoKHR-flags-03168", "If flags contains VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR then the pNext chain must include a VkImageFormatListCreateInfo structure with a viewFormatCount greater than zero and pViewFormats must have an element equal to imageFormat (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-flags-03168)"},
- {"VUID-VkSwapchainCreateInfoKHR-flags-03187", "If flags contains VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR, then VkSurfaceProtectedCapabilitiesKHR::supportsProtected must be VK_TRUE in the VkSurfaceProtectedCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilities2KHR for surface (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-flags-03187)"},
- {"VUID-VkSwapchainCreateInfoKHR-flags-parameter", "flags must be a valid combination of VkSwapchainCreateFlagBitsKHR values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-flags-parameter)"},
- {"VUID-VkSwapchainCreateInfoKHR-imageArrayLayers-01275", "imageArrayLayers must be greater than 0 and less than or equal to the maxImageArrayLayers member of the VkSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageArrayLayers-01275)"},
- {"VUID-VkSwapchainCreateInfoKHR-imageColorSpace-parameter", "imageColorSpace must be a valid VkColorSpaceKHR value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageColorSpace-parameter)"},
- {"VUID-VkSwapchainCreateInfoKHR-imageExtent-01274", "imageExtent must be between minImageExtent and maxImageExtent, inclusive, where minImageExtent and maxImageExtent are members of the VkSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageExtent-01274)"},
- {"VUID-VkSwapchainCreateInfoKHR-imageExtent-01689", "imageExtent members width and height must both be non-zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageExtent-01689)"},
- {"VUID-VkSwapchainCreateInfoKHR-imageFormat-01273", "imageFormat and imageColorSpace must match the format and colorSpace members, respectively, of one of the VkSurfaceFormatKHR structures returned by vkGetPhysicalDeviceSurfaceFormatsKHR for the surface (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageFormat-01273)"},
- {"VUID-VkSwapchainCreateInfoKHR-imageFormat-01778", "The implied image creation parameters of the swapchain must be supported as reported by vkGetPhysicalDeviceImageFormatProperties (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageFormat-01778)"},
- {"VUID-VkSwapchainCreateInfoKHR-imageFormat-parameter", "imageFormat must be a valid VkFormat value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageFormat-parameter)"},
- {"VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01277", "If imageSharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a valid pointer to an array of queueFamilyIndexCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01277)"},
- {"VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01278", "If imageSharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01278)"},
- {"VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01393", "If imageSharingMode is VK_SHARING_MODE_CONCURRENT, each element of pQueueFamilyIndices must be unique and must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the physicalDevice that was used to create device (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01393)"},
- {"VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01428", "If imageSharingMode is VK_SHARING_MODE_CONCURRENT, each element of pQueueFamilyIndices must be unique and must be less than pQueueFamilyPropertyCount returned by either vkGetPhysicalDeviceQueueFamilyProperties or vkGetPhysicalDeviceQueueFamilyProperties2 for the physicalDevice that was used to create device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01428)"},
- {"VUID-VkSwapchainCreateInfoKHR-imageSharingMode-parameter", "imageSharingMode must be a valid VkSharingMode value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageSharingMode-parameter)"},
- {"VUID-VkSwapchainCreateInfoKHR-imageUsage-01276", "imageUsage must be a subset of the supported usage flags present in the supportedUsageFlags member of the VkSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkSwapchainCreateInfoKHR-imageUsage-01276)"},
- {"VUID-VkSwapchainCreateInfoKHR-imageUsage-01384", "If presentMode is VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR or VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR, imageUsage must be a subset of the supported usage flags present in the sharedPresentSupportedUsageFlags member of the VkSharedPresentSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilities2KHR for surface (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageUsage-01384)"},
- {"VUID-VkSwapchainCreateInfoKHR-imageUsage-parameter", "imageUsage must be a valid combination of VkImageUsageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageUsage-parameter)"},
- {"VUID-VkSwapchainCreateInfoKHR-imageUsage-requiredbitmask", "imageUsage must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-imageUsage-requiredbitmask)"},
- {"VUID-VkSwapchainCreateInfoKHR-minImageCount-01271", "minImageCount must be greater than or equal to the value returned in the minImageCount member of the VkSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-VkSwapchainCreateInfoKHR-minImageCount-01271)"},
- {"VUID-VkSwapchainCreateInfoKHR-minImageCount-01272", "minImageCount must be less than or equal to the value returned in the maxImageCount member of the VkSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface if the returned maxImageCount is not zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-minImageCount-01272)"},
- {"VUID-VkSwapchainCreateInfoKHR-minImageCount-01383", "minImageCount must be 1 if presentMode is either VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR or VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-minImageCount-01383)"},
- {"VUID-VkSwapchainCreateInfoKHR-oldSwapchain-01933", "If oldSwapchain is not VK_NULL_HANDLE, oldSwapchain must be a non-retired swapchain associated with native window referred to by surface (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-oldSwapchain-01933)"},
- {"VUID-VkSwapchainCreateInfoKHR-oldSwapchain-parameter", "If oldSwapchain is not VK_NULL_HANDLE, oldSwapchain must be a valid VkSwapchainKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-oldSwapchain-parameter)"},
- {"VUID-VkSwapchainCreateInfoKHR-oldSwapchain-parent", "If oldSwapchain is a valid handle, it must have been created, allocated, or retrieved from surface (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-oldSwapchain-parent)"},
- {"VUID-VkSwapchainCreateInfoKHR-pNext-02679", "If the pNext chain includes a VkSurfaceFullScreenExclusiveInfoEXT structure with its fullScreenExclusive member set to VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT, and surface was created using vkCreateWin32SurfaceKHR, a VkSurfaceFullScreenExclusiveWin32InfoEXT structure must be included in the pNext chain (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-pNext-02679)"},
- {"VUID-VkSwapchainCreateInfoKHR-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkDeviceGroupSwapchainCreateInfoKHR, VkImageFormatListCreateInfo, VkSurfaceFullScreenExclusiveInfoEXT, VkSurfaceFullScreenExclusiveWin32InfoEXT, VkSwapchainCounterCreateInfoEXT, or VkSwapchainDisplayNativeHdrCreateInfoAMD (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-pNext-pNext)"},
- {"VUID-VkSwapchainCreateInfoKHR-physicalDeviceCount-01429", "If the logical device was created with VkDeviceGroupDeviceCreateInfo::physicalDeviceCount equal to 1, flags must not contain VK_SWAPCHAIN_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-physicalDeviceCount-01429)"},
- {"VUID-VkSwapchainCreateInfoKHR-preTransform-01279", "preTransform must be one of the bits present in the supportedTransforms member of the VkSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-preTransform-01279)"},
- {"VUID-VkSwapchainCreateInfoKHR-preTransform-parameter", "preTransform must be a valid VkSurfaceTransformFlagBitsKHR value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-preTransform-parameter)"},
- {"VUID-VkSwapchainCreateInfoKHR-presentMode-01281", "presentMode must be one of the VkPresentModeKHR values returned by vkGetPhysicalDeviceSurfacePresentModesKHR for the surface (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-presentMode-01281)"},
- {"VUID-VkSwapchainCreateInfoKHR-presentMode-01427", "If presentMode is VK_PRESENT_MODE_IMMEDIATE_KHR, VK_PRESENT_MODE_MAILBOX_KHR, VK_PRESENT_MODE_FIFO_KHR or VK_PRESENT_MODE_FIFO_RELAXED_KHR, imageUsage must be a subset of the supported usage flags present in the supportedUsageFlags member of the VkSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilitiesKHR for surface (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-presentMode-01427)"},
- {"VUID-VkSwapchainCreateInfoKHR-presentMode-02839", "If presentMode is not VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR nor VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR, then minImageCount must be greater than or equal to the value returned in the minImageCount member of the VkSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-presentMode-02839)"},
- {"VUID-VkSwapchainCreateInfoKHR-presentMode-parameter", "presentMode must be a valid VkPresentModeKHR value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-presentMode-parameter)"},
- {"VUID-VkSwapchainCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-sType-sType)"},
- {"VUID-VkSwapchainCreateInfoKHR-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-sType-unique)"},
- {"VUID-VkSwapchainCreateInfoKHR-surface-01270", "surface must be a surface that is supported by the device as determined using vkGetPhysicalDeviceSurfaceSupportKHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-surface-01270)"},
- {"VUID-VkSwapchainCreateInfoKHR-surface-parameter", "surface must be a valid VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-surface-parameter)"},
- {"VUID-VkSwapchainDisplayNativeHdrCreateInfoAMD-localDimmingEnable-XXXXX", "It is only valid to set localDimmingEnable to VK_TRUE if VkDisplayNativeHdrSurfaceCapabilitiesAMD::localDimmingSupport is supported. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainDisplayNativeHdrCreateInfoAMD-localDimmingEnable-XXXXX)"},
- {"VUID-VkSwapchainDisplayNativeHdrCreateInfoAMD-sType-sType", "sType must be VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainDisplayNativeHdrCreateInfoAMD-sType-sType)"},
- {"VUID-VkTextureLODGatherFormatPropertiesAMD-sType-sType", "sType must be VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkTextureLODGatherFormatPropertiesAMD-sType-sType)"},
- {"VUID-VkTimelineSemaphoreSubmitInfo-pSignalSemaphoreValues-parameter", "If signalSemaphoreValueCount is not 0, and pSignalSemaphoreValues is not NULL, pSignalSemaphoreValues must be a valid pointer to an array of signalSemaphoreValueCount uint64_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkTimelineSemaphoreSubmitInfo-pSignalSemaphoreValues-parameter)"},
- {"VUID-VkTimelineSemaphoreSubmitInfo-pWaitSemaphoreValues-parameter", "If waitSemaphoreValueCount is not 0, and pWaitSemaphoreValues is not NULL, pWaitSemaphoreValues must be a valid pointer to an array of waitSemaphoreValueCount uint64_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkTimelineSemaphoreSubmitInfo-pWaitSemaphoreValues-parameter)"},
- {"VUID-VkTimelineSemaphoreSubmitInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkTimelineSemaphoreSubmitInfo-sType-sType)"},
- {"VUID-VkTraceRaysIndirectCommandKHR-depth-03521", "depth must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkTraceRaysIndirectCommandKHR-depth-03521)"},
- {"VUID-VkTraceRaysIndirectCommandKHR-height-03520", "height must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkTraceRaysIndirectCommandKHR-height-03520)"},
- {"VUID-VkTraceRaysIndirectCommandKHR-width-03519", "width must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkTraceRaysIndirectCommandKHR-width-03519)"},
- {"VUID-VkValidationCacheCreateInfoEXT-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkValidationCacheCreateInfoEXT-flags-zerobitmask)"},
- {"VUID-VkValidationCacheCreateInfoEXT-initialDataSize-01534", "If initialDataSize is not 0, it must be equal to the size of pInitialData, as returned by vkGetValidationCacheDataEXT when pInitialData was originally retrieved (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkValidationCacheCreateInfoEXT-initialDataSize-01534)"},
- {"VUID-VkValidationCacheCreateInfoEXT-initialDataSize-01535", "If initialDataSize is not 0, pInitialData must have been retrieved from a previous call to vkGetValidationCacheDataEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkValidationCacheCreateInfoEXT-initialDataSize-01535)"},
- {"VUID-VkValidationCacheCreateInfoEXT-pInitialData-parameter", "If initialDataSize is not 0, pInitialData must be a valid pointer to an array of initialDataSize bytes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkValidationCacheCreateInfoEXT-pInitialData-parameter)"},
- {"VUID-VkValidationCacheCreateInfoEXT-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkValidationCacheCreateInfoEXT-pNext-pNext)"},
- {"VUID-VkValidationCacheCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkValidationCacheCreateInfoEXT-sType-sType)"},
- {"VUID-VkValidationFeaturesEXT-pDisabledValidationFeatures-parameter", "If disabledValidationFeatureCount is not 0, pDisabledValidationFeatures must be a valid pointer to an array of disabledValidationFeatureCount valid VkValidationFeatureDisableEXT values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkValidationFeaturesEXT-pDisabledValidationFeatures-parameter)"},
- {"VUID-VkValidationFeaturesEXT-pEnabledValidationFeatures-parameter", "If enabledValidationFeatureCount is not 0, pEnabledValidationFeatures must be a valid pointer to an array of enabledValidationFeatureCount valid VkValidationFeatureEnableEXT values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkValidationFeaturesEXT-pEnabledValidationFeatures-parameter)"},
- {"VUID-VkValidationFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkValidationFeaturesEXT-sType-sType)"},
- {"VUID-VkValidationFlagsEXT-disabledValidationCheckCount-arraylength", "disabledValidationCheckCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkValidationFlagsEXT-disabledValidationCheckCount-arraylength)"},
- {"VUID-VkValidationFlagsEXT-pDisabledValidationChecks-parameter", "pDisabledValidationChecks must be a valid pointer to an array of disabledValidationCheckCount valid VkValidationCheckEXT values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkValidationFlagsEXT-pDisabledValidationChecks-parameter)"},
- {"VUID-VkValidationFlagsEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkValidationFlagsEXT-sType-sType)"},
- {"VUID-VkVertexInputAttributeDescription-binding-00621", "binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkVertexInputAttributeDescription-binding-00621)"},
- {"VUID-VkVertexInputAttributeDescription-format-00623", "format must be allowed as a vertex buffer format, as specified by the VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT flag in VkFormatProperties::bufferFeatures returned by vkGetPhysicalDeviceFormatProperties (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkVertexInputAttributeDescription-format-00623)"},
- {"VUID-VkVertexInputAttributeDescription-format-parameter", "format must be a valid VkFormat value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkVertexInputAttributeDescription-format-parameter)"},
- {"VUID-VkVertexInputAttributeDescription-location-00620", "location must be less than VkPhysicalDeviceLimits::maxVertexInputAttributes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkVertexInputAttributeDescription-location-00620)"},
- {"VUID-VkVertexInputAttributeDescription-offset-00622", "offset must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputAttributeOffset (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkVertexInputAttributeDescription-offset-00622)"},
- {"VUID-VkVertexInputBindingDescription-binding-00618", "binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkVertexInputBindingDescription-binding-00618)"},
- {"VUID-VkVertexInputBindingDescription-inputRate-parameter", "inputRate must be a valid VkVertexInputRate value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkVertexInputBindingDescription-inputRate-parameter)"},
- {"VUID-VkVertexInputBindingDescription-stride-00619", "stride must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputBindingStride (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkVertexInputBindingDescription-stride-00619)"},
- {"VUID-VkVertexInputBindingDivisorDescriptionEXT-binding-01869", "binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkVertexInputBindingDivisorDescriptionEXT-binding-01869)"},
- {"VUID-VkVertexInputBindingDivisorDescriptionEXT-divisor-01870", "divisor must be a value between 0 and VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT::maxVertexAttribDivisor, inclusive. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkVertexInputBindingDivisorDescriptionEXT-divisor-01870)"},
- {"VUID-VkVertexInputBindingDivisorDescriptionEXT-inputRate-01871", "VkVertexInputBindingDescription::inputRate must be of type VK_VERTEX_INPUT_RATE_INSTANCE for this binding. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkVertexInputBindingDivisorDescriptionEXT-inputRate-01871)"},
- {"VUID-VkVertexInputBindingDivisorDescriptionEXT-vertexAttributeInstanceRateDivisor-02229", "If the vertexAttributeInstanceRateDivisor feature is not enabled, divisor must be 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkVertexInputBindingDivisorDescriptionEXT-vertexAttributeInstanceRateDivisor-02229)"},
- {"VUID-VkVertexInputBindingDivisorDescriptionEXT-vertexAttributeInstanceRateZeroDivisor-02228", "If the vertexAttributeInstanceRateZeroDivisor feature is not enabled, divisor must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkVertexInputBindingDivisorDescriptionEXT-vertexAttributeInstanceRateZeroDivisor-02228)"},
- {"VUID-VkViSurfaceCreateInfoNN-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkViSurfaceCreateInfoNN-flags-zerobitmask)"},
- {"VUID-VkViSurfaceCreateInfoNN-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkViSurfaceCreateInfoNN-pNext-pNext)"},
- {"VUID-VkViSurfaceCreateInfoNN-sType-sType", "sType must be VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkViSurfaceCreateInfoNN-sType-sType)"},
- {"VUID-VkViSurfaceCreateInfoNN-window-01318", "window must be a valid nn::vi::NativeWindowHandle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkViSurfaceCreateInfoNN-window-01318)"},
- {"VUID-VkViewport-height-01772", "height must be greater than 0.0 (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-VkViewport-height-01772)"},
- {"VUID-VkViewport-height-01773", "The absolute value of height must be less than or equal to VkPhysicalDeviceLimits::maxViewportDimensions[1] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkViewport-height-01773)"},
- {"VUID-VkViewport-maxDepth-01235", "Unless VK_EXT_depth_range_unrestricted extension is enabled maxDepth must be between 0.0 and 1.0, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkViewport-maxDepth-01235)"},
- {"VUID-VkViewport-maxDepth-02541", "maxDepth must be between 0.0 and 1.0, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkViewport-maxDepth-02541)"},
- {"VUID-VkViewport-minDepth-01234", "Unless VK_EXT_depth_range_unrestricted extension is enabled minDepth must be between 0.0 and 1.0, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkViewport-minDepth-01234)"},
- {"VUID-VkViewport-minDepth-02540", "minDepth must be between 0.0 and 1.0, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-VkViewport-minDepth-02540)"},
- {"VUID-VkViewport-width-01770", "width must be greater than 0.0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkViewport-width-01770)"},
- {"VUID-VkViewport-width-01771", "width must be less than or equal to VkPhysicalDeviceLimits::maxViewportDimensions[0] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkViewport-width-01771)"},
- {"VUID-VkViewport-x-01232", "(x + width) must be less than or equal to viewportBoundsRange[1] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkViewport-x-01232)"},
- {"VUID-VkViewport-x-01774", "x must be greater than or equal to viewportBoundsRange[0] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkViewport-x-01774)"},
- {"VUID-VkViewport-y-01233", "(y + height) must be less than or equal to viewportBoundsRange[1] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkViewport-y-01233)"},
- {"VUID-VkViewport-y-01775", "y must be greater than or equal to viewportBoundsRange[0] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkViewport-y-01775)"},
- {"VUID-VkViewport-y-01776", "y must be less than or equal to viewportBoundsRange[1] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkViewport-y-01776)"},
- {"VUID-VkViewport-y-01777", "(y + height) must be greater than or equal to viewportBoundsRange[0] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkViewport-y-01777)"},
- {"VUID-VkViewportSwizzleNV-w-parameter", "w must be a valid VkViewportCoordinateSwizzleNV value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkViewportSwizzleNV-w-parameter)"},
- {"VUID-VkViewportSwizzleNV-x-parameter", "x must be a valid VkViewportCoordinateSwizzleNV value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkViewportSwizzleNV-x-parameter)"},
- {"VUID-VkViewportSwizzleNV-y-parameter", "y must be a valid VkViewportCoordinateSwizzleNV value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkViewportSwizzleNV-y-parameter)"},
- {"VUID-VkViewportSwizzleNV-z-parameter", "z must be a valid VkViewportCoordinateSwizzleNV value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkViewportSwizzleNV-z-parameter)"},
- {"VUID-VkWaylandSurfaceCreateInfoKHR-display-01304", "display must point to a valid Wayland wl_display. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWaylandSurfaceCreateInfoKHR-display-01304)"},
- {"VUID-VkWaylandSurfaceCreateInfoKHR-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWaylandSurfaceCreateInfoKHR-flags-zerobitmask)"},
- {"VUID-VkWaylandSurfaceCreateInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWaylandSurfaceCreateInfoKHR-pNext-pNext)"},
- {"VUID-VkWaylandSurfaceCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWaylandSurfaceCreateInfoKHR-sType-sType)"},
- {"VUID-VkWaylandSurfaceCreateInfoKHR-surface-01305", "surface must point to a valid Wayland wl_surface. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWaylandSurfaceCreateInfoKHR-surface-01305)"},
- {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-commonparent", "Both of the elements of pAcquireSyncs, and the elements of pReleaseSyncs that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-commonparent)"},
- {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pAcquireKeys-parameter", "If acquireCount is not 0, pAcquireKeys must be a valid pointer to an array of acquireCount uint64_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pAcquireKeys-parameter)"},
- {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pAcquireSyncs-00081", "Each member of pAcquireSyncs and pReleaseSyncs must be a device memory object imported by setting VkImportMemoryWin32HandleInfoKHR::handleType to VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT or VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pAcquireSyncs-00081)"},
- {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pAcquireSyncs-parameter", "If acquireCount is not 0, pAcquireSyncs must be a valid pointer to an array of acquireCount valid VkDeviceMemory handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pAcquireSyncs-parameter)"},
- {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pAcquireTimeouts-parameter", "If acquireCount is not 0, pAcquireTimeouts must be a valid pointer to an array of acquireCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pAcquireTimeouts-parameter)"},
- {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pReleaseKeys-parameter", "If releaseCount is not 0, pReleaseKeys must be a valid pointer to an array of releaseCount uint64_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pReleaseKeys-parameter)"},
- {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pReleaseSyncs-parameter", "If releaseCount is not 0, pReleaseSyncs must be a valid pointer to an array of releaseCount valid VkDeviceMemory handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pReleaseSyncs-parameter)"},
- {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-sType-sType)"},
- {"VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-commonparent", "Both of the elements of pAcquireSyncs, and the elements of pReleaseSyncs that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-commonparent)"},
- {"VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pAcquireKeys-parameter", "If acquireCount is not 0, pAcquireKeys must be a valid pointer to an array of acquireCount uint64_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pAcquireKeys-parameter)"},
- {"VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pAcquireSyncs-parameter", "If acquireCount is not 0, pAcquireSyncs must be a valid pointer to an array of acquireCount valid VkDeviceMemory handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pAcquireSyncs-parameter)"},
- {"VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pAcquireTimeoutMilliseconds-parameter", "If acquireCount is not 0, pAcquireTimeoutMilliseconds must be a valid pointer to an array of acquireCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pAcquireTimeoutMilliseconds-parameter)"},
- {"VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pReleaseKeys-parameter", "If releaseCount is not 0, pReleaseKeys must be a valid pointer to an array of releaseCount uint64_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pReleaseKeys-parameter)"},
- {"VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pReleaseSyncs-parameter", "If releaseCount is not 0, pReleaseSyncs must be a valid pointer to an array of releaseCount valid VkDeviceMemory handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pReleaseSyncs-parameter)"},
- {"VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-sType-sType)"},
- {"VUID-VkWin32SurfaceCreateInfoKHR-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWin32SurfaceCreateInfoKHR-flags-zerobitmask)"},
- {"VUID-VkWin32SurfaceCreateInfoKHR-hinstance-01307", "hinstance must be a valid Win32 HINSTANCE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWin32SurfaceCreateInfoKHR-hinstance-01307)"},
- {"VUID-VkWin32SurfaceCreateInfoKHR-hwnd-01308", "hwnd must be a valid Win32 HWND. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWin32SurfaceCreateInfoKHR-hwnd-01308)"},
- {"VUID-VkWin32SurfaceCreateInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWin32SurfaceCreateInfoKHR-pNext-pNext)"},
- {"VUID-VkWin32SurfaceCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWin32SurfaceCreateInfoKHR-sType-sType)"},
- {"VUID-VkWriteDescriptorSet-commonparent", "Both of dstSet, and the elements of pTexelBufferView that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-commonparent)"},
- {"VUID-VkWriteDescriptorSet-descriptorCount-00317", "All consecutive bindings updated via a single VkWriteDescriptorSet structure, except those with a descriptorCount of zero, must have identical descriptorType and stageFlags. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorCount-00317)"},
- {"VUID-VkWriteDescriptorSet-descriptorCount-00318", "All consecutive bindings updated via a single VkWriteDescriptorSet structure, except those with a descriptorCount of zero, must all either use immutable samplers or must all not use immutable samplers. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorCount-00318)"},
- {"VUID-VkWriteDescriptorSet-descriptorCount-03048", "All consecutive bindings updated via a single VkWriteDescriptorSet structure, except those with a descriptorCount of zero, must have identical VkDescriptorBindingFlagBits. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorCount-03048)"},
- {"VUID-VkWriteDescriptorSet-descriptorCount-arraylength", "descriptorCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorCount-arraylength)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-00319", "descriptorType must match the type of dstBinding within dstSet (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-00319)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-00322", "If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pImageInfo must be a valid pointer to an array of descriptorCount valid VkDescriptorImageInfo structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-00322)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-00323", "If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, pTexelBufferView must be a valid pointer to an array of descriptorCount valid VkBufferView handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-00323)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-00324", "If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a valid pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-00324)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-00325", "If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and dstSet was not allocated with a layout that included immutable samplers for dstBinding with descriptorType, the sampler member of each element of pImageInfo must be a valid VkSampler object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-00325)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-00326", "If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout members of each element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-00326)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-00327", "If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, the offset member of each element of pBufferInfo must be a multiple of VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-00327)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-00328", "If descriptorType is VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, the offset member of each element of pBufferInfo must be a multiple of VkPhysicalDeviceLimits::minStorageBufferOffsetAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-00328)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-00329", "If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, and the buffer member of any element of pBufferInfo is the handle of a non-sparse buffer, then that buffer must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-00329)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-00330", "If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, the buffer member of each element of pBufferInfo must have been created with VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-00330)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-00331", "If descriptorType is VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, the buffer member of each element of pBufferInfo must have been created with VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-00331)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-00332", "If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, the range member of each element of pBufferInfo, or the effective range if range is VK_WHOLE_SIZE, must be less than or equal to VkPhysicalDeviceLimits::maxUniformBufferRange (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-00332)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-00333", "If descriptorType is VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, the range member of each element of pBufferInfo, or the effective range if range is VK_WHOLE_SIZE, must be less than or equal to VkPhysicalDeviceLimits::maxStorageBufferRange (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-00333)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-00334", "If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, the VkBuffer that each element of pTexelBufferView was created from must have been created with VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-00334)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-00335", "If descriptorType is VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, the VkBuffer that each element of pTexelBufferView was created from must have been created with VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-00335)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-00336", "If descriptorType is VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView member of each element of pImageInfo must have been created with the identity swizzle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-00336)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-00337", "If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, the imageView member of each element of pImageInfo must have been created with VK_IMAGE_USAGE_SAMPLED_BIT set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-00337)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-00338", "If descriptorType is VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView member of each element of pImageInfo must have been created with VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-00338)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-00339", "If descriptorType is VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, the imageView member of each element of pImageInfo must have been created with VK_IMAGE_USAGE_STORAGE_BIT set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-00339)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-01402", "If descriptorType is VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, for each descriptor that will be accessed via load or store operations the imageLayout member for corresponding elements of pImageInfo must be VK_IMAGE_LAYOUT_GENERAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-01402)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-01403", "If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, the imageLayout member of each element of pImageInfo must be a member of the list given in Sampled Image or Combined Image Sampler, corresponding to its type (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-01403)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-01946", "If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, then the imageView member of each pImageInfo element must have been created without a VkSamplerYcbcrConversionInfo structure in its pNext chain (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-01946)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-01948", "If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and dstSet was allocated with a layout that included immutable samplers for dstBinding, then the imageView member of each element of pImageInfo which corresponds to an immutable sampler that enables sampler {YCbCr} conversion must have been created with a VkSamplerYcbcrConversionInfo structure in its pNext chain with an identically defined VkSamplerYcbcrConversionInfo to the corresponding immutable sampler (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-01948)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-02219", "If descriptorType is VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, dstArrayElement must be an integer multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-02219)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-02220", "If descriptorType is VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, descriptorCount must be an integer multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-02220)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-02221", "If descriptorType is VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, the pNext chain must include a VkWriteDescriptorSetInlineUniformBlockEXT structure whose dataSize member equals descriptorCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-02221)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-02382", "If descriptorType is VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, the pNext chain must include a VkWriteDescriptorSetAccelerationStructureKHR structure whose accelerationStructureCount member equals descriptorCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-02382)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-02738", "If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and if any element of pImageInfo has a imageView member that was created with a VkSamplerYcbcrConversionInfo structure in its pNext chain, then dstSet must have been allocated with a layout that included immutable samplers for dstBinding, and the corresponding immutable sampler must have been created with an identically defined VkSamplerYcbcrConversionInfo object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-02738)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-02752", "If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, then dstSet must not have been allocated with a layout that included immutable samplers for dstBinding (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-02752)"},
- {"VUID-VkWriteDescriptorSet-descriptorType-parameter", "descriptorType must be a valid VkDescriptorType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-descriptorType-parameter)"},
- {"VUID-VkWriteDescriptorSet-dstArrayElement-00321", "The sum of dstArrayElement and descriptorCount must be less than or equal to the number of array elements in the descriptor set binding specified by dstBinding, and all applicable consecutive bindings, as described by consecutive binding updates (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-dstArrayElement-00321)"},
- {"VUID-VkWriteDescriptorSet-dstBinding-00315", "dstBinding must be less than or equal to the maximum value of binding of all VkDescriptorSetLayoutBinding structures specified when dstSet's descriptor set layout was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-dstBinding-00315)"},
- {"VUID-VkWriteDescriptorSet-dstBinding-00316", "dstBinding must be a binding with a non-zero descriptorCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-dstBinding-00316)"},
- {"VUID-VkWriteDescriptorSet-dstSet-00320", "dstSet must be a valid VkDescriptorSet handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-dstSet-00320)"},
- {"VUID-VkWriteDescriptorSet-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkWriteDescriptorSetAccelerationStructureKHR or VkWriteDescriptorSetInlineUniformBlockEXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-pNext-pNext)"},
- {"VUID-VkWriteDescriptorSet-sType-sType", "sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-sType-sType)"},
- {"VUID-VkWriteDescriptorSet-sType-unique", "The sType value of each struct in the pNext chain must be unique (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSet-sType-unique)"},
- {"VUID-VkWriteDescriptorSetAccelerationStructureKHR-accelerationStructureCount-02236", "accelerationStructureCount must be equal to descriptorCount in the extended structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSetAccelerationStructureKHR-accelerationStructureCount-02236)"},
- {"VUID-VkWriteDescriptorSetAccelerationStructureKHR-accelerationStructureCount-arraylength", "accelerationStructureCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSetAccelerationStructureKHR-accelerationStructureCount-arraylength)"},
- {"VUID-VkWriteDescriptorSetAccelerationStructureKHR-pAccelerationStructures-02764", "Each acceleration structure in pAccelerationStructures must have been created with VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSetAccelerationStructureKHR-pAccelerationStructures-02764)"},
- {"VUID-VkWriteDescriptorSetAccelerationStructureKHR-pAccelerationStructures-parameter", "pAccelerationStructures must be a valid pointer to an array of accelerationStructureCount valid VkAccelerationStructureKHR handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSetAccelerationStructureKHR-pAccelerationStructures-parameter)"},
- {"VUID-VkWriteDescriptorSetAccelerationStructureKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSetAccelerationStructureKHR-sType-sType)"},
- {"VUID-VkWriteDescriptorSetInlineUniformBlockEXT-dataSize-02222", "dataSize must be an integer multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSetInlineUniformBlockEXT-dataSize-02222)"},
- {"VUID-VkWriteDescriptorSetInlineUniformBlockEXT-dataSize-arraylength", "dataSize must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSetInlineUniformBlockEXT-dataSize-arraylength)"},
- {"VUID-VkWriteDescriptorSetInlineUniformBlockEXT-pData-parameter", "pData must be a valid pointer to an array of dataSize bytes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSetInlineUniformBlockEXT-pData-parameter)"},
- {"VUID-VkWriteDescriptorSetInlineUniformBlockEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkWriteDescriptorSetInlineUniformBlockEXT-sType-sType)"},
- {"VUID-VkXcbSurfaceCreateInfoKHR-connection-01310", "connection must point to a valid X11 xcb_connection_t. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkXcbSurfaceCreateInfoKHR-connection-01310)"},
- {"VUID-VkXcbSurfaceCreateInfoKHR-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkXcbSurfaceCreateInfoKHR-flags-zerobitmask)"},
- {"VUID-VkXcbSurfaceCreateInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkXcbSurfaceCreateInfoKHR-pNext-pNext)"},
- {"VUID-VkXcbSurfaceCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkXcbSurfaceCreateInfoKHR-sType-sType)"},
- {"VUID-VkXcbSurfaceCreateInfoKHR-window-01311", "window must be a valid X11 xcb_window_t. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkXcbSurfaceCreateInfoKHR-window-01311)"},
- {"VUID-VkXlibSurfaceCreateInfoKHR-dpy-01313", "dpy must point to a valid Xlib Display. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkXlibSurfaceCreateInfoKHR-dpy-01313)"},
- {"VUID-VkXlibSurfaceCreateInfoKHR-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkXlibSurfaceCreateInfoKHR-flags-zerobitmask)"},
- {"VUID-VkXlibSurfaceCreateInfoKHR-pNext-pNext", "pNext must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkXlibSurfaceCreateInfoKHR-pNext-pNext)"},
- {"VUID-VkXlibSurfaceCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkXlibSurfaceCreateInfoKHR-sType-sType)"},
- {"VUID-VkXlibSurfaceCreateInfoKHR-window-01314", "window must be a valid Xlib Window. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkXlibSurfaceCreateInfoKHR-window-01314)"},
- {"VUID-vkAcquireFullScreenExclusiveModeEXT-commonparent", "Both of device, and swapchain must have been created, allocated, or retrieved from the same VkInstance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireFullScreenExclusiveModeEXT-commonparent)"},
- {"VUID-vkAcquireFullScreenExclusiveModeEXT-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireFullScreenExclusiveModeEXT-device-parameter)"},
- {"VUID-vkAcquireFullScreenExclusiveModeEXT-swapchain-02674", "swapchain must not be in the retired state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireFullScreenExclusiveModeEXT-swapchain-02674)"},
- {"VUID-vkAcquireFullScreenExclusiveModeEXT-swapchain-02675", "swapchain must be a swapchain created with a VkSurfaceFullScreenExclusiveInfoEXT structure, with fullScreenExclusive set to VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireFullScreenExclusiveModeEXT-swapchain-02675)"},
- {"VUID-vkAcquireFullScreenExclusiveModeEXT-swapchain-02676", "swapchain must not currently have exclusive full-screen access (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireFullScreenExclusiveModeEXT-swapchain-02676)"},
- {"VUID-vkAcquireFullScreenExclusiveModeEXT-swapchain-parameter", "swapchain must be a valid VkSwapchainKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireFullScreenExclusiveModeEXT-swapchain-parameter)"},
- {"VUID-vkAcquireNextImage2KHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireNextImage2KHR-device-parameter)"},
- {"VUID-vkAcquireNextImage2KHR-pAcquireInfo-parameter", "pAcquireInfo must be a valid pointer to a valid VkAcquireNextImageInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireNextImage2KHR-pAcquireInfo-parameter)"},
- {"VUID-vkAcquireNextImage2KHR-pImageIndex-parameter", "pImageIndex must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireNextImage2KHR-pImageIndex-parameter)"},
- {"VUID-vkAcquireNextImage2KHR-swapchain-01803", "If the number of currently acquired images is greater than the difference between the number of images in the swapchain member of pAcquireInfo and the value of VkSurfaceCapabilitiesKHR::minImageCount as returned by a call to vkGetPhysicalDeviceSurfaceCapabilities2KHR with the surface used to create swapchain, the timeout member of pAcquireInfo must not be UINT64_MAX (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireNextImage2KHR-swapchain-01803)"},
- {"VUID-vkAcquireNextImageKHR-commonparent", "Both of device, and swapchain that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkInstance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireNextImageKHR-commonparent)"},
- {"VUID-vkAcquireNextImageKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireNextImageKHR-device-parameter)"},
- {"VUID-vkAcquireNextImageKHR-fence-01287", "If fence is not VK_NULL_HANDLE it must be unsignaled and must not be associated with any other queue command that has not yet completed execution on that queue (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireNextImageKHR-fence-01287)"},
- {"VUID-vkAcquireNextImageKHR-fence-parameter", "If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireNextImageKHR-fence-parameter)"},
- {"VUID-vkAcquireNextImageKHR-fence-parent", "If fence is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireNextImageKHR-fence-parent)"},
- {"VUID-vkAcquireNextImageKHR-pImageIndex-parameter", "pImageIndex must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireNextImageKHR-pImageIndex-parameter)"},
- {"VUID-vkAcquireNextImageKHR-semaphore-01286", "If semaphore is not VK_NULL_HANDLE it must be unsignaled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireNextImageKHR-semaphore-01286)"},
- {"VUID-vkAcquireNextImageKHR-semaphore-01779", "If semaphore is not VK_NULL_HANDLE it must not have any uncompleted signal or wait operations pending (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireNextImageKHR-semaphore-01779)"},
- {"VUID-vkAcquireNextImageKHR-semaphore-01780", "semaphore and fence must not both be equal to VK_NULL_HANDLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireNextImageKHR-semaphore-01780)"},
- {"VUID-vkAcquireNextImageKHR-semaphore-03265", "semaphore must have a VkSemaphoreType of VK_SEMAPHORE_TYPE_BINARY (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireNextImageKHR-semaphore-03265)"},
- {"VUID-vkAcquireNextImageKHR-semaphore-parameter", "If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireNextImageKHR-semaphore-parameter)"},
- {"VUID-vkAcquireNextImageKHR-semaphore-parent", "If semaphore is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireNextImageKHR-semaphore-parent)"},
- {"VUID-vkAcquireNextImageKHR-swapchain-01285", "swapchain must not be in the retired state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireNextImageKHR-swapchain-01285)"},
- {"VUID-vkAcquireNextImageKHR-swapchain-01802", "If the number of currently acquired images is greater than the difference between the number of images in swapchain and the value of VkSurfaceCapabilitiesKHR::minImageCount as returned by a call to vkGetPhysicalDeviceSurfaceCapabilities2KHR with the surface used to create swapchain, timeout must not be UINT64_MAX (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireNextImageKHR-swapchain-01802)"},
- {"VUID-vkAcquireNextImageKHR-swapchain-parameter", "swapchain must be a valid VkSwapchainKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireNextImageKHR-swapchain-parameter)"},
- {"VUID-vkAcquirePerformanceConfigurationINTEL-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquirePerformanceConfigurationINTEL-device-parameter)"},
- {"VUID-vkAcquirePerformanceConfigurationINTEL-pAcquireInfo-parameter", "pAcquireInfo must be a valid pointer to a valid VkPerformanceConfigurationAcquireInfoINTEL structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquirePerformanceConfigurationINTEL-pAcquireInfo-parameter)"},
- {"VUID-vkAcquirePerformanceConfigurationINTEL-pConfiguration-parameter", "pConfiguration must be a valid pointer to a VkPerformanceConfigurationINTEL handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquirePerformanceConfigurationINTEL-pConfiguration-parameter)"},
- {"VUID-vkAcquireProfilingLockKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireProfilingLockKHR-device-parameter)"},
- {"VUID-vkAcquireProfilingLockKHR-pInfo-parameter", "pInfo must be a valid pointer to a valid VkAcquireProfilingLockInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireProfilingLockKHR-pInfo-parameter)"},
- {"VUID-vkAcquireXlibDisplayEXT-display-parameter", "display must be a valid VkDisplayKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireXlibDisplayEXT-display-parameter)"},
- {"VUID-vkAcquireXlibDisplayEXT-display-parent", "display must have been created, allocated, or retrieved from physicalDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireXlibDisplayEXT-display-parent)"},
- {"VUID-vkAcquireXlibDisplayEXT-dpy-parameter", "dpy must be a valid pointer to a Display value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireXlibDisplayEXT-dpy-parameter)"},
- {"VUID-vkAcquireXlibDisplayEXT-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAcquireXlibDisplayEXT-physicalDevice-parameter)"},
- {"VUID-vkAllocateCommandBuffers-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAllocateCommandBuffers-device-parameter)"},
- {"VUID-vkAllocateCommandBuffers-pAllocateInfo-parameter", "pAllocateInfo must be a valid pointer to a valid VkCommandBufferAllocateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAllocateCommandBuffers-pAllocateInfo-parameter)"},
- {"VUID-vkAllocateCommandBuffers-pAllocateInfo::commandBufferCount-arraylength", "The value referenced by pAllocateInfo::commandBufferCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAllocateCommandBuffers-pAllocateInfo::commandBufferCount-arraylength)"},
- {"VUID-vkAllocateCommandBuffers-pCommandBuffers-parameter", "pCommandBuffers must be a valid pointer to an array of pAllocateInfo::commandBufferCount VkCommandBuffer handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAllocateCommandBuffers-pCommandBuffers-parameter)"},
- {"VUID-vkAllocateDescriptorSets-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAllocateDescriptorSets-device-parameter)"},
- {"VUID-vkAllocateDescriptorSets-pAllocateInfo-parameter", "pAllocateInfo must be a valid pointer to a valid VkDescriptorSetAllocateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAllocateDescriptorSets-pAllocateInfo-parameter)"},
- {"VUID-vkAllocateDescriptorSets-pAllocateInfo::descriptorSetCount-arraylength", "The value referenced by pAllocateInfo::descriptorSetCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAllocateDescriptorSets-pAllocateInfo::descriptorSetCount-arraylength)"},
- {"VUID-vkAllocateDescriptorSets-pDescriptorSets-parameter", "pDescriptorSets must be a valid pointer to an array of pAllocateInfo::descriptorSetCount VkDescriptorSet handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAllocateDescriptorSets-pDescriptorSets-parameter)"},
- {"VUID-vkAllocateMemory-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAllocateMemory-device-parameter)"},
- {"VUID-vkAllocateMemory-deviceCoherentMemory-02790", "If the deviceCoherentMemory feature is not enabled, pAllocateInfo->memoryTypeIndex must not identify a memory type supporting VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAllocateMemory-deviceCoherentMemory-02790)"},
- {"VUID-vkAllocateMemory-pAllocateInfo-01713", "pAllocateInfo->allocationSize must be less than or equal to VkPhysicalDeviceMemoryProperties::memoryHeaps[memindex].size where memindex = VkPhysicalDeviceMemoryProperties::memoryTypes[pAllocateInfo->memoryTypeIndex].heapIndex as returned by vkGetPhysicalDeviceMemoryProperties for the VkPhysicalDevice that device was created from. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAllocateMemory-pAllocateInfo-01713)"},
- {"VUID-vkAllocateMemory-pAllocateInfo-01714", "pAllocateInfo->memoryTypeIndex must be less than VkPhysicalDeviceMemoryProperties::memoryTypeCount as returned by vkGetPhysicalDeviceMemoryProperties for the VkPhysicalDevice that device was created from. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAllocateMemory-pAllocateInfo-01714)"},
- {"VUID-vkAllocateMemory-pAllocateInfo-parameter", "pAllocateInfo must be a valid pointer to a valid VkMemoryAllocateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAllocateMemory-pAllocateInfo-parameter)"},
- {"VUID-vkAllocateMemory-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAllocateMemory-pAllocator-parameter)"},
- {"VUID-vkAllocateMemory-pMemory-parameter", "pMemory must be a valid pointer to a VkDeviceMemory handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkAllocateMemory-pMemory-parameter)"},
- {"VUID-vkBeginCommandBuffer-commandBuffer-00049", "commandBuffer must not be in the recording or pending state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBeginCommandBuffer-commandBuffer-00049)"},
- {"VUID-vkBeginCommandBuffer-commandBuffer-00050", "If commandBuffer was allocated from a VkCommandPool which did not have the VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBeginCommandBuffer-commandBuffer-00050)"},
- {"VUID-vkBeginCommandBuffer-commandBuffer-00051", "If commandBuffer is a secondary command buffer, the pInheritanceInfo member of pBeginInfo must be a valid VkCommandBufferInheritanceInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBeginCommandBuffer-commandBuffer-00051)"},
- {"VUID-vkBeginCommandBuffer-commandBuffer-00052", "If commandBuffer is a secondary command buffer and either the occlusionQueryEnable member of the pInheritanceInfo member of pBeginInfo is VK_FALSE, or the precise occlusion queries feature is not enabled, the queryFlags member of the pInheritanceInfo member pBeginInfo must not contain VK_QUERY_CONTROL_PRECISE_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBeginCommandBuffer-commandBuffer-00052)"},
- {"VUID-vkBeginCommandBuffer-commandBuffer-02840", "If commandBuffer is a primary command buffer, then pBeginInfo->flags must not set both the VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT and the VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT flags (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBeginCommandBuffer-commandBuffer-02840)"},
- {"VUID-vkBeginCommandBuffer-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBeginCommandBuffer-commandBuffer-parameter)"},
- {"VUID-vkBeginCommandBuffer-pBeginInfo-parameter", "pBeginInfo must be a valid pointer to a valid VkCommandBufferBeginInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBeginCommandBuffer-pBeginInfo-parameter)"},
- {"VUID-vkBindAccelerationStructureMemoryKHR-bindInfoCount-arraylength", "bindInfoCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindAccelerationStructureMemoryKHR-bindInfoCount-arraylength)"},
- {"VUID-vkBindAccelerationStructureMemoryKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindAccelerationStructureMemoryKHR-device-parameter)"},
- {"VUID-vkBindAccelerationStructureMemoryKHR-pBindInfos-parameter", "pBindInfos must be a valid pointer to an array of bindInfoCount valid VkBindAccelerationStructureMemoryInfoKHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindAccelerationStructureMemoryKHR-pBindInfos-parameter)"},
- {"VUID-vkBindBufferMemory-None-01898", "If buffer was created with the VK_BUFFER_CREATE_PROTECTED_BIT bit set, the buffer must be bound to a memory object allocated with a memory type that reports VK_MEMORY_PROPERTY_PROTECTED_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindBufferMemory-None-01898)"},
- {"VUID-vkBindBufferMemory-None-01899", "If buffer was created with the VK_BUFFER_CREATE_PROTECTED_BIT bit not set, the buffer must not be bound to a memory object created with a memory type that reports VK_MEMORY_PROPERTY_PROTECTED_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindBufferMemory-None-01899)"},
- {"VUID-vkBindBufferMemory-buffer-01029", "buffer must not already be backed by a memory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindBufferMemory-buffer-01029)"},
- {"VUID-vkBindBufferMemory-buffer-01030", "buffer must not have been created with any sparse memory binding flags (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindBufferMemory-buffer-01030)"},
- {"VUID-vkBindBufferMemory-buffer-01038", "If buffer was created with VkDedicatedAllocationBufferCreateInfoNV::dedicatedAllocation equal to VK_TRUE, memory must have been created with VkDedicatedAllocationMemoryAllocateInfoNV::buffer equal to a buffer handle created with identical creation parameters to buffer and memoryOffset must be zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindBufferMemory-buffer-01038)"},
- {"VUID-vkBindBufferMemory-buffer-01039", "If buffer was not created with VkDedicatedAllocationBufferCreateInfoNV::dedicatedAllocation equal to VK_TRUE, memory must not have been allocated dedicated for a specific buffer or image (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-vkBindBufferMemory-buffer-01039)"},
- {"VUID-vkBindBufferMemory-buffer-01444", "If buffer requires a dedicated allocation(as reported by vkGetBufferMemoryRequirements2 in VkMemoryDedicatedRequirements::requiresDedicatedAllocation for buffer), memory must have been created with VkMemoryDedicatedAllocateInfo::buffer equal to buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindBufferMemory-buffer-01444)"},
- {"VUID-vkBindBufferMemory-buffer-parameter", "buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindBufferMemory-buffer-parameter)"},
- {"VUID-vkBindBufferMemory-buffer-parent", "buffer must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindBufferMemory-buffer-parent)"},
- {"VUID-vkBindBufferMemory-bufferDeviceAddress-03339", "If the VkPhysicalDeviceBufferDeviceAddressFeatures::bufferDeviceAddress feature is enabled and buffer was created with the VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT bit set, memory must have been allocated with the VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindBufferMemory-bufferDeviceAddress-03339)"},
- {"VUID-vkBindBufferMemory-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindBufferMemory-device-parameter)"},
- {"VUID-vkBindBufferMemory-memory-01035", "memory must have been allocated using one of the memory types allowed in the memoryTypeBits member of the VkMemoryRequirements structure returned from a call to vkGetBufferMemoryRequirements with buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindBufferMemory-memory-01035)"},
- {"VUID-vkBindBufferMemory-memory-01508", "If the VkMemoryAllocateInfo provided when memory was allocated included a VkMemoryDedicatedAllocateInfo structure in its pNext chain, and VkMemoryDedicatedAllocateInfo::buffer was not VK_NULL_HANDLE, then buffer must equal VkMemoryDedicatedAllocateInfo::buffer, and memoryOffset must be zero. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindBufferMemory-memory-01508)"},
- {"VUID-vkBindBufferMemory-memory-02726", "If the value of VkExportMemoryAllocateInfo::handleTypes used to allocate memory is not 0, it must include at least one of the handles set in VkExternalMemoryBufferCreateInfo::handleTypes when buffer was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindBufferMemory-memory-02726)"},
- {"VUID-vkBindBufferMemory-memory-02727", "If memory was created by a memory import operation, the external handle type of the imported memory must also have been set in VkExternalMemoryBufferCreateInfo::handleTypes when buffer was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindBufferMemory-memory-02727)"},
- {"VUID-vkBindBufferMemory-memory-parameter", "memory must be a valid VkDeviceMemory handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindBufferMemory-memory-parameter)"},
- {"VUID-vkBindBufferMemory-memory-parent", "memory must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindBufferMemory-memory-parent)"},
- {"VUID-vkBindBufferMemory-memoryOffset-01031", "memoryOffset must be less than the size of memory (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindBufferMemory-memoryOffset-01031)"},
- {"VUID-vkBindBufferMemory-memoryOffset-01036", "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from a call to vkGetBufferMemoryRequirements with buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindBufferMemory-memoryOffset-01036)"},
- {"VUID-vkBindBufferMemory-size-01037", "The size member of the VkMemoryRequirements structure returned from a call to vkGetBufferMemoryRequirements with buffer must be less than or equal to the size of memory minus memoryOffset (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindBufferMemory-size-01037)"},
- {"VUID-vkBindBufferMemory2-bindInfoCount-arraylength", "bindInfoCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindBufferMemory2-bindInfoCount-arraylength)"},
- {"VUID-vkBindBufferMemory2-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindBufferMemory2-device-parameter)"},
- {"VUID-vkBindBufferMemory2-pBindInfos-parameter", "pBindInfos must be a valid pointer to an array of bindInfoCount valid VkBindBufferMemoryInfo structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindBufferMemory2-pBindInfos-parameter)"},
- {"VUID-vkBindImageMemory-None-01901", "If image was created with the VK_IMAGE_CREATE_PROTECTED_BIT bit set, the image must be bound to a memory object allocated with a memory type that reports VK_MEMORY_PROPERTY_PROTECTED_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory-None-01901)"},
- {"VUID-vkBindImageMemory-None-01902", "If image was created with the VK_IMAGE_CREATE_PROTECTED_BIT bit not set, the image must not be bound to a memory object created with a memory type that reports VK_MEMORY_PROPERTY_PROTECTED_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory-None-01902)"},
- {"VUID-vkBindImageMemory-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory-device-parameter)"},
- {"VUID-vkBindImageMemory-image-01044", "image must not already be backed by a memory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory-image-01044)"},
- {"VUID-vkBindImageMemory-image-01045", "image must not have been created with any sparse memory binding flags (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory-image-01045)"},
- {"VUID-vkBindImageMemory-image-01050", "If image was created with VkDedicatedAllocationImageCreateInfoNV::dedicatedAllocation equal to VK_TRUE, memory must have been created with VkDedicatedAllocationMemoryAllocateInfoNV::image equal to an image handle created with identical creation parameters to image and memoryOffset must be zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory-image-01050)"},
- {"VUID-vkBindImageMemory-image-01051", "If image was not created with VkDedicatedAllocationImageCreateInfoNV::dedicatedAllocation equal to VK_TRUE, memory must not have been allocated dedicated for a specific buffer or image (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-vkBindImageMemory-image-01051)"},
- {"VUID-vkBindImageMemory-image-01445", "If image requires a dedicated allocation (as reported by vkGetImageMemoryRequirements2 in VkMemoryDedicatedRequirements::requiresDedicatedAllocation for image), memory must have been created with VkMemoryDedicatedAllocateInfo::image equal to image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory-image-01445)"},
- {"VUID-vkBindImageMemory-image-01608", "image must not have been created with the VK_IMAGE_CREATE_DISJOINT_BIT set. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory-image-01608)"},
- {"VUID-vkBindImageMemory-image-parameter", "image must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory-image-parameter)"},
- {"VUID-vkBindImageMemory-image-parent", "image must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory-image-parent)"},
- {"VUID-vkBindImageMemory-memory-01047", "memory must have been allocated using one of the memory types allowed in the memoryTypeBits member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements with image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory-memory-01047)"},
- {"VUID-vkBindImageMemory-memory-01509", "If the VkMemoryAllocateInfo provided when memory was allocated included a VkMemoryDedicatedAllocateInfo structure in its pNext chain, and VkMemoryDedicatedAllocateInfo::image was not VK_NULL_HANDLE, then image must equal VkMemoryDedicatedAllocateInfo::image and memoryOffset must be zero (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-vkBindImageMemory-memory-01509)"},
- {"VUID-vkBindImageMemory-memory-02628", "If the dedicated allocation image aliasing feature is not enabled, and the VkMemoryAllocateInfo provided when memory was allocated included a VkMemoryDedicatedAllocateInfo structure in its pNext chain, and VkMemoryDedicatedAllocateInfo::image was not VK_NULL_HANDLE, then image must equal VkMemoryDedicatedAllocateInfo::image and memoryOffset must be zero. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory-memory-02628)"},
- {"VUID-vkBindImageMemory-memory-02629", "If the dedicated allocation image aliasing feature is enabled, and the VkMemoryAllocateInfo provided when memory was allocated included a VkMemoryDedicatedAllocateInfo structure in its pNext chain, and VkMemoryDedicatedAllocateInfo::image was not VK_NULL_HANDLE, then memoryOffset must be zero, and image must be either equal to VkMemoryDedicatedAllocateInfo::image or an image that was created using the same parameters in VkImageCreateInfo, with the exception that extent and arrayLayers may differ subject to the following restrictions: every dimension in the extent parameter of the image being bound must be equal to or smaller than the original image for which the allocation was created; and the arrayLayers parameter of the image being bound must be equal to or smaller than the original image for which the allocation was created. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory-memory-02629)"},
- {"VUID-vkBindImageMemory-memory-02728", "If the value of VkExportMemoryAllocateInfo::handleTypes used to allocate memory is not 0, it must include at least one of the handles set in VkExternalMemoryImageCreateInfo::handleTypes when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory-memory-02728)"},
- {"VUID-vkBindImageMemory-memory-02729", "If memory was created by a memory import operation, the external handle type of the imported memory must also have been set in VkExternalMemoryImageCreateInfo::handleTypes when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory-memory-02729)"},
- {"VUID-vkBindImageMemory-memory-parameter", "memory must be a valid VkDeviceMemory handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory-memory-parameter)"},
- {"VUID-vkBindImageMemory-memory-parent", "memory must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory-memory-parent)"},
- {"VUID-vkBindImageMemory-memoryOffset-01046", "memoryOffset must be less than the size of memory (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory-memoryOffset-01046)"},
- {"VUID-vkBindImageMemory-memoryOffset-01048", "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements with image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory-memoryOffset-01048)"},
- {"VUID-vkBindImageMemory-size-01049", "The difference of the size of memory and memoryOffset must be greater than or equal to the size member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements with the same image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory-size-01049)"},
- {"VUID-vkBindImageMemory2-bindInfoCount-arraylength", "bindInfoCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory2-bindInfoCount-arraylength)"},
- {"VUID-vkBindImageMemory2-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory2-device-parameter)"},
- {"VUID-vkBindImageMemory2-pBindInfos-02858", "If any VkBindImageMemoryInfo::image was created with VK_IMAGE_CREATE_DISJOINT_BIT then all planes of VkBindImageMemoryInfo::image must be bound individually in separate pBindInfos (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory2-pBindInfos-02858)"},
- {"VUID-vkBindImageMemory2-pBindInfos-parameter", "pBindInfos must be a valid pointer to an array of bindInfoCount valid VkBindImageMemoryInfo structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBindImageMemory2-pBindInfos-parameter)"},
- {"VUID-vkBuildAccelerationStructureKHR-None-03407", "Any acceleration structure instance in any top level build in this command must not reference any bottom level acceleration structure built by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBuildAccelerationStructureKHR-None-03407)"},
- {"VUID-vkBuildAccelerationStructureKHR-None-03409", "There must not be any memory aliasing between memory bound to any top level, bottom level, or instance acceleration structure accessed by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBuildAccelerationStructureKHR-None-03409)"},
- {"VUID-vkBuildAccelerationStructureKHR-None-03437", "All VkDeviceOrHostAddressKHR or VkDeviceOrHostAddressConstKHR referenced by this command must contain valid host addresses (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBuildAccelerationStructureKHR-None-03437)"},
- {"VUID-vkBuildAccelerationStructureKHR-None-03438", "All VkAccelerationStructureKHR objects referenced by this command must be bound to host-visible memory (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBuildAccelerationStructureKHR-None-03438)"},
- {"VUID-vkBuildAccelerationStructureKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBuildAccelerationStructureKHR-device-parameter)"},
- {"VUID-vkBuildAccelerationStructureKHR-infoCount-arraylength", "infoCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBuildAccelerationStructureKHR-infoCount-arraylength)"},
- {"VUID-vkBuildAccelerationStructureKHR-pInfos-03403", "Each pInfos[i].srcAccelerationStructure must not refer to the same acceleration structure as any pInfos[i].dstAccelerationStructure that is provided to the same build command unless it is identical for an update (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBuildAccelerationStructureKHR-pInfos-03403)"},
- {"VUID-vkBuildAccelerationStructureKHR-pInfos-03404", "For each pInfos[i], dstAccelerationStructure must have been created with compatible VkAccelerationStructureCreateInfoKHR where VkAccelerationStructureCreateInfoKHR::type and VkAccelerationStructureCreateInfoKHR::flags are identical to VkAccelerationStructureBuildGeometryInfoKHR::type and VkAccelerationStructureBuildGeometryInfoKHR::flags respectively, VkAccelerationStructureBuildGeometryInfoKHR::geometryCount for dstAccelerationStructure are greater than or equal to the build size, and each geometry in VkAccelerationStructureBuildGeometryInfoKHR::ppGeometries for dstAccelerationStructure has greater than or equal to the number of vertices, indices, and AABBs, VkAccelerationStructureGeometryTrianglesDataKHR::transformData is both 0 or both non-zero, and all other parameters are the same. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBuildAccelerationStructureKHR-pInfos-03404)"},
- {"VUID-vkBuildAccelerationStructureKHR-pInfos-03405", "For each pInfos[i], if update is VK_TRUE, then objects that were previously active for that acceleration structure must not be made inactive as per Inactive Primitives and Instances (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBuildAccelerationStructureKHR-pInfos-03405)"},
- {"VUID-vkBuildAccelerationStructureKHR-pInfos-03406", "For each pInfos[i], if update is VK_TRUE, then objects that were previously inactive for that acceleration structure must not be made active as per Inactive Primitives and Instances (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBuildAccelerationStructureKHR-pInfos-03406)"},
- {"VUID-vkBuildAccelerationStructureKHR-pInfos-03408", "There must not be any memory aliasing between the scratch memories that are provided in all the pInfos[i].scratchData memories for the acceleration structure builds (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBuildAccelerationStructureKHR-pInfos-03408)"},
- {"VUID-vkBuildAccelerationStructureKHR-pInfos-parameter", "pInfos must be a valid pointer to an array of infoCount valid VkAccelerationStructureBuildGeometryInfoKHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBuildAccelerationStructureKHR-pInfos-parameter)"},
- {"VUID-vkBuildAccelerationStructureKHR-pOffsetInfos-03402", "pOffsetInfos[i] must be a valid pointer to an array of pInfos[i]->geometryCount VkAccelerationStructureBuildOffsetInfoKHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBuildAccelerationStructureKHR-pOffsetInfos-03402)"},
- {"VUID-vkBuildAccelerationStructureKHR-ppOffsetInfos-parameter", "ppOffsetInfos must be a valid pointer to an array of infoCount VkAccelerationStructureBuildOffsetInfoKHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBuildAccelerationStructureKHR-ppOffsetInfos-parameter)"},
- {"VUID-vkBuildAccelerationStructureKHR-rayTracingHostAccelerationStructureCommands-03439", "The VkPhysicalDeviceRayTracingFeaturesKHR->rayTracingHostAccelerationStructureCommands feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkBuildAccelerationStructureKHR-rayTracingHostAccelerationStructureCommands-03439)"},
- {"VUID-vkCmdBeginConditionalRenderingEXT-None-01980", "Conditional rendering must not already be active (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginConditionalRenderingEXT-None-01980)"},
- {"VUID-vkCmdBeginConditionalRenderingEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginConditionalRenderingEXT-commandBuffer-cmdpool)"},
- {"VUID-vkCmdBeginConditionalRenderingEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginConditionalRenderingEXT-commandBuffer-parameter)"},
- {"VUID-vkCmdBeginConditionalRenderingEXT-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginConditionalRenderingEXT-commandBuffer-recording)"},
- {"VUID-vkCmdBeginConditionalRenderingEXT-pConditionalRenderingBegin-parameter", "pConditionalRenderingBegin must be a valid pointer to a valid VkConditionalRenderingBeginInfoEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginConditionalRenderingEXT-pConditionalRenderingBegin-parameter)"},
- {"VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-cmdpool)"},
- {"VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-parameter)"},
- {"VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-recording)"},
- {"VUID-vkCmdBeginDebugUtilsLabelEXT-pLabelInfo-parameter", "pLabelInfo must be a valid pointer to a valid VkDebugUtilsLabelEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginDebugUtilsLabelEXT-pLabelInfo-parameter)"},
- {"VUID-vkCmdBeginQuery-None-00807", "All queries used by the command must be unavailable (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-None-00807)"},
- {"VUID-vkCmdBeginQuery-None-02863", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, this command must not be recorded in a command buffer that, either directly or through secondary command buffers, also contains a vkCmdResetQueryPool command affecting the same query. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-None-02863)"},
- {"VUID-vkCmdBeginQuery-commandBuffer-01885", "commandBuffer must not be a protected command buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-commandBuffer-01885)"},
- {"VUID-vkCmdBeginQuery-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-commandBuffer-cmdpool)"},
- {"VUID-vkCmdBeginQuery-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-commandBuffer-parameter)"},
- {"VUID-vkCmdBeginQuery-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-commandBuffer-recording)"},
- {"VUID-vkCmdBeginQuery-commonparent", "Both of commandBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-commonparent)"},
- {"VUID-vkCmdBeginQuery-flags-parameter", "flags must be a valid combination of VkQueryControlFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-flags-parameter)"},
- {"VUID-vkCmdBeginQuery-query-00802", "query must be less than the number of queries in queryPool (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-query-00802)"},
- {"VUID-vkCmdBeginQuery-query-00808", "If called within a render pass instance, the sum of query and the number of bits set in the current subpass's view mask must be less than or equal to the number of queries in queryPool (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-query-00808)"},
- {"VUID-vkCmdBeginQuery-queryPool-01922", "queryPool must have been created with a queryType that differs from that of any queries that are active within commandBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-queryPool-01922)"},
- {"VUID-vkCmdBeginQuery-queryPool-03223", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, the profiling lock must have been held before vkBeginCommandBuffer was called on commandBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-queryPool-03223)"},
- {"VUID-vkCmdBeginQuery-queryPool-03224", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR and one of the counters used to create queryPool was VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR, the query begin must be the first recorded command in commandBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-queryPool-03224)"},
- {"VUID-vkCmdBeginQuery-queryPool-03225", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR and one of the counters used to create queryPool was VK_PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR, the begin command must not be recorded within a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-queryPool-03225)"},
- {"VUID-vkCmdBeginQuery-queryPool-03226", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR and another query pool with a queryType VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR has been used within commandBuffer, its parent primary command buffer or secondary command buffer recorded within the same parent primary command buffer as commandBuffer, the performanceCounterMultipleQueryPools feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-queryPool-03226)"},
- {"VUID-vkCmdBeginQuery-queryPool-parameter", "queryPool must be a valid VkQueryPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-queryPool-parameter)"},
- {"VUID-vkCmdBeginQuery-queryType-00800", "If the precise occlusion queries feature is not enabled, or the queryType used to create queryPool was not VK_QUERY_TYPE_OCCLUSION, flags must not contain VK_QUERY_CONTROL_PRECISE_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-queryType-00800)"},
- {"VUID-vkCmdBeginQuery-queryType-00803", "If the queryType used to create queryPool was VK_QUERY_TYPE_OCCLUSION, the VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-queryType-00803)"},
- {"VUID-vkCmdBeginQuery-queryType-00804", "If the queryType used to create queryPool was VK_QUERY_TYPE_PIPELINE_STATISTICS and any of the pipelineStatistics indicate graphics operations, the VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-queryType-00804)"},
- {"VUID-vkCmdBeginQuery-queryType-00805", "If the queryType used to create queryPool was VK_QUERY_TYPE_PIPELINE_STATISTICS and any of the pipelineStatistics indicate compute operations, the VkCommandPool that commandBuffer was allocated from must support compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-queryType-00805)"},
- {"VUID-vkCmdBeginQuery-queryType-02327", "If the queryType used to create queryPool was VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT the VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-queryType-02327)"},
- {"VUID-vkCmdBeginQuery-queryType-02328", "If the queryType used to create queryPool was VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT then VkPhysicalDeviceTransformFeedbackPropertiesEXT::transformFeedbackQueries must be supported (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-queryType-02328)"},
- {"VUID-vkCmdBeginQuery-queryType-02804", "The queryType used to create queryPool must not be VK_QUERY_TYPE_TIMESTAMP (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQuery-queryType-02804)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-None-00807", "All queries used by the command must be unavailable (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-None-00807)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-None-02863", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, this command must not be recorded in a command buffer that, either directly or through secondary command buffers, also contains a vkCmdResetQueryPool command affecting the same query. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-None-02863)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-commandBuffer-01885", "commandBuffer must not be a protected command buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-commandBuffer-01885)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-commandBuffer-cmdpool)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-commandBuffer-parameter)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-commandBuffer-recording)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-commonparent", "Both of commandBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-commonparent)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-flags-parameter", "flags must be a valid combination of VkQueryControlFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-flags-parameter)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-query-00802", "query must be less than the number of queries in queryPool (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-query-00802)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-query-00808", "If called within a render pass instance, the sum of query and the number of bits set in the current subpass's view mask must be less than or equal to the number of queries in queryPool (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-query-00808)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-queryPool-01922", "queryPool must have been created with a queryType that differs from that of any queries that are active within commandBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-queryPool-01922)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-queryPool-03223", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, the profiling lock must have been held before vkBeginCommandBuffer was called on commandBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-queryPool-03223)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-queryPool-03224", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR and one of the counters used to create queryPool was VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR, the query begin must be the first recorded command in commandBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-queryPool-03224)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-queryPool-03225", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR and one of the counters used to create queryPool was VK_PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR, the begin command must not be recorded within a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-queryPool-03225)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-queryPool-03226", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR and another query pool with a queryType VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR has been used within commandBuffer, its parent primary command buffer or secondary command buffer recorded within the same parent primary command buffer as commandBuffer, the performanceCounterMultipleQueryPools feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-queryPool-03226)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-queryPool-parameter", "queryPool must be a valid VkQueryPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-queryPool-parameter)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-queryType-00800", "If the precise occlusion queries feature is not enabled, or the queryType used to create queryPool was not VK_QUERY_TYPE_OCCLUSION, flags must not contain VK_QUERY_CONTROL_PRECISE_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-queryType-00800)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-queryType-00803", "If the queryType used to create queryPool was VK_QUERY_TYPE_OCCLUSION, the VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-queryType-00803)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-queryType-00804", "If the queryType used to create queryPool was VK_QUERY_TYPE_PIPELINE_STATISTICS and any of the pipelineStatistics indicate graphics operations, the VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-queryType-00804)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-queryType-00805", "If the queryType used to create queryPool was VK_QUERY_TYPE_PIPELINE_STATISTICS and any of the pipelineStatistics indicate compute operations, the VkCommandPool that commandBuffer was allocated from must support compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-queryType-00805)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-queryType-02338", "If the queryType used to create queryPool was VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT the VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-queryType-02338)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-queryType-02339", "If the queryType used to create queryPool was VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT the index parameter must be less than VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackStreams (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-queryType-02339)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-queryType-02340", "If the queryType used to create queryPool was not VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT the index must be zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-queryType-02340)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-queryType-02341", "If the queryType used to create queryPool was VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT then VkPhysicalDeviceTransformFeedbackPropertiesEXT::transformFeedbackQueries must be supported (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-queryType-02341)"},
- {"VUID-vkCmdBeginQueryIndexedEXT-queryType-02804", "The queryType used to create queryPool must not be VK_QUERY_TYPE_TIMESTAMP (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginQueryIndexedEXT-queryType-02804)"},
- {"VUID-vkCmdBeginRenderPass-bufferlevel", "commandBuffer must be a primary VkCommandBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass-bufferlevel)"},
- {"VUID-vkCmdBeginRenderPass-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass-commandBuffer-cmdpool)"},
- {"VUID-vkCmdBeginRenderPass-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass-commandBuffer-parameter)"},
- {"VUID-vkCmdBeginRenderPass-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass-commandBuffer-recording)"},
- {"VUID-vkCmdBeginRenderPass-contents-parameter", "contents must be a valid VkSubpassContents value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass-contents-parameter)"},
- {"VUID-vkCmdBeginRenderPass-framebuffer-02532", "For any attachment in framebuffer that is used by renderPass and is bound to memory locations that are also bound to another attachment used by renderPass, and if at least one of those uses causes either attachment to be written to, both attachments must have had the VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass-framebuffer-02532)"},
- {"VUID-vkCmdBeginRenderPass-initialLayout-00895", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass-initialLayout-00895)"},
- {"VUID-vkCmdBeginRenderPass-initialLayout-00896", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdBeginRenderPass-initialLayout-00896)"},
- {"VUID-vkCmdBeginRenderPass-initialLayout-00897", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass-initialLayout-00897)"},
- {"VUID-vkCmdBeginRenderPass-initialLayout-00898", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_TRANSFER_SRC_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass-initialLayout-00898)"},
- {"VUID-vkCmdBeginRenderPass-initialLayout-00899", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_TRANSFER_DST_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass-initialLayout-00899)"},
- {"VUID-vkCmdBeginRenderPass-initialLayout-00900", "If any of the initialLayout members of the VkAttachmentDescription structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is not VK_IMAGE_LAYOUT_UNDEFINED, then each such initialLayout must be equal to the current layout of the corresponding attachment image subresource of the framebuffer specified in the framebuffer member of pRenderPassBegin (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass-initialLayout-00900)"},
- {"VUID-vkCmdBeginRenderPass-initialLayout-01758", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass-initialLayout-01758)"},
- {"VUID-vkCmdBeginRenderPass-initialLayout-02842", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass-initialLayout-02842)"},
- {"VUID-vkCmdBeginRenderPass-pRenderPassBegin-parameter", "pRenderPassBegin must be a valid pointer to a valid VkRenderPassBeginInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass-pRenderPassBegin-parameter)"},
- {"VUID-vkCmdBeginRenderPass-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass-renderpass)"},
- {"VUID-vkCmdBeginRenderPass-srcStageMask-00901", "The srcStageMask and dstStageMask members of any element of the pDependencies member of VkRenderPassCreateInfo used to create renderPass must be supported by the capabilities of the queue family identified by the queueFamilyIndex member of the VkCommandPoolCreateInfo used to create the command pool which commandBuffer was allocated from (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass-srcStageMask-00901)"},
- {"VUID-vkCmdBeginRenderPass-stencilInitialLayout-02843", "If any of the stencilInitialLayout or stencilFinalLayout member of the VkAttachmentDescriptionStencilLayout structures or the stencilLayout member of the VkAttachmentReferenceStencilLayout structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass-stencilInitialLayout-02843)"},
- {"VUID-vkCmdBeginRenderPass2-bufferlevel", "commandBuffer must be a primary VkCommandBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass2-bufferlevel)"},
- {"VUID-vkCmdBeginRenderPass2-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass2-commandBuffer-cmdpool)"},
- {"VUID-vkCmdBeginRenderPass2-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass2-commandBuffer-parameter)"},
- {"VUID-vkCmdBeginRenderPass2-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass2-commandBuffer-recording)"},
- {"VUID-vkCmdBeginRenderPass2-framebuffer-02533", "For any attachment in framebuffer that is used by renderPass and is bound to memory locations that are also bound to another attachment used by renderPass, and if at least one of those uses causes either attachment to be written to, both attachments must have had the VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass2-framebuffer-02533)"},
- {"VUID-vkCmdBeginRenderPass2-framebuffer-02779", "Both the framebuffer and renderPass members of pRenderPassBegin must have been created on the same VkDevice that commandBuffer was allocated on (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass2-framebuffer-02779)"},
- {"VUID-vkCmdBeginRenderPass2-initialLayout-02844", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass2-initialLayout-02844)"},
- {"VUID-vkCmdBeginRenderPass2-initialLayout-03094", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass2-initialLayout-03094)"},
- {"VUID-vkCmdBeginRenderPass2-initialLayout-03096", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass2-initialLayout-03096)"},
- {"VUID-vkCmdBeginRenderPass2-initialLayout-03097", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass2-initialLayout-03097)"},
- {"VUID-vkCmdBeginRenderPass2-initialLayout-03098", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_TRANSFER_SRC_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass2-initialLayout-03098)"},
- {"VUID-vkCmdBeginRenderPass2-initialLayout-03099", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_TRANSFER_DST_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass2-initialLayout-03099)"},
- {"VUID-vkCmdBeginRenderPass2-initialLayout-03100", "If any of the initialLayout members of the VkAttachmentDescription structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is not VK_IMAGE_LAYOUT_UNDEFINED, then each such initialLayout must be equal to the current layout of the corresponding attachment image subresource of the framebuffer specified in the framebuffer member of pRenderPassBegin (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass2-initialLayout-03100)"},
- {"VUID-vkCmdBeginRenderPass2-pRenderPassBegin-parameter", "pRenderPassBegin must be a valid pointer to a valid VkRenderPassBeginInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass2-pRenderPassBegin-parameter)"},
- {"VUID-vkCmdBeginRenderPass2-pSubpassBeginInfo-parameter", "pSubpassBeginInfo must be a valid pointer to a valid VkSubpassBeginInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass2-pSubpassBeginInfo-parameter)"},
- {"VUID-vkCmdBeginRenderPass2-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass2-renderpass)"},
- {"VUID-vkCmdBeginRenderPass2-srcStageMask-03101", "The srcStageMask and dstStageMask members of any element of the pDependencies member of VkRenderPassCreateInfo used to create renderPass must be supported by the capabilities of the queue family identified by the queueFamilyIndex member of the VkCommandPoolCreateInfo used to create the command pool which commandBuffer was allocated from (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass2-srcStageMask-03101)"},
- {"VUID-vkCmdBeginRenderPass2-stencilInitialLayout-02845", "If any of the stencilInitialLayout or stencilFinalLayout member of the VkAttachmentDescriptionStencilLayout structures or the stencilLayout member of the VkAttachmentReferenceStencilLayout structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginRenderPass2-stencilInitialLayout-02845)"},
- {"VUID-vkCmdBeginTransformFeedbackEXT-None-02367", "Transform feedback must not be active (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginTransformFeedbackEXT-None-02367)"},
- {"VUID-vkCmdBeginTransformFeedbackEXT-None-02373", "Transform feedback must not be made active in a render pass instance with multiview enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginTransformFeedbackEXT-None-02373)"},
- {"VUID-vkCmdBeginTransformFeedbackEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginTransformFeedbackEXT-commandBuffer-cmdpool)"},
- {"VUID-vkCmdBeginTransformFeedbackEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginTransformFeedbackEXT-commandBuffer-parameter)"},
- {"VUID-vkCmdBeginTransformFeedbackEXT-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginTransformFeedbackEXT-commandBuffer-recording)"},
- {"VUID-vkCmdBeginTransformFeedbackEXT-commonparent", "Both of commandBuffer, and the elements of pCounterBuffers that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginTransformFeedbackEXT-commonparent)"},
- {"VUID-vkCmdBeginTransformFeedbackEXT-counterBufferCount-02607", "If counterBufferCount is not 0, and pCounterBuffers is not NULL, pCounterBuffers must be a valid pointer to an array of counterBufferCount VkBuffer handles that are either valid or VK_NULL_HANDLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginTransformFeedbackEXT-counterBufferCount-02607)"},
- {"VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02368", "firstCounterBuffer must be less than VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02368)"},
- {"VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369", "The sum of firstCounterBuffer and counterBufferCount must be less than or equal to VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369)"},
- {"VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffer-02371", "If pCounterBuffer is NULL, then pCounterBufferOffsets must also be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffer-02371)"},
- {"VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-02370", "For each buffer handle in the array, if it is not VK_NULL_HANDLE it must reference a buffer large enough to hold 4 bytes at the corresponding offset from the pCounterBufferOffsets array (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-02370)"},
- {"VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-parameter", "If counterBufferCount is not 0, and pCounterBufferOffsets is not NULL, pCounterBufferOffsets must be a valid pointer to an array of counterBufferCount VkDeviceSize values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-parameter)"},
- {"VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffers-02372", "For each buffer handle in the pCounterBuffers array that is not VK_NULL_HANDLE it must have been created with a usage value containing VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffers-02372)"},
- {"VUID-vkCmdBeginTransformFeedbackEXT-renderpass", "This command must only be called inside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginTransformFeedbackEXT-renderpass)"},
- {"VUID-vkCmdBeginTransformFeedbackEXT-transformFeedback-02366", "VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBeginTransformFeedbackEXT-transformFeedback-02366)"},
- {"VUID-vkCmdBindDescriptorSets-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindDescriptorSets-commandBuffer-cmdpool)"},
- {"VUID-vkCmdBindDescriptorSets-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindDescriptorSets-commandBuffer-parameter)"},
- {"VUID-vkCmdBindDescriptorSets-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindDescriptorSets-commandBuffer-recording)"},
- {"VUID-vkCmdBindDescriptorSets-commonparent", "Each of commandBuffer, layout, and the elements of pDescriptorSets must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindDescriptorSets-commonparent)"},
- {"VUID-vkCmdBindDescriptorSets-descriptorSetCount-arraylength", "descriptorSetCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindDescriptorSets-descriptorSetCount-arraylength)"},
- {"VUID-vkCmdBindDescriptorSets-dynamicOffsetCount-00359", "dynamicOffsetCount must be equal to the total number of dynamic descriptors in pDescriptorSets (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindDescriptorSets-dynamicOffsetCount-00359)"},
- {"VUID-vkCmdBindDescriptorSets-firstSet-00360", "The sum of firstSet and descriptorSetCount must be less than or equal to VkPipelineLayoutCreateInfo::setLayoutCount provided when layout was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindDescriptorSets-firstSet-00360)"},
- {"VUID-vkCmdBindDescriptorSets-layout-parameter", "layout must be a valid VkPipelineLayout handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindDescriptorSets-layout-parameter)"},
- {"VUID-vkCmdBindDescriptorSets-pDescriptorSets-00358", "Each element of pDescriptorSets must have been allocated with a VkDescriptorSetLayout that matches (is the same as, or identically defined as) the VkDescriptorSetLayout at set n in layout, where n is the sum of firstSet and the index into pDescriptorSets (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindDescriptorSets-pDescriptorSets-00358)"},
- {"VUID-vkCmdBindDescriptorSets-pDescriptorSets-01979", "For each dynamic uniform or storage buffer binding in pDescriptorSets, the sum of the effective offset, as defined above, and the range of the binding must be less than or equal to the size of the buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindDescriptorSets-pDescriptorSets-01979)"},
- {"VUID-vkCmdBindDescriptorSets-pDescriptorSets-parameter", "pDescriptorSets must be a valid pointer to an array of descriptorSetCount valid VkDescriptorSet handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindDescriptorSets-pDescriptorSets-parameter)"},
- {"VUID-vkCmdBindDescriptorSets-pDynamicOffsets-01971", "Each element of pDynamicOffsets which corresponds to a descriptor binding with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC must be a multiple of VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindDescriptorSets-pDynamicOffsets-01971)"},
- {"VUID-vkCmdBindDescriptorSets-pDynamicOffsets-01972", "Each element of pDynamicOffsets which corresponds to a descriptor binding with type VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC must be a multiple of VkPhysicalDeviceLimits::minStorageBufferOffsetAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindDescriptorSets-pDynamicOffsets-01972)"},
- {"VUID-vkCmdBindDescriptorSets-pDynamicOffsets-parameter", "If dynamicOffsetCount is not 0, pDynamicOffsets must be a valid pointer to an array of dynamicOffsetCount uint32_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindDescriptorSets-pDynamicOffsets-parameter)"},
- {"VUID-vkCmdBindDescriptorSets-pipelineBindPoint-00361", "pipelineBindPoint must be supported by the commandBuffer's parent VkCommandPool's queue family (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindDescriptorSets-pipelineBindPoint-00361)"},
- {"VUID-vkCmdBindDescriptorSets-pipelineBindPoint-parameter", "pipelineBindPoint must be a valid VkPipelineBindPoint value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindDescriptorSets-pipelineBindPoint-parameter)"},
- {"VUID-vkCmdBindIndexBuffer-buffer-00433", "buffer must have been created with the VK_BUFFER_USAGE_INDEX_BUFFER_BIT flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindIndexBuffer-buffer-00433)"},
- {"VUID-vkCmdBindIndexBuffer-buffer-00434", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindIndexBuffer-buffer-00434)"},
- {"VUID-vkCmdBindIndexBuffer-buffer-parameter", "buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindIndexBuffer-buffer-parameter)"},
- {"VUID-vkCmdBindIndexBuffer-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindIndexBuffer-commandBuffer-cmdpool)"},
- {"VUID-vkCmdBindIndexBuffer-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindIndexBuffer-commandBuffer-parameter)"},
- {"VUID-vkCmdBindIndexBuffer-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindIndexBuffer-commandBuffer-recording)"},
- {"VUID-vkCmdBindIndexBuffer-commonparent", "Both of buffer, and commandBuffer must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindIndexBuffer-commonparent)"},
- {"VUID-vkCmdBindIndexBuffer-indexType-02507", "indexType must not be VK_INDEX_TYPE_NONE_KHR. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindIndexBuffer-indexType-02507)"},
- {"VUID-vkCmdBindIndexBuffer-indexType-02765", "If indexType is VK_INDEX_TYPE_UINT8_EXT, the indexTypeUint8 feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindIndexBuffer-indexType-02765)"},
- {"VUID-vkCmdBindIndexBuffer-indexType-parameter", "indexType must be a valid VkIndexType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindIndexBuffer-indexType-parameter)"},
- {"VUID-vkCmdBindIndexBuffer-offset-00431", "offset must be less than the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindIndexBuffer-offset-00431)"},
- {"VUID-vkCmdBindIndexBuffer-offset-00432", "The sum of offset and the address of the range of VkDeviceMemory object that is backing buffer, must be a multiple of the type indicated by indexType (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindIndexBuffer-offset-00432)"},
- {"VUID-vkCmdBindPipeline-None-02323", "This command must not be recorded when transform feedback is active (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipeline-None-02323)"},
- {"VUID-vkCmdBindPipeline-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipeline-commandBuffer-cmdpool)"},
- {"VUID-vkCmdBindPipeline-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipeline-commandBuffer-parameter)"},
- {"VUID-vkCmdBindPipeline-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipeline-commandBuffer-recording)"},
- {"VUID-vkCmdBindPipeline-commonparent", "Both of commandBuffer, and pipeline must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipeline-commonparent)"},
- {"VUID-vkCmdBindPipeline-pipeline-00781", "If the variable multisample rate feature is not supported, pipeline is a graphics pipeline, the current subpass has no attachments, and this is not the first call to this function with a graphics pipeline after transitioning to the current subpass, then the sample count specified by this pipeline must match that set in the previous pipeline (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipeline-pipeline-00781)"},
- {"VUID-vkCmdBindPipeline-pipeline-03382", "The pipeline must not have been created with VK_PIPELINE_CREATE_LIBRARY_BIT_KHR set. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipeline-pipeline-03382)"},
- {"VUID-vkCmdBindPipeline-pipeline-parameter", "pipeline must be a valid VkPipeline handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipeline-pipeline-parameter)"},
- {"VUID-vkCmdBindPipeline-pipelineBindPoint-00777", "If pipelineBindPoint is VK_PIPELINE_BIND_POINT_COMPUTE, the VkCommandPool that commandBuffer was allocated from must support compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipeline-pipelineBindPoint-00777)"},
- {"VUID-vkCmdBindPipeline-pipelineBindPoint-00778", "If pipelineBindPoint is VK_PIPELINE_BIND_POINT_GRAPHICS, the VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipeline-pipelineBindPoint-00778)"},
- {"VUID-vkCmdBindPipeline-pipelineBindPoint-00779", "If pipelineBindPoint is VK_PIPELINE_BIND_POINT_COMPUTE, pipeline must be a compute pipeline (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipeline-pipelineBindPoint-00779)"},
- {"VUID-vkCmdBindPipeline-pipelineBindPoint-00780", "If pipelineBindPoint is VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline must be a graphics pipeline (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipeline-pipelineBindPoint-00780)"},
- {"VUID-vkCmdBindPipeline-pipelineBindPoint-02391", "If pipelineBindPoint is VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, the VkCommandPool that commandBuffer was allocated from must support compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipeline-pipelineBindPoint-02391)"},
- {"VUID-vkCmdBindPipeline-pipelineBindPoint-02392", "If pipelineBindPoint is VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, the pipeline must be a ray tracing pipeline (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipeline-pipelineBindPoint-02392)"},
- {"VUID-vkCmdBindPipeline-pipelineBindPoint-parameter", "pipelineBindPoint must be a valid VkPipelineBindPoint value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipeline-pipelineBindPoint-parameter)"},
- {"VUID-vkCmdBindPipeline-variableSampleLocations-01525", "If VkPhysicalDeviceSampleLocationsPropertiesEXT::variableSampleLocations is VK_FALSE, and pipeline is a graphics pipeline created with a VkPipelineSampleLocationsStateCreateInfoEXT structure having its sampleLocationsEnable member set to VK_TRUE but without VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT enabled then the current render pass instance must have been begun by specifying a VkRenderPassSampleLocationsBeginInfoEXT structure whose pPostSubpassSampleLocations member contains an element with a subpassIndex matching the current subpass index and the sampleLocationsInfo member of that element must match the sampleLocationsInfo specified in VkPipelineSampleLocationsStateCreateInfoEXT when the pipeline was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipeline-variableSampleLocations-01525)"},
- {"VUID-vkCmdBindPipelineShaderGroupNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipelineShaderGroupNV-commandBuffer-cmdpool)"},
- {"VUID-vkCmdBindPipelineShaderGroupNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipelineShaderGroupNV-commandBuffer-parameter)"},
- {"VUID-vkCmdBindPipelineShaderGroupNV-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipelineShaderGroupNV-commandBuffer-recording)"},
- {"VUID-vkCmdBindPipelineShaderGroupNV-commonparent", "Both of commandBuffer, and pipeline must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipelineShaderGroupNV-commonparent)"},
- {"VUID-vkCmdBindPipelineShaderGroupNV-deviceGeneratedCommands-02896", "The VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV->deviceGeneratedCommands feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipelineShaderGroupNV-deviceGeneratedCommands-02896)"},
- {"VUID-vkCmdBindPipelineShaderGroupNV-groupIndex-02893", "groupIndex must be 0 or less than the effective VkGraphicsPipelineShaderGroupsCreateInfoNV::groupCount including the referenced pipelines. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipelineShaderGroupNV-groupIndex-02893)"},
- {"VUID-vkCmdBindPipelineShaderGroupNV-groupIndex-02895", "The same restrictions as vkCmdBindPipeline apply as if the bound pipeline was created only with the Shader Group from the groupIndex information. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipelineShaderGroupNV-groupIndex-02895)"},
- {"VUID-vkCmdBindPipelineShaderGroupNV-pipeline-parameter", "pipeline must be a valid VkPipeline handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipelineShaderGroupNV-pipeline-parameter)"},
- {"VUID-vkCmdBindPipelineShaderGroupNV-pipelineBindPoint-02894", "The pipelineBindPoint must be VK_PIPELINE_BIND_POINT_GRAPHICS (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipelineShaderGroupNV-pipelineBindPoint-02894)"},
- {"VUID-vkCmdBindPipelineShaderGroupNV-pipelineBindPoint-parameter", "pipelineBindPoint must be a valid VkPipelineBindPoint value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindPipelineShaderGroupNV-pipelineBindPoint-parameter)"},
- {"VUID-vkCmdBindShadingRateImageNV-None-02058", "The shading rate image feature must be enabled. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindShadingRateImageNV-None-02058)"},
- {"VUID-vkCmdBindShadingRateImageNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindShadingRateImageNV-commandBuffer-cmdpool)"},
- {"VUID-vkCmdBindShadingRateImageNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindShadingRateImageNV-commandBuffer-parameter)"},
- {"VUID-vkCmdBindShadingRateImageNV-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindShadingRateImageNV-commandBuffer-recording)"},
- {"VUID-vkCmdBindShadingRateImageNV-commonparent", "Both of commandBuffer, and imageView that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindShadingRateImageNV-commonparent)"},
- {"VUID-vkCmdBindShadingRateImageNV-imageLayout-02063", "If imageView is not VK_NULL_HANDLE, imageLayout must be VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV or VK_IMAGE_LAYOUT_GENERAL. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindShadingRateImageNV-imageLayout-02063)"},
- {"VUID-vkCmdBindShadingRateImageNV-imageLayout-parameter", "imageLayout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindShadingRateImageNV-imageLayout-parameter)"},
- {"VUID-vkCmdBindShadingRateImageNV-imageView-02059", "If imageView is not VK_NULL_HANDLE, it must be a valid VkImageView handle of type VK_IMAGE_VIEW_TYPE_2D or VK_IMAGE_VIEW_TYPE_2D_ARRAY. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindShadingRateImageNV-imageView-02059)"},
- {"VUID-vkCmdBindShadingRateImageNV-imageView-02060", "If imageView is not VK_NULL_HANDLE, it must have a format of VK_FORMAT_R8_UINT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindShadingRateImageNV-imageView-02060)"},
- {"VUID-vkCmdBindShadingRateImageNV-imageView-02061", "If imageView is not VK_NULL_HANDLE, it must have been created with a usage value including VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindShadingRateImageNV-imageView-02061)"},
- {"VUID-vkCmdBindShadingRateImageNV-imageView-02062", "If imageView is not VK_NULL_HANDLE, imageLayout must match the actual VkImageLayout of each subresource accessible from imageView at the time the subresource is accessed. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindShadingRateImageNV-imageView-02062)"},
- {"VUID-vkCmdBindShadingRateImageNV-imageView-parameter", "If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindShadingRateImageNV-imageView-parameter)"},
- {"VUID-vkCmdBindTransformFeedbackBuffersEXT-None-02365", "Transform feedback must not be active when the vkCmdBindTransformFeedbackBuffersEXT command is recorded (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindTransformFeedbackBuffersEXT-None-02365)"},
- {"VUID-vkCmdBindTransformFeedbackBuffersEXT-bindingCount-arraylength", "If pSizes is not NULL, bindingCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindTransformFeedbackBuffersEXT-bindingCount-arraylength)"},
- {"VUID-vkCmdBindTransformFeedbackBuffersEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindTransformFeedbackBuffersEXT-commandBuffer-cmdpool)"},
- {"VUID-vkCmdBindTransformFeedbackBuffersEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindTransformFeedbackBuffersEXT-commandBuffer-parameter)"},
- {"VUID-vkCmdBindTransformFeedbackBuffersEXT-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindTransformFeedbackBuffersEXT-commandBuffer-recording)"},
- {"VUID-vkCmdBindTransformFeedbackBuffersEXT-commonparent", "Both of commandBuffer, and the elements of pBuffers must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindTransformFeedbackBuffersEXT-commonparent)"},
- {"VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02356", "firstBinding must be less than VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02356)"},
- {"VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357", "The sum of firstBinding and bindingCount must be less than or equal to VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357)"},
- {"VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02360", "All elements of pBuffers must have been created with the VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02360)"},
- {"VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02364", "Each element of pBuffers that is non-sparse must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02364)"},
- {"VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-parameter", "pBuffers must be a valid pointer to an array of bindingCount valid VkBuffer handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-parameter)"},
- {"VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02358", "All elements of pOffsets must be less than the size of the corresponding element in pBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02358)"},
- {"VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02359", "All elements of pOffsets must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02359)"},
- {"VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02363", "All elements of pOffsets plus pSizes, where the pSizes, element is not VK_WHOLE_SIZE, must be less than or equal to the size of the corresponding element in pBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02363)"},
- {"VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-parameter", "pOffsets must be a valid pointer to an array of bindingCount VkDeviceSize values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-parameter)"},
- {"VUID-vkCmdBindTransformFeedbackBuffersEXT-pSize-02361", "If the optional pSize array is specified, each element of pSizes must either be VK_WHOLE_SIZE, or be less than or equal to VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackBufferSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindTransformFeedbackBuffersEXT-pSize-02361)"},
- {"VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-02362", "All elements of pSizes must be less than or equal to the size of the corresponding buffer in pBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-02362)"},
- {"VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-parameter", "If pSizes is not NULL, pSizes must be a valid pointer to an array of bindingCount VkDeviceSize values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-parameter)"},
- {"VUID-vkCmdBindTransformFeedbackBuffersEXT-transformFeedback-02355", "VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindTransformFeedbackBuffersEXT-transformFeedback-02355)"},
- {"VUID-vkCmdBindVertexBuffers-bindingCount-arraylength", "bindingCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindVertexBuffers-bindingCount-arraylength)"},
- {"VUID-vkCmdBindVertexBuffers-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindVertexBuffers-commandBuffer-cmdpool)"},
- {"VUID-vkCmdBindVertexBuffers-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindVertexBuffers-commandBuffer-parameter)"},
- {"VUID-vkCmdBindVertexBuffers-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindVertexBuffers-commandBuffer-recording)"},
- {"VUID-vkCmdBindVertexBuffers-commonparent", "Both of commandBuffer, and the elements of pBuffers must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindVertexBuffers-commonparent)"},
- {"VUID-vkCmdBindVertexBuffers-firstBinding-00624", "firstBinding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindVertexBuffers-firstBinding-00624)"},
- {"VUID-vkCmdBindVertexBuffers-firstBinding-00625", "The sum of firstBinding and bindingCount must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindVertexBuffers-firstBinding-00625)"},
- {"VUID-vkCmdBindVertexBuffers-pBuffers-00627", "All elements of pBuffers must have been created with the VK_BUFFER_USAGE_VERTEX_BUFFER_BIT flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindVertexBuffers-pBuffers-00627)"},
- {"VUID-vkCmdBindVertexBuffers-pBuffers-00628", "Each element of pBuffers that is non-sparse must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindVertexBuffers-pBuffers-00628)"},
- {"VUID-vkCmdBindVertexBuffers-pBuffers-parameter", "pBuffers must be a valid pointer to an array of bindingCount valid VkBuffer handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindVertexBuffers-pBuffers-parameter)"},
- {"VUID-vkCmdBindVertexBuffers-pOffsets-00626", "All elements of pOffsets must be less than the size of the corresponding element in pBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindVertexBuffers-pOffsets-00626)"},
- {"VUID-vkCmdBindVertexBuffers-pOffsets-parameter", "pOffsets must be a valid pointer to an array of bindingCount VkDeviceSize values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBindVertexBuffers-pOffsets-parameter)"},
- {"VUID-vkCmdBlitImage-commandBuffer-01834", "If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-commandBuffer-01834)"},
- {"VUID-vkCmdBlitImage-commandBuffer-01835", "If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-commandBuffer-01835)"},
- {"VUID-vkCmdBlitImage-commandBuffer-01836", "If commandBuffer is a protected command buffer, then dstImage must not be an unprotected image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-commandBuffer-01836)"},
- {"VUID-vkCmdBlitImage-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-commandBuffer-cmdpool)"},
- {"VUID-vkCmdBlitImage-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-commandBuffer-parameter)"},
- {"VUID-vkCmdBlitImage-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-commandBuffer-recording)"},
- {"VUID-vkCmdBlitImage-commonparent", "Each of commandBuffer, dstImage, and srcImage must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-commonparent)"},
- {"VUID-vkCmdBlitImage-dstImage-00224", "dstImage must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-dstImage-00224)"},
- {"VUID-vkCmdBlitImage-dstImage-00225", "If dstImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-dstImage-00225)"},
- {"VUID-vkCmdBlitImage-dstImage-00234", "dstImage must have been created with a samples value of VK_SAMPLE_COUNT_1_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-dstImage-00234)"},
- {"VUID-vkCmdBlitImage-dstImage-01562", "dstImage must not use a format listed in Formats requiring sampler Y'CBCR conversion for VK_IMAGE_ASPECT_COLOR_BIT image views (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-dstImage-01562)"},
- {"VUID-vkCmdBlitImage-dstImage-02000", "The format features of dstImage must contain VK_FORMAT_FEATURE_BLIT_DST_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-dstImage-02000)"},
- {"VUID-vkCmdBlitImage-dstImage-02545", "dstImage and srcImage must not have been created with flags containing VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-dstImage-02545)"},
- {"VUID-vkCmdBlitImage-dstImage-parameter", "dstImage must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-dstImage-parameter)"},
- {"VUID-vkCmdBlitImage-dstImageLayout-00226", "dstImageLayout must specify the layout of the image subresources of dstImage specified in pRegions at the time this command is executed on a VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-dstImageLayout-00226)"},
- {"VUID-vkCmdBlitImage-dstImageLayout-00227", "dstImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL (https://www.khronos.org/registry/vulkan/specs/1.1/html/vkspec.html#VUID-vkCmdBlitImage-dstImageLayout-00227)"},
- {"VUID-vkCmdBlitImage-dstImageLayout-01399", "dstImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-dstImageLayout-01399)"},
- {"VUID-vkCmdBlitImage-dstImageLayout-parameter", "dstImageLayout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-dstImageLayout-parameter)"},
- {"VUID-vkCmdBlitImage-dstSubresource-01706", "The dstSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when dstImage was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-dstSubresource-01706)"},
- {"VUID-vkCmdBlitImage-dstSubresource-01708", "The dstSubresource.baseArrayLayer + dstSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when dstImage was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-dstSubresource-01708)"},
- {"VUID-vkCmdBlitImage-filter-00237", "If filter is VK_FILTER_CUBIC_EXT, srcImage must have a VkImageType of VK_IMAGE_TYPE_2D (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-filter-00237)"},
- {"VUID-vkCmdBlitImage-filter-02001", "If filter is VK_FILTER_LINEAR, then the format features of srcImage must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-filter-02001)"},
- {"VUID-vkCmdBlitImage-filter-02002", "If filter is VK_FILTER_CUBIC_EXT, then the format features of srcImage must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-filter-02002)"},
- {"VUID-vkCmdBlitImage-filter-parameter", "filter must be a valid VkFilter value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-filter-parameter)"},
- {"VUID-vkCmdBlitImage-pRegions-00215", "The source region specified by each element of pRegions must be a region that is contained within srcImage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-pRegions-00215)"},
- {"VUID-vkCmdBlitImage-pRegions-00216", "The destination region specified by each element of pRegions must be a region that is contained within dstImage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-pRegions-00216)"},
- {"VUID-vkCmdBlitImage-pRegions-00217", "The union of all destination regions, specified by the elements of pRegions, must not overlap in memory with any texel that may be sampled during the blit operation (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-pRegions-00217)"},
- {"VUID-vkCmdBlitImage-pRegions-parameter", "pRegions must be a valid pointer to an array of regionCount valid VkImageBlit structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-pRegions-parameter)"},
- {"VUID-vkCmdBlitImage-regionCount-arraylength", "regionCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-regionCount-arraylength)"},
- {"VUID-vkCmdBlitImage-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-renderpass)"},
- {"VUID-vkCmdBlitImage-srcImage-00219", "srcImage must have been created with VK_IMAGE_USAGE_TRANSFER_SRC_BIT usage flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-srcImage-00219)"},
- {"VUID-vkCmdBlitImage-srcImage-00220", "If srcImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-srcImage-00220)"},
- {"VUID-vkCmdBlitImage-srcImage-00228", "The sample count of srcImage and dstImage must both be equal to VK_SAMPLE_COUNT_1_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-srcImage-00228)"},
- {"VUID-vkCmdBlitImage-srcImage-00229", "If either of srcImage or dstImage was created with a signed integer VkFormat, the other must also have been created with a signed integer VkFormat (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-srcImage-00229)"},
- {"VUID-vkCmdBlitImage-srcImage-00230", "If either of srcImage or dstImage was created with an unsigned integer VkFormat, the other must also have been created with an unsigned integer VkFormat (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-srcImage-00230)"},
- {"VUID-vkCmdBlitImage-srcImage-00231", "If either of srcImage or dstImage was created with a depth/stencil format, the other must have exactly the same format (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-srcImage-00231)"},
- {"VUID-vkCmdBlitImage-srcImage-00232", "If srcImage was created with a depth/stencil format, filter must be VK_FILTER_NEAREST (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-srcImage-00232)"},
- {"VUID-vkCmdBlitImage-srcImage-00233", "srcImage must have been created with a samples value of VK_SAMPLE_COUNT_1_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-srcImage-00233)"},
- {"VUID-vkCmdBlitImage-srcImage-01561", "srcImage must not use a format listed in Formats requiring sampler Y'CBCR conversion for VK_IMAGE_ASPECT_COLOR_BIT image views (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-srcImage-01561)"},
- {"VUID-vkCmdBlitImage-srcImage-01999", "The format features of srcImage must contain VK_FORMAT_FEATURE_BLIT_SRC_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-srcImage-01999)"},
- {"VUID-vkCmdBlitImage-srcImage-parameter", "srcImage must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-srcImage-parameter)"},
- {"VUID-vkCmdBlitImage-srcImageLayout-00221", "srcImageLayout must specify the layout of the image subresources of srcImage specified in pRegions at the time this command is executed on a VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-srcImageLayout-00221)"},
- {"VUID-vkCmdBlitImage-srcImageLayout-00222", "srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL (https://www.khronos.org/registry/vulkan/specs/1.1/html/vkspec.html#VUID-vkCmdBlitImage-srcImageLayout-00222)"},
- {"VUID-vkCmdBlitImage-srcImageLayout-01398", "srcImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-srcImageLayout-01398)"},
- {"VUID-vkCmdBlitImage-srcImageLayout-parameter", "srcImageLayout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-srcImageLayout-parameter)"},
- {"VUID-vkCmdBlitImage-srcSubresource-01705", "The srcSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when srcImage was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-srcSubresource-01705)"},
- {"VUID-vkCmdBlitImage-srcSubresource-01707", "The srcSubresource.baseArrayLayer + srcSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when srcImage was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBlitImage-srcSubresource-01707)"},
- {"VUID-vkCmdBuildAccelerationStructureIndirectKHR-None-03533", "All VkDeviceOrHostAddressKHR or VkDeviceOrHostAddressConstKHR referenced by this command must contain valid device addresses (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureIndirectKHR-None-03533)"},
- {"VUID-vkCmdBuildAccelerationStructureIndirectKHR-None-03534", "All VkAccelerationStructureKHR objects referenced by this command must be bound to device memory (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureIndirectKHR-None-03534)"},
- {"VUID-vkCmdBuildAccelerationStructureIndirectKHR-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureIndirectKHR-commandBuffer-cmdpool)"},
- {"VUID-vkCmdBuildAccelerationStructureIndirectKHR-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureIndirectKHR-commandBuffer-parameter)"},
- {"VUID-vkCmdBuildAccelerationStructureIndirectKHR-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureIndirectKHR-commandBuffer-recording)"},
- {"VUID-vkCmdBuildAccelerationStructureIndirectKHR-commonparent", "Both of commandBuffer, and indirectBuffer must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureIndirectKHR-commonparent)"},
- {"VUID-vkCmdBuildAccelerationStructureIndirectKHR-indirectBuffer-parameter", "indirectBuffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureIndirectKHR-indirectBuffer-parameter)"},
- {"VUID-vkCmdBuildAccelerationStructureIndirectKHR-pInfo-parameter", "pInfo must be a valid pointer to a valid VkAccelerationStructureBuildGeometryInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureIndirectKHR-pInfo-parameter)"},
- {"VUID-vkCmdBuildAccelerationStructureIndirectKHR-pNext-03536", "The VkDeferredOperationInfoKHR structure must not be included in the pNext chain of any of the provided VkAccelerationStructureBuildGeometryInfoKHR structures. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureIndirectKHR-pNext-03536)"},
- {"VUID-vkCmdBuildAccelerationStructureIndirectKHR-rayTracingIndirectAccelerationStructureBuild-03535", "The VkPhysicalDeviceRayTracingFeaturesKHR->rayTracingIndirectAccelerationStructureBuild feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureIndirectKHR-rayTracingIndirectAccelerationStructureBuild-03535)"},
- {"VUID-vkCmdBuildAccelerationStructureIndirectKHR-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureIndirectKHR-renderpass)"},
- {"VUID-vkCmdBuildAccelerationStructureKHR-None-03407", "Any acceleration structure instance in any top level build in this command must not reference any bottom level acceleration structure built by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureKHR-None-03407)"},
- {"VUID-vkCmdBuildAccelerationStructureKHR-None-03409", "There must not be any memory aliasing between memory bound to any top level, bottom level, or instance acceleration structure accessed by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureKHR-None-03409)"},
- {"VUID-vkCmdBuildAccelerationStructureKHR-None-03530", "All VkDeviceOrHostAddressKHR or VkDeviceOrHostAddressConstKHR referenced by this command must contain valid device addresses (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureKHR-None-03530)"},
- {"VUID-vkCmdBuildAccelerationStructureKHR-None-03531", "All VkAccelerationStructureKHR objects referenced by this command must be bound to device memory (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureKHR-None-03531)"},
- {"VUID-vkCmdBuildAccelerationStructureKHR-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureKHR-commandBuffer-cmdpool)"},
- {"VUID-vkCmdBuildAccelerationStructureKHR-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureKHR-commandBuffer-parameter)"},
- {"VUID-vkCmdBuildAccelerationStructureKHR-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureKHR-commandBuffer-recording)"},
- {"VUID-vkCmdBuildAccelerationStructureKHR-infoCount-arraylength", "infoCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureKHR-infoCount-arraylength)"},
- {"VUID-vkCmdBuildAccelerationStructureKHR-pInfos-03403", "Each pInfos[i].srcAccelerationStructure must not refer to the same acceleration structure as any pInfos[i].dstAccelerationStructure that is provided to the same build command unless it is identical for an update (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureKHR-pInfos-03403)"},
- {"VUID-vkCmdBuildAccelerationStructureKHR-pInfos-03404", "For each pInfos[i], dstAccelerationStructure must have been created with compatible VkAccelerationStructureCreateInfoKHR where VkAccelerationStructureCreateInfoKHR::type and VkAccelerationStructureCreateInfoKHR::flags are identical to VkAccelerationStructureBuildGeometryInfoKHR::type and VkAccelerationStructureBuildGeometryInfoKHR::flags respectively, VkAccelerationStructureBuildGeometryInfoKHR::geometryCount for dstAccelerationStructure are greater than or equal to the build size, and each geometry in VkAccelerationStructureBuildGeometryInfoKHR::ppGeometries for dstAccelerationStructure has greater than or equal to the number of vertices, indices, and AABBs, VkAccelerationStructureGeometryTrianglesDataKHR::transformData is both 0 or both non-zero, and all other parameters are the same. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureKHR-pInfos-03404)"},
- {"VUID-vkCmdBuildAccelerationStructureKHR-pInfos-03405", "For each pInfos[i], if update is VK_TRUE, then objects that were previously active for that acceleration structure must not be made inactive as per Inactive Primitives and Instances (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureKHR-pInfos-03405)"},
- {"VUID-vkCmdBuildAccelerationStructureKHR-pInfos-03406", "For each pInfos[i], if update is VK_TRUE, then objects that were previously inactive for that acceleration structure must not be made active as per Inactive Primitives and Instances (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureKHR-pInfos-03406)"},
- {"VUID-vkCmdBuildAccelerationStructureKHR-pInfos-03408", "There must not be any memory aliasing between the scratch memories that are provided in all the pInfos[i].scratchData memories for the acceleration structure builds (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureKHR-pInfos-03408)"},
- {"VUID-vkCmdBuildAccelerationStructureKHR-pInfos-03529", "The buffer from which the buffer device address pInfos[i].scratchData is queried must have been created with VK_BUFFER_USAGE_RAY_TRACING_BIT_KHR usage flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureKHR-pInfos-03529)"},
- {"VUID-vkCmdBuildAccelerationStructureKHR-pInfos-parameter", "pInfos must be a valid pointer to an array of infoCount valid VkAccelerationStructureBuildGeometryInfoKHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureKHR-pInfos-parameter)"},
- {"VUID-vkCmdBuildAccelerationStructureKHR-pNext-03532", "The VkDeferredOperationInfoKHR structure must not be included in the pNext chain of any of the provided VkAccelerationStructureBuildGeometryInfoKHR structures. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureKHR-pNext-03532)"},
- {"VUID-vkCmdBuildAccelerationStructureKHR-pOffsetInfos-03402", "pOffsetInfos[i] must be a valid pointer to an array of pInfos[i]->geometryCount VkAccelerationStructureBuildOffsetInfoKHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureKHR-pOffsetInfos-03402)"},
- {"VUID-vkCmdBuildAccelerationStructureKHR-ppOffsetInfos-parameter", "ppOffsetInfos must be a valid pointer to an array of infoCount VkAccelerationStructureBuildOffsetInfoKHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureKHR-ppOffsetInfos-parameter)"},
- {"VUID-vkCmdBuildAccelerationStructureKHR-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureKHR-renderpass)"},
- {"VUID-vkCmdBuildAccelerationStructureKHR-update-03527", "If update is VK_FALSE, all addresses between pInfos[i].scratchData and pInfos[i].scratchData + N - 1 must be in the buffer device address range of the same buffer, where N is given by the size member of the VkMemoryRequirements structure returned from a call to vkGetAccelerationStructureMemoryRequirementsKHR with VkAccelerationStructureMemoryRequirementsInfoKHR::accelerationStructure set to pInfos[i].dstAccelerationStructure and VkAccelerationStructureMemoryRequirementsInfoKHR::type set to VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureKHR-update-03527)"},
- {"VUID-vkCmdBuildAccelerationStructureKHR-update-03528", "If update is VK_TRUE, all addresses between pInfos[i].scratchData and pInfos[i].scratchData + N - 1 must be in the buffer device address range of the same buffer, where N is given by the size member of the VkMemoryRequirements structure returned from a call to vkGetAccelerationStructureMemoryRequirementsKHR with VkAccelerationStructureMemoryRequirementsInfoKHR::accelerationStructure set to pInfos[i].dstAccelerationStructure and VkAccelerationStructureMemoryRequirementsInfoKHR::type set to VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureKHR-update-03528)"},
- {"VUID-vkCmdBuildAccelerationStructureNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureNV-commandBuffer-cmdpool)"},
- {"VUID-vkCmdBuildAccelerationStructureNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureNV-commandBuffer-parameter)"},
- {"VUID-vkCmdBuildAccelerationStructureNV-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureNV-commandBuffer-recording)"},
- {"VUID-vkCmdBuildAccelerationStructureNV-commonparent", "Each of commandBuffer, dst, instanceData, scratch, and src that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureNV-commonparent)"},
- {"VUID-vkCmdBuildAccelerationStructureNV-dst-02488", "dst must have been created with compatible VkAccelerationStructureInfoNV where VkAccelerationStructureInfoNV::type and VkAccelerationStructureInfoNV::flags are identical, VkAccelerationStructureInfoNV::instanceCount and VkAccelerationStructureInfoNV::geometryCount for dst are greater than or equal to the build size and each geometry in VkAccelerationStructureInfoNV::pGeometries for dst has greater than or equal to the number of vertices, indices, and AABBs. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureNV-dst-02488)"},
- {"VUID-vkCmdBuildAccelerationStructureNV-dst-parameter", "dst must be a valid VkAccelerationStructureKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureNV-dst-parameter)"},
- {"VUID-vkCmdBuildAccelerationStructureNV-geometryCount-02241", "geometryCount must be less than or equal to VkPhysicalDeviceRayTracingPropertiesNV::maxGeometryCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureNV-geometryCount-02241)"},
- {"VUID-vkCmdBuildAccelerationStructureNV-instanceData-03523", "If instanceData is not VK_NULL_HANDLE, instanceData must have been created with VK_BUFFER_USAGE_RAY_TRACING_BIT_NV usage flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureNV-instanceData-03523)"},
- {"VUID-vkCmdBuildAccelerationStructureNV-instanceData-parameter", "If instanceData is not VK_NULL_HANDLE, instanceData must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureNV-instanceData-parameter)"},
- {"VUID-vkCmdBuildAccelerationStructureNV-pInfo-parameter", "pInfo must be a valid pointer to a valid VkAccelerationStructureInfoNV structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureNV-pInfo-parameter)"},
- {"VUID-vkCmdBuildAccelerationStructureNV-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureNV-renderpass)"},
- {"VUID-vkCmdBuildAccelerationStructureNV-scratch-03522", "scratch must have been created with VK_BUFFER_USAGE_RAY_TRACING_BIT_NV usage flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureNV-scratch-03522)"},
- {"VUID-vkCmdBuildAccelerationStructureNV-scratch-parameter", "scratch must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureNV-scratch-parameter)"},
- {"VUID-vkCmdBuildAccelerationStructureNV-src-parameter", "If src is not VK_NULL_HANDLE, src must be a valid VkAccelerationStructureKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureNV-src-parameter)"},
- {"VUID-vkCmdBuildAccelerationStructureNV-update-02489", "If update is VK_TRUE, src must not be VK_NULL_HANDLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureNV-update-02489)"},
- {"VUID-vkCmdBuildAccelerationStructureNV-update-02490", "If update is VK_TRUE, src must have been built before with VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_NV set in VkAccelerationStructureInfoNV::flags (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureNV-update-02490)"},
- {"VUID-vkCmdBuildAccelerationStructureNV-update-02491", "If update is VK_FALSE, the size member of the VkMemoryRequirements structure returned from a call to vkGetAccelerationStructureMemoryRequirementsNV with VkAccelerationStructureMemoryRequirementsInfoNV::accelerationStructure set to dst and VkAccelerationStructureMemoryRequirementsInfoNV::type set to VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV must be less than or equal to the size of scratch minus scratchOffset (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureNV-update-02491)"},
- {"VUID-vkCmdBuildAccelerationStructureNV-update-02492", "If update is VK_TRUE, the size member of the VkMemoryRequirements structure returned from a call to vkGetAccelerationStructureMemoryRequirementsNV with VkAccelerationStructureMemoryRequirementsInfoNV::accelerationStructure set to dst and VkAccelerationStructureMemoryRequirementsInfoNV::type set to VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV must be less than or equal to the size of scratch minus scratchOffset (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureNV-update-02492)"},
- {"VUID-vkCmdBuildAccelerationStructureNV-update-03524", "If update is VK_TRUE, then objects that were previously active must not be made inactive as per Inactive Primitives and Instances (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureNV-update-03524)"},
- {"VUID-vkCmdBuildAccelerationStructureNV-update-03525", "If update is VK_TRUE, then objects that were previously inactive must not be made active as per Inactive Primitives and Instances (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureNV-update-03525)"},
- {"VUID-vkCmdBuildAccelerationStructureNV-update-03526", "If update is VK_TRUE, the src and dst objects must either be the same object or not have any memory aliasing (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdBuildAccelerationStructureNV-update-03526)"},
- {"VUID-vkCmdClearAttachments-aspectMask-02501", "If the aspectMask member of any element of pAttachments contains VK_IMAGE_ASPECT_COLOR_BIT, then the colorAttachment member of that element must either refer to a color attachment which is VK_ATTACHMENT_UNUSED, or must be a valid color attachment. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearAttachments-aspectMask-02501)"},
- {"VUID-vkCmdClearAttachments-aspectMask-02502", "If the aspectMask member of any element of pAttachments contains VK_IMAGE_ASPECT_DEPTH_BIT, then the current subpass' depth/stencil attachment must either be VK_ATTACHMENT_UNUSED, or must have a depth component (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearAttachments-aspectMask-02502)"},
- {"VUID-vkCmdClearAttachments-aspectMask-02503", "If the aspectMask member of any element of pAttachments contains VK_IMAGE_ASPECT_STENCIL_BIT, then the current subpass' depth/stencil attachment must either be VK_ATTACHMENT_UNUSED, or must have a stencil component (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearAttachments-aspectMask-02503)"},
- {"VUID-vkCmdClearAttachments-attachmentCount-arraylength", "attachmentCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearAttachments-attachmentCount-arraylength)"},
- {"VUID-vkCmdClearAttachments-baseArrayLayer-00018", "If the render pass instance this is recorded in uses multiview, then baseArrayLayer must be zero and layerCount must be one. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearAttachments-baseArrayLayer-00018)"},
- {"VUID-vkCmdClearAttachments-commandBuffer-02504", "If commandBuffer is an unprotected command buffer, then each attachment to be cleared must not be a protected image. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearAttachments-commandBuffer-02504)"},
- {"VUID-vkCmdClearAttachments-commandBuffer-02505", "If commandBuffer is a protected command buffer, then each attachment to be cleared must not be an unprotected image. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearAttachments-commandBuffer-02505)"},
- {"VUID-vkCmdClearAttachments-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearAttachments-commandBuffer-cmdpool)"},
- {"VUID-vkCmdClearAttachments-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearAttachments-commandBuffer-parameter)"},
- {"VUID-vkCmdClearAttachments-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearAttachments-commandBuffer-recording)"},
- {"VUID-vkCmdClearAttachments-layerCount-01934", "The layerCount member of each element of pRects must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearAttachments-layerCount-01934)"},
- {"VUID-vkCmdClearAttachments-pAttachments-parameter", "pAttachments must be a valid pointer to an array of attachmentCount valid VkClearAttachment structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearAttachments-pAttachments-parameter)"},
- {"VUID-vkCmdClearAttachments-pRects-00016", "The rectangular region specified by each element of pRects must be contained within the render area of the current render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearAttachments-pRects-00016)"},
- {"VUID-vkCmdClearAttachments-pRects-00017", "The layers specified by each element of pRects must be contained within every attachment that pAttachments refers to (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearAttachments-pRects-00017)"},
- {"VUID-vkCmdClearAttachments-pRects-parameter", "pRects must be a valid pointer to an array of rectCount VkClearRect structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearAttachments-pRects-parameter)"},
- {"VUID-vkCmdClearAttachments-rect-02682", "The rect member of each element of pRects must have an extent.width greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearAttachments-rect-02682)"},
- {"VUID-vkCmdClearAttachments-rect-02683", "The rect member of each element of pRects must have an extent.height greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearAttachments-rect-02683)"},
- {"VUID-vkCmdClearAttachments-rectCount-arraylength", "rectCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearAttachments-rectCount-arraylength)"},
- {"VUID-vkCmdClearAttachments-renderpass", "This command must only be called inside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearAttachments-renderpass)"},
- {"VUID-vkCmdClearColorImage-aspectMask-02498", "The VkImageSubresourceRange::aspectMask members of the elements of the pRanges array must each only include VK_IMAGE_ASPECT_COLOR_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-aspectMask-02498)"},
- {"VUID-vkCmdClearColorImage-baseArrayLayer-01472", "The VkImageSubresourceRange::baseArrayLayer members of the elements of the pRanges array must each be less than the arrayLayers specified in VkImageCreateInfo when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-baseArrayLayer-01472)"},
- {"VUID-vkCmdClearColorImage-baseMipLevel-01470", "The VkImageSubresourceRange::baseMipLevel members of the elements of the pRanges array must each be less than the mipLevels specified in VkImageCreateInfo when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-baseMipLevel-01470)"},
- {"VUID-vkCmdClearColorImage-commandBuffer-01805", "If commandBuffer is an unprotected command buffer, then image must not be a protected image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-commandBuffer-01805)"},
- {"VUID-vkCmdClearColorImage-commandBuffer-01806", "If commandBuffer is a protected command buffer, then image must not be an unprotected image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-commandBuffer-01806)"},
- {"VUID-vkCmdClearColorImage-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-commandBuffer-cmdpool)"},
- {"VUID-vkCmdClearColorImage-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-commandBuffer-parameter)"},
- {"VUID-vkCmdClearColorImage-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-commandBuffer-recording)"},
- {"VUID-vkCmdClearColorImage-commonparent", "Both of commandBuffer, and image must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-commonparent)"},
- {"VUID-vkCmdClearColorImage-image-00002", "image must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-image-00002)"},
- {"VUID-vkCmdClearColorImage-image-00003", "If image is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-image-00003)"},
- {"VUID-vkCmdClearColorImage-image-00007", "image must not have a compressed or depth/stencil format (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-image-00007)"},
- {"VUID-vkCmdClearColorImage-image-01545", "image must not use a format listed in Formats requiring sampler Y'CBCR conversion for VK_IMAGE_ASPECT_COLOR_BIT image views (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-image-01545)"},
- {"VUID-vkCmdClearColorImage-image-01993", "The format features of image must contain VK_FORMAT_FEATURE_TRANSFER_DST_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-image-01993)"},
- {"VUID-vkCmdClearColorImage-image-parameter", "image must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-image-parameter)"},
- {"VUID-vkCmdClearColorImage-imageLayout-00004", "imageLayout must specify the layout of the image subresource ranges of image specified in pRanges at the time this command is executed on a VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-imageLayout-00004)"},
- {"VUID-vkCmdClearColorImage-imageLayout-00005", "imageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL (https://www.khronos.org/registry/vulkan/specs/1.1/html/vkspec.html#VUID-vkCmdClearColorImage-imageLayout-00005)"},
- {"VUID-vkCmdClearColorImage-imageLayout-01394", "imageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, or VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-imageLayout-01394)"},
- {"VUID-vkCmdClearColorImage-imageLayout-parameter", "imageLayout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-imageLayout-parameter)"},
- {"VUID-vkCmdClearColorImage-pColor-parameter", "pColor must be a valid pointer to a valid VkClearColorValue union (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-pColor-parameter)"},
- {"VUID-vkCmdClearColorImage-pRanges-01692", "For each VkImageSubresourceRange element of pRanges, if the levelCount member is not VK_REMAINING_MIP_LEVELS, then baseMipLevel + levelCount must be less than the mipLevels specified in VkImageCreateInfo when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-pRanges-01692)"},
- {"VUID-vkCmdClearColorImage-pRanges-01693", "For each VkImageSubresourceRange element of pRanges, if the layerCount member is not VK_REMAINING_ARRAY_LAYERS, then baseArrayLayer + layerCount must be less than the arrayLayers specified in VkImageCreateInfo when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-pRanges-01693)"},
- {"VUID-vkCmdClearColorImage-pRanges-parameter", "pRanges must be a valid pointer to an array of rangeCount valid VkImageSubresourceRange structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-pRanges-parameter)"},
- {"VUID-vkCmdClearColorImage-rangeCount-arraylength", "rangeCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-rangeCount-arraylength)"},
- {"VUID-vkCmdClearColorImage-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearColorImage-renderpass)"},
- {"VUID-vkCmdClearDepthStencilImage-aspectMask-02824", "The VkImageSubresourceRange::aspectMask member of each element of the pRanges array must not include bits other than VK_IMAGE_ASPECT_DEPTH_BIT or VK_IMAGE_ASPECT_STENCIL_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-aspectMask-02824)"},
- {"VUID-vkCmdClearDepthStencilImage-baseArrayLayer-01476", "The VkImageSubresourceRange::baseArrayLayer members of the elements of the pRanges array must each be less than the arrayLayers specified in VkImageCreateInfo when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-baseArrayLayer-01476)"},
- {"VUID-vkCmdClearDepthStencilImage-baseMipLevel-01474", "The VkImageSubresourceRange::baseMipLevel members of the elements of the pRanges array must each be less than the mipLevels specified in VkImageCreateInfo when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-baseMipLevel-01474)"},
- {"VUID-vkCmdClearDepthStencilImage-commandBuffer-01807", "If commandBuffer is an unprotected command buffer, then image must not be a protected image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-commandBuffer-01807)"},
- {"VUID-vkCmdClearDepthStencilImage-commandBuffer-01808", "If commandBuffer is a protected command buffer, then image must not be an unprotected image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-commandBuffer-01808)"},
- {"VUID-vkCmdClearDepthStencilImage-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-commandBuffer-cmdpool)"},
- {"VUID-vkCmdClearDepthStencilImage-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-commandBuffer-parameter)"},
- {"VUID-vkCmdClearDepthStencilImage-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-commandBuffer-recording)"},
- {"VUID-vkCmdClearDepthStencilImage-commonparent", "Both of commandBuffer, and image must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-commonparent)"},
- {"VUID-vkCmdClearDepthStencilImage-image-00009", "image must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-image-00009)"},
- {"VUID-vkCmdClearDepthStencilImage-image-00010", "If image is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-image-00010)"},
- {"VUID-vkCmdClearDepthStencilImage-image-00014", "image must have a depth/stencil format (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-image-00014)"},
- {"VUID-vkCmdClearDepthStencilImage-image-01994", "The format features of image must contain VK_FORMAT_FEATURE_TRANSFER_DST_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-image-01994)"},
- {"VUID-vkCmdClearDepthStencilImage-image-02825", "If the image's format does not have a stencil component, then the VkImageSubresourceRange::aspectMask member of each element of the pRanges array must not include the VK_IMAGE_ASPECT_STENCIL_BIT bit (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-image-02825)"},
- {"VUID-vkCmdClearDepthStencilImage-image-02826", "If the image's format does not have a depth component, then the VkImageSubresourceRange::aspectMask member of each element of the pRanges array must not include the VK_IMAGE_ASPECT_DEPTH_BIT bit (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-image-02826)"},
- {"VUID-vkCmdClearDepthStencilImage-image-parameter", "image must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-image-parameter)"},
- {"VUID-vkCmdClearDepthStencilImage-imageLayout-00011", "imageLayout must specify the layout of the image subresource ranges of image specified in pRanges at the time this command is executed on a VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-imageLayout-00011)"},
- {"VUID-vkCmdClearDepthStencilImage-imageLayout-00012", "imageLayout must be either of VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-imageLayout-00012)"},
- {"VUID-vkCmdClearDepthStencilImage-imageLayout-parameter", "imageLayout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-imageLayout-parameter)"},
- {"VUID-vkCmdClearDepthStencilImage-pDepthStencil-parameter", "pDepthStencil must be a valid pointer to a valid VkClearDepthStencilValue structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-pDepthStencil-parameter)"},
- {"VUID-vkCmdClearDepthStencilImage-pRanges-01694", "For each VkImageSubresourceRange element of pRanges, if the levelCount member is not VK_REMAINING_MIP_LEVELS, then baseMipLevel + levelCount must be less than the mipLevels specified in VkImageCreateInfo when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-pRanges-01694)"},
- {"VUID-vkCmdClearDepthStencilImage-pRanges-01695", "For each VkImageSubresourceRange element of pRanges, if the layerCount member is not VK_REMAINING_ARRAY_LAYERS, then baseArrayLayer + layerCount must be less than the arrayLayers specified in VkImageCreateInfo when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-pRanges-01695)"},
- {"VUID-vkCmdClearDepthStencilImage-pRanges-02658", "If any element of pRanges.aspect includes VK_IMAGE_ASPECT_STENCIL_BIT, and image was created with separate stencil usage, VK_IMAGE_USAGE_TRANSFER_DST_BIT must have been included in the VkImageStencilUsageCreateInfo::stencilUsage used to create image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-pRanges-02658)"},
- {"VUID-vkCmdClearDepthStencilImage-pRanges-02659", "If any element of pRanges.aspect includes VK_IMAGE_ASPECT_STENCIL_BIT, and image was not created with separate stencil usage, VK_IMAGE_USAGE_TRANSFER_DST_BIT must have been included in the VkImageCreateInfo::usage used to create image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-pRanges-02659)"},
- {"VUID-vkCmdClearDepthStencilImage-pRanges-02660", "If any element of pRanges.aspect includes VK_IMAGE_ASPECT_DEPTH_BIT, VK_IMAGE_USAGE_TRANSFER_DST_BIT must have been included in the VkImageCreateInfo::usage used to create image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-pRanges-02660)"},
- {"VUID-vkCmdClearDepthStencilImage-pRanges-parameter", "pRanges must be a valid pointer to an array of rangeCount valid VkImageSubresourceRange structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-pRanges-parameter)"},
- {"VUID-vkCmdClearDepthStencilImage-rangeCount-arraylength", "rangeCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-rangeCount-arraylength)"},
- {"VUID-vkCmdClearDepthStencilImage-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdClearDepthStencilImage-renderpass)"},
- {"VUID-vkCmdCopyAccelerationStructureKHR-None-03556", "All VkAccelerationStructureKHR objects referenced by this command must be bound to device memory. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureKHR-None-03556)"},
- {"VUID-vkCmdCopyAccelerationStructureKHR-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureKHR-commandBuffer-cmdpool)"},
- {"VUID-vkCmdCopyAccelerationStructureKHR-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureKHR-commandBuffer-parameter)"},
- {"VUID-vkCmdCopyAccelerationStructureKHR-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureKHR-commandBuffer-recording)"},
- {"VUID-vkCmdCopyAccelerationStructureKHR-pInfo-parameter", "pInfo must be a valid pointer to a valid VkCopyAccelerationStructureInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureKHR-pInfo-parameter)"},
- {"VUID-vkCmdCopyAccelerationStructureKHR-pNext-03557", "The VkDeferredOperationInfoKHR structure must not be included in the pNext chain of the VkCopyAccelerationStructureInfoKHR structure. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureKHR-pNext-03557)"},
- {"VUID-vkCmdCopyAccelerationStructureKHR-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureKHR-renderpass)"},
- {"VUID-vkCmdCopyAccelerationStructureNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureNV-commandBuffer-cmdpool)"},
- {"VUID-vkCmdCopyAccelerationStructureNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureNV-commandBuffer-parameter)"},
- {"VUID-vkCmdCopyAccelerationStructureNV-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureNV-commandBuffer-recording)"},
- {"VUID-vkCmdCopyAccelerationStructureNV-commonparent", "Each of commandBuffer, dst, and src must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureNV-commonparent)"},
- {"VUID-vkCmdCopyAccelerationStructureNV-dst-parameter", "dst must be a valid VkAccelerationStructureKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureNV-dst-parameter)"},
- {"VUID-vkCmdCopyAccelerationStructureNV-mode-03410", "mode must be VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR or VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureNV-mode-03410)"},
- {"VUID-vkCmdCopyAccelerationStructureNV-mode-parameter", "mode must be a valid VkCopyAccelerationStructureModeKHR value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureNV-mode-parameter)"},
- {"VUID-vkCmdCopyAccelerationStructureNV-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureNV-renderpass)"},
- {"VUID-vkCmdCopyAccelerationStructureNV-src-03411", "src must have been built with VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR if mode is VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureNV-src-03411)"},
- {"VUID-vkCmdCopyAccelerationStructureNV-src-parameter", "src must be a valid VkAccelerationStructureKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureNV-src-parameter)"},
- {"VUID-vkCmdCopyAccelerationStructureToMemoryKHR-None-03558", "All VkDeviceOrHostAddressConstKHR referenced by this command must contain valid device addresses. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureToMemoryKHR-None-03558)"},
- {"VUID-vkCmdCopyAccelerationStructureToMemoryKHR-None-03559", "All VkAccelerationStructureKHR objects referenced by this command must be bound to device memory. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureToMemoryKHR-None-03559)"},
- {"VUID-vkCmdCopyAccelerationStructureToMemoryKHR-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureToMemoryKHR-commandBuffer-cmdpool)"},
- {"VUID-vkCmdCopyAccelerationStructureToMemoryKHR-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureToMemoryKHR-commandBuffer-parameter)"},
- {"VUID-vkCmdCopyAccelerationStructureToMemoryKHR-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureToMemoryKHR-commandBuffer-recording)"},
- {"VUID-vkCmdCopyAccelerationStructureToMemoryKHR-mode-03412", "mode must be VK_COPY_ACCELERATION_STRUCTURE_MODE_SERIALIZE_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureToMemoryKHR-mode-03412)"},
- {"VUID-vkCmdCopyAccelerationStructureToMemoryKHR-pInfo-parameter", "pInfo must be a valid pointer to a valid VkCopyAccelerationStructureToMemoryInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureToMemoryKHR-pInfo-parameter)"},
- {"VUID-vkCmdCopyAccelerationStructureToMemoryKHR-pNext-03560", "The VkDeferredOperationInfoKHR structure must not be included in the pNext chain of the VkCopyAccelerationStructureToMemoryInfoKHR structure. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureToMemoryKHR-pNext-03560)"},
- {"VUID-vkCmdCopyAccelerationStructureToMemoryKHR-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyAccelerationStructureToMemoryKHR-renderpass)"},
- {"VUID-vkCmdCopyBuffer-commandBuffer-01822", "If commandBuffer is an unprotected command buffer, then srcBuffer must not be a protected buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-commandBuffer-01822)"},
- {"VUID-vkCmdCopyBuffer-commandBuffer-01823", "If commandBuffer is an unprotected command buffer, then dstBuffer must not be a protected buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-commandBuffer-01823)"},
- {"VUID-vkCmdCopyBuffer-commandBuffer-01824", "If commandBuffer is a protected command buffer, then dstBuffer must not be an unprotected buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-commandBuffer-01824)"},
- {"VUID-vkCmdCopyBuffer-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-commandBuffer-cmdpool)"},
- {"VUID-vkCmdCopyBuffer-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-commandBuffer-parameter)"},
- {"VUID-vkCmdCopyBuffer-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-commandBuffer-recording)"},
- {"VUID-vkCmdCopyBuffer-commonparent", "Each of commandBuffer, dstBuffer, and srcBuffer must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-commonparent)"},
- {"VUID-vkCmdCopyBuffer-dstBuffer-00120", "dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-dstBuffer-00120)"},
- {"VUID-vkCmdCopyBuffer-dstBuffer-00121", "If dstBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-dstBuffer-00121)"},
- {"VUID-vkCmdCopyBuffer-dstBuffer-parameter", "dstBuffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-dstBuffer-parameter)"},
- {"VUID-vkCmdCopyBuffer-dstOffset-00114", "The dstOffset member of each element of pRegions must be less than the size of dstBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-dstOffset-00114)"},
- {"VUID-vkCmdCopyBuffer-pRegions-00117", "The union of the source regions, and the union of the destination regions, specified by the elements of pRegions, must not overlap in memory (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-pRegions-00117)"},
- {"VUID-vkCmdCopyBuffer-pRegions-parameter", "pRegions must be a valid pointer to an array of regionCount valid VkBufferCopy structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-pRegions-parameter)"},
- {"VUID-vkCmdCopyBuffer-regionCount-arraylength", "regionCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-regionCount-arraylength)"},
- {"VUID-vkCmdCopyBuffer-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-renderpass)"},
- {"VUID-vkCmdCopyBuffer-size-00115", "The size member of each element of pRegions must be less than or equal to the size of srcBuffer minus srcOffset (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-size-00115)"},
- {"VUID-vkCmdCopyBuffer-size-00116", "The size member of each element of pRegions must be less than or equal to the size of dstBuffer minus dstOffset (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-size-00116)"},
- {"VUID-vkCmdCopyBuffer-srcBuffer-00118", "srcBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_SRC_BIT usage flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-srcBuffer-00118)"},
- {"VUID-vkCmdCopyBuffer-srcBuffer-00119", "If srcBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-srcBuffer-00119)"},
- {"VUID-vkCmdCopyBuffer-srcBuffer-parameter", "srcBuffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-srcBuffer-parameter)"},
- {"VUID-vkCmdCopyBuffer-srcOffset-00113", "The srcOffset member of each element of pRegions must be less than the size of srcBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBuffer-srcOffset-00113)"},
- {"VUID-vkCmdCopyBufferToImage-commandBuffer-01828", "If commandBuffer is an unprotected command buffer, then srcBuffer must not be a protected buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-commandBuffer-01828)"},
- {"VUID-vkCmdCopyBufferToImage-commandBuffer-01829", "If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-commandBuffer-01829)"},
- {"VUID-vkCmdCopyBufferToImage-commandBuffer-01830", "If commandBuffer is a protected command buffer, then dstImage must not be an unprotected image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-commandBuffer-01830)"},
- {"VUID-vkCmdCopyBufferToImage-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-commandBuffer-cmdpool)"},
- {"VUID-vkCmdCopyBufferToImage-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-commandBuffer-parameter)"},
- {"VUID-vkCmdCopyBufferToImage-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-commandBuffer-recording)"},
- {"VUID-vkCmdCopyBufferToImage-commonparent", "Each of commandBuffer, dstImage, and srcBuffer must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-commonparent)"},
- {"VUID-vkCmdCopyBufferToImage-dstImage-00177", "dstImage must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-dstImage-00177)"},
- {"VUID-vkCmdCopyBufferToImage-dstImage-00178", "If dstImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-dstImage-00178)"},
- {"VUID-vkCmdCopyBufferToImage-dstImage-00179", "dstImage must have a sample count equal to VK_SAMPLE_COUNT_1_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-dstImage-00179)"},
- {"VUID-vkCmdCopyBufferToImage-dstImage-01997", "The format features of dstImage must contain VK_FORMAT_FEATURE_TRANSFER_DST_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-dstImage-01997)"},
- {"VUID-vkCmdCopyBufferToImage-dstImage-02543", "dstImage must not have been created with flags containing VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-dstImage-02543)"},
- {"VUID-vkCmdCopyBufferToImage-dstImage-parameter", "dstImage must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-dstImage-parameter)"},
- {"VUID-vkCmdCopyBufferToImage-dstImageLayout-00180", "dstImageLayout must specify the layout of the image subresources of dstImage specified in pRegions at the time this command is executed on a VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-dstImageLayout-00180)"},
- {"VUID-vkCmdCopyBufferToImage-dstImageLayout-00181", "dstImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL (https://www.khronos.org/registry/vulkan/specs/1.1/html/vkspec.html#VUID-vkCmdCopyBufferToImage-dstImageLayout-00181)"},
- {"VUID-vkCmdCopyBufferToImage-dstImageLayout-01396", "dstImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, or VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-dstImageLayout-01396)"},
- {"VUID-vkCmdCopyBufferToImage-dstImageLayout-parameter", "dstImageLayout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-dstImageLayout-parameter)"},
- {"VUID-vkCmdCopyBufferToImage-imageOffset-01793", "The imageOffset and imageExtent members of each element of pRegions must respect the image transfer granularity requirements of commandBuffer's command pool's queue family, as described in VkQueueFamilyProperties (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-imageOffset-01793)"},
- {"VUID-vkCmdCopyBufferToImage-imageSubresource-01701", "The imageSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when dstImage was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-imageSubresource-01701)"},
- {"VUID-vkCmdCopyBufferToImage-imageSubresource-01702", "The imageSubresource.baseArrayLayer + imageSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when dstImage was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-imageSubresource-01702)"},
- {"VUID-vkCmdCopyBufferToImage-pRegions-00171", "srcBuffer must be large enough to contain all buffer locations that are accessed according to Buffer and Image Addressing, for each element of pRegions (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-pRegions-00171)"},
- {"VUID-vkCmdCopyBufferToImage-pRegions-00172", "The image region specified by each element of pRegions must be a region that is contained within dstImage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-pRegions-00172)"},
- {"VUID-vkCmdCopyBufferToImage-pRegions-00173", "The union of all source regions, and the union of all destination regions, specified by the elements of pRegions, must not overlap in memory (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-pRegions-00173)"},
- {"VUID-vkCmdCopyBufferToImage-pRegions-parameter", "pRegions must be a valid pointer to an array of regionCount valid VkBufferImageCopy structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-pRegions-parameter)"},
- {"VUID-vkCmdCopyBufferToImage-regionCount-arraylength", "regionCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-regionCount-arraylength)"},
- {"VUID-vkCmdCopyBufferToImage-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-renderpass)"},
- {"VUID-vkCmdCopyBufferToImage-srcBuffer-00174", "srcBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_SRC_BIT usage flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-srcBuffer-00174)"},
- {"VUID-vkCmdCopyBufferToImage-srcBuffer-00176", "If srcBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-srcBuffer-00176)"},
- {"VUID-vkCmdCopyBufferToImage-srcBuffer-parameter", "srcBuffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyBufferToImage-srcBuffer-parameter)"},
- {"VUID-vkCmdCopyImage-None-01549", "In a copy to or from a plane of a multi-planar image, the VkFormat of the image and plane must be compatible according to the description of compatible planes for the plane being copied (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-None-01549)"},
- {"VUID-vkCmdCopyImage-commandBuffer-01825", "If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-commandBuffer-01825)"},
- {"VUID-vkCmdCopyImage-commandBuffer-01826", "If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-commandBuffer-01826)"},
- {"VUID-vkCmdCopyImage-commandBuffer-01827", "If commandBuffer is a protected command buffer, then dstImage must not be an unprotected image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-commandBuffer-01827)"},
- {"VUID-vkCmdCopyImage-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-commandBuffer-cmdpool)"},
- {"VUID-vkCmdCopyImage-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-commandBuffer-parameter)"},
- {"VUID-vkCmdCopyImage-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-commandBuffer-recording)"},
- {"VUID-vkCmdCopyImage-commonparent", "Each of commandBuffer, dstImage, and srcImage must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-commonparent)"},
- {"VUID-vkCmdCopyImage-dstImage-00131", "dstImage must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-dstImage-00131)"},
- {"VUID-vkCmdCopyImage-dstImage-00132", "If dstImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImage-dstImage-00132)"},
- {"VUID-vkCmdCopyImage-dstImage-01547", "If dstImage is non-sparse then the image or disjoint plane that is the destination of the copy must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-dstImage-01547)"},
- {"VUID-vkCmdCopyImage-dstImage-01996", "The format features of dstImage must contain VK_FORMAT_FEATURE_TRANSFER_DST_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-dstImage-01996)"},
- {"VUID-vkCmdCopyImage-dstImage-02542", "dstImage and srcImage must not have been created with flags containing VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-dstImage-02542)"},
- {"VUID-vkCmdCopyImage-dstImage-parameter", "dstImage must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-dstImage-parameter)"},
- {"VUID-vkCmdCopyImage-dstImageLayout-00133", "dstImageLayout must specify the layout of the image subresources of dstImage specified in pRegions at the time this command is executed on a VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-dstImageLayout-00133)"},
- {"VUID-vkCmdCopyImage-dstImageLayout-00134", "dstImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL (https://www.khronos.org/registry/vulkan/specs/1.1/html/vkspec.html#VUID-vkCmdCopyImage-dstImageLayout-00134)"},
- {"VUID-vkCmdCopyImage-dstImageLayout-01395", "dstImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, or VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-dstImageLayout-01395)"},
- {"VUID-vkCmdCopyImage-dstImageLayout-parameter", "dstImageLayout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-dstImageLayout-parameter)"},
- {"VUID-vkCmdCopyImage-dstOffset-01784", "The dstOffset and extent members of each element of pRegions must respect the image transfer granularity requirements of commandBuffer's command pool's queue family, as described in VkQueueFamilyProperties (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-dstOffset-01784)"},
- {"VUID-vkCmdCopyImage-dstSubresource-01697", "The dstSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when dstImage was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-dstSubresource-01697)"},
- {"VUID-vkCmdCopyImage-dstSubresource-01699", "The dstSubresource.baseArrayLayer + dstSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when dstImage was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-dstSubresource-01699)"},
- {"VUID-vkCmdCopyImage-pRegions-00124", "The union of all source regions, and the union of all destination regions, specified by the elements of pRegions, must not overlap in memory (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-pRegions-00124)"},
- {"VUID-vkCmdCopyImage-pRegions-parameter", "pRegions must be a valid pointer to an array of regionCount valid VkImageCopy structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-pRegions-parameter)"},
- {"VUID-vkCmdCopyImage-regionCount-arraylength", "regionCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-regionCount-arraylength)"},
- {"VUID-vkCmdCopyImage-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-renderpass)"},
- {"VUID-vkCmdCopyImage-srcImage-00126", "srcImage must have been created with VK_IMAGE_USAGE_TRANSFER_SRC_BIT usage flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-srcImage-00126)"},
- {"VUID-vkCmdCopyImage-srcImage-00127", "If srcImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImage-srcImage-00127)"},
- {"VUID-vkCmdCopyImage-srcImage-00135", "The VkFormat of each of srcImage and dstImage must be compatible, as defined above (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdCopyImage-srcImage-00135)"},
- {"VUID-vkCmdCopyImage-srcImage-00136", "The sample count of srcImage and dstImage must match (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-srcImage-00136)"},
- {"VUID-vkCmdCopyImage-srcImage-01546", "If srcImage is non-sparse then the image or disjoint plane to be copied must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-srcImage-01546)"},
- {"VUID-vkCmdCopyImage-srcImage-01548", "If the VkFormat of each of srcImage and dstImage is not a multi-planar format, the VkFormat of each of srcImage and dstImage must be compatible, as defined above (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-srcImage-01548)"},
- {"VUID-vkCmdCopyImage-srcImage-01995", "The format features of srcImage must contain VK_FORMAT_FEATURE_TRANSFER_SRC_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-srcImage-01995)"},
- {"VUID-vkCmdCopyImage-srcImage-parameter", "srcImage must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-srcImage-parameter)"},
- {"VUID-vkCmdCopyImage-srcImageLayout-00128", "srcImageLayout must specify the layout of the image subresources of srcImage specified in pRegions at the time this command is executed on a VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-srcImageLayout-00128)"},
- {"VUID-vkCmdCopyImage-srcImageLayout-00129", "srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL (https://www.khronos.org/registry/vulkan/specs/1.1/html/vkspec.html#VUID-vkCmdCopyImage-srcImageLayout-00129)"},
- {"VUID-vkCmdCopyImage-srcImageLayout-01917", "srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, or VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-srcImageLayout-01917)"},
- {"VUID-vkCmdCopyImage-srcImageLayout-parameter", "srcImageLayout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-srcImageLayout-parameter)"},
- {"VUID-vkCmdCopyImage-srcOffset-01783", "The srcOffset and extent members of each element of pRegions must respect the image transfer granularity requirements of commandBuffer's command pool's queue family, as described in VkQueueFamilyProperties (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-srcOffset-01783)"},
- {"VUID-vkCmdCopyImage-srcSubresource-01696", "The srcSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when srcImage was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-srcSubresource-01696)"},
- {"VUID-vkCmdCopyImage-srcSubresource-01698", "The srcSubresource.baseArrayLayer + srcSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when srcImage was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImage-srcSubresource-01698)"},
- {"VUID-vkCmdCopyImageToBuffer-commandBuffer-01831", "If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-commandBuffer-01831)"},
- {"VUID-vkCmdCopyImageToBuffer-commandBuffer-01832", "If commandBuffer is an unprotected command buffer, then dstBuffer must not be a protected buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-commandBuffer-01832)"},
- {"VUID-vkCmdCopyImageToBuffer-commandBuffer-01833", "If commandBuffer is a protected command buffer, then dstBuffer must not be an unprotected buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-commandBuffer-01833)"},
- {"VUID-vkCmdCopyImageToBuffer-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-commandBuffer-cmdpool)"},
- {"VUID-vkCmdCopyImageToBuffer-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-commandBuffer-parameter)"},
- {"VUID-vkCmdCopyImageToBuffer-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-commandBuffer-recording)"},
- {"VUID-vkCmdCopyImageToBuffer-commonparent", "Each of commandBuffer, dstBuffer, and srcImage must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-commonparent)"},
- {"VUID-vkCmdCopyImageToBuffer-dstBuffer-00191", "dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-dstBuffer-00191)"},
- {"VUID-vkCmdCopyImageToBuffer-dstBuffer-00192", "If dstBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-dstBuffer-00192)"},
- {"VUID-vkCmdCopyImageToBuffer-dstBuffer-parameter", "dstBuffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-dstBuffer-parameter)"},
- {"VUID-vkCmdCopyImageToBuffer-imageOffset-01794", "The imageOffset and imageExtent members of each element of pRegions must respect the image transfer granularity requirements of commandBuffer's command pool's queue family, as described in VkQueueFamilyProperties (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-imageOffset-01794)"},
- {"VUID-vkCmdCopyImageToBuffer-imageSubresource-01703", "The imageSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when srcImage was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-imageSubresource-01703)"},
- {"VUID-vkCmdCopyImageToBuffer-imageSubresource-01704", "The imageSubresource.baseArrayLayer + imageSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when srcImage was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-imageSubresource-01704)"},
- {"VUID-vkCmdCopyImageToBuffer-pRegions-00182", "The image region specified by each element of pRegions must be a region that is contained within srcImage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-pRegions-00182)"},
- {"VUID-vkCmdCopyImageToBuffer-pRegions-00183", "dstBuffer must be large enough to contain all buffer locations that are accessed according to Buffer and Image Addressing, for each element of pRegions (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-pRegions-00183)"},
- {"VUID-vkCmdCopyImageToBuffer-pRegions-00184", "The union of all source regions, and the union of all destination regions, specified by the elements of pRegions, must not overlap in memory (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-pRegions-00184)"},
- {"VUID-vkCmdCopyImageToBuffer-pRegions-parameter", "pRegions must be a valid pointer to an array of regionCount valid VkBufferImageCopy structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-pRegions-parameter)"},
- {"VUID-vkCmdCopyImageToBuffer-regionCount-arraylength", "regionCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-regionCount-arraylength)"},
- {"VUID-vkCmdCopyImageToBuffer-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-renderpass)"},
- {"VUID-vkCmdCopyImageToBuffer-srcImage-00186", "srcImage must have been created with VK_IMAGE_USAGE_TRANSFER_SRC_BIT usage flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-srcImage-00186)"},
- {"VUID-vkCmdCopyImageToBuffer-srcImage-00187", "If srcImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-srcImage-00187)"},
- {"VUID-vkCmdCopyImageToBuffer-srcImage-00188", "srcImage must have a sample count equal to VK_SAMPLE_COUNT_1_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-srcImage-00188)"},
- {"VUID-vkCmdCopyImageToBuffer-srcImage-01998", "The format features of srcImage must contain VK_FORMAT_FEATURE_TRANSFER_SRC_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-srcImage-01998)"},
- {"VUID-vkCmdCopyImageToBuffer-srcImage-02544", "srcImage must not have been created with flags containing VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-srcImage-02544)"},
- {"VUID-vkCmdCopyImageToBuffer-srcImage-parameter", "srcImage must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-srcImage-parameter)"},
- {"VUID-vkCmdCopyImageToBuffer-srcImageLayout-00189", "srcImageLayout must specify the layout of the image subresources of srcImage specified in pRegions at the time this command is executed on a VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-srcImageLayout-00189)"},
- {"VUID-vkCmdCopyImageToBuffer-srcImageLayout-00190", "srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL (https://www.khronos.org/registry/vulkan/specs/1.1/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-srcImageLayout-00190)"},
- {"VUID-vkCmdCopyImageToBuffer-srcImageLayout-01397", "srcImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-srcImageLayout-01397)"},
- {"VUID-vkCmdCopyImageToBuffer-srcImageLayout-parameter", "srcImageLayout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyImageToBuffer-srcImageLayout-parameter)"},
- {"VUID-vkCmdCopyMemoryToAccelerationStructureKHR-None-03562", "All VkDeviceOrHostAddressKHR referenced by this command must contain valid device addresses. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyMemoryToAccelerationStructureKHR-None-03562)"},
- {"VUID-vkCmdCopyMemoryToAccelerationStructureKHR-None-03563", "All VkAccelerationStructureKHR objects referenced by this command must be bound to device memory. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyMemoryToAccelerationStructureKHR-None-03563)"},
- {"VUID-vkCmdCopyMemoryToAccelerationStructureKHR-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyMemoryToAccelerationStructureKHR-commandBuffer-cmdpool)"},
- {"VUID-vkCmdCopyMemoryToAccelerationStructureKHR-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyMemoryToAccelerationStructureKHR-commandBuffer-parameter)"},
- {"VUID-vkCmdCopyMemoryToAccelerationStructureKHR-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyMemoryToAccelerationStructureKHR-commandBuffer-recording)"},
- {"VUID-vkCmdCopyMemoryToAccelerationStructureKHR-mode-03413", "mode must be VK_COPY_ACCELERATION_STRUCTURE_MODE_DESERIALIZE_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyMemoryToAccelerationStructureKHR-mode-03413)"},
- {"VUID-vkCmdCopyMemoryToAccelerationStructureKHR-pInfo-03414", "The data in pInfo->pname:src must have a format compatible with the destination physical device as returned by vkGetDeviceAccelerationStructureCompatibilityKHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyMemoryToAccelerationStructureKHR-pInfo-03414)"},
- {"VUID-vkCmdCopyMemoryToAccelerationStructureKHR-pInfo-parameter", "pInfo must be a valid pointer to a valid VkCopyMemoryToAccelerationStructureInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyMemoryToAccelerationStructureKHR-pInfo-parameter)"},
- {"VUID-vkCmdCopyMemoryToAccelerationStructureKHR-pNext-03564", "The VkDeferredOperationInfoKHR structure must not be included in the pNext chain of the VkCopyMemoryToAccelerationStructureInfoKHR structure. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyMemoryToAccelerationStructureKHR-pNext-03564)"},
- {"VUID-vkCmdCopyMemoryToAccelerationStructureKHR-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyMemoryToAccelerationStructureKHR-renderpass)"},
- {"VUID-vkCmdCopyQueryPoolResults-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyQueryPoolResults-commandBuffer-cmdpool)"},
- {"VUID-vkCmdCopyQueryPoolResults-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyQueryPoolResults-commandBuffer-parameter)"},
- {"VUID-vkCmdCopyQueryPoolResults-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyQueryPoolResults-commandBuffer-recording)"},
- {"VUID-vkCmdCopyQueryPoolResults-commonparent", "Each of commandBuffer, dstBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyQueryPoolResults-commonparent)"},
- {"VUID-vkCmdCopyQueryPoolResults-dstBuffer-00824", "dstBuffer must have enough storage, from dstOffset, to contain the result of each query, as described here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyQueryPoolResults-dstBuffer-00824)"},
- {"VUID-vkCmdCopyQueryPoolResults-dstBuffer-00825", "dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyQueryPoolResults-dstBuffer-00825)"},
- {"VUID-vkCmdCopyQueryPoolResults-dstBuffer-00826", "If dstBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyQueryPoolResults-dstBuffer-00826)"},
- {"VUID-vkCmdCopyQueryPoolResults-dstBuffer-parameter", "dstBuffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyQueryPoolResults-dstBuffer-parameter)"},
- {"VUID-vkCmdCopyQueryPoolResults-dstOffset-00819", "dstOffset must be less than the size of dstBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyQueryPoolResults-dstOffset-00819)"},
- {"VUID-vkCmdCopyQueryPoolResults-firstQuery-00820", "firstQuery must be less than the number of queries in queryPool (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyQueryPoolResults-firstQuery-00820)"},
- {"VUID-vkCmdCopyQueryPoolResults-firstQuery-00821", "The sum of firstQuery and queryCount must be less than or equal to the number of queries in queryPool (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyQueryPoolResults-firstQuery-00821)"},
- {"VUID-vkCmdCopyQueryPoolResults-flags-00822", "If VK_QUERY_RESULT_64_BIT is not set in flags then dstOffset and stride must be multiples of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyQueryPoolResults-flags-00822)"},
- {"VUID-vkCmdCopyQueryPoolResults-flags-00823", "If VK_QUERY_RESULT_64_BIT is set in flags then dstOffset and stride must be multiples of 8 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyQueryPoolResults-flags-00823)"},
- {"VUID-vkCmdCopyQueryPoolResults-flags-parameter", "flags must be a valid combination of VkQueryResultFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyQueryPoolResults-flags-parameter)"},
- {"VUID-vkCmdCopyQueryPoolResults-queryPool-parameter", "queryPool must be a valid VkQueryPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyQueryPoolResults-queryPool-parameter)"},
- {"VUID-vkCmdCopyQueryPoolResults-queryType-00827", "If the queryType used to create queryPool was VK_QUERY_TYPE_TIMESTAMP, flags must not contain VK_QUERY_RESULT_PARTIAL_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyQueryPoolResults-queryType-00827)"},
- {"VUID-vkCmdCopyQueryPoolResults-queryType-02734", "vkCmdCopyQueryPoolResults must not be called if the queryType used to create queryPool was VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyQueryPoolResults-queryType-02734)"},
- {"VUID-vkCmdCopyQueryPoolResults-queryType-03232", "If the queryType used to create queryPool was VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, VkPhysicalDevicePerformanceQueryPropertiesKHR::allowCommandBufferQueryCopies must be VK_TRUE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyQueryPoolResults-queryType-03232)"},
- {"VUID-vkCmdCopyQueryPoolResults-queryType-03233", "If the queryType used to create queryPool was VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, flags must not contain VK_QUERY_RESULT_WITH_AVAILABILITY_BIT, VK_QUERY_RESULT_PARTIAL_BIT or VK_QUERY_RESULT_64_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyQueryPoolResults-queryType-03233)"},
- {"VUID-vkCmdCopyQueryPoolResults-queryType-03234", "If the queryType used to create queryPool was VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, the queryPool must have been submitted once for each pass as retrieved via a call to vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyQueryPoolResults-queryType-03234)"},
- {"VUID-vkCmdCopyQueryPoolResults-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdCopyQueryPoolResults-renderpass)"},
- {"VUID-vkCmdDebugMarkerBeginEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDebugMarkerBeginEXT-commandBuffer-cmdpool)"},
- {"VUID-vkCmdDebugMarkerBeginEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDebugMarkerBeginEXT-commandBuffer-parameter)"},
- {"VUID-vkCmdDebugMarkerBeginEXT-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDebugMarkerBeginEXT-commandBuffer-recording)"},
- {"VUID-vkCmdDebugMarkerBeginEXT-pMarkerInfo-parameter", "pMarkerInfo must be a valid pointer to a valid VkDebugMarkerMarkerInfoEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDebugMarkerBeginEXT-pMarkerInfo-parameter)"},
- {"VUID-vkCmdDebugMarkerEndEXT-commandBuffer-01239", "There must be an outstanding vkCmdDebugMarkerBeginEXT command prior to the vkCmdDebugMarkerEndEXT on the queue that commandBuffer is submitted to (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDebugMarkerEndEXT-commandBuffer-01239)"},
- {"VUID-vkCmdDebugMarkerEndEXT-commandBuffer-01240", "If commandBuffer is a secondary command buffer, there must be an outstanding vkCmdDebugMarkerBeginEXT command recorded to commandBuffer that has not previously been ended by a call to vkCmdDebugMarkerEndEXT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDebugMarkerEndEXT-commandBuffer-01240)"},
- {"VUID-vkCmdDebugMarkerEndEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDebugMarkerEndEXT-commandBuffer-cmdpool)"},
- {"VUID-vkCmdDebugMarkerEndEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDebugMarkerEndEXT-commandBuffer-parameter)"},
- {"VUID-vkCmdDebugMarkerEndEXT-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDebugMarkerEndEXT-commandBuffer-recording)"},
- {"VUID-vkCmdDebugMarkerInsertEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDebugMarkerInsertEXT-commandBuffer-cmdpool)"},
- {"VUID-vkCmdDebugMarkerInsertEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDebugMarkerInsertEXT-commandBuffer-parameter)"},
- {"VUID-vkCmdDebugMarkerInsertEXT-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDebugMarkerInsertEXT-commandBuffer-recording)"},
- {"VUID-vkCmdDebugMarkerInsertEXT-pMarkerInfo-parameter", "pMarkerInfo must be a valid pointer to a valid VkDebugMarkerMarkerInfoEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDebugMarkerInsertEXT-pMarkerInfo-parameter)"},
- {"VUID-vkCmdDispatch-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-None-02690)"},
- {"VUID-vkCmdDispatch-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-None-02691)"},
- {"VUID-vkCmdDispatch-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-None-02692)"},
- {"VUID-vkCmdDispatch-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-vkCmdDispatch-None-02693)"},
- {"VUID-vkCmdDispatch-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-None-02697)"},
- {"VUID-vkCmdDispatch-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-None-02698)"},
- {"VUID-vkCmdDispatch-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-None-02699)"},
- {"VUID-vkCmdDispatch-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-None-02700)"},
- {"VUID-vkCmdDispatch-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-None-02702)"},
- {"VUID-vkCmdDispatch-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-None-02703)"},
- {"VUID-vkCmdDispatch-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-None-02704)"},
- {"VUID-vkCmdDispatch-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-None-02705)"},
- {"VUID-vkCmdDispatch-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-None-02706)"},
- {"VUID-vkCmdDispatch-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-None-02859)"},
- {"VUID-vkCmdDispatch-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-commandBuffer-02701)"},
- {"VUID-vkCmdDispatch-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-commandBuffer-02707)"},
- {"VUID-vkCmdDispatch-commandBuffer-02712", "If commandBuffer is a protected command buffer, any resource written to by the VkPipeline object bound to the pipeline bind point used by this command must not be an unprotected resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-commandBuffer-02712)"},
- {"VUID-vkCmdDispatch-commandBuffer-02713", "If commandBuffer is a protected command buffer, pipeline stages other than the framebuffer-space and compute stages in the VkPipeline object bound to the pipeline bind point must not write to any resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-commandBuffer-02713)"},
- {"VUID-vkCmdDispatch-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-commandBuffer-cmdpool)"},
- {"VUID-vkCmdDispatch-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-commandBuffer-parameter)"},
- {"VUID-vkCmdDispatch-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-commandBuffer-recording)"},
- {"VUID-vkCmdDispatch-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-filterCubic-02694)"},
- {"VUID-vkCmdDispatch-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-filterCubicMinmax-02695)"},
- {"VUID-vkCmdDispatch-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-flags-02696)"},
- {"VUID-vkCmdDispatch-groupCountX-00386", "groupCountX must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-groupCountX-00386)"},
- {"VUID-vkCmdDispatch-groupCountY-00387", "groupCountY must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-groupCountY-00387)"},
- {"VUID-vkCmdDispatch-groupCountZ-00388", "groupCountZ must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-groupCountZ-00388)"},
- {"VUID-vkCmdDispatch-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatch-renderpass)"},
- {"VUID-vkCmdDispatchBase-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-None-02690)"},
- {"VUID-vkCmdDispatchBase-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-None-02691)"},
- {"VUID-vkCmdDispatchBase-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-None-02692)"},
- {"VUID-vkCmdDispatchBase-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-vkCmdDispatchBase-None-02693)"},
- {"VUID-vkCmdDispatchBase-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-None-02697)"},
- {"VUID-vkCmdDispatchBase-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-None-02698)"},
- {"VUID-vkCmdDispatchBase-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-None-02699)"},
- {"VUID-vkCmdDispatchBase-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-None-02700)"},
- {"VUID-vkCmdDispatchBase-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-None-02702)"},
- {"VUID-vkCmdDispatchBase-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-None-02703)"},
- {"VUID-vkCmdDispatchBase-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-None-02704)"},
- {"VUID-vkCmdDispatchBase-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-None-02705)"},
- {"VUID-vkCmdDispatchBase-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-None-02706)"},
- {"VUID-vkCmdDispatchBase-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-None-02859)"},
- {"VUID-vkCmdDispatchBase-baseGroupX-00421", "baseGroupX must be less than VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-baseGroupX-00421)"},
- {"VUID-vkCmdDispatchBase-baseGroupX-00422", "baseGroupX must be less than VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-baseGroupX-00422)"},
- {"VUID-vkCmdDispatchBase-baseGroupX-00427", "If any of baseGroupX, baseGroupY, or baseGroupZ are not zero, then the bound compute pipeline must have been created with the VK_PIPELINE_CREATE_DISPATCH_BASE flag. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-baseGroupX-00427)"},
- {"VUID-vkCmdDispatchBase-baseGroupZ-00423", "baseGroupZ must be less than VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-baseGroupZ-00423)"},
- {"VUID-vkCmdDispatchBase-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-commandBuffer-02701)"},
- {"VUID-vkCmdDispatchBase-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-commandBuffer-02707)"},
- {"VUID-vkCmdDispatchBase-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-commandBuffer-cmdpool)"},
- {"VUID-vkCmdDispatchBase-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-commandBuffer-parameter)"},
- {"VUID-vkCmdDispatchBase-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-commandBuffer-recording)"},
- {"VUID-vkCmdDispatchBase-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-filterCubic-02694)"},
- {"VUID-vkCmdDispatchBase-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-filterCubicMinmax-02695)"},
- {"VUID-vkCmdDispatchBase-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-flags-02696)"},
- {"VUID-vkCmdDispatchBase-groupCountX-00424", "groupCountX must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0] minus baseGroupX (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-groupCountX-00424)"},
- {"VUID-vkCmdDispatchBase-groupCountY-00425", "groupCountY must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1] minus baseGroupY (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-groupCountY-00425)"},
- {"VUID-vkCmdDispatchBase-groupCountZ-00426", "groupCountZ must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2] minus baseGroupZ (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-groupCountZ-00426)"},
- {"VUID-vkCmdDispatchBase-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchBase-renderpass)"},
- {"VUID-vkCmdDispatchIndirect-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-02690)"},
- {"VUID-vkCmdDispatchIndirect-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-02691)"},
- {"VUID-vkCmdDispatchIndirect-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-02692)"},
- {"VUID-vkCmdDispatchIndirect-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-vkCmdDispatchIndirect-None-02693)"},
- {"VUID-vkCmdDispatchIndirect-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-02697)"},
- {"VUID-vkCmdDispatchIndirect-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-02698)"},
- {"VUID-vkCmdDispatchIndirect-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-02699)"},
- {"VUID-vkCmdDispatchIndirect-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-02700)"},
- {"VUID-vkCmdDispatchIndirect-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-02702)"},
- {"VUID-vkCmdDispatchIndirect-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-02703)"},
- {"VUID-vkCmdDispatchIndirect-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-02704)"},
- {"VUID-vkCmdDispatchIndirect-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-02705)"},
- {"VUID-vkCmdDispatchIndirect-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-02706)"},
- {"VUID-vkCmdDispatchIndirect-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-None-02859)"},
- {"VUID-vkCmdDispatchIndirect-buffer-02708", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-buffer-02708)"},
- {"VUID-vkCmdDispatchIndirect-buffer-02709", "buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-buffer-02709)"},
- {"VUID-vkCmdDispatchIndirect-buffer-parameter", "buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-buffer-parameter)"},
- {"VUID-vkCmdDispatchIndirect-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-commandBuffer-02701)"},
- {"VUID-vkCmdDispatchIndirect-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-commandBuffer-02707)"},
- {"VUID-vkCmdDispatchIndirect-commandBuffer-02711", "commandBuffer must not be a protected command buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-commandBuffer-02711)"},
- {"VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool)"},
- {"VUID-vkCmdDispatchIndirect-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-commandBuffer-parameter)"},
- {"VUID-vkCmdDispatchIndirect-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-commandBuffer-recording)"},
- {"VUID-vkCmdDispatchIndirect-commonparent", "Both of buffer, and commandBuffer must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-commonparent)"},
- {"VUID-vkCmdDispatchIndirect-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-filterCubic-02694)"},
- {"VUID-vkCmdDispatchIndirect-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-filterCubicMinmax-02695)"},
- {"VUID-vkCmdDispatchIndirect-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-flags-02696)"},
- {"VUID-vkCmdDispatchIndirect-offset-00407", "The sum of offset and the size of VkDispatchIndirectCommand must be less than or equal to the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-offset-00407)"},
- {"VUID-vkCmdDispatchIndirect-offset-02710", "offset must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-offset-02710)"},
- {"VUID-vkCmdDispatchIndirect-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDispatchIndirect-renderpass)"},
- {"VUID-vkCmdDraw-None-02686", "Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-None-02686)"},
- {"VUID-vkCmdDraw-None-02687", "Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by this command. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-None-02687)"},
- {"VUID-vkCmdDraw-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-None-02690)"},
- {"VUID-vkCmdDraw-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-None-02691)"},
- {"VUID-vkCmdDraw-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-None-02692)"},
- {"VUID-vkCmdDraw-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-vkCmdDraw-None-02693)"},
- {"VUID-vkCmdDraw-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-None-02697)"},
- {"VUID-vkCmdDraw-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-None-02698)"},
- {"VUID-vkCmdDraw-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-None-02699)"},
- {"VUID-vkCmdDraw-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-None-02700)"},
- {"VUID-vkCmdDraw-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-None-02702)"},
- {"VUID-vkCmdDraw-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-None-02703)"},
- {"VUID-vkCmdDraw-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-None-02704)"},
- {"VUID-vkCmdDraw-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-None-02705)"},
- {"VUID-vkCmdDraw-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-None-02706)"},
- {"VUID-vkCmdDraw-None-02720", "All vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must have valid buffers bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-None-02720)"},
- {"VUID-vkCmdDraw-None-02721", "For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in Vertex Input Description (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-None-02721)"},
- {"VUID-vkCmdDraw-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-None-02859)"},
- {"VUID-vkCmdDraw-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-commandBuffer-02701)"},
- {"VUID-vkCmdDraw-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-commandBuffer-02707)"},
- {"VUID-vkCmdDraw-commandBuffer-02712", "If commandBuffer is a protected command buffer, any resource written to by the VkPipeline object bound to the pipeline bind point used by this command must not be an unprotected resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-commandBuffer-02712)"},
- {"VUID-vkCmdDraw-commandBuffer-02713", "If commandBuffer is a protected command buffer, pipeline stages other than the framebuffer-space and compute stages in the VkPipeline object bound to the pipeline bind point must not write to any resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-commandBuffer-02713)"},
- {"VUID-vkCmdDraw-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-commandBuffer-cmdpool)"},
- {"VUID-vkCmdDraw-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-commandBuffer-parameter)"},
- {"VUID-vkCmdDraw-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-commandBuffer-recording)"},
- {"VUID-vkCmdDraw-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-filterCubic-02694)"},
- {"VUID-vkCmdDraw-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-filterCubicMinmax-02695)"},
- {"VUID-vkCmdDraw-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-flags-02696)"},
- {"VUID-vkCmdDraw-maxMultiviewInstanceIndex-02688", "If the draw is recorded in a render pass instance with multiview enabled, the maximum instance index must be less than or equal to VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-maxMultiviewInstanceIndex-02688)"},
- {"VUID-vkCmdDraw-renderPass-02684", "The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-renderPass-02684)"},
- {"VUID-vkCmdDraw-renderpass", "This command must only be called inside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-renderpass)"},
- {"VUID-vkCmdDraw-sampleLocationsEnable-02689", "If the bound graphics pipeline was created with VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable set to VK_TRUE and the current subpass has a depth/stencil attachment, then that attachment must have been created with the VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-sampleLocationsEnable-02689)"},
- {"VUID-vkCmdDraw-subpass-02685", "The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDraw-subpass-02685)"},
- {"VUID-vkCmdDrawIndexed-None-02686", "Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-None-02686)"},
- {"VUID-vkCmdDrawIndexed-None-02687", "Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by this command. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-None-02687)"},
- {"VUID-vkCmdDrawIndexed-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-None-02690)"},
- {"VUID-vkCmdDrawIndexed-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-None-02691)"},
- {"VUID-vkCmdDrawIndexed-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-None-02692)"},
- {"VUID-vkCmdDrawIndexed-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-vkCmdDrawIndexed-None-02693)"},
- {"VUID-vkCmdDrawIndexed-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-None-02697)"},
- {"VUID-vkCmdDrawIndexed-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-None-02698)"},
- {"VUID-vkCmdDrawIndexed-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-None-02699)"},
- {"VUID-vkCmdDrawIndexed-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-None-02700)"},
- {"VUID-vkCmdDrawIndexed-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-None-02702)"},
- {"VUID-vkCmdDrawIndexed-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-None-02703)"},
- {"VUID-vkCmdDrawIndexed-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-None-02704)"},
- {"VUID-vkCmdDrawIndexed-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-None-02705)"},
- {"VUID-vkCmdDrawIndexed-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-None-02706)"},
- {"VUID-vkCmdDrawIndexed-None-02720", "All vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must have valid buffers bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-None-02720)"},
- {"VUID-vkCmdDrawIndexed-None-02721", "For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in Vertex Input Description (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-None-02721)"},
- {"VUID-vkCmdDrawIndexed-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-None-02859)"},
- {"VUID-vkCmdDrawIndexed-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-commandBuffer-02701)"},
- {"VUID-vkCmdDrawIndexed-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-commandBuffer-02707)"},
- {"VUID-vkCmdDrawIndexed-commandBuffer-02712", "If commandBuffer is a protected command buffer, any resource written to by the VkPipeline object bound to the pipeline bind point used by this command must not be an unprotected resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-commandBuffer-02712)"},
- {"VUID-vkCmdDrawIndexed-commandBuffer-02713", "If commandBuffer is a protected command buffer, pipeline stages other than the framebuffer-space and compute stages in the VkPipeline object bound to the pipeline bind point must not write to any resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-commandBuffer-02713)"},
- {"VUID-vkCmdDrawIndexed-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-commandBuffer-cmdpool)"},
- {"VUID-vkCmdDrawIndexed-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-commandBuffer-parameter)"},
- {"VUID-vkCmdDrawIndexed-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-commandBuffer-recording)"},
- {"VUID-vkCmdDrawIndexed-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-filterCubic-02694)"},
- {"VUID-vkCmdDrawIndexed-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-filterCubicMinmax-02695)"},
- {"VUID-vkCmdDrawIndexed-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-flags-02696)"},
- {"VUID-vkCmdDrawIndexed-indexSize-00463", "(indexSize * (firstIndex + indexCount) + offset) must be less than or equal to the size of the bound index buffer, with indexSize being based on the type specified by indexType, where the index buffer, indexType, and offset are specified via vkCmdBindIndexBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-indexSize-00463)"},
- {"VUID-vkCmdDrawIndexed-maxMultiviewInstanceIndex-02688", "If the draw is recorded in a render pass instance with multiview enabled, the maximum instance index must be less than or equal to VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-maxMultiviewInstanceIndex-02688)"},
- {"VUID-vkCmdDrawIndexed-renderPass-02684", "The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-renderPass-02684)"},
- {"VUID-vkCmdDrawIndexed-renderpass", "This command must only be called inside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-renderpass)"},
- {"VUID-vkCmdDrawIndexed-sampleLocationsEnable-02689", "If the bound graphics pipeline was created with VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable set to VK_TRUE and the current subpass has a depth/stencil attachment, then that attachment must have been created with the VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-sampleLocationsEnable-02689)"},
- {"VUID-vkCmdDrawIndexed-subpass-02685", "The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-subpass-02685)"},
- {"VUID-vkCmdDrawIndexedIndirect-None-02686", "Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-02686)"},
- {"VUID-vkCmdDrawIndexedIndirect-None-02687", "Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by this command. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-02687)"},
- {"VUID-vkCmdDrawIndexedIndirect-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-02690)"},
- {"VUID-vkCmdDrawIndexedIndirect-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-02691)"},
- {"VUID-vkCmdDrawIndexedIndirect-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-02692)"},
- {"VUID-vkCmdDrawIndexedIndirect-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-vkCmdDrawIndexedIndirect-None-02693)"},
- {"VUID-vkCmdDrawIndexedIndirect-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-02697)"},
- {"VUID-vkCmdDrawIndexedIndirect-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-02698)"},
- {"VUID-vkCmdDrawIndexedIndirect-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-02699)"},
- {"VUID-vkCmdDrawIndexedIndirect-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-02700)"},
- {"VUID-vkCmdDrawIndexedIndirect-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-02702)"},
- {"VUID-vkCmdDrawIndexedIndirect-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-02703)"},
- {"VUID-vkCmdDrawIndexedIndirect-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-02704)"},
- {"VUID-vkCmdDrawIndexedIndirect-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-02705)"},
- {"VUID-vkCmdDrawIndexedIndirect-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-02706)"},
- {"VUID-vkCmdDrawIndexedIndirect-None-02720", "All vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must have valid buffers bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-02720)"},
- {"VUID-vkCmdDrawIndexedIndirect-None-02721", "For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in Vertex Input Description (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-02721)"},
- {"VUID-vkCmdDrawIndexedIndirect-None-02837", "If drawIndirectCount is not enabled this function must not be used (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-vkCmdDrawIndexedIndirect-None-02837)"},
- {"VUID-vkCmdDrawIndexedIndirect-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-None-02859)"},
- {"VUID-vkCmdDrawIndexedIndirect-buffer-02708", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-buffer-02708)"},
- {"VUID-vkCmdDrawIndexedIndirect-buffer-02709", "buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-buffer-02709)"},
- {"VUID-vkCmdDrawIndexedIndirect-buffer-parameter", "buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-buffer-parameter)"},
- {"VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701)"},
- {"VUID-vkCmdDrawIndexedIndirect-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-commandBuffer-02707)"},
- {"VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711", "commandBuffer must not be a protected command buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711)"},
- {"VUID-vkCmdDrawIndexedIndirect-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-commandBuffer-cmdpool)"},
- {"VUID-vkCmdDrawIndexedIndirect-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-commandBuffer-parameter)"},
- {"VUID-vkCmdDrawIndexedIndirect-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-commandBuffer-recording)"},
- {"VUID-vkCmdDrawIndexedIndirect-commonparent", "Both of buffer, and commandBuffer must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-commonparent)"},
- {"VUID-vkCmdDrawIndexedIndirect-drawCount-00528", "If drawCount is greater than 1, stride must be a multiple of 4 and must be greater than or equal to sizeof(VkDrawIndexedIndirectCommand) (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-drawCount-00528)"},
- {"VUID-vkCmdDrawIndexedIndirect-drawCount-00539", "If drawCount is equal to 1, (offset + sizeof(VkDrawIndexedIndirectCommand)) must be less than or equal to the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-drawCount-00539)"},
- {"VUID-vkCmdDrawIndexedIndirect-drawCount-00540", "If drawCount is greater than 1, (stride {times} (drawCount - 1) + offset + sizeof(VkDrawIndexedIndirectCommand)) must be less than or equal to the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-drawCount-00540)"},
- {"VUID-vkCmdDrawIndexedIndirect-drawCount-02718", "If the multi-draw indirect feature is not enabled, drawCount must be 0 or 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-drawCount-02718)"},
- {"VUID-vkCmdDrawIndexedIndirect-drawCount-02719", "drawCount must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-drawCount-02719)"},
- {"VUID-vkCmdDrawIndexedIndirect-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-filterCubic-02694)"},
- {"VUID-vkCmdDrawIndexedIndirect-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-filterCubicMinmax-02695)"},
- {"VUID-vkCmdDrawIndexedIndirect-firstInstance-00530", "If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the VkDrawIndexedIndirectCommand structures accessed by this command must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-firstInstance-00530)"},
- {"VUID-vkCmdDrawIndexedIndirect-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-flags-02696)"},
- {"VUID-vkCmdDrawIndexedIndirect-maxMultiviewInstanceIndex-02688", "If the draw is recorded in a render pass instance with multiview enabled, the maximum instance index must be less than or equal to VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-maxMultiviewInstanceIndex-02688)"},
- {"VUID-vkCmdDrawIndexedIndirect-offset-02710", "offset must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-offset-02710)"},
- {"VUID-vkCmdDrawIndexedIndirect-renderPass-02684", "The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-renderPass-02684)"},
- {"VUID-vkCmdDrawIndexedIndirect-renderpass", "This command must only be called inside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-renderpass)"},
- {"VUID-vkCmdDrawIndexedIndirect-sampleLocationsEnable-02689", "If the bound graphics pipeline was created with VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable set to VK_TRUE and the current subpass has a depth/stencil attachment, then that attachment must have been created with the VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-sampleLocationsEnable-02689)"},
- {"VUID-vkCmdDrawIndexedIndirect-subpass-02685", "The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirect-subpass-02685)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-None-02686", "Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-None-02686)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-None-02687", "Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by this command. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-None-02687)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-None-02690)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-None-02691)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-None-02692)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-vkCmdDrawIndexedIndirectCount-None-02693)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-None-02697)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-None-02698)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-None-02699)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-None-02700)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-None-02702)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-None-02703)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-None-02704)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-None-02705)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-None-02706)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-None-02720", "All vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must have valid buffers bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-None-02720)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-None-02721", "For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in Vertex Input Description (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-None-02721)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-None-02859)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-buffer-02708", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-buffer-02708)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-buffer-02709", "buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-buffer-02709)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-buffer-parameter", "buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-buffer-parameter)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02707)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02711", "commandBuffer must not be a protected command buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02711)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-cmdpool)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-parameter)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-recording)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-commonparent", "Each of buffer, commandBuffer, and countBuffer must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-commonparent)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714", "If countBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715", "countBuffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02717", "The count stored in countBuffer must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02717)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-countBuffer-03153", "If count stored in countBuffer is equal to 1, (offset + sizeof(VkDrawIndexedIndirectCommand)) must be less than or equal to the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-countBuffer-03153)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-countBuffer-03154", "If count stored in countBuffer is greater than 1, (stride {times} (drawCount - 1) + offset + sizeof(VkDrawIndexedIndirectCommand)) must be less than or equal to the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-countBuffer-03154)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-countBuffer-parameter", "countBuffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-countBuffer-parameter)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716", "countBufferOffset must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-filterCubic-02694)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-filterCubicMinmax-02695)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-flags-02696)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-maxDrawCount-03143", "If maxDrawCount is greater than or equal to 1, (stride {times} (maxDrawCount - 1) + offset + sizeof(VkDrawIndexedIndirectCommand)) must be less than or equal to the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-maxDrawCount-03143)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-maxMultiviewInstanceIndex-02688", "If the draw is recorded in a render pass instance with multiview enabled, the maximum instance index must be less than or equal to VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-maxMultiviewInstanceIndex-02688)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-offset-02710", "offset must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-offset-02710)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684", "The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-renderpass", "This command must only be called inside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-renderpass)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-sampleLocationsEnable-02689", "If the bound graphics pipeline was created with VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable set to VK_TRUE and the current subpass has a depth/stencil attachment, then that attachment must have been created with the VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-sampleLocationsEnable-02689)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-stride-03142", "stride must be a multiple of 4 and must be greater than or equal to sizeof(VkDrawIndexedIndirectCommand) (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-stride-03142)"},
- {"VUID-vkCmdDrawIndexedIndirectCount-subpass-02685", "The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndexedIndirectCount-subpass-02685)"},
- {"VUID-vkCmdDrawIndirect-None-02686", "Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-None-02686)"},
- {"VUID-vkCmdDrawIndirect-None-02687", "Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by this command. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-None-02687)"},
- {"VUID-vkCmdDrawIndirect-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-None-02690)"},
- {"VUID-vkCmdDrawIndirect-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-None-02691)"},
- {"VUID-vkCmdDrawIndirect-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-None-02692)"},
- {"VUID-vkCmdDrawIndirect-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-vkCmdDrawIndirect-None-02693)"},
- {"VUID-vkCmdDrawIndirect-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-None-02697)"},
- {"VUID-vkCmdDrawIndirect-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-None-02698)"},
- {"VUID-vkCmdDrawIndirect-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-None-02699)"},
- {"VUID-vkCmdDrawIndirect-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-None-02700)"},
- {"VUID-vkCmdDrawIndirect-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-None-02702)"},
- {"VUID-vkCmdDrawIndirect-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-None-02703)"},
- {"VUID-vkCmdDrawIndirect-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-None-02704)"},
- {"VUID-vkCmdDrawIndirect-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-None-02705)"},
- {"VUID-vkCmdDrawIndirect-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-None-02706)"},
- {"VUID-vkCmdDrawIndirect-None-02720", "All vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must have valid buffers bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-None-02720)"},
- {"VUID-vkCmdDrawIndirect-None-02721", "For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in Vertex Input Description (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-None-02721)"},
- {"VUID-vkCmdDrawIndirect-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-None-02859)"},
- {"VUID-vkCmdDrawIndirect-buffer-02708", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-buffer-02708)"},
- {"VUID-vkCmdDrawIndirect-buffer-02709", "buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-buffer-02709)"},
- {"VUID-vkCmdDrawIndirect-buffer-parameter", "buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-buffer-parameter)"},
- {"VUID-vkCmdDrawIndirect-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-commandBuffer-02701)"},
- {"VUID-vkCmdDrawIndirect-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-commandBuffer-02707)"},
- {"VUID-vkCmdDrawIndirect-commandBuffer-02711", "commandBuffer must not be a protected command buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-commandBuffer-02711)"},
- {"VUID-vkCmdDrawIndirect-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-commandBuffer-cmdpool)"},
- {"VUID-vkCmdDrawIndirect-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-commandBuffer-parameter)"},
- {"VUID-vkCmdDrawIndirect-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-commandBuffer-recording)"},
- {"VUID-vkCmdDrawIndirect-commonparent", "Both of buffer, and commandBuffer must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-commonparent)"},
- {"VUID-vkCmdDrawIndirect-drawCount-00476", "If drawCount is greater than 1, stride must be a multiple of 4 and must be greater than or equal to sizeof(VkDrawIndirectCommand) (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-drawCount-00476)"},
- {"VUID-vkCmdDrawIndirect-drawCount-00487", "If drawCount is equal to 1, (offset + sizeof(VkDrawIndirectCommand)) must be less than or equal to the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-drawCount-00487)"},
- {"VUID-vkCmdDrawIndirect-drawCount-00488", "If drawCount is greater than 1, (stride {times} (drawCount - 1) + offset + sizeof(VkDrawIndirectCommand)) must be less than or equal to the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-drawCount-00488)"},
- {"VUID-vkCmdDrawIndirect-drawCount-02718", "If the multi-draw indirect feature is not enabled, drawCount must be 0 or 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-drawCount-02718)"},
- {"VUID-vkCmdDrawIndirect-drawCount-02719", "drawCount must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-drawCount-02719)"},
- {"VUID-vkCmdDrawIndirect-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-filterCubic-02694)"},
- {"VUID-vkCmdDrawIndirect-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-filterCubicMinmax-02695)"},
- {"VUID-vkCmdDrawIndirect-firstInstance-00478", "If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the VkDrawIndirectCommand structures accessed by this command must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-firstInstance-00478)"},
- {"VUID-vkCmdDrawIndirect-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-flags-02696)"},
- {"VUID-vkCmdDrawIndirect-maxMultiviewInstanceIndex-02688", "If the draw is recorded in a render pass instance with multiview enabled, the maximum instance index must be less than or equal to VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-maxMultiviewInstanceIndex-02688)"},
- {"VUID-vkCmdDrawIndirect-offset-02710", "offset must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-offset-02710)"},
- {"VUID-vkCmdDrawIndirect-renderPass-02684", "The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-renderPass-02684)"},
- {"VUID-vkCmdDrawIndirect-renderpass", "This command must only be called inside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-renderpass)"},
- {"VUID-vkCmdDrawIndirect-sampleLocationsEnable-02689", "If the bound graphics pipeline was created with VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable set to VK_TRUE and the current subpass has a depth/stencil attachment, then that attachment must have been created with the VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-sampleLocationsEnable-02689)"},
- {"VUID-vkCmdDrawIndirect-subpass-02685", "The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirect-subpass-02685)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-None-02686", "Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-None-02686)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-None-02687", "Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by this command. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-None-02687)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-None-02690)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-None-02691)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-None-02692)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-vkCmdDrawIndirectByteCountEXT-None-02693)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-None-02697)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-None-02698)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-None-02699)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-None-02700)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-None-02702)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-None-02703)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-None-02704)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-None-02705)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-None-02706)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-None-02720", "All vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must have valid buffers bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-None-02720)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-None-02721", "For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in Vertex Input Description (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-None-02721)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-None-02859)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-02646", "commandBuffer must not be a protected command buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-02646)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-02701)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-02707)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-cmdpool)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-parameter)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-recording)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-commonparent", "Both of commandBuffer, and counterBuffer must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-commonparent)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-counterBuffer-02290", "counterBuffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-counterBuffer-02290)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-counterBuffer-parameter", "counterBuffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-counterBuffer-parameter)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-filterCubic-02694)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-filterCubicMinmax-02695)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-flags-02696)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-maxMultiviewInstanceIndex-02688", "If the draw is recorded in a render pass instance with multiview enabled, the maximum instance index must be less than or equal to VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-maxMultiviewInstanceIndex-02688)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-renderPass-02684", "The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-renderPass-02684)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-renderpass", "This command must only be called inside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-renderpass)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-sampleLocationsEnable-02689", "If the bound graphics pipeline was created with VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable set to VK_TRUE and the current subpass has a depth/stencil attachment, then that attachment must have been created with the VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-sampleLocationsEnable-02689)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-subpass-02685", "The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-subpass-02685)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-transformFeedback-02287", "VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-transformFeedback-02287)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-transformFeedbackDraw-02288", "The implementation must support VkPhysicalDeviceTransformFeedbackPropertiesEXT::transformFeedbackDraw (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-transformFeedbackDraw-02288)"},
- {"VUID-vkCmdDrawIndirectByteCountEXT-vertexStride-02289", "vertexStride must be greater than 0 and less than or equal to VkPhysicalDeviceLimits::maxTransformFeedbackBufferDataStride (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectByteCountEXT-vertexStride-02289)"},
- {"VUID-vkCmdDrawIndirectCount-None-02686", "Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-None-02686)"},
- {"VUID-vkCmdDrawIndirectCount-None-02687", "Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by this command. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-None-02687)"},
- {"VUID-vkCmdDrawIndirectCount-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-None-02690)"},
- {"VUID-vkCmdDrawIndirectCount-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-None-02691)"},
- {"VUID-vkCmdDrawIndirectCount-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-None-02692)"},
- {"VUID-vkCmdDrawIndirectCount-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-vkCmdDrawIndirectCount-None-02693)"},
- {"VUID-vkCmdDrawIndirectCount-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-None-02697)"},
- {"VUID-vkCmdDrawIndirectCount-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-None-02698)"},
- {"VUID-vkCmdDrawIndirectCount-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-None-02699)"},
- {"VUID-vkCmdDrawIndirectCount-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-None-02700)"},
- {"VUID-vkCmdDrawIndirectCount-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-None-02702)"},
- {"VUID-vkCmdDrawIndirectCount-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-None-02703)"},
- {"VUID-vkCmdDrawIndirectCount-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-None-02704)"},
- {"VUID-vkCmdDrawIndirectCount-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-None-02705)"},
- {"VUID-vkCmdDrawIndirectCount-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-None-02706)"},
- {"VUID-vkCmdDrawIndirectCount-None-02720", "All vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must have valid buffers bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-None-02720)"},
- {"VUID-vkCmdDrawIndirectCount-None-02721", "For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in Vertex Input Description (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-None-02721)"},
- {"VUID-vkCmdDrawIndirectCount-None-02836", "If drawIndirectCount is not enabled this function must not be used (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-vkCmdDrawIndirectCount-None-02836)"},
- {"VUID-vkCmdDrawIndirectCount-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-None-02859)"},
- {"VUID-vkCmdDrawIndirectCount-buffer-02708", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-buffer-02708)"},
- {"VUID-vkCmdDrawIndirectCount-buffer-02709", "buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-buffer-02709)"},
- {"VUID-vkCmdDrawIndirectCount-buffer-parameter", "buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-buffer-parameter)"},
- {"VUID-vkCmdDrawIndirectCount-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-commandBuffer-02701)"},
- {"VUID-vkCmdDrawIndirectCount-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-commandBuffer-02707)"},
- {"VUID-vkCmdDrawIndirectCount-commandBuffer-02711", "commandBuffer must not be a protected command buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-commandBuffer-02711)"},
- {"VUID-vkCmdDrawIndirectCount-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-commandBuffer-cmdpool)"},
- {"VUID-vkCmdDrawIndirectCount-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-commandBuffer-parameter)"},
- {"VUID-vkCmdDrawIndirectCount-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-commandBuffer-recording)"},
- {"VUID-vkCmdDrawIndirectCount-commonparent", "Each of buffer, commandBuffer, and countBuffer must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-commonparent)"},
- {"VUID-vkCmdDrawIndirectCount-countBuffer-02714", "If countBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-countBuffer-02714)"},
- {"VUID-vkCmdDrawIndirectCount-countBuffer-02715", "countBuffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-countBuffer-02715)"},
- {"VUID-vkCmdDrawIndirectCount-countBuffer-02717", "The count stored in countBuffer must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-countBuffer-02717)"},
- {"VUID-vkCmdDrawIndirectCount-countBuffer-03121", "If the count stored in countBuffer is equal to 1, (offset + sizeof(VkDrawIndirectCommand)) must be less than or equal to the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-countBuffer-03121)"},
- {"VUID-vkCmdDrawIndirectCount-countBuffer-03122", "If the count stored in countBuffer is greater than 1, (stride {times} (drawCount - 1) + offset + sizeof(VkDrawIndirectCommand)) must be less than or equal to the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-countBuffer-03122)"},
- {"VUID-vkCmdDrawIndirectCount-countBuffer-parameter", "countBuffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-countBuffer-parameter)"},
- {"VUID-vkCmdDrawIndirectCount-countBufferOffset-02716", "countBufferOffset must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-countBufferOffset-02716)"},
- {"VUID-vkCmdDrawIndirectCount-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-filterCubic-02694)"},
- {"VUID-vkCmdDrawIndirectCount-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-filterCubicMinmax-02695)"},
- {"VUID-vkCmdDrawIndirectCount-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-flags-02696)"},
- {"VUID-vkCmdDrawIndirectCount-maxDrawCount-03111", "If maxDrawCount is greater than or equal to 1, (stride {times} (maxDrawCount - 1) + offset + sizeof(VkDrawIndirectCommand)) must be less than or equal to the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-maxDrawCount-03111)"},
- {"VUID-vkCmdDrawIndirectCount-maxMultiviewInstanceIndex-02688", "If the draw is recorded in a render pass instance with multiview enabled, the maximum instance index must be less than or equal to VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-maxMultiviewInstanceIndex-02688)"},
- {"VUID-vkCmdDrawIndirectCount-offset-02710", "offset must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-offset-02710)"},
- {"VUID-vkCmdDrawIndirectCount-renderPass-02684", "The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-renderPass-02684)"},
- {"VUID-vkCmdDrawIndirectCount-renderpass", "This command must only be called inside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-renderpass)"},
- {"VUID-vkCmdDrawIndirectCount-sampleLocationsEnable-02689", "If the bound graphics pipeline was created with VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable set to VK_TRUE and the current subpass has a depth/stencil attachment, then that attachment must have been created with the VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-sampleLocationsEnable-02689)"},
- {"VUID-vkCmdDrawIndirectCount-stride-03110", "stride must be a multiple of 4 and must be greater than or equal to sizeof(VkDrawIndirectCommand) (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-stride-03110)"},
- {"VUID-vkCmdDrawIndirectCount-subpass-02685", "The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawIndirectCount-subpass-02685)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02686", "Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02686)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02687", "Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by this command. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02687)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02690)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02691)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02692)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02693)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02697)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02698)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02699)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02700)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02702)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02703)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02704)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02705)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02706)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02859)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02708", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02708)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02709", "buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02709)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-parameter", "buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-parameter)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02701)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02707)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02711", "commandBuffer must not be a protected command buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02711)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-cmdpool)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-parameter)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-recording)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-commonparent", "Each of buffer, commandBuffer, and countBuffer must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-commonparent)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02191", "If the count stored in countBuffer is equal to 1, (offset + sizeof(VkDrawMeshTasksIndirectCommandNV)) must be less than or equal to the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02191)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02192", "If the count stored in countBuffer is greater than 1, (stride {times} (drawCount - 1) + offset + sizeof(VkDrawMeshTasksIndirectCommandNV)) must be less than or equal to the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02192)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02714", "If countBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02714)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715", "countBuffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02717", "The count stored in countBuffer must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02717)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-parameter", "countBuffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-parameter)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-countBufferOffset-02716", "countBufferOffset must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-countBufferOffset-02716)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-filterCubic-02694)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-filterCubicMinmax-02695)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-flags-02696)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-maxDrawCount-02183", "If maxDrawCount is greater than or equal to 1, (stride {times} (maxDrawCount - 1) + offset + sizeof(VkDrawMeshTasksIndirectCommandNV)) must be less than or equal to the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-maxDrawCount-02183)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-maxMultiviewInstanceIndex-02688", "If the draw is recorded in a render pass instance with multiview enabled, the maximum instance index must be less than or equal to VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-maxMultiviewInstanceIndex-02688)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-offset-02710", "offset must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-offset-02710)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-renderPass-02684", "The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-renderPass-02684)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-renderpass", "This command must only be called inside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-renderpass)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-sampleLocationsEnable-02689", "If the bound graphics pipeline was created with VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable set to VK_TRUE and the current subpass has a depth/stencil attachment, then that attachment must have been created with the VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-sampleLocationsEnable-02689)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182", "stride must be a multiple of 4 and must be greater than or equal to sizeof(VkDrawMeshTasksIndirectCommandNV) (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182)"},
- {"VUID-vkCmdDrawMeshTasksIndirectCountNV-subpass-02685", "The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectCountNV-subpass-02685)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02686", "Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-None-02686)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02687", "Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by this command. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-None-02687)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-None-02690)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-None-02691)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-None-02692)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-vkCmdDrawMeshTasksIndirectNV-None-02693)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-None-02697)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-None-02698)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-None-02699)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-None-02700)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-None-02702)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-None-02703)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-None-02704)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-None-02705)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-None-02706)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-None-02859)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02708", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02708)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02709", "buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02709)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-buffer-parameter", "buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-buffer-parameter)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02701)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02707)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02711", "commandBuffer must not be a protected command buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02711)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-cmdpool)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-parameter)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-recording)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-commonparent", "Both of buffer, and commandBuffer must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-commonparent)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02146", "If drawCount is greater than 1, stride must be a multiple of 4 and must be greater than or equal to sizeof(VkDrawMeshTasksIndirectCommandNV) (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02146)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02156", "If drawCount is equal to 1, (offset + sizeof(VkDrawMeshTasksIndirectCommandNV)) must be less than or equal to the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02156)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02157", "If drawCount is greater than 1, (stride {times} (drawCount - 1) + offset + sizeof(VkDrawMeshTasksIndirectCommandNV)) must be less than or equal to the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02157)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02718", "If the multi-draw indirect feature is not enabled, drawCount must be 0 or 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02718)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02719", "drawCount must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02719)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-filterCubic-02694)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-filterCubicMinmax-02695)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-flags-02696)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-maxMultiviewInstanceIndex-02688", "If the draw is recorded in a render pass instance with multiview enabled, the maximum instance index must be less than or equal to VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-maxMultiviewInstanceIndex-02688)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-offset-02710", "offset must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-offset-02710)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-renderPass-02684", "The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-renderPass-02684)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-renderpass", "This command must only be called inside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-renderpass)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-sampleLocationsEnable-02689", "If the bound graphics pipeline was created with VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable set to VK_TRUE and the current subpass has a depth/stencil attachment, then that attachment must have been created with the VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-sampleLocationsEnable-02689)"},
- {"VUID-vkCmdDrawMeshTasksIndirectNV-subpass-02685", "The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksIndirectNV-subpass-02685)"},
- {"VUID-vkCmdDrawMeshTasksNV-None-02686", "Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-None-02686)"},
- {"VUID-vkCmdDrawMeshTasksNV-None-02687", "Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by this command. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-None-02687)"},
- {"VUID-vkCmdDrawMeshTasksNV-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-None-02690)"},
- {"VUID-vkCmdDrawMeshTasksNV-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-None-02691)"},
- {"VUID-vkCmdDrawMeshTasksNV-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-None-02692)"},
- {"VUID-vkCmdDrawMeshTasksNV-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-vkCmdDrawMeshTasksNV-None-02693)"},
- {"VUID-vkCmdDrawMeshTasksNV-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-None-02697)"},
- {"VUID-vkCmdDrawMeshTasksNV-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-None-02698)"},
- {"VUID-vkCmdDrawMeshTasksNV-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-None-02699)"},
- {"VUID-vkCmdDrawMeshTasksNV-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-None-02700)"},
- {"VUID-vkCmdDrawMeshTasksNV-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-None-02702)"},
- {"VUID-vkCmdDrawMeshTasksNV-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-None-02703)"},
- {"VUID-vkCmdDrawMeshTasksNV-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-None-02704)"},
- {"VUID-vkCmdDrawMeshTasksNV-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-None-02705)"},
- {"VUID-vkCmdDrawMeshTasksNV-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-None-02706)"},
- {"VUID-vkCmdDrawMeshTasksNV-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-None-02859)"},
- {"VUID-vkCmdDrawMeshTasksNV-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-commandBuffer-02701)"},
- {"VUID-vkCmdDrawMeshTasksNV-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-commandBuffer-02707)"},
- {"VUID-vkCmdDrawMeshTasksNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-commandBuffer-cmdpool)"},
- {"VUID-vkCmdDrawMeshTasksNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-commandBuffer-parameter)"},
- {"VUID-vkCmdDrawMeshTasksNV-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-commandBuffer-recording)"},
- {"VUID-vkCmdDrawMeshTasksNV-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-filterCubic-02694)"},
- {"VUID-vkCmdDrawMeshTasksNV-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-filterCubicMinmax-02695)"},
- {"VUID-vkCmdDrawMeshTasksNV-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-flags-02696)"},
- {"VUID-vkCmdDrawMeshTasksNV-maxMultiviewInstanceIndex-02688", "If the draw is recorded in a render pass instance with multiview enabled, the maximum instance index must be less than or equal to VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-maxMultiviewInstanceIndex-02688)"},
- {"VUID-vkCmdDrawMeshTasksNV-renderPass-02684", "The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-renderPass-02684)"},
- {"VUID-vkCmdDrawMeshTasksNV-renderpass", "This command must only be called inside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-renderpass)"},
- {"VUID-vkCmdDrawMeshTasksNV-sampleLocationsEnable-02689", "If the bound graphics pipeline was created with VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable set to VK_TRUE and the current subpass has a depth/stencil attachment, then that attachment must have been created with the VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-sampleLocationsEnable-02689)"},
- {"VUID-vkCmdDrawMeshTasksNV-subpass-02685", "The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-subpass-02685)"},
- {"VUID-vkCmdDrawMeshTasksNV-taskCount-02119", "taskCount must be less than or equal to VkPhysicalDeviceMeshShaderPropertiesNV::maxDrawMeshTasksCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdDrawMeshTasksNV-taskCount-02119)"},
- {"VUID-vkCmdEndConditionalRenderingEXT-None-01985", "Conditional rendering must be active (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndConditionalRenderingEXT-None-01985)"},
- {"VUID-vkCmdEndConditionalRenderingEXT-None-01986", "If conditional rendering was made active outside of a render pass instance, it must not be ended inside a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndConditionalRenderingEXT-None-01986)"},
- {"VUID-vkCmdEndConditionalRenderingEXT-None-01987", "If conditional rendering was made active within a subpass it must be ended in the same subpass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndConditionalRenderingEXT-None-01987)"},
- {"VUID-vkCmdEndConditionalRenderingEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndConditionalRenderingEXT-commandBuffer-cmdpool)"},
- {"VUID-vkCmdEndConditionalRenderingEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndConditionalRenderingEXT-commandBuffer-parameter)"},
- {"VUID-vkCmdEndConditionalRenderingEXT-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndConditionalRenderingEXT-commandBuffer-recording)"},
- {"VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-01912", "There must be an outstanding vkCmdBeginDebugUtilsLabelEXT command prior to the vkCmdEndDebugUtilsLabelEXT on the queue that commandBuffer is submitted to (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-01912)"},
- {"VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-01913", "If commandBuffer is a secondary command buffer, there must be an outstanding vkCmdBeginDebugUtilsLabelEXT command recorded to commandBuffer that has not previously been ended by a call to vkCmdEndDebugUtilsLabelEXT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-01913)"},
- {"VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-cmdpool)"},
- {"VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-parameter)"},
- {"VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-recording)"},
- {"VUID-vkCmdEndQuery-None-01923", "All queries used by the command must be active (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQuery-None-01923)"},
- {"VUID-vkCmdEndQuery-commandBuffer-01886", "commandBuffer must not be a protected command buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQuery-commandBuffer-01886)"},
- {"VUID-vkCmdEndQuery-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQuery-commandBuffer-cmdpool)"},
- {"VUID-vkCmdEndQuery-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQuery-commandBuffer-parameter)"},
- {"VUID-vkCmdEndQuery-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQuery-commandBuffer-recording)"},
- {"VUID-vkCmdEndQuery-commonparent", "Both of commandBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQuery-commonparent)"},
- {"VUID-vkCmdEndQuery-query-00810", "query must be less than the number of queries in queryPool (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQuery-query-00810)"},
- {"VUID-vkCmdEndQuery-query-00812", "If vkCmdEndQuery is called within a render pass instance, the sum of query and the number of bits set in the current subpass's view mask must be less than or equal to the number of queries in queryPool (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQuery-query-00812)"},
- {"VUID-vkCmdEndQuery-queryPool-03227", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR and one or more of the counters used to create queryPool was VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR, the vkCmdEndQuery must be the last recorded command in commandBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQuery-queryPool-03227)"},
- {"VUID-vkCmdEndQuery-queryPool-03228", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR and one or more of the counters used to create queryPool was VK_PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR, the vkCmdEndQuery must not be recorded within a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQuery-queryPool-03228)"},
- {"VUID-vkCmdEndQuery-queryPool-parameter", "queryPool must be a valid VkQueryPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQuery-queryPool-parameter)"},
- {"VUID-vkCmdEndQueryIndexedEXT-None-02342", "All queries used by the command must be active (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQueryIndexedEXT-None-02342)"},
- {"VUID-vkCmdEndQueryIndexedEXT-commandBuffer-02344", "commandBuffer must not be a protected command buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQueryIndexedEXT-commandBuffer-02344)"},
- {"VUID-vkCmdEndQueryIndexedEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQueryIndexedEXT-commandBuffer-cmdpool)"},
- {"VUID-vkCmdEndQueryIndexedEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQueryIndexedEXT-commandBuffer-parameter)"},
- {"VUID-vkCmdEndQueryIndexedEXT-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQueryIndexedEXT-commandBuffer-recording)"},
- {"VUID-vkCmdEndQueryIndexedEXT-commonparent", "Both of commandBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQueryIndexedEXT-commonparent)"},
- {"VUID-vkCmdEndQueryIndexedEXT-query-02343", "query must be less than the number of queries in queryPool (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQueryIndexedEXT-query-02343)"},
- {"VUID-vkCmdEndQueryIndexedEXT-query-02345", "If vkCmdEndQueryIndexedEXT is called within a render pass instance, the sum of query and the number of bits set in the current subpass's view mask must be less than or equal to the number of queries in queryPool (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQueryIndexedEXT-query-02345)"},
- {"VUID-vkCmdEndQueryIndexedEXT-queryPool-parameter", "queryPool must be a valid VkQueryPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQueryIndexedEXT-queryPool-parameter)"},
- {"VUID-vkCmdEndQueryIndexedEXT-queryType-02346", "If the queryType used to create queryPool was VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT the index parameter must be less than VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackStreams (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQueryIndexedEXT-queryType-02346)"},
- {"VUID-vkCmdEndQueryIndexedEXT-queryType-02347", "If the queryType used to create queryPool was not VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT the index must be zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQueryIndexedEXT-queryType-02347)"},
- {"VUID-vkCmdEndQueryIndexedEXT-queryType-02723", "If the queryType used to create queryPool was VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT index must equal the index used to begin the query (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndQueryIndexedEXT-queryType-02723)"},
- {"VUID-vkCmdEndRenderPass-None-00910", "The current subpass index must be equal to the number of subpasses in the render pass minus one (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndRenderPass-None-00910)"},
- {"VUID-vkCmdEndRenderPass-None-02351", "This command must not be recorded when transform feedback is active (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndRenderPass-None-02351)"},
- {"VUID-vkCmdEndRenderPass-bufferlevel", "commandBuffer must be a primary VkCommandBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndRenderPass-bufferlevel)"},
- {"VUID-vkCmdEndRenderPass-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndRenderPass-commandBuffer-cmdpool)"},
- {"VUID-vkCmdEndRenderPass-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndRenderPass-commandBuffer-parameter)"},
- {"VUID-vkCmdEndRenderPass-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndRenderPass-commandBuffer-recording)"},
- {"VUID-vkCmdEndRenderPass-renderpass", "This command must only be called inside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndRenderPass-renderpass)"},
- {"VUID-vkCmdEndRenderPass2-None-02352", "This command must not be recorded when transform feedback is active (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndRenderPass2-None-02352)"},
- {"VUID-vkCmdEndRenderPass2-None-03103", "The current subpass index must be equal to the number of subpasses in the render pass minus one (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndRenderPass2-None-03103)"},
- {"VUID-vkCmdEndRenderPass2-bufferlevel", "commandBuffer must be a primary VkCommandBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndRenderPass2-bufferlevel)"},
- {"VUID-vkCmdEndRenderPass2-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndRenderPass2-commandBuffer-cmdpool)"},
- {"VUID-vkCmdEndRenderPass2-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndRenderPass2-commandBuffer-parameter)"},
- {"VUID-vkCmdEndRenderPass2-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndRenderPass2-commandBuffer-recording)"},
- {"VUID-vkCmdEndRenderPass2-pSubpassEndInfo-parameter", "pSubpassEndInfo must be a valid pointer to a valid VkSubpassEndInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndRenderPass2-pSubpassEndInfo-parameter)"},
- {"VUID-vkCmdEndRenderPass2-renderpass", "This command must only be called inside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndRenderPass2-renderpass)"},
- {"VUID-vkCmdEndTransformFeedbackEXT-None-02375", "Transform feedback must be active (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndTransformFeedbackEXT-None-02375)"},
- {"VUID-vkCmdEndTransformFeedbackEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndTransformFeedbackEXT-commandBuffer-cmdpool)"},
- {"VUID-vkCmdEndTransformFeedbackEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndTransformFeedbackEXT-commandBuffer-parameter)"},
- {"VUID-vkCmdEndTransformFeedbackEXT-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndTransformFeedbackEXT-commandBuffer-recording)"},
- {"VUID-vkCmdEndTransformFeedbackEXT-commonparent", "Both of commandBuffer, and the elements of pCounterBuffers that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndTransformFeedbackEXT-commonparent)"},
- {"VUID-vkCmdEndTransformFeedbackEXT-counterBufferCount-02608", "If counterBufferCount is not 0, and pCounterBuffers is not NULL, pCounterBuffers must be a valid pointer to an array of counterBufferCount VkBuffer handles that are either valid or VK_NULL_HANDLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndTransformFeedbackEXT-counterBufferCount-02608)"},
- {"VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02376", "firstCounterBuffer must be less than VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02376)"},
- {"VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377", "The sum of firstCounterBuffer and counterBufferCount must be less than or equal to VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377)"},
- {"VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffer-02379", "If pCounterBuffer is NULL, then pCounterBufferOffsets must also be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffer-02379)"},
- {"VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-02378", "For each buffer handle in the array, if it is not VK_NULL_HANDLE it must reference a buffer large enough to hold 4 bytes at the corresponding offset from the pCounterBufferOffsets array (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-02378)"},
- {"VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-parameter", "If counterBufferCount is not 0, and pCounterBufferOffsets is not NULL, pCounterBufferOffsets must be a valid pointer to an array of counterBufferCount VkDeviceSize values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-parameter)"},
- {"VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffers-02380", "For each buffer handle in the pCounterBuffers array that is not VK_NULL_HANDLE it must have been created with a usage value containing VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffers-02380)"},
- {"VUID-vkCmdEndTransformFeedbackEXT-renderpass", "This command must only be called inside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndTransformFeedbackEXT-renderpass)"},
- {"VUID-vkCmdEndTransformFeedbackEXT-transformFeedback-02374", "VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdEndTransformFeedbackEXT-transformFeedback-02374)"},
- {"VUID-vkCmdExecuteCommands-None-02286", "This command must not be recorded when transform feedback is active (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-None-02286)"},
- {"VUID-vkCmdExecuteCommands-bufferlevel", "commandBuffer must be a primary VkCommandBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-bufferlevel)"},
- {"VUID-vkCmdExecuteCommands-commandBuffer-00101", "If the inherited queries feature is not enabled, commandBuffer must not have any queries active (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-00101)"},
- {"VUID-vkCmdExecuteCommands-commandBuffer-00102", "If commandBuffer has a VK_QUERY_TYPE_OCCLUSION query active, then each element of pCommandBuffers must have been recorded with VkCommandBufferInheritanceInfo::occlusionQueryEnable set to VK_TRUE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-00102)"},
- {"VUID-vkCmdExecuteCommands-commandBuffer-00103", "If commandBuffer has a VK_QUERY_TYPE_OCCLUSION query active, then each element of pCommandBuffers must have been recorded with VkCommandBufferInheritanceInfo::queryFlags having all bits set that are set for the query (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-00103)"},
- {"VUID-vkCmdExecuteCommands-commandBuffer-00104", "If commandBuffer has a VK_QUERY_TYPE_PIPELINE_STATISTICS query active, then each element of pCommandBuffers must have been recorded with VkCommandBufferInheritanceInfo::pipelineStatistics having all bits set that are set in the VkQueryPool the query uses (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-00104)"},
- {"VUID-vkCmdExecuteCommands-commandBuffer-01820", "If commandBuffer is a protected command buffer, then each element of pCommandBuffers must be a protected command buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-01820)"},
- {"VUID-vkCmdExecuteCommands-commandBuffer-01821", "If commandBuffer is an unprotected command buffer, then each element of pCommandBuffers must be an unprotected command buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-01821)"},
- {"VUID-vkCmdExecuteCommands-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-cmdpool)"},
- {"VUID-vkCmdExecuteCommands-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-parameter)"},
- {"VUID-vkCmdExecuteCommands-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBuffer-recording)"},
- {"VUID-vkCmdExecuteCommands-commandBufferCount-arraylength", "commandBufferCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-commandBufferCount-arraylength)"},
- {"VUID-vkCmdExecuteCommands-commonparent", "Both of commandBuffer, and the elements of pCommandBuffers must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-commonparent)"},
- {"VUID-vkCmdExecuteCommands-contents-00095", "If vkCmdExecuteCommands is being called within a render pass instance, that render pass instance must have been begun with the contents parameter of vkCmdBeginRenderPass set to VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-contents-00095)"},
- {"VUID-vkCmdExecuteCommands-pCommandBuffers-00088", "Each element of pCommandBuffers must have been allocated with a level of VK_COMMAND_BUFFER_LEVEL_SECONDARY (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-pCommandBuffers-00088)"},
- {"VUID-vkCmdExecuteCommands-pCommandBuffers-00089", "Each element of pCommandBuffers must be in the pending or executable state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-pCommandBuffers-00089)"},
- {"VUID-vkCmdExecuteCommands-pCommandBuffers-00091", "If any element of pCommandBuffers was not recorded with the VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT flag, it must not be in the pending state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-pCommandBuffers-00091)"},
- {"VUID-vkCmdExecuteCommands-pCommandBuffers-00092", "If any element of pCommandBuffers was not recorded with the VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT flag, it must not have already been recorded to commandBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-pCommandBuffers-00092)"},
- {"VUID-vkCmdExecuteCommands-pCommandBuffers-00093", "If any element of pCommandBuffers was not recorded with the VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT flag, it must not appear more than once in pCommandBuffers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-pCommandBuffers-00093)"},
- {"VUID-vkCmdExecuteCommands-pCommandBuffers-00094", "Each element of pCommandBuffers must have been allocated from a VkCommandPool that was created for the same queue family as the VkCommandPool from which commandBuffer was allocated (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-pCommandBuffers-00094)"},
- {"VUID-vkCmdExecuteCommands-pCommandBuffers-00096", "If vkCmdExecuteCommands is being called within a render pass instance, each element of pCommandBuffers must have been recorded with the VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-pCommandBuffers-00096)"},
- {"VUID-vkCmdExecuteCommands-pCommandBuffers-00097", "If vkCmdExecuteCommands is being called within a render pass instance, each element of pCommandBuffers must have been recorded with VkCommandBufferInheritanceInfo::subpass set to the index of the subpass which the given command buffer will be executed in (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-pCommandBuffers-00097)"},
- {"VUID-vkCmdExecuteCommands-pCommandBuffers-00099", "If vkCmdExecuteCommands is being called within a render pass instance, and any element of pCommandBuffers was recorded with VkCommandBufferInheritanceInfo::framebuffer not equal to VK_NULL_HANDLE, that VkFramebuffer must match the VkFramebuffer used in the current render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-pCommandBuffers-00099)"},
- {"VUID-vkCmdExecuteCommands-pCommandBuffers-00100", "If vkCmdExecuteCommands is not being called within a render pass instance, each element of pCommandBuffers must not have been recorded with the VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-pCommandBuffers-00100)"},
- {"VUID-vkCmdExecuteCommands-pCommandBuffers-00105", "Each element of pCommandBuffers must not begin any query types that are active in commandBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-pCommandBuffers-00105)"},
- {"VUID-vkCmdExecuteCommands-pCommandBuffers-parameter", "pCommandBuffers must be a valid pointer to an array of commandBufferCount valid VkCommandBuffer handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-pCommandBuffers-parameter)"},
- {"VUID-vkCmdExecuteCommands-pInheritanceInfo-00098", "If vkCmdExecuteCommands is being called within a render pass instance, the render passes specified in the pBeginInfo->pInheritanceInfo->renderPass members of the vkBeginCommandBuffer commands used to begin recording each element of pCommandBuffers must be compatible with the current render pass (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-pInheritanceInfo-00098)"},
- {"VUID-vkCmdExecuteCommands-pNext-02865", "If vkCmdExecuteCommands is being called within a render pass instance that included VkRenderPassTransformBeginInfoQCOM in the pNext chain of VkRenderPassBeginInfo, then each element of pCommandBuffers must have been recorded with VkCommandBufferInheritanceRenderPassTransformInfoQCOM in the pNext chain of VkCommandBufferBeginInfo (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-pNext-02865)"},
- {"VUID-vkCmdExecuteCommands-pNext-02866", "If vkCmdExecuteCommands is being called within a render pass instance that included VkRenderPassTransformBeginInfoQCOM in the pNext chain of VkRenderPassBeginInfo, then each element of pCommandBuffers must have been recorded with VkCommandBufferInheritanceRenderPassTransformInfoQCOM::transform identical to VkRenderPassTransformBeginInfoQCOM::transform (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-pNext-02866)"},
- {"VUID-vkCmdExecuteCommands-pNext-02867", "If vkCmdExecuteCommands is being called within a render pass instance that included VkRenderPassTransformBeginInfoQCOM in the pNext chain of VkRenderPassBeginInfo, then each element of pCommandBuffers must have been recorded with VkCommandBufferInheritanceRenderPassTransformInfoQCOM::renderArea identical to VkRenderPassBeginInfo::renderArea (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteCommands-pNext-02867)"},
- {"VUID-vkCmdExecuteGeneratedCommandsNV-None-02910", "Transform feedback must not be active. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteGeneratedCommandsNV-None-02910)"},
- {"VUID-vkCmdExecuteGeneratedCommandsNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteGeneratedCommandsNV-commandBuffer-cmdpool)"},
- {"VUID-vkCmdExecuteGeneratedCommandsNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteGeneratedCommandsNV-commandBuffer-parameter)"},
- {"VUID-vkCmdExecuteGeneratedCommandsNV-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteGeneratedCommandsNV-commandBuffer-recording)"},
- {"VUID-vkCmdExecuteGeneratedCommandsNV-deviceGeneratedCommands-02911", "The VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV->deviceGeneratedCommands feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteGeneratedCommandsNV-deviceGeneratedCommands-02911)"},
- {"VUID-vkCmdExecuteGeneratedCommandsNV-isPreprocessed-02908", "If isPreprocessed is VK_TRUE then vkCmdPreprocessGeneratedCommandsNV must have already been executed on the device, using the same pGeneratedCommandsInfo content as well as the content of the input buffers it references (all except VkGeneratedCommandsInfoNV::preprocessBuffer). Furthermore pGeneratedCommandsInfo`s indirectCommandsLayout must have been created with the VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_NV bit set. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteGeneratedCommandsNV-isPreprocessed-02908)"},
- {"VUID-vkCmdExecuteGeneratedCommandsNV-pGeneratedCommandsInfo-parameter", "pGeneratedCommandsInfo must be a valid pointer to a valid VkGeneratedCommandsInfoNV structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteGeneratedCommandsNV-pGeneratedCommandsInfo-parameter)"},
- {"VUID-vkCmdExecuteGeneratedCommandsNV-pipeline-02909", "VkGeneratedCommandsInfoNV::pipeline must match the current bound pipeline at VkGeneratedCommandsInfoNV::pipelineBindPoint. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteGeneratedCommandsNV-pipeline-02909)"},
- {"VUID-vkCmdExecuteGeneratedCommandsNV-renderpass", "This command must only be called inside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdExecuteGeneratedCommandsNV-renderpass)"},
- {"VUID-vkCmdFillBuffer-commandBuffer-00030", "The VkCommandPool that commandBuffer was allocated from must support graphics or compute operations (https://www.khronos.org/registry/vulkan/specs/1.0/html/vkspec.html#VUID-vkCmdFillBuffer-commandBuffer-00030)"},
- {"VUID-vkCmdFillBuffer-commandBuffer-01811", "If commandBuffer is an unprotected command buffer, then dstBuffer must not be a protected buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdFillBuffer-commandBuffer-01811)"},
- {"VUID-vkCmdFillBuffer-commandBuffer-01812", "If commandBuffer is a protected command buffer, then dstBuffer must not be an unprotected buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdFillBuffer-commandBuffer-01812)"},
- {"VUID-vkCmdFillBuffer-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support transfer, graphics or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdFillBuffer-commandBuffer-cmdpool)"},
- {"VUID-vkCmdFillBuffer-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdFillBuffer-commandBuffer-parameter)"},
- {"VUID-vkCmdFillBuffer-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdFillBuffer-commandBuffer-recording)"},
- {"VUID-vkCmdFillBuffer-commonparent", "Both of commandBuffer, and dstBuffer must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdFillBuffer-commonparent)"},
- {"VUID-vkCmdFillBuffer-dstBuffer-00029", "dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdFillBuffer-dstBuffer-00029)"},
- {"VUID-vkCmdFillBuffer-dstBuffer-00031", "If dstBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdFillBuffer-dstBuffer-00031)"},
- {"VUID-vkCmdFillBuffer-dstBuffer-parameter", "dstBuffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdFillBuffer-dstBuffer-parameter)"},
- {"VUID-vkCmdFillBuffer-dstOffset-00024", "dstOffset must be less than the size of dstBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdFillBuffer-dstOffset-00024)"},
- {"VUID-vkCmdFillBuffer-dstOffset-00025", "dstOffset must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdFillBuffer-dstOffset-00025)"},
- {"VUID-vkCmdFillBuffer-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdFillBuffer-renderpass)"},
- {"VUID-vkCmdFillBuffer-size-00026", "If size is not equal to VK_WHOLE_SIZE, size must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdFillBuffer-size-00026)"},
- {"VUID-vkCmdFillBuffer-size-00027", "If size is not equal to VK_WHOLE_SIZE, size must be less than or equal to the size of dstBuffer minus dstOffset (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdFillBuffer-size-00027)"},
- {"VUID-vkCmdFillBuffer-size-00028", "If size is not equal to VK_WHOLE_SIZE, size must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdFillBuffer-size-00028)"},
- {"VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-cmdpool)"},
- {"VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-parameter)"},
- {"VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-recording)"},
- {"VUID-vkCmdInsertDebugUtilsLabelEXT-pLabelInfo-parameter", "pLabelInfo must be a valid pointer to a valid VkDebugUtilsLabelEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdInsertDebugUtilsLabelEXT-pLabelInfo-parameter)"},
- {"VUID-vkCmdNextSubpass-None-00909", "The current subpass index must be less than the number of subpasses in the render pass minus one (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdNextSubpass-None-00909)"},
- {"VUID-vkCmdNextSubpass-None-02349", "This command must not be recorded when transform feedback is active (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdNextSubpass-None-02349)"},
- {"VUID-vkCmdNextSubpass-bufferlevel", "commandBuffer must be a primary VkCommandBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdNextSubpass-bufferlevel)"},
- {"VUID-vkCmdNextSubpass-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdNextSubpass-commandBuffer-cmdpool)"},
- {"VUID-vkCmdNextSubpass-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdNextSubpass-commandBuffer-parameter)"},
- {"VUID-vkCmdNextSubpass-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdNextSubpass-commandBuffer-recording)"},
- {"VUID-vkCmdNextSubpass-contents-parameter", "contents must be a valid VkSubpassContents value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdNextSubpass-contents-parameter)"},
- {"VUID-vkCmdNextSubpass-renderpass", "This command must only be called inside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdNextSubpass-renderpass)"},
- {"VUID-vkCmdNextSubpass2-None-02350", "This command must not be recorded when transform feedback is active (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdNextSubpass2-None-02350)"},
- {"VUID-vkCmdNextSubpass2-None-03102", "The current subpass index must be less than the number of subpasses in the render pass minus one (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdNextSubpass2-None-03102)"},
- {"VUID-vkCmdNextSubpass2-bufferlevel", "commandBuffer must be a primary VkCommandBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdNextSubpass2-bufferlevel)"},
- {"VUID-vkCmdNextSubpass2-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdNextSubpass2-commandBuffer-cmdpool)"},
- {"VUID-vkCmdNextSubpass2-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdNextSubpass2-commandBuffer-parameter)"},
- {"VUID-vkCmdNextSubpass2-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdNextSubpass2-commandBuffer-recording)"},
- {"VUID-vkCmdNextSubpass2-pSubpassBeginInfo-parameter", "pSubpassBeginInfo must be a valid pointer to a valid VkSubpassBeginInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdNextSubpass2-pSubpassBeginInfo-parameter)"},
- {"VUID-vkCmdNextSubpass2-pSubpassEndInfo-parameter", "pSubpassEndInfo must be a valid pointer to a valid VkSubpassEndInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdNextSubpass2-pSubpassEndInfo-parameter)"},
- {"VUID-vkCmdNextSubpass2-renderpass", "This command must only be called inside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdNextSubpass2-renderpass)"},
- {"VUID-vkCmdPipelineBarrier-bufferMemoryBarrierCount-01178", "If vkCmdPipelineBarrier is called within a render pass instance, bufferMemoryBarrierCount must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-bufferMemoryBarrierCount-01178)"},
- {"VUID-vkCmdPipelineBarrier-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-commandBuffer-cmdpool)"},
- {"VUID-vkCmdPipelineBarrier-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-commandBuffer-parameter)"},
- {"VUID-vkCmdPipelineBarrier-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-commandBuffer-recording)"},
- {"VUID-vkCmdPipelineBarrier-dependencyFlags-01186", "If vkCmdPipelineBarrier is called outside of a render pass instance, dependencyFlags must not include VK_DEPENDENCY_VIEW_LOCAL_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-dependencyFlags-01186)"},
- {"VUID-vkCmdPipelineBarrier-dependencyFlags-parameter", "dependencyFlags must be a valid combination of VkDependencyFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-dependencyFlags-parameter)"},
- {"VUID-vkCmdPipelineBarrier-dstAccessMask-02816", "The dstAccessMask member of each element of pMemoryBarriers must only include access flags that are supported by one or more of the pipeline stages in dstStageMask, as specified in the table of supported access types (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-dstAccessMask-02816)"},
- {"VUID-vkCmdPipelineBarrier-dstStageMask-01169", "If the geometry shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-dstStageMask-01169)"},
- {"VUID-vkCmdPipelineBarrier-dstStageMask-01171", "If the tessellation shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-dstStageMask-01171)"},
- {"VUID-vkCmdPipelineBarrier-dstStageMask-02117", "If the mesh shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-dstStageMask-02117)"},
- {"VUID-vkCmdPipelineBarrier-dstStageMask-02118", "If the task shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-dstStageMask-02118)"},
- {"VUID-vkCmdPipelineBarrier-dstStageMask-parameter", "dstStageMask must be a valid combination of VkPipelineStageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-dstStageMask-parameter)"},
- {"VUID-vkCmdPipelineBarrier-dstStageMask-requiredbitmask", "dstStageMask must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-dstStageMask-requiredbitmask)"},
- {"VUID-vkCmdPipelineBarrier-image-02635", "If vkCmdPipelineBarrier is called within a render pass instance, the image member of any element of pImageMemoryBarriers must be equal to one of the elements of pAttachments that the current framebuffer was created with, that is also referred to by one of the elements of the pColorAttachments, pResolveAttachments or pDepthStencilAttachment members of the VkSubpassDescription instance or by the pDepthStencilResolveAttachment member of the VkSubpassDescriptionDepthStencilResolve structure that the current subpass was created with (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-image-02635)"},
- {"VUID-vkCmdPipelineBarrier-image-02637", "If vkCmdPipelineBarrier is called within a render pass instance, the image member of any element of pImageMemoryBarriers must be equal to one of the elements of pAttachments that the current framebuffer was created with, that is also referred to by one of the elements of the pColorAttachments, pResolveAttachments or pDepthStencilAttachment members of the VkSubpassDescription instance that the current subpass was created with (https://www.khronos.org/registry/vulkan/specs/1.1/html/vkspec.html#VUID-vkCmdPipelineBarrier-image-02637)"},
- {"VUID-vkCmdPipelineBarrier-oldLayout-01181", "If vkCmdPipelineBarrier is called within a render pass instance, the oldLayout and newLayout members of an element of pImageMemoryBarriers must be equal (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-oldLayout-01181)"},
- {"VUID-vkCmdPipelineBarrier-oldLayout-02636", "If vkCmdPipelineBarrier is called within a render pass instance, the oldLayout and newLayout members of any element of pImageMemoryBarriers must be equal to the layout member of an element of the pColorAttachments, pResolveAttachments or pDepthStencilAttachment members of the VkSubpassDescription instance or by the pDepthStencilResolveAttachment member of the VkSubpassDescriptionDepthStencilResolve structure that the current subpass was created with, that refers to the same image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-oldLayout-02636)"},
- {"VUID-vkCmdPipelineBarrier-oldLayout-02638", "If vkCmdPipelineBarrier is called within a render pass instance, the oldLayout and newLayout members of any element of pImageMemoryBarriers must be equal to the layout member of an element of the pColorAttachments, pResolveAttachments or pDepthStencilAttachment members of the VkSubpassDescription instance that the current subpass was created with, that refers to the same image (https://www.khronos.org/registry/vulkan/specs/1.1/html/vkspec.html#VUID-vkCmdPipelineBarrier-oldLayout-02638)"},
- {"VUID-vkCmdPipelineBarrier-pBufferMemoryBarriers-02817", "For any element of pBufferMemoryBarriers, if its srcQueueFamilyIndex and dstQueueFamilyIndex members are equal, or if its srcQueueFamilyIndex is the queue family index that was used to create the command pool that commandBuffer was allocated from, then its srcAccessMask member must only contain access flags that are supported by one or more of the pipeline stages in srcStageMask, as specified in the table of supported access types (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-pBufferMemoryBarriers-02817)"},
- {"VUID-vkCmdPipelineBarrier-pBufferMemoryBarriers-02818", "For any element of pBufferMemoryBarriers, if its srcQueueFamilyIndex and dstQueueFamilyIndex members are equal, or if its dstQueueFamilyIndex is the queue family index that was used to create the command pool that commandBuffer was allocated from, then its dstAccessMask member must only contain access flags that are supported by one or more of the pipeline stages in dstStageMask, as specified in the table of supported access types (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-pBufferMemoryBarriers-02818)"},
- {"VUID-vkCmdPipelineBarrier-pBufferMemoryBarriers-parameter", "If bufferMemoryBarrierCount is not 0, pBufferMemoryBarriers must be a valid pointer to an array of bufferMemoryBarrierCount valid VkBufferMemoryBarrier structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-pBufferMemoryBarriers-parameter)"},
- {"VUID-vkCmdPipelineBarrier-pDependencies-02285", "If vkCmdPipelineBarrier is called within a render pass instance, the render pass must have been created with at least one VkSubpassDependency instance in VkRenderPassCreateInfo::pDependencies that expresses a dependency from the current subpass to itself, and for which srcStageMask contains a subset of the bit values in VkSubpassDependency::srcStageMask, dstStageMask contains a subset of the bit values in VkSubpassDependency::dstStageMask, dependencyFlags is equal to VkSubpassDependency::dependencyFlags, srcAccessMask member of each element of pMemoryBarriers and pImageMemoryBarriers contains a subset of the bit values in VkSubpassDependency::srcAccessMask, and dstAccessMask member of each element of pMemoryBarriers and pImageMemoryBarriers contains a subset of the bit values in VkSubpassDependency::dstAccessMask (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-pDependencies-02285)"},
- {"VUID-vkCmdPipelineBarrier-pImageMemoryBarriers-02819", "For any element of pImageMemoryBarriers, if its srcQueueFamilyIndex and dstQueueFamilyIndex members are equal, or if its srcQueueFamilyIndex is the queue family index that was used to create the command pool that commandBuffer was allocated from, then its srcAccessMask member must only contain access flags that are supported by one or more of the pipeline stages in srcStageMask, as specified in the table of supported access types (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-pImageMemoryBarriers-02819)"},
- {"VUID-vkCmdPipelineBarrier-pImageMemoryBarriers-02820", "For any element of pImageMemoryBarriers, if its srcQueueFamilyIndex and dstQueueFamilyIndex members are equal, or if its dstQueueFamilyIndex is the queue family index that was used to create the command pool that commandBuffer was allocated from, then its dstAccessMask member must only contain access flags that are supported by one or more of the pipeline stages in dstStageMask, as specified in the table of supported access types (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-pImageMemoryBarriers-02820)"},
- {"VUID-vkCmdPipelineBarrier-pImageMemoryBarriers-parameter", "If imageMemoryBarrierCount is not 0, pImageMemoryBarriers must be a valid pointer to an array of imageMemoryBarrierCount valid VkImageMemoryBarrier structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-pImageMemoryBarriers-parameter)"},
- {"VUID-vkCmdPipelineBarrier-pMemoryBarriers-parameter", "If memoryBarrierCount is not 0, pMemoryBarriers must be a valid pointer to an array of memoryBarrierCount valid VkMemoryBarrier structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-pMemoryBarriers-parameter)"},
- {"VUID-vkCmdPipelineBarrier-srcAccessMask-02815", "The srcAccessMask member of each element of pMemoryBarriers must only include access flags that are supported by one or more of the pipeline stages in srcStageMask, as specified in the table of supported access types (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-srcAccessMask-02815)"},
- {"VUID-vkCmdPipelineBarrier-srcQueueFamilyIndex-01182", "If vkCmdPipelineBarrier is called within a render pass instance, the srcQueueFamilyIndex and dstQueueFamilyIndex members of any element of pImageMemoryBarriers must be VK_QUEUE_FAMILY_IGNORED (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-srcQueueFamilyIndex-01182)"},
- {"VUID-vkCmdPipelineBarrier-srcStageMask-01168", "If the geometry shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-srcStageMask-01168)"},
- {"VUID-vkCmdPipelineBarrier-srcStageMask-01170", "If the tessellation shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-srcStageMask-01170)"},
- {"VUID-vkCmdPipelineBarrier-srcStageMask-01183", "Any pipeline stage included in srcStageMask or dstStageMask must be supported by the capabilities of the queue family specified by the queueFamilyIndex member of the VkCommandPoolCreateInfo structure that was used to create the VkCommandPool that commandBuffer was allocated from, as specified in the table of supported pipeline stages (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-srcStageMask-01183)"},
- {"VUID-vkCmdPipelineBarrier-srcStageMask-02115", "If the mesh shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-srcStageMask-02115)"},
- {"VUID-vkCmdPipelineBarrier-srcStageMask-02116", "If the task shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-srcStageMask-02116)"},
- {"VUID-vkCmdPipelineBarrier-srcStageMask-parameter", "srcStageMask must be a valid combination of VkPipelineStageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-srcStageMask-parameter)"},
- {"VUID-vkCmdPipelineBarrier-srcStageMask-requiredbitmask", "srcStageMask must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPipelineBarrier-srcStageMask-requiredbitmask)"},
- {"VUID-vkCmdPreprocessGeneratedCommandsNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPreprocessGeneratedCommandsNV-commandBuffer-cmdpool)"},
- {"VUID-vkCmdPreprocessGeneratedCommandsNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPreprocessGeneratedCommandsNV-commandBuffer-parameter)"},
- {"VUID-vkCmdPreprocessGeneratedCommandsNV-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPreprocessGeneratedCommandsNV-commandBuffer-recording)"},
- {"VUID-vkCmdPreprocessGeneratedCommandsNV-deviceGeneratedCommands-02928", "The VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV->deviceGeneratedCommands feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPreprocessGeneratedCommandsNV-deviceGeneratedCommands-02928)"},
- {"VUID-vkCmdPreprocessGeneratedCommandsNV-pGeneratedCommandsInfo-02927", "pGeneratedCommandsInfo`s indirectCommandsLayout must have been created with the VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_NV bit set. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPreprocessGeneratedCommandsNV-pGeneratedCommandsInfo-02927)"},
- {"VUID-vkCmdPreprocessGeneratedCommandsNV-pGeneratedCommandsInfo-parameter", "pGeneratedCommandsInfo must be a valid pointer to a valid VkGeneratedCommandsInfoNV structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPreprocessGeneratedCommandsNV-pGeneratedCommandsInfo-parameter)"},
- {"VUID-vkCmdPreprocessGeneratedCommandsNV-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPreprocessGeneratedCommandsNV-renderpass)"},
- {"VUID-vkCmdPushConstants-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushConstants-commandBuffer-cmdpool)"},
- {"VUID-vkCmdPushConstants-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushConstants-commandBuffer-parameter)"},
- {"VUID-vkCmdPushConstants-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushConstants-commandBuffer-recording)"},
- {"VUID-vkCmdPushConstants-commonparent", "Both of commandBuffer, and layout must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushConstants-commonparent)"},
- {"VUID-vkCmdPushConstants-layout-parameter", "layout must be a valid VkPipelineLayout handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushConstants-layout-parameter)"},
- {"VUID-vkCmdPushConstants-offset-00368", "offset must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushConstants-offset-00368)"},
- {"VUID-vkCmdPushConstants-offset-00370", "offset must be less than VkPhysicalDeviceLimits::maxPushConstantsSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushConstants-offset-00370)"},
- {"VUID-vkCmdPushConstants-offset-01795", "For each byte in the range specified by offset and size and for each shader stage in stageFlags, there must be a push constant range in layout that includes that byte and that stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushConstants-offset-01795)"},
- {"VUID-vkCmdPushConstants-offset-01796", "For each byte in the range specified by offset and size and for each push constant range that overlaps that byte, stageFlags must include all stages in that push constant range's VkPushConstantRange::stageFlags (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushConstants-offset-01796)"},
- {"VUID-vkCmdPushConstants-pValues-parameter", "pValues must be a valid pointer to an array of size bytes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushConstants-pValues-parameter)"},
- {"VUID-vkCmdPushConstants-size-00369", "size must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushConstants-size-00369)"},
- {"VUID-vkCmdPushConstants-size-00371", "size must be less than or equal to VkPhysicalDeviceLimits::maxPushConstantsSize minus offset (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushConstants-size-00371)"},
- {"VUID-vkCmdPushConstants-size-arraylength", "size must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushConstants-size-arraylength)"},
- {"VUID-vkCmdPushConstants-stageFlags-parameter", "stageFlags must be a valid combination of VkShaderStageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushConstants-stageFlags-parameter)"},
- {"VUID-vkCmdPushConstants-stageFlags-requiredbitmask", "stageFlags must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushConstants-stageFlags-requiredbitmask)"},
- {"VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool)"},
- {"VUID-vkCmdPushDescriptorSetKHR-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetKHR-commandBuffer-parameter)"},
- {"VUID-vkCmdPushDescriptorSetKHR-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetKHR-commandBuffer-recording)"},
- {"VUID-vkCmdPushDescriptorSetKHR-commonparent", "Both of commandBuffer, and layout must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetKHR-commonparent)"},
- {"VUID-vkCmdPushDescriptorSetKHR-descriptorWriteCount-arraylength", "descriptorWriteCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetKHR-descriptorWriteCount-arraylength)"},
- {"VUID-vkCmdPushDescriptorSetKHR-layout-parameter", "layout must be a valid VkPipelineLayout handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetKHR-layout-parameter)"},
- {"VUID-vkCmdPushDescriptorSetKHR-pDescriptorWrites-parameter", "pDescriptorWrites must be a valid pointer to an array of descriptorWriteCount valid VkWriteDescriptorSet structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetKHR-pDescriptorWrites-parameter)"},
- {"VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363", "pipelineBindPoint must be supported by the commandBuffer's parent VkCommandPool's queue family (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363)"},
- {"VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-parameter", "pipelineBindPoint must be a valid VkPipelineBindPoint value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-parameter)"},
- {"VUID-vkCmdPushDescriptorSetKHR-set-00364", "set must be less than VkPipelineLayoutCreateInfo::setLayoutCount provided when layout was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetKHR-set-00364)"},
- {"VUID-vkCmdPushDescriptorSetKHR-set-00365", "set must be the unique set number in the pipeline layout that uses a descriptor set layout that was created with VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetKHR-set-00365)"},
- {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-00366", "The pipelineBindPoint specified during the creation of the descriptor update template must be supported by the commandBuffer's parent VkCommandPool's queue family (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-00366)"},
- {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-cmdpool)"},
- {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-parameter)"},
- {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-recording)"},
- {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-commonparent", "Each of commandBuffer, descriptorUpdateTemplate, and layout must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-commonparent)"},
- {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-descriptorUpdateTemplate-parameter", "descriptorUpdateTemplate must be a valid VkDescriptorUpdateTemplate handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-descriptorUpdateTemplate-parameter)"},
- {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-layout-parameter", "layout must be a valid VkPipelineLayout handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-layout-parameter)"},
- {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-pData-01686", "pData must be a valid pointer to a memory containing one or more valid instances of VkDescriptorImageInfo, VkDescriptorBufferInfo, or VkBufferView in a layout defined by descriptorUpdateTemplate when it was created with vkCreateDescriptorUpdateTemplateKHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdPushDescriptorSetWithTemplateKHR-pData-01686)"},
- {"VUID-vkCmdResetEvent-commandBuffer-01157", "commandBuffer's current device mask must include exactly one physical device. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetEvent-commandBuffer-01157)"},
- {"VUID-vkCmdResetEvent-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetEvent-commandBuffer-cmdpool)"},
- {"VUID-vkCmdResetEvent-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetEvent-commandBuffer-parameter)"},
- {"VUID-vkCmdResetEvent-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetEvent-commandBuffer-recording)"},
- {"VUID-vkCmdResetEvent-commonparent", "Both of commandBuffer, and event must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetEvent-commonparent)"},
- {"VUID-vkCmdResetEvent-event-01156", "When this command executes, event must not be waited on by a vkCmdWaitEvents command that is currently executing (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetEvent-event-01156)"},
- {"VUID-vkCmdResetEvent-event-parameter", "event must be a valid VkEvent handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetEvent-event-parameter)"},
- {"VUID-vkCmdResetEvent-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetEvent-renderpass)"},
- {"VUID-vkCmdResetEvent-stageMask-01153", "stageMask must not include VK_PIPELINE_STAGE_HOST_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetEvent-stageMask-01153)"},
- {"VUID-vkCmdResetEvent-stageMask-01154", "If the geometry shaders feature is not enabled, stageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetEvent-stageMask-01154)"},
- {"VUID-vkCmdResetEvent-stageMask-01155", "If the tessellation shaders feature is not enabled, stageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetEvent-stageMask-01155)"},
- {"VUID-vkCmdResetEvent-stageMask-02109", "If the mesh shaders feature is not enabled, stageMask must not contain VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetEvent-stageMask-02109)"},
- {"VUID-vkCmdResetEvent-stageMask-02110", "If the task shaders feature is not enabled, stageMask must not contain VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetEvent-stageMask-02110)"},
- {"VUID-vkCmdResetEvent-stageMask-parameter", "stageMask must be a valid combination of VkPipelineStageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetEvent-stageMask-parameter)"},
- {"VUID-vkCmdResetEvent-stageMask-requiredbitmask", "stageMask must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetEvent-stageMask-requiredbitmask)"},
- {"VUID-vkCmdResetQueryPool-None-02841", "All queries used by the command must not be active (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetQueryPool-None-02841)"},
- {"VUID-vkCmdResetQueryPool-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetQueryPool-commandBuffer-cmdpool)"},
- {"VUID-vkCmdResetQueryPool-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetQueryPool-commandBuffer-parameter)"},
- {"VUID-vkCmdResetQueryPool-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetQueryPool-commandBuffer-recording)"},
- {"VUID-vkCmdResetQueryPool-commonparent", "Both of commandBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetQueryPool-commonparent)"},
- {"VUID-vkCmdResetQueryPool-firstQuery-00796", "firstQuery must be less than the number of queries in queryPool (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetQueryPool-firstQuery-00796)"},
- {"VUID-vkCmdResetQueryPool-firstQuery-00797", "The sum of firstQuery and queryCount must be less than or equal to the number of queries in queryPool (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetQueryPool-firstQuery-00797)"},
- {"VUID-vkCmdResetQueryPool-firstQuery-02862", "If queryPool was created with VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, this command must not be recorded in a command buffer that, either directly or through secondary command buffers, also contains begin commands for a query from the set of queries [firstQuery, firstQuery + queryCount - 1] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetQueryPool-firstQuery-02862)"},
- {"VUID-vkCmdResetQueryPool-queryPool-parameter", "queryPool must be a valid VkQueryPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetQueryPool-queryPool-parameter)"},
- {"VUID-vkCmdResetQueryPool-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResetQueryPool-renderpass)"},
- {"VUID-vkCmdResolveImage-commandBuffer-01837", "If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-commandBuffer-01837)"},
- {"VUID-vkCmdResolveImage-commandBuffer-01838", "If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-commandBuffer-01838)"},
- {"VUID-vkCmdResolveImage-commandBuffer-01839", "If commandBuffer is a protected command buffer, then dstImage must not be an unprotected image (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-commandBuffer-01839)"},
- {"VUID-vkCmdResolveImage-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-commandBuffer-cmdpool)"},
- {"VUID-vkCmdResolveImage-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-commandBuffer-parameter)"},
- {"VUID-vkCmdResolveImage-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-commandBuffer-recording)"},
- {"VUID-vkCmdResolveImage-commonparent", "Each of commandBuffer, dstImage, and srcImage must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-commonparent)"},
- {"VUID-vkCmdResolveImage-dstImage-00258", "If dstImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-dstImage-00258)"},
- {"VUID-vkCmdResolveImage-dstImage-00259", "dstImage must have a sample count equal to VK_SAMPLE_COUNT_1_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-dstImage-00259)"},
- {"VUID-vkCmdResolveImage-dstImage-02003", "The format features of dstImage must contain VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-dstImage-02003)"},
- {"VUID-vkCmdResolveImage-dstImage-02546", "dstImage and srcImage must not have been created with flags containing VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-dstImage-02546)"},
- {"VUID-vkCmdResolveImage-dstImage-parameter", "dstImage must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-dstImage-parameter)"},
- {"VUID-vkCmdResolveImage-dstImageLayout-00262", "dstImageLayout must specify the layout of the image subresources of dstImage specified in pRegions at the time this command is executed on a VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-dstImageLayout-00262)"},
- {"VUID-vkCmdResolveImage-dstImageLayout-00263", "dstImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL (https://www.khronos.org/registry/vulkan/specs/1.1/html/vkspec.html#VUID-vkCmdResolveImage-dstImageLayout-00263)"},
- {"VUID-vkCmdResolveImage-dstImageLayout-01401", "dstImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-dstImageLayout-01401)"},
- {"VUID-vkCmdResolveImage-dstImageLayout-parameter", "dstImageLayout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-dstImageLayout-parameter)"},
- {"VUID-vkCmdResolveImage-dstSubresource-01710", "The dstSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when dstImage was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-dstSubresource-01710)"},
- {"VUID-vkCmdResolveImage-dstSubresource-01712", "The dstSubresource.baseArrayLayer + dstSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when dstImage was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-dstSubresource-01712)"},
- {"VUID-vkCmdResolveImage-pRegions-00253", "The source region specified by each element of pRegions must be a region that is contained within srcImage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-pRegions-00253)"},
- {"VUID-vkCmdResolveImage-pRegions-00254", "The destination region specified by each element of pRegions must be a region that is contained within dstImage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-pRegions-00254)"},
- {"VUID-vkCmdResolveImage-pRegions-00255", "The union of all source regions, and the union of all destination regions, specified by the elements of pRegions, must not overlap in memory (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-pRegions-00255)"},
- {"VUID-vkCmdResolveImage-pRegions-parameter", "pRegions must be a valid pointer to an array of regionCount valid VkImageResolve structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-pRegions-parameter)"},
- {"VUID-vkCmdResolveImage-regionCount-arraylength", "regionCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-regionCount-arraylength)"},
- {"VUID-vkCmdResolveImage-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-renderpass)"},
- {"VUID-vkCmdResolveImage-srcImage-00256", "If srcImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-srcImage-00256)"},
- {"VUID-vkCmdResolveImage-srcImage-00257", "srcImage must have a sample count equal to any valid sample count value other than VK_SAMPLE_COUNT_1_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-srcImage-00257)"},
- {"VUID-vkCmdResolveImage-srcImage-01386", "srcImage and dstImage must have been created with the same image format (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-srcImage-01386)"},
- {"VUID-vkCmdResolveImage-srcImage-parameter", "srcImage must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-srcImage-parameter)"},
- {"VUID-vkCmdResolveImage-srcImageLayout-00260", "srcImageLayout must specify the layout of the image subresources of srcImage specified in pRegions at the time this command is executed on a VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-srcImageLayout-00260)"},
- {"VUID-vkCmdResolveImage-srcImageLayout-00261", "srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL (https://www.khronos.org/registry/vulkan/specs/1.1/html/vkspec.html#VUID-vkCmdResolveImage-srcImageLayout-00261)"},
- {"VUID-vkCmdResolveImage-srcImageLayout-01400", "srcImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-srcImageLayout-01400)"},
- {"VUID-vkCmdResolveImage-srcImageLayout-parameter", "srcImageLayout must be a valid VkImageLayout value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-srcImageLayout-parameter)"},
- {"VUID-vkCmdResolveImage-srcSubresource-01709", "The srcSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when srcImage was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-srcSubresource-01709)"},
- {"VUID-vkCmdResolveImage-srcSubresource-01711", "The srcSubresource.baseArrayLayer + srcSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when srcImage was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdResolveImage-srcSubresource-01711)"},
- {"VUID-vkCmdSetBlendConstants-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetBlendConstants-commandBuffer-cmdpool)"},
- {"VUID-vkCmdSetBlendConstants-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetBlendConstants-commandBuffer-parameter)"},
- {"VUID-vkCmdSetBlendConstants-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetBlendConstants-commandBuffer-recording)"},
- {"VUID-vkCmdSetCheckpointNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, compute, or transfer operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetCheckpointNV-commandBuffer-cmdpool)"},
- {"VUID-vkCmdSetCheckpointNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetCheckpointNV-commandBuffer-parameter)"},
- {"VUID-vkCmdSetCheckpointNV-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetCheckpointNV-commandBuffer-recording)"},
- {"VUID-vkCmdSetCoarseSampleOrderNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetCoarseSampleOrderNV-commandBuffer-cmdpool)"},
- {"VUID-vkCmdSetCoarseSampleOrderNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetCoarseSampleOrderNV-commandBuffer-parameter)"},
- {"VUID-vkCmdSetCoarseSampleOrderNV-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetCoarseSampleOrderNV-commandBuffer-recording)"},
- {"VUID-vkCmdSetCoarseSampleOrderNV-pCustomSampleOrders-02235", "The array pCustomSampleOrders must not contain two structures with matching values for both the shadingRate and sampleCount members. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetCoarseSampleOrderNV-pCustomSampleOrders-02235)"},
- {"VUID-vkCmdSetCoarseSampleOrderNV-pCustomSampleOrders-parameter", "If customSampleOrderCount is not 0, pCustomSampleOrders must be a valid pointer to an array of customSampleOrderCount valid VkCoarseSampleOrderCustomNV structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetCoarseSampleOrderNV-pCustomSampleOrders-parameter)"},
- {"VUID-vkCmdSetCoarseSampleOrderNV-sampleOrderType-02081", "If sampleOrderType is not VK_COARSE_SAMPLE_ORDER_TYPE_CUSTOM_NV, customSamplerOrderCount must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetCoarseSampleOrderNV-sampleOrderType-02081)"},
- {"VUID-vkCmdSetCoarseSampleOrderNV-sampleOrderType-parameter", "sampleOrderType must be a valid VkCoarseSampleOrderTypeNV value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetCoarseSampleOrderNV-sampleOrderType-parameter)"},
- {"VUID-vkCmdSetDepthBias-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDepthBias-commandBuffer-cmdpool)"},
- {"VUID-vkCmdSetDepthBias-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDepthBias-commandBuffer-parameter)"},
- {"VUID-vkCmdSetDepthBias-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDepthBias-commandBuffer-recording)"},
- {"VUID-vkCmdSetDepthBias-depthBiasClamp-00790", "If the depth bias clamping feature is not enabled, depthBiasClamp must be 0.0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDepthBias-depthBiasClamp-00790)"},
- {"VUID-vkCmdSetDepthBounds-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDepthBounds-commandBuffer-cmdpool)"},
- {"VUID-vkCmdSetDepthBounds-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDepthBounds-commandBuffer-parameter)"},
- {"VUID-vkCmdSetDepthBounds-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDepthBounds-commandBuffer-recording)"},
- {"VUID-vkCmdSetDepthBounds-maxDepthBounds-00601", "Unless the VK_EXT_depth_range_unrestricted extension is enabled maxDepthBounds must be between 0.0 and 1.0, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDepthBounds-maxDepthBounds-00601)"},
- {"VUID-vkCmdSetDepthBounds-maxDepthBounds-02509", "maxDepthBounds must be between 0.0 and 1.0, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-vkCmdSetDepthBounds-maxDepthBounds-02509)"},
- {"VUID-vkCmdSetDepthBounds-minDepthBounds-00600", "Unless the VK_EXT_depth_range_unrestricted extension is enabled minDepthBounds must be between 0.0 and 1.0, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDepthBounds-minDepthBounds-00600)"},
- {"VUID-vkCmdSetDepthBounds-minDepthBounds-02508", "minDepthBounds must be between 0.0 and 1.0, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-vkCmdSetDepthBounds-minDepthBounds-02508)"},
- {"VUID-vkCmdSetDeviceMask-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, compute, or transfer operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-commandBuffer-cmdpool)"},
- {"VUID-vkCmdSetDeviceMask-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-commandBuffer-parameter)"},
- {"VUID-vkCmdSetDeviceMask-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-commandBuffer-recording)"},
- {"VUID-vkCmdSetDeviceMask-deviceMask-00108", "deviceMask must be a valid device mask value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-deviceMask-00108)"},
- {"VUID-vkCmdSetDeviceMask-deviceMask-00109", "deviceMask must not be zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-deviceMask-00109)"},
- {"VUID-vkCmdSetDeviceMask-deviceMask-00110", "deviceMask must not include any set bits that were not in the VkDeviceGroupCommandBufferBeginInfo::deviceMask value when the command buffer began recording. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-deviceMask-00110)"},
- {"VUID-vkCmdSetDeviceMask-deviceMask-00111", "If vkCmdSetDeviceMask is called inside a render pass instance, deviceMask must not include any set bits that were not in the VkDeviceGroupRenderPassBeginInfo::deviceMask value when the render pass instance began recording. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDeviceMask-deviceMask-00111)"},
- {"VUID-vkCmdSetDiscardRectangleEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDiscardRectangleEXT-commandBuffer-cmdpool)"},
- {"VUID-vkCmdSetDiscardRectangleEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDiscardRectangleEXT-commandBuffer-parameter)"},
- {"VUID-vkCmdSetDiscardRectangleEXT-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDiscardRectangleEXT-commandBuffer-recording)"},
- {"VUID-vkCmdSetDiscardRectangleEXT-discardRectangleCount-arraylength", "discardRectangleCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDiscardRectangleEXT-discardRectangleCount-arraylength)"},
- {"VUID-vkCmdSetDiscardRectangleEXT-firstDiscardRectangle-00585", "The sum of firstDiscardRectangle and discardRectangleCount must be less than or equal to VkPhysicalDeviceDiscardRectanglePropertiesEXT::maxDiscardRectangles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDiscardRectangleEXT-firstDiscardRectangle-00585)"},
- {"VUID-vkCmdSetDiscardRectangleEXT-offset-00588", "Evaluation of (offset.x + extent.width) in each VkRect2D element of pDiscardRectangles must not cause a signed integer addition overflow (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDiscardRectangleEXT-offset-00588)"},
- {"VUID-vkCmdSetDiscardRectangleEXT-offset-00589", "Evaluation of (offset.y + extent.height) in each VkRect2D element of pDiscardRectangles must not cause a signed integer addition overflow (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDiscardRectangleEXT-offset-00589)"},
- {"VUID-vkCmdSetDiscardRectangleEXT-pDiscardRectangles-parameter", "pDiscardRectangles must be a valid pointer to an array of discardRectangleCount VkRect2D structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDiscardRectangleEXT-pDiscardRectangles-parameter)"},
- {"VUID-vkCmdSetDiscardRectangleEXT-x-00587", "The x and y member of offset in each VkRect2D element of pDiscardRectangles must be greater than or equal to 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetDiscardRectangleEXT-x-00587)"},
- {"VUID-vkCmdSetEvent-commandBuffer-01152", "commandBuffer's current device mask must include exactly one physical device. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetEvent-commandBuffer-01152)"},
- {"VUID-vkCmdSetEvent-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetEvent-commandBuffer-cmdpool)"},
- {"VUID-vkCmdSetEvent-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetEvent-commandBuffer-parameter)"},
- {"VUID-vkCmdSetEvent-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetEvent-commandBuffer-recording)"},
- {"VUID-vkCmdSetEvent-commonparent", "Both of commandBuffer, and event must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetEvent-commonparent)"},
- {"VUID-vkCmdSetEvent-event-parameter", "event must be a valid VkEvent handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetEvent-event-parameter)"},
- {"VUID-vkCmdSetEvent-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetEvent-renderpass)"},
- {"VUID-vkCmdSetEvent-stageMask-01149", "stageMask must not include VK_PIPELINE_STAGE_HOST_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetEvent-stageMask-01149)"},
- {"VUID-vkCmdSetEvent-stageMask-01150", "If the geometry shaders feature is not enabled, stageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetEvent-stageMask-01150)"},
- {"VUID-vkCmdSetEvent-stageMask-01151", "If the tessellation shaders feature is not enabled, stageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetEvent-stageMask-01151)"},
- {"VUID-vkCmdSetEvent-stageMask-02107", "If the mesh shaders feature is not enabled, stageMask must not contain VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetEvent-stageMask-02107)"},
- {"VUID-vkCmdSetEvent-stageMask-02108", "If the task shaders feature is not enabled, stageMask must not contain VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetEvent-stageMask-02108)"},
- {"VUID-vkCmdSetEvent-stageMask-parameter", "stageMask must be a valid combination of VkPipelineStageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetEvent-stageMask-parameter)"},
- {"VUID-vkCmdSetEvent-stageMask-requiredbitmask", "stageMask must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetEvent-stageMask-requiredbitmask)"},
- {"VUID-vkCmdSetExclusiveScissorNV-None-02031", "The exclusive scissor feature must be enabled. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetExclusiveScissorNV-None-02031)"},
- {"VUID-vkCmdSetExclusiveScissorNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetExclusiveScissorNV-commandBuffer-cmdpool)"},
- {"VUID-vkCmdSetExclusiveScissorNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetExclusiveScissorNV-commandBuffer-parameter)"},
- {"VUID-vkCmdSetExclusiveScissorNV-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetExclusiveScissorNV-commandBuffer-recording)"},
- {"VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036", "If the multiple viewports feature is not enabled, exclusiveScissorCount must be 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036)"},
- {"VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-arraylength", "exclusiveScissorCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-arraylength)"},
- {"VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02033", "firstExclusiveScissor must be less than VkPhysicalDeviceLimits::maxViewports (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02033)"},
- {"VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02034", "The sum of firstExclusiveScissor and exclusiveScissorCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02034)"},
- {"VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035", "If the multiple viewports feature is not enabled, firstExclusiveScissor must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035)"},
- {"VUID-vkCmdSetExclusiveScissorNV-offset-02038", "Evaluation of (offset.x + extent.width) for each member of pExclusiveScissors must not cause a signed integer addition overflow (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetExclusiveScissorNV-offset-02038)"},
- {"VUID-vkCmdSetExclusiveScissorNV-offset-02039", "Evaluation of (offset.y + extent.height) for each member of pExclusiveScissors must not cause a signed integer addition overflow (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetExclusiveScissorNV-offset-02039)"},
- {"VUID-vkCmdSetExclusiveScissorNV-pExclusiveScissors-parameter", "pExclusiveScissors must be a valid pointer to an array of exclusiveScissorCount VkRect2D structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetExclusiveScissorNV-pExclusiveScissors-parameter)"},
- {"VUID-vkCmdSetExclusiveScissorNV-x-02037", "The x and y members of offset in each member of pExclusiveScissors must be greater than or equal to 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetExclusiveScissorNV-x-02037)"},
- {"VUID-vkCmdSetLineStippleEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetLineStippleEXT-commandBuffer-cmdpool)"},
- {"VUID-vkCmdSetLineStippleEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetLineStippleEXT-commandBuffer-parameter)"},
- {"VUID-vkCmdSetLineStippleEXT-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetLineStippleEXT-commandBuffer-recording)"},
- {"VUID-vkCmdSetLineStippleEXT-lineStippleFactor-02776", "lineStippleFactor must be in the range [1,256] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetLineStippleEXT-lineStippleFactor-02776)"},
- {"VUID-vkCmdSetLineWidth-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetLineWidth-commandBuffer-cmdpool)"},
- {"VUID-vkCmdSetLineWidth-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetLineWidth-commandBuffer-parameter)"},
- {"VUID-vkCmdSetLineWidth-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetLineWidth-commandBuffer-recording)"},
- {"VUID-vkCmdSetLineWidth-lineWidth-00788", "If the wide lines feature is not enabled, lineWidth must be 1.0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetLineWidth-lineWidth-00788)"},
- {"VUID-vkCmdSetPerformanceMarkerINTEL-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, compute, or transfer operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetPerformanceMarkerINTEL-commandBuffer-cmdpool)"},
- {"VUID-vkCmdSetPerformanceMarkerINTEL-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetPerformanceMarkerINTEL-commandBuffer-parameter)"},
- {"VUID-vkCmdSetPerformanceMarkerINTEL-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetPerformanceMarkerINTEL-commandBuffer-recording)"},
- {"VUID-vkCmdSetPerformanceMarkerINTEL-pMarkerInfo-parameter", "pMarkerInfo must be a valid pointer to a valid VkPerformanceMarkerInfoINTEL structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetPerformanceMarkerINTEL-pMarkerInfo-parameter)"},
- {"VUID-vkCmdSetPerformanceOverrideINTEL-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, compute, or transfer operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetPerformanceOverrideINTEL-commandBuffer-cmdpool)"},
- {"VUID-vkCmdSetPerformanceOverrideINTEL-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetPerformanceOverrideINTEL-commandBuffer-parameter)"},
- {"VUID-vkCmdSetPerformanceOverrideINTEL-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetPerformanceOverrideINTEL-commandBuffer-recording)"},
- {"VUID-vkCmdSetPerformanceOverrideINTEL-pOverrideInfo-02736", "pOverrideInfo must not be used with a VkPerformanceOverrideTypeINTEL that is not reported available by vkGetPerformanceParameterINTEL. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetPerformanceOverrideINTEL-pOverrideInfo-02736)"},
- {"VUID-vkCmdSetPerformanceOverrideINTEL-pOverrideInfo-parameter", "pOverrideInfo must be a valid pointer to a valid VkPerformanceOverrideInfoINTEL structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetPerformanceOverrideINTEL-pOverrideInfo-parameter)"},
- {"VUID-vkCmdSetPerformanceStreamMarkerINTEL-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, compute, or transfer operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetPerformanceStreamMarkerINTEL-commandBuffer-cmdpool)"},
- {"VUID-vkCmdSetPerformanceStreamMarkerINTEL-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetPerformanceStreamMarkerINTEL-commandBuffer-parameter)"},
- {"VUID-vkCmdSetPerformanceStreamMarkerINTEL-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetPerformanceStreamMarkerINTEL-commandBuffer-recording)"},
- {"VUID-vkCmdSetPerformanceStreamMarkerINTEL-pMarkerInfo-parameter", "pMarkerInfo must be a valid pointer to a valid VkPerformanceStreamMarkerInfoINTEL structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetPerformanceStreamMarkerINTEL-pMarkerInfo-parameter)"},
- {"VUID-vkCmdSetSampleLocationsEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetSampleLocationsEXT-commandBuffer-cmdpool)"},
- {"VUID-vkCmdSetSampleLocationsEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetSampleLocationsEXT-commandBuffer-parameter)"},
- {"VUID-vkCmdSetSampleLocationsEXT-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetSampleLocationsEXT-commandBuffer-recording)"},
- {"VUID-vkCmdSetSampleLocationsEXT-pSampleLocationsInfo-parameter", "pSampleLocationsInfo must be a valid pointer to a valid VkSampleLocationsInfoEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetSampleLocationsEXT-pSampleLocationsInfo-parameter)"},
- {"VUID-vkCmdSetSampleLocationsEXT-sampleLocationsPerPixel-01529", "The sampleLocationsPerPixel member of pSampleLocationsInfo must equal the rasterizationSamples member of the VkPipelineMultisampleStateCreateInfo structure the bound graphics pipeline has been created with (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetSampleLocationsEXT-sampleLocationsPerPixel-01529)"},
- {"VUID-vkCmdSetSampleLocationsEXT-variableSampleLocations-01530", "If VkPhysicalDeviceSampleLocationsPropertiesEXT::variableSampleLocations is VK_FALSE then the current render pass must have been begun by specifying a VkRenderPassSampleLocationsBeginInfoEXT structure whose pPostSubpassSampleLocations member contains an element with a subpassIndex matching the current subpass index and the sampleLocationsInfo member of that element must match the sample locations state pointed to by pSampleLocationsInfo (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetSampleLocationsEXT-variableSampleLocations-01530)"},
- {"VUID-vkCmdSetScissor-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetScissor-commandBuffer-cmdpool)"},
- {"VUID-vkCmdSetScissor-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetScissor-commandBuffer-parameter)"},
- {"VUID-vkCmdSetScissor-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetScissor-commandBuffer-recording)"},
- {"VUID-vkCmdSetScissor-firstScissor-00591", "firstScissor must be less than VkPhysicalDeviceLimits::maxViewports (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetScissor-firstScissor-00591)"},
- {"VUID-vkCmdSetScissor-firstScissor-00592", "The sum of firstScissor and scissorCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetScissor-firstScissor-00592)"},
- {"VUID-vkCmdSetScissor-firstScissor-00593", "If the multiple viewports feature is not enabled, firstScissor must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetScissor-firstScissor-00593)"},
- {"VUID-vkCmdSetScissor-offset-00596", "Evaluation of (offset.x + extent.width) must not cause a signed integer addition overflow for any element of pScissors (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetScissor-offset-00596)"},
- {"VUID-vkCmdSetScissor-offset-00597", "Evaluation of (offset.y + extent.height) must not cause a signed integer addition overflow for any element of pScissors (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetScissor-offset-00597)"},
- {"VUID-vkCmdSetScissor-pScissors-parameter", "pScissors must be a valid pointer to an array of scissorCount VkRect2D structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetScissor-pScissors-parameter)"},
- {"VUID-vkCmdSetScissor-scissorCount-00594", "If the multiple viewports feature is not enabled, scissorCount must be 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetScissor-scissorCount-00594)"},
- {"VUID-vkCmdSetScissor-scissorCount-arraylength", "scissorCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetScissor-scissorCount-arraylength)"},
- {"VUID-vkCmdSetScissor-x-00595", "The x and y members of offset member of any element of pScissors must be greater than or equal to 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetScissor-x-00595)"},
- {"VUID-vkCmdSetStencilCompareMask-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetStencilCompareMask-commandBuffer-cmdpool)"},
- {"VUID-vkCmdSetStencilCompareMask-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetStencilCompareMask-commandBuffer-parameter)"},
- {"VUID-vkCmdSetStencilCompareMask-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetStencilCompareMask-commandBuffer-recording)"},
- {"VUID-vkCmdSetStencilCompareMask-faceMask-parameter", "faceMask must be a valid combination of VkStencilFaceFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetStencilCompareMask-faceMask-parameter)"},
- {"VUID-vkCmdSetStencilCompareMask-faceMask-requiredbitmask", "faceMask must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetStencilCompareMask-faceMask-requiredbitmask)"},
- {"VUID-vkCmdSetStencilReference-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetStencilReference-commandBuffer-cmdpool)"},
- {"VUID-vkCmdSetStencilReference-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetStencilReference-commandBuffer-parameter)"},
- {"VUID-vkCmdSetStencilReference-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetStencilReference-commandBuffer-recording)"},
- {"VUID-vkCmdSetStencilReference-faceMask-parameter", "faceMask must be a valid combination of VkStencilFaceFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetStencilReference-faceMask-parameter)"},
- {"VUID-vkCmdSetStencilReference-faceMask-requiredbitmask", "faceMask must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetStencilReference-faceMask-requiredbitmask)"},
- {"VUID-vkCmdSetStencilWriteMask-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetStencilWriteMask-commandBuffer-cmdpool)"},
- {"VUID-vkCmdSetStencilWriteMask-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetStencilWriteMask-commandBuffer-parameter)"},
- {"VUID-vkCmdSetStencilWriteMask-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetStencilWriteMask-commandBuffer-recording)"},
- {"VUID-vkCmdSetStencilWriteMask-faceMask-parameter", "faceMask must be a valid combination of VkStencilFaceFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetStencilWriteMask-faceMask-parameter)"},
- {"VUID-vkCmdSetStencilWriteMask-faceMask-requiredbitmask", "faceMask must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetStencilWriteMask-faceMask-requiredbitmask)"},
- {"VUID-vkCmdSetViewport-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewport-commandBuffer-cmdpool)"},
- {"VUID-vkCmdSetViewport-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewport-commandBuffer-parameter)"},
- {"VUID-vkCmdSetViewport-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewport-commandBuffer-recording)"},
- {"VUID-vkCmdSetViewport-firstViewport-01222", "firstViewport must be less than VkPhysicalDeviceLimits::maxViewports (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewport-firstViewport-01222)"},
- {"VUID-vkCmdSetViewport-firstViewport-01223", "The sum of firstViewport and viewportCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewport-firstViewport-01223)"},
- {"VUID-vkCmdSetViewport-firstViewport-01224", "If the multiple viewports feature is not enabled, firstViewport must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewport-firstViewport-01224)"},
- {"VUID-vkCmdSetViewport-pViewports-parameter", "pViewports must be a valid pointer to an array of viewportCount valid VkViewport structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewport-pViewports-parameter)"},
- {"VUID-vkCmdSetViewport-viewportCount-01225", "If the multiple viewports feature is not enabled, viewportCount must be 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewport-viewportCount-01225)"},
- {"VUID-vkCmdSetViewport-viewportCount-arraylength", "viewportCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewport-viewportCount-arraylength)"},
- {"VUID-vkCmdSetViewportShadingRatePaletteNV-None-02064", "The shading rate image feature must be enabled. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewportShadingRatePaletteNV-None-02064)"},
- {"VUID-vkCmdSetViewportShadingRatePaletteNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewportShadingRatePaletteNV-commandBuffer-cmdpool)"},
- {"VUID-vkCmdSetViewportShadingRatePaletteNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewportShadingRatePaletteNV-commandBuffer-parameter)"},
- {"VUID-vkCmdSetViewportShadingRatePaletteNV-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewportShadingRatePaletteNV-commandBuffer-recording)"},
- {"VUID-vkCmdSetViewportShadingRatePaletteNV-firstViewport-02066", "firstViewport must be less than VkPhysicalDeviceLimits::maxViewports (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewportShadingRatePaletteNV-firstViewport-02066)"},
- {"VUID-vkCmdSetViewportShadingRatePaletteNV-firstViewport-02067", "The sum of firstViewport and viewportCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewportShadingRatePaletteNV-firstViewport-02067)"},
- {"VUID-vkCmdSetViewportShadingRatePaletteNV-firstViewport-02068", "If the multiple viewports feature is not enabled, firstViewport must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewportShadingRatePaletteNV-firstViewport-02068)"},
- {"VUID-vkCmdSetViewportShadingRatePaletteNV-pShadingRatePalettes-parameter", "pShadingRatePalettes must be a valid pointer to an array of viewportCount valid VkShadingRatePaletteNV structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewportShadingRatePaletteNV-pShadingRatePalettes-parameter)"},
- {"VUID-vkCmdSetViewportShadingRatePaletteNV-viewportCount-02069", "If the multiple viewports feature is not enabled, viewportCount must be 1 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewportShadingRatePaletteNV-viewportCount-02069)"},
- {"VUID-vkCmdSetViewportShadingRatePaletteNV-viewportCount-arraylength", "viewportCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewportShadingRatePaletteNV-viewportCount-arraylength)"},
- {"VUID-vkCmdSetViewportWScalingNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewportWScalingNV-commandBuffer-cmdpool)"},
- {"VUID-vkCmdSetViewportWScalingNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewportWScalingNV-commandBuffer-parameter)"},
- {"VUID-vkCmdSetViewportWScalingNV-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewportWScalingNV-commandBuffer-recording)"},
- {"VUID-vkCmdSetViewportWScalingNV-firstViewport-01323", "firstViewport must be less than VkPhysicalDeviceLimits::maxViewports (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewportWScalingNV-firstViewport-01323)"},
- {"VUID-vkCmdSetViewportWScalingNV-firstViewport-01324", "The sum of firstViewport and viewportCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewportWScalingNV-firstViewport-01324)"},
- {"VUID-vkCmdSetViewportWScalingNV-pViewportWScalings-parameter", "pViewportWScalings must be a valid pointer to an array of viewportCount VkViewportWScalingNV structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewportWScalingNV-pViewportWScalings-parameter)"},
- {"VUID-vkCmdSetViewportWScalingNV-viewportCount-arraylength", "viewportCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdSetViewportWScalingNV-viewportCount-arraylength)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-None-02690)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-None-02691)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-None-02692)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-vkCmdTraceRaysIndirectKHR-None-02693)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-None-02697)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-None-02698)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-None-02699)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-None-02700)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-None-02702)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-None-02703)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-None-02704)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-None-02705)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-None-02706)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-None-02859)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-None-03429", "Any shader group handle referenced by this call must have been queried from the currently bound ray tracing shader pipeline (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-None-03429)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-buffer-02708", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-buffer-02708)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-buffer-02709", "buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-buffer-02709)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-buffer-parameter", "buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-buffer-parameter)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-callableShaderBindingOffset-02461", "callableShaderBindingOffset must be less than the size of callableShaderBindingTableBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-callableShaderBindingOffset-02461)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-callableShaderBindingOffset-02462", "callableShaderBindingOffset must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-callableShaderBindingOffset-02462)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-callableShaderBindingStride-02465", "callableShaderBindingStride must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-callableShaderBindingStride-02465)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-callableShaderBindingStride-02468", "callableShaderBindingStride must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxShaderGroupStride (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-callableShaderBindingStride-02468)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02701)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02707)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02711", "commandBuffer must not be a protected command buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02711)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-cmdpool)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-parameter)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-recording)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-commonparent", "Both of buffer, and commandBuffer must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-commonparent)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-filterCubic-02694)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-filterCubicMinmax-02695)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-flags-02696)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-hitShaderBindingOffset-02459", "hitShaderBindingOffset must be less than the size of hitShaderBindingTableBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-hitShaderBindingOffset-02459)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-hitShaderBindingOffset-02460", "hitShaderBindingOffset must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-hitShaderBindingOffset-02460)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-hitShaderBindingStride-02464", "hitShaderBindingStride must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-hitShaderBindingStride-02464)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-hitShaderBindingStride-02467", "hitShaderBindingStride must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxShaderGroupStride (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-hitShaderBindingStride-02467)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-maxRecursionDepth-03430", "This command must not cause a shader call instruction to be executed from a shader invocation with a recursion depth greater than the value of maxRecursionDepth used to create the bound ray tracing pipeline. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-maxRecursionDepth-03430)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-missShaderBindingOffset-02457", "missShaderBindingOffset must be less than the size of missShaderBindingTableBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-missShaderBindingOffset-02457)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-missShaderBindingOffset-02458", "missShaderBindingOffset must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-missShaderBindingOffset-02458)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-missShaderBindingStride-02463", "missShaderBindingStride must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-missShaderBindingStride-02463)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-missShaderBindingStride-02466", "missShaderBindingStride must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxShaderGroupStride (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-missShaderBindingStride-02466)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-offset-02710", "offset must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-offset-02710)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-offset-03517", "(offset + sizeof(VkTraceRaysIndirectCommandKHR)) must be less than or equal to the size of buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-offset-03517)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-pCallableShaderBindingTable-parameter", "pCallableShaderBindingTable must be a valid pointer to a valid VkStridedBufferRegionKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-pCallableShaderBindingTable-parameter)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-pHitShaderBindingTable-parameter", "pHitShaderBindingTable must be a valid pointer to a valid VkStridedBufferRegionKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-pHitShaderBindingTable-parameter)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-pMissShaderBindingTable-parameter", "pMissShaderBindingTable must be a valid pointer to a valid VkStridedBufferRegionKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-pMissShaderBindingTable-parameter)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-pRaygenShaderBindingTable-parameter", "pRaygenShaderBindingTable must be a valid pointer to a valid VkStridedBufferRegionKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-pRaygenShaderBindingTable-parameter)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-rayTracingIndirectTraceRays-03518", "the VkPhysicalDeviceRayTracingFeaturesKHR->rayTracingIndirectTraceRays feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-rayTracingIndirectTraceRays-03518)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-raygenShaderBindingOffset-02455", "raygenShaderBindingOffset must be less than the size of raygenShaderBindingTableBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-raygenShaderBindingOffset-02455)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-raygenShaderBindingOffset-02456", "raygenShaderBindingOffset must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-raygenShaderBindingOffset-02456)"},
- {"VUID-vkCmdTraceRaysIndirectKHR-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysIndirectKHR-renderpass)"},
- {"VUID-vkCmdTraceRaysKHR-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-None-02690)"},
- {"VUID-vkCmdTraceRaysKHR-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-None-02691)"},
- {"VUID-vkCmdTraceRaysKHR-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-None-02692)"},
- {"VUID-vkCmdTraceRaysKHR-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-vkCmdTraceRaysKHR-None-02693)"},
- {"VUID-vkCmdTraceRaysKHR-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-None-02697)"},
- {"VUID-vkCmdTraceRaysKHR-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-None-02698)"},
- {"VUID-vkCmdTraceRaysKHR-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-None-02699)"},
- {"VUID-vkCmdTraceRaysKHR-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-None-02700)"},
- {"VUID-vkCmdTraceRaysKHR-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-None-02702)"},
- {"VUID-vkCmdTraceRaysKHR-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-None-02703)"},
- {"VUID-vkCmdTraceRaysKHR-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-None-02704)"},
- {"VUID-vkCmdTraceRaysKHR-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-None-02705)"},
- {"VUID-vkCmdTraceRaysKHR-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-None-02706)"},
- {"VUID-vkCmdTraceRaysKHR-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-None-02859)"},
- {"VUID-vkCmdTraceRaysKHR-None-03429", "Any shader group handle referenced by this call must have been queried from the currently bound ray tracing shader pipeline (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-None-03429)"},
- {"VUID-vkCmdTraceRaysKHR-callableShaderBindingOffset-02461", "callableShaderBindingOffset must be less than the size of callableShaderBindingTableBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-callableShaderBindingOffset-02461)"},
- {"VUID-vkCmdTraceRaysKHR-callableShaderBindingOffset-02462", "callableShaderBindingOffset must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-callableShaderBindingOffset-02462)"},
- {"VUID-vkCmdTraceRaysKHR-callableShaderBindingStride-02465", "callableShaderBindingStride must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-callableShaderBindingStride-02465)"},
- {"VUID-vkCmdTraceRaysKHR-callableShaderBindingStride-02468", "callableShaderBindingStride must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxShaderGroupStride (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-callableShaderBindingStride-02468)"},
- {"VUID-vkCmdTraceRaysKHR-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-commandBuffer-02701)"},
- {"VUID-vkCmdTraceRaysKHR-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-commandBuffer-02707)"},
- {"VUID-vkCmdTraceRaysKHR-commandBuffer-02712", "If commandBuffer is a protected command buffer, any resource written to by the VkPipeline object bound to the pipeline bind point used by this command must not be an unprotected resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-commandBuffer-02712)"},
- {"VUID-vkCmdTraceRaysKHR-commandBuffer-02713", "If commandBuffer is a protected command buffer, pipeline stages other than the framebuffer-space and compute stages in the VkPipeline object bound to the pipeline bind point must not write to any resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-commandBuffer-02713)"},
- {"VUID-vkCmdTraceRaysKHR-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-commandBuffer-cmdpool)"},
- {"VUID-vkCmdTraceRaysKHR-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-commandBuffer-parameter)"},
- {"VUID-vkCmdTraceRaysKHR-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-commandBuffer-recording)"},
- {"VUID-vkCmdTraceRaysKHR-depth-03507", "depth must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-depth-03507)"},
- {"VUID-vkCmdTraceRaysKHR-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-filterCubic-02694)"},
- {"VUID-vkCmdTraceRaysKHR-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-filterCubicMinmax-02695)"},
- {"VUID-vkCmdTraceRaysKHR-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-flags-02696)"},
- {"VUID-vkCmdTraceRaysKHR-flags-03508", "If the currently bound ray tracing pipeline was created with flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR, the buffer member of hitShaderBindingTable must not be VK_NULL_HANDLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-flags-03508)"},
- {"VUID-vkCmdTraceRaysKHR-flags-03509", "If the currently bound ray tracing pipeline was created with flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, the buffer member of hitShaderBindingTable must not be VK_NULL_HANDLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-flags-03509)"},
- {"VUID-vkCmdTraceRaysKHR-flags-03510", "If the currently bound ray tracing pipeline was created with flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR, the buffer member of hitShaderBindingTable must not be VK_NULL_HANDLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-flags-03510)"},
- {"VUID-vkCmdTraceRaysKHR-flags-03511", "If the currently bound ray tracing pipeline was created with flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR, the shader group handle identified by missShaderBindingTable must contain a valid miss shader (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-flags-03511)"},
- {"VUID-vkCmdTraceRaysKHR-flags-03512", "If the currently bound ray tracing pipeline was created with flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR, entries in hitShaderBindingTable accessed as a result of this command in order to execute an any hit shader must not be set to zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-flags-03512)"},
- {"VUID-vkCmdTraceRaysKHR-flags-03513", "If the currently bound ray tracing pipeline was created with flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, entries in hitShaderBindingTable accessed as a result of this command in order to execute a closest hit shader must not be set to zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-flags-03513)"},
- {"VUID-vkCmdTraceRaysKHR-flags-03514", "If the currently bound ray tracing pipeline was created with flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR, entries in hitShaderBindingTable accessed as a result of this command in order to execute an intersection shader must not be set to zero (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-flags-03514)"},
- {"VUID-vkCmdTraceRaysKHR-height-03506", "height must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-height-03506)"},
- {"VUID-vkCmdTraceRaysKHR-hitShaderBindingOffset-02459", "hitShaderBindingOffset must be less than the size of hitShaderBindingTableBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-hitShaderBindingOffset-02459)"},
- {"VUID-vkCmdTraceRaysKHR-hitShaderBindingOffset-02460", "hitShaderBindingOffset must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-hitShaderBindingOffset-02460)"},
- {"VUID-vkCmdTraceRaysKHR-hitShaderBindingStride-02464", "hitShaderBindingStride must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-hitShaderBindingStride-02464)"},
- {"VUID-vkCmdTraceRaysKHR-hitShaderBindingStride-02467", "hitShaderBindingStride must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxShaderGroupStride (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-hitShaderBindingStride-02467)"},
- {"VUID-vkCmdTraceRaysKHR-maxRecursionDepth-03430", "This command must not cause a shader call instruction to be executed from a shader invocation with a recursion depth greater than the value of maxRecursionDepth used to create the bound ray tracing pipeline. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-maxRecursionDepth-03430)"},
- {"VUID-vkCmdTraceRaysKHR-missShaderBindingOffset-02457", "missShaderBindingOffset must be less than the size of missShaderBindingTableBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-missShaderBindingOffset-02457)"},
- {"VUID-vkCmdTraceRaysKHR-missShaderBindingOffset-02458", "missShaderBindingOffset must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-missShaderBindingOffset-02458)"},
- {"VUID-vkCmdTraceRaysKHR-missShaderBindingStride-02463", "missShaderBindingStride must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-missShaderBindingStride-02463)"},
- {"VUID-vkCmdTraceRaysKHR-missShaderBindingStride-02466", "missShaderBindingStride must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxShaderGroupStride (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-missShaderBindingStride-02466)"},
- {"VUID-vkCmdTraceRaysKHR-pCallableShaderBindingTable-parameter", "pCallableShaderBindingTable must be a valid pointer to a valid VkStridedBufferRegionKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-pCallableShaderBindingTable-parameter)"},
- {"VUID-vkCmdTraceRaysKHR-pHitShaderBindingTable-parameter", "pHitShaderBindingTable must be a valid pointer to a valid VkStridedBufferRegionKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-pHitShaderBindingTable-parameter)"},
- {"VUID-vkCmdTraceRaysKHR-pMissShaderBindingTable-parameter", "pMissShaderBindingTable must be a valid pointer to a valid VkStridedBufferRegionKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-pMissShaderBindingTable-parameter)"},
- {"VUID-vkCmdTraceRaysKHR-pRaygenShaderBindingTable-parameter", "pRaygenShaderBindingTable must be a valid pointer to a valid VkStridedBufferRegionKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-pRaygenShaderBindingTable-parameter)"},
- {"VUID-vkCmdTraceRaysKHR-raygenShaderBindingOffset-02455", "raygenShaderBindingOffset must be less than the size of raygenShaderBindingTableBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-raygenShaderBindingOffset-02455)"},
- {"VUID-vkCmdTraceRaysKHR-raygenShaderBindingOffset-02456", "raygenShaderBindingOffset must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-raygenShaderBindingOffset-02456)"},
- {"VUID-vkCmdTraceRaysKHR-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-renderpass)"},
- {"VUID-vkCmdTraceRaysKHR-width-03505", "width must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysKHR-width-03505)"},
- {"VUID-vkCmdTraceRaysNV-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-None-02690)"},
- {"VUID-vkCmdTraceRaysNV-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-None-02691)"},
- {"VUID-vkCmdTraceRaysNV-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-None-02692)"},
- {"VUID-vkCmdTraceRaysNV-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY (https://github.com/KhronosGroup/Vulkan-Docs/search?q=VUID-vkCmdTraceRaysNV-None-02693)"},
- {"VUID-vkCmdTraceRaysNV-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-None-02697)"},
- {"VUID-vkCmdTraceRaysNV-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-None-02698)"},
- {"VUID-vkCmdTraceRaysNV-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-None-02699)"},
- {"VUID-vkCmdTraceRaysNV-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-None-02700)"},
- {"VUID-vkCmdTraceRaysNV-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-None-02702)"},
- {"VUID-vkCmdTraceRaysNV-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-None-02703)"},
- {"VUID-vkCmdTraceRaysNV-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-None-02704)"},
- {"VUID-vkCmdTraceRaysNV-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-None-02705)"},
- {"VUID-vkCmdTraceRaysNV-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-None-02706)"},
- {"VUID-vkCmdTraceRaysNV-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-None-02859)"},
- {"VUID-vkCmdTraceRaysNV-None-03429", "Any shader group handle referenced by this call must have been queried from the currently bound ray tracing shader pipeline (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-None-03429)"},
- {"VUID-vkCmdTraceRaysNV-callableShaderBindingOffset-02461", "callableShaderBindingOffset must be less than the size of callableShaderBindingTableBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-callableShaderBindingOffset-02461)"},
- {"VUID-vkCmdTraceRaysNV-callableShaderBindingOffset-02462", "callableShaderBindingOffset must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-callableShaderBindingOffset-02462)"},
- {"VUID-vkCmdTraceRaysNV-callableShaderBindingStride-02465", "callableShaderBindingStride must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-callableShaderBindingStride-02465)"},
- {"VUID-vkCmdTraceRaysNV-callableShaderBindingStride-02468", "callableShaderBindingStride must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxShaderGroupStride (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-callableShaderBindingStride-02468)"},
- {"VUID-vkCmdTraceRaysNV-callableShaderBindingTableBuffer-parameter", "If callableShaderBindingTableBuffer is not VK_NULL_HANDLE, callableShaderBindingTableBuffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-callableShaderBindingTableBuffer-parameter)"},
- {"VUID-vkCmdTraceRaysNV-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-commandBuffer-02701)"},
- {"VUID-vkCmdTraceRaysNV-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-commandBuffer-02707)"},
- {"VUID-vkCmdTraceRaysNV-commandBuffer-02712", "If commandBuffer is a protected command buffer, any resource written to by the VkPipeline object bound to the pipeline bind point used by this command must not be an unprotected resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-commandBuffer-02712)"},
- {"VUID-vkCmdTraceRaysNV-commandBuffer-02713", "If commandBuffer is a protected command buffer, pipeline stages other than the framebuffer-space and compute stages in the VkPipeline object bound to the pipeline bind point must not write to any resource (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-commandBuffer-02713)"},
- {"VUID-vkCmdTraceRaysNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-commandBuffer-cmdpool)"},
- {"VUID-vkCmdTraceRaysNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-commandBuffer-parameter)"},
- {"VUID-vkCmdTraceRaysNV-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-commandBuffer-recording)"},
- {"VUID-vkCmdTraceRaysNV-commonparent", "Each of callableShaderBindingTableBuffer, commandBuffer, hitShaderBindingTableBuffer, missShaderBindingTableBuffer, and raygenShaderBindingTableBuffer that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-commonparent)"},
- {"VUID-vkCmdTraceRaysNV-depth-02471", "depth must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-depth-02471)"},
- {"VUID-vkCmdTraceRaysNV-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-filterCubic-02694)"},
- {"VUID-vkCmdTraceRaysNV-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-filterCubicMinmax-02695)"},
- {"VUID-vkCmdTraceRaysNV-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-flags-02696)"},
- {"VUID-vkCmdTraceRaysNV-height-02470", "height must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-height-02470)"},
- {"VUID-vkCmdTraceRaysNV-hitShaderBindingOffset-02459", "hitShaderBindingOffset must be less than the size of hitShaderBindingTableBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-hitShaderBindingOffset-02459)"},
- {"VUID-vkCmdTraceRaysNV-hitShaderBindingOffset-02460", "hitShaderBindingOffset must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-hitShaderBindingOffset-02460)"},
- {"VUID-vkCmdTraceRaysNV-hitShaderBindingStride-02464", "hitShaderBindingStride must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-hitShaderBindingStride-02464)"},
- {"VUID-vkCmdTraceRaysNV-hitShaderBindingStride-02467", "hitShaderBindingStride must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxShaderGroupStride (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-hitShaderBindingStride-02467)"},
- {"VUID-vkCmdTraceRaysNV-hitShaderBindingTableBuffer-parameter", "If hitShaderBindingTableBuffer is not VK_NULL_HANDLE, hitShaderBindingTableBuffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-hitShaderBindingTableBuffer-parameter)"},
- {"VUID-vkCmdTraceRaysNV-maxRecursionDepth-03430", "This command must not cause a shader call instruction to be executed from a shader invocation with a recursion depth greater than the value of maxRecursionDepth used to create the bound ray tracing pipeline. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-maxRecursionDepth-03430)"},
- {"VUID-vkCmdTraceRaysNV-missShaderBindingOffset-02457", "missShaderBindingOffset must be less than the size of missShaderBindingTableBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-missShaderBindingOffset-02457)"},
- {"VUID-vkCmdTraceRaysNV-missShaderBindingOffset-02458", "missShaderBindingOffset must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-missShaderBindingOffset-02458)"},
- {"VUID-vkCmdTraceRaysNV-missShaderBindingStride-02463", "missShaderBindingStride must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-missShaderBindingStride-02463)"},
- {"VUID-vkCmdTraceRaysNV-missShaderBindingStride-02466", "missShaderBindingStride must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxShaderGroupStride (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-missShaderBindingStride-02466)"},
- {"VUID-vkCmdTraceRaysNV-missShaderBindingTableBuffer-parameter", "If missShaderBindingTableBuffer is not VK_NULL_HANDLE, missShaderBindingTableBuffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-missShaderBindingTableBuffer-parameter)"},
- {"VUID-vkCmdTraceRaysNV-raygenShaderBindingOffset-02455", "raygenShaderBindingOffset must be less than the size of raygenShaderBindingTableBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-raygenShaderBindingOffset-02455)"},
- {"VUID-vkCmdTraceRaysNV-raygenShaderBindingOffset-02456", "raygenShaderBindingOffset must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-raygenShaderBindingOffset-02456)"},
- {"VUID-vkCmdTraceRaysNV-raygenShaderBindingTableBuffer-parameter", "raygenShaderBindingTableBuffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-raygenShaderBindingTableBuffer-parameter)"},
- {"VUID-vkCmdTraceRaysNV-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-renderpass)"},
- {"VUID-vkCmdTraceRaysNV-width-02469", "width must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0] (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdTraceRaysNV-width-02469)"},
- {"VUID-vkCmdUpdateBuffer-commandBuffer-01813", "If commandBuffer is an unprotected command buffer, then dstBuffer must not be a protected buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdUpdateBuffer-commandBuffer-01813)"},
- {"VUID-vkCmdUpdateBuffer-commandBuffer-01814", "If commandBuffer is a protected command buffer, then dstBuffer must not be an unprotected buffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdUpdateBuffer-commandBuffer-01814)"},
- {"VUID-vkCmdUpdateBuffer-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdUpdateBuffer-commandBuffer-cmdpool)"},
- {"VUID-vkCmdUpdateBuffer-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdUpdateBuffer-commandBuffer-parameter)"},
- {"VUID-vkCmdUpdateBuffer-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdUpdateBuffer-commandBuffer-recording)"},
- {"VUID-vkCmdUpdateBuffer-commonparent", "Both of commandBuffer, and dstBuffer must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdUpdateBuffer-commonparent)"},
- {"VUID-vkCmdUpdateBuffer-dataSize-00033", "dataSize must be less than or equal to the size of dstBuffer minus dstOffset (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdUpdateBuffer-dataSize-00033)"},
- {"VUID-vkCmdUpdateBuffer-dataSize-00037", "dataSize must be less than or equal to 65536 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdUpdateBuffer-dataSize-00037)"},
- {"VUID-vkCmdUpdateBuffer-dataSize-00038", "dataSize must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdUpdateBuffer-dataSize-00038)"},
- {"VUID-vkCmdUpdateBuffer-dataSize-arraylength", "dataSize must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdUpdateBuffer-dataSize-arraylength)"},
- {"VUID-vkCmdUpdateBuffer-dstBuffer-00034", "dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdUpdateBuffer-dstBuffer-00034)"},
- {"VUID-vkCmdUpdateBuffer-dstBuffer-00035", "If dstBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdUpdateBuffer-dstBuffer-00035)"},
- {"VUID-vkCmdUpdateBuffer-dstBuffer-parameter", "dstBuffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdUpdateBuffer-dstBuffer-parameter)"},
- {"VUID-vkCmdUpdateBuffer-dstOffset-00032", "dstOffset must be less than the size of dstBuffer (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdUpdateBuffer-dstOffset-00032)"},
- {"VUID-vkCmdUpdateBuffer-dstOffset-00036", "dstOffset must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdUpdateBuffer-dstOffset-00036)"},
- {"VUID-vkCmdUpdateBuffer-pData-parameter", "pData must be a valid pointer to an array of dataSize bytes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdUpdateBuffer-pData-parameter)"},
- {"VUID-vkCmdUpdateBuffer-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdUpdateBuffer-renderpass)"},
- {"VUID-vkCmdWaitEvents-commandBuffer-01167", "commandBuffer's current device mask must include exactly one physical device. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-commandBuffer-01167)"},
- {"VUID-vkCmdWaitEvents-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-commandBuffer-cmdpool)"},
- {"VUID-vkCmdWaitEvents-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-commandBuffer-parameter)"},
- {"VUID-vkCmdWaitEvents-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-commandBuffer-recording)"},
- {"VUID-vkCmdWaitEvents-commonparent", "Both of commandBuffer, and the elements of pEvents must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-commonparent)"},
- {"VUID-vkCmdWaitEvents-dstAccessMask-02810", "The dstAccessMask member of each element of pMemoryBarriers must only include access flags that are supported by one or more of the pipeline stages in dstStageMask, as specified in the table of supported access types (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-dstAccessMask-02810)"},
- {"VUID-vkCmdWaitEvents-dstAccessMask-02812", "The dstAccessMask member of each element of pBufferMemoryBarriers must only include access flags that are supported by one or more of the pipeline stages in dstStageMask, as specified in the table of supported access types (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-dstAccessMask-02812)"},
- {"VUID-vkCmdWaitEvents-dstAccessMask-02814", "The dstAccessMask member of any element of pImageMemoryBarriers must only include access flags that are supported by one or more of the pipeline stages in dstStageMask, as specified in the table of supported access types (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-dstAccessMask-02814)"},
- {"VUID-vkCmdWaitEvents-dstStageMask-01160", "If the geometry shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-dstStageMask-01160)"},
- {"VUID-vkCmdWaitEvents-dstStageMask-01162", "If the tessellation shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-dstStageMask-01162)"},
- {"VUID-vkCmdWaitEvents-dstStageMask-02113", "If the mesh shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-dstStageMask-02113)"},
- {"VUID-vkCmdWaitEvents-dstStageMask-02114", "If the task shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-dstStageMask-02114)"},
- {"VUID-vkCmdWaitEvents-dstStageMask-parameter", "dstStageMask must be a valid combination of VkPipelineStageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-dstStageMask-parameter)"},
- {"VUID-vkCmdWaitEvents-dstStageMask-requiredbitmask", "dstStageMask must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-dstStageMask-requiredbitmask)"},
- {"VUID-vkCmdWaitEvents-eventCount-arraylength", "eventCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-eventCount-arraylength)"},
- {"VUID-vkCmdWaitEvents-pBufferMemoryBarriers-parameter", "If bufferMemoryBarrierCount is not 0, pBufferMemoryBarriers must be a valid pointer to an array of bufferMemoryBarrierCount valid VkBufferMemoryBarrier structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-pBufferMemoryBarriers-parameter)"},
- {"VUID-vkCmdWaitEvents-pEvents-01163", "If pEvents includes one or more events that will be signaled by vkSetEvent after commandBuffer has been submitted to a queue, then vkCmdWaitEvents must not be called inside a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-pEvents-01163)"},
- {"VUID-vkCmdWaitEvents-pEvents-parameter", "pEvents must be a valid pointer to an array of eventCount valid VkEvent handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-pEvents-parameter)"},
- {"VUID-vkCmdWaitEvents-pImageMemoryBarriers-parameter", "If imageMemoryBarrierCount is not 0, pImageMemoryBarriers must be a valid pointer to an array of imageMemoryBarrierCount valid VkImageMemoryBarrier structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-pImageMemoryBarriers-parameter)"},
- {"VUID-vkCmdWaitEvents-pMemoryBarriers-01165", "Each element of pMemoryBarriers, pBufferMemoryBarriers or pImageMemoryBarriers must not have any access flag included in its srcAccessMask member if that bit is not supported by any of the pipeline stages in srcStageMask, as specified in the table of supported access types. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-pMemoryBarriers-01165)"},
- {"VUID-vkCmdWaitEvents-pMemoryBarriers-01166", "Each element of pMemoryBarriers, pBufferMemoryBarriers or pImageMemoryBarriers must not have any access flag included in its dstAccessMask member if that bit is not supported by any of the pipeline stages in dstStageMask, as specified in the table of supported access types. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-pMemoryBarriers-01166)"},
- {"VUID-vkCmdWaitEvents-pMemoryBarriers-parameter", "If memoryBarrierCount is not 0, pMemoryBarriers must be a valid pointer to an array of memoryBarrierCount valid VkMemoryBarrier structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-pMemoryBarriers-parameter)"},
- {"VUID-vkCmdWaitEvents-srcAccessMask-02809", "The srcAccessMask member of each element of pMemoryBarriers must only include access flags that are supported by one or more of the pipeline stages in srcStageMask, as specified in the table of supported access types (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-srcAccessMask-02809)"},
- {"VUID-vkCmdWaitEvents-srcAccessMask-02811", "The srcAccessMask member of each element of pBufferMemoryBarriers must only include access flags that are supported by one or more of the pipeline stages in srcStageMask, as specified in the table of supported access types (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-srcAccessMask-02811)"},
- {"VUID-vkCmdWaitEvents-srcAccessMask-02813", "The srcAccessMask member of each element of pImageMemoryBarriers must only include access flags that are supported by one or more of the pipeline stages in srcStageMask, as specified in the table of supported access types (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-srcAccessMask-02813)"},
- {"VUID-vkCmdWaitEvents-srcQueueFamilyIndex-02803", "The srcQueueFamilyIndex and dstQueueFamilyIndex members of any element of pBufferMemoryBarriers or pImageMemoryBarriers must be equal. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-srcQueueFamilyIndex-02803)"},
- {"VUID-vkCmdWaitEvents-srcStageMask-01158", "srcStageMask must be the bitwise OR of the stageMask parameter used in previous calls to vkCmdSetEvent with any of the members of pEvents and VK_PIPELINE_STAGE_HOST_BIT if any of the members of pEvents was set using vkSetEvent (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-srcStageMask-01158)"},
- {"VUID-vkCmdWaitEvents-srcStageMask-01159", "If the geometry shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-srcStageMask-01159)"},
- {"VUID-vkCmdWaitEvents-srcStageMask-01161", "If the tessellation shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-srcStageMask-01161)"},
- {"VUID-vkCmdWaitEvents-srcStageMask-01164", "Any pipeline stage included in srcStageMask or dstStageMask must be supported by the capabilities of the queue family specified by the queueFamilyIndex member of the VkCommandPoolCreateInfo structure that was used to create the VkCommandPool that commandBuffer was allocated from, as specified in the table of supported pipeline stages. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-srcStageMask-01164)"},
- {"VUID-vkCmdWaitEvents-srcStageMask-02111", "If the mesh shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-srcStageMask-02111)"},
- {"VUID-vkCmdWaitEvents-srcStageMask-02112", "If the task shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-srcStageMask-02112)"},
- {"VUID-vkCmdWaitEvents-srcStageMask-parameter", "srcStageMask must be a valid combination of VkPipelineStageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-srcStageMask-parameter)"},
- {"VUID-vkCmdWaitEvents-srcStageMask-requiredbitmask", "srcStageMask must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWaitEvents-srcStageMask-requiredbitmask)"},
- {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-accelerationStructureCount-arraylength", "accelerationStructureCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-accelerationStructureCount-arraylength)"},
- {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-accelerationStructures-03431", "All acceleration structures in accelerationStructures must have been built with VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR if queryType is VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-accelerationStructures-03431)"},
- {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-commandBuffer-cmdpool)"},
- {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-commandBuffer-parameter)"},
- {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-commandBuffer-recording)"},
- {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-commonparent", "Each of commandBuffer, queryPool, and the elements of pAccelerationStructures must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-commonparent)"},
- {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-pAccelerationStructures-parameter", "pAccelerationStructures must be a valid pointer to an array of accelerationStructureCount valid VkAccelerationStructureKHR handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-pAccelerationStructures-parameter)"},
- {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryPool-02493", "queryPool must have been created with a queryType matching queryType (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryPool-02493)"},
- {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryPool-02494", "The queries identified by queryPool and firstQuery must be unavailable (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryPool-02494)"},
- {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryPool-parameter", "queryPool must be a valid VkQueryPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryPool-parameter)"},
- {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryType-03432", "queryType must be VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR or VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryType-03432)"},
- {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryType-parameter", "queryType must be a valid VkQueryType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryType-parameter)"},
- {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-renderpass", "This command must only be called outside of a render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-renderpass)"},
- {"VUID-vkCmdWriteBufferMarkerAMD-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteBufferMarkerAMD-commandBuffer-cmdpool)"},
- {"VUID-vkCmdWriteBufferMarkerAMD-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteBufferMarkerAMD-commandBuffer-parameter)"},
- {"VUID-vkCmdWriteBufferMarkerAMD-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteBufferMarkerAMD-commandBuffer-recording)"},
- {"VUID-vkCmdWriteBufferMarkerAMD-commonparent", "Both of commandBuffer, and dstBuffer must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteBufferMarkerAMD-commonparent)"},
- {"VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-01799", "dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-01799)"},
- {"VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-01800", "If dstBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-01800)"},
- {"VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-parameter", "dstBuffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-parameter)"},
- {"VUID-vkCmdWriteBufferMarkerAMD-dstOffset-01798", "dstOffset must be less than or equal to the size of dstBuffer minus 4. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteBufferMarkerAMD-dstOffset-01798)"},
- {"VUID-vkCmdWriteBufferMarkerAMD-dstOffset-01801", "dstOffset must be a multiple of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteBufferMarkerAMD-dstOffset-01801)"},
- {"VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-parameter", "pipelineStage must be a valid VkPipelineStageFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-parameter)"},
- {"VUID-vkCmdWriteTimestamp-None-00830", "All queries used by the command must be unavailable (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteTimestamp-None-00830)"},
- {"VUID-vkCmdWriteTimestamp-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteTimestamp-commandBuffer-cmdpool)"},
- {"VUID-vkCmdWriteTimestamp-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteTimestamp-commandBuffer-parameter)"},
- {"VUID-vkCmdWriteTimestamp-commandBuffer-recording", "commandBuffer must be in the recording state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteTimestamp-commandBuffer-recording)"},
- {"VUID-vkCmdWriteTimestamp-commonparent", "Both of commandBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteTimestamp-commonparent)"},
- {"VUID-vkCmdWriteTimestamp-pipelineStage-parameter", "pipelineStage must be a valid VkPipelineStageFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteTimestamp-pipelineStage-parameter)"},
- {"VUID-vkCmdWriteTimestamp-query-00831", "If vkCmdWriteTimestamp is called within a render pass instance, the sum of query and the number of bits set in the current subpass's view mask must be less than or equal to the number of queries in queryPool (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteTimestamp-query-00831)"},
- {"VUID-vkCmdWriteTimestamp-queryPool-00828", "The query identified by queryPool and query must be unavailable (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteTimestamp-queryPool-00828)"},
- {"VUID-vkCmdWriteTimestamp-queryPool-01416", "queryPool must have been created with a queryType of VK_QUERY_TYPE_TIMESTAMP (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteTimestamp-queryPool-01416)"},
- {"VUID-vkCmdWriteTimestamp-queryPool-parameter", "queryPool must be a valid VkQueryPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteTimestamp-queryPool-parameter)"},
- {"VUID-vkCmdWriteTimestamp-timestampValidBits-00829", "The command pool's queue family must support a non-zero timestampValidBits (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCmdWriteTimestamp-timestampValidBits-00829)"},
- {"VUID-vkCompileDeferredNV-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCompileDeferredNV-device-parameter)"},
- {"VUID-vkCompileDeferredNV-pipeline-02237", "pipeline must have been created with VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCompileDeferredNV-pipeline-02237)"},
- {"VUID-vkCompileDeferredNV-pipeline-parameter", "pipeline must be a valid VkPipeline handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCompileDeferredNV-pipeline-parameter)"},
- {"VUID-vkCompileDeferredNV-pipeline-parent", "pipeline must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCompileDeferredNV-pipeline-parent)"},
- {"VUID-vkCompileDeferredNV-shader-02238", "shader must not have been called as a deferred compile before (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCompileDeferredNV-shader-02238)"},
- {"VUID-vkCopyAccelerationStructureKHR-None-03440", "All VkAccelerationStructureKHR objects referenced by this command must be bound to host-visible memory. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCopyAccelerationStructureKHR-None-03440)"},
- {"VUID-vkCopyAccelerationStructureKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCopyAccelerationStructureKHR-device-parameter)"},
- {"VUID-vkCopyAccelerationStructureKHR-pInfo-parameter", "pInfo must be a valid pointer to a valid VkCopyAccelerationStructureInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCopyAccelerationStructureKHR-pInfo-parameter)"},
- {"VUID-vkCopyAccelerationStructureKHR-rayTracingHostAccelerationStructureCommands-03441", "the VkPhysicalDeviceRayTracingFeaturesKHR->rayTracingHostAccelerationStructureCommands feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCopyAccelerationStructureKHR-rayTracingHostAccelerationStructureCommands-03441)"},
- {"VUID-vkCopyAccelerationStructureToMemoryKHR-None-03445", "All VkAccelerationStructureKHR objects referenced by this command must be bound to host-visible memory. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCopyAccelerationStructureToMemoryKHR-None-03445)"},
- {"VUID-vkCopyAccelerationStructureToMemoryKHR-None-03446", "All VkDeviceOrHostAddressKHR referenced by this command must contain valid host pointers. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCopyAccelerationStructureToMemoryKHR-None-03446)"},
- {"VUID-vkCopyAccelerationStructureToMemoryKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCopyAccelerationStructureToMemoryKHR-device-parameter)"},
- {"VUID-vkCopyAccelerationStructureToMemoryKHR-pInfo-parameter", "pInfo must be a valid pointer to a valid VkCopyAccelerationStructureToMemoryInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCopyAccelerationStructureToMemoryKHR-pInfo-parameter)"},
- {"VUID-vkCopyAccelerationStructureToMemoryKHR-rayTracingHostAccelerationStructureCommands-03447", "the VkPhysicalDeviceRayTracingFeaturesKHR->rayTracingHostAccelerationStructureCommands feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCopyAccelerationStructureToMemoryKHR-rayTracingHostAccelerationStructureCommands-03447)"},
- {"VUID-vkCopyMemoryToAccelerationStructureKHR-None-03442", "All VkAccelerationStructureKHR objects referenced by this command must be bound to host-visible memory. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCopyMemoryToAccelerationStructureKHR-None-03442)"},
- {"VUID-vkCopyMemoryToAccelerationStructureKHR-None-03443", "All VkDeviceOrHostAddressConstKHR referenced by this command must contain valid host pointers. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCopyMemoryToAccelerationStructureKHR-None-03443)"},
- {"VUID-vkCopyMemoryToAccelerationStructureKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCopyMemoryToAccelerationStructureKHR-device-parameter)"},
- {"VUID-vkCopyMemoryToAccelerationStructureKHR-pInfo-parameter", "pInfo must be a valid pointer to a valid VkCopyMemoryToAccelerationStructureInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCopyMemoryToAccelerationStructureKHR-pInfo-parameter)"},
- {"VUID-vkCopyMemoryToAccelerationStructureKHR-rayTracingHostAccelerationStructureCommands-03444", "the VkPhysicalDeviceRayTracingFeaturesKHR->rayTracingHostAccelerationStructureCommands feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCopyMemoryToAccelerationStructureKHR-rayTracingHostAccelerationStructureCommands-03444)"},
- {"VUID-vkCreateAccelerationStructureKHR-device-03489", "If device was created with multiple physical devices, then the bufferDeviceAddressMultiDevice feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateAccelerationStructureKHR-device-03489)"},
- {"VUID-vkCreateAccelerationStructureKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateAccelerationStructureKHR-device-parameter)"},
- {"VUID-vkCreateAccelerationStructureKHR-deviceAddress-03488", "If VkAccelerationStructureCreateInfoKHR::deviceAddress is not zero, the rayTracingAccelerationStructureCaptureReplay feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateAccelerationStructureKHR-deviceAddress-03488)"},
- {"VUID-vkCreateAccelerationStructureKHR-pAccelerationStructure-parameter", "pAccelerationStructure must be a valid pointer to a VkAccelerationStructureKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateAccelerationStructureKHR-pAccelerationStructure-parameter)"},
- {"VUID-vkCreateAccelerationStructureKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateAccelerationStructureKHR-pAllocator-parameter)"},
- {"VUID-vkCreateAccelerationStructureKHR-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkAccelerationStructureCreateInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateAccelerationStructureKHR-pCreateInfo-parameter)"},
- {"VUID-vkCreateAccelerationStructureKHR-rayTracing-03487", "The rayTracing or rayQuery feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateAccelerationStructureKHR-rayTracing-03487)"},
- {"VUID-vkCreateAccelerationStructureNV-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateAccelerationStructureNV-device-parameter)"},
- {"VUID-vkCreateAccelerationStructureNV-pAccelerationStructure-parameter", "pAccelerationStructure must be a valid pointer to a VkAccelerationStructureNV handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateAccelerationStructureNV-pAccelerationStructure-parameter)"},
- {"VUID-vkCreateAccelerationStructureNV-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateAccelerationStructureNV-pAllocator-parameter)"},
- {"VUID-vkCreateAccelerationStructureNV-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkAccelerationStructureCreateInfoNV structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateAccelerationStructureNV-pCreateInfo-parameter)"},
- {"VUID-vkCreateAndroidSurfaceKHR-instance-parameter", "instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateAndroidSurfaceKHR-instance-parameter)"},
- {"VUID-vkCreateAndroidSurfaceKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateAndroidSurfaceKHR-pAllocator-parameter)"},
- {"VUID-vkCreateAndroidSurfaceKHR-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkAndroidSurfaceCreateInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateAndroidSurfaceKHR-pCreateInfo-parameter)"},
- {"VUID-vkCreateAndroidSurfaceKHR-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateAndroidSurfaceKHR-pSurface-parameter)"},
- {"VUID-vkCreateBuffer-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateBuffer-device-parameter)"},
- {"VUID-vkCreateBuffer-flags-00911", "If the flags member of pCreateInfo includes VK_BUFFER_CREATE_SPARSE_BINDING_BIT, creating this VkBuffer must not cause the total required sparse memory for all currently valid sparse resources on the device to exceed VkPhysicalDeviceLimits::sparseAddressSpaceSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateBuffer-flags-00911)"},
- {"VUID-vkCreateBuffer-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateBuffer-pAllocator-parameter)"},
- {"VUID-vkCreateBuffer-pBuffer-parameter", "pBuffer must be a valid pointer to a VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateBuffer-pBuffer-parameter)"},
- {"VUID-vkCreateBuffer-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkBufferCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateBuffer-pCreateInfo-parameter)"},
- {"VUID-vkCreateBufferView-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateBufferView-device-parameter)"},
- {"VUID-vkCreateBufferView-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateBufferView-pAllocator-parameter)"},
- {"VUID-vkCreateBufferView-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkBufferViewCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateBufferView-pCreateInfo-parameter)"},
- {"VUID-vkCreateBufferView-pView-parameter", "pView must be a valid pointer to a VkBufferView handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateBufferView-pView-parameter)"},
- {"VUID-vkCreateCommandPool-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateCommandPool-device-parameter)"},
- {"VUID-vkCreateCommandPool-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateCommandPool-pAllocator-parameter)"},
- {"VUID-vkCreateCommandPool-pCommandPool-parameter", "pCommandPool must be a valid pointer to a VkCommandPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateCommandPool-pCommandPool-parameter)"},
- {"VUID-vkCreateCommandPool-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkCommandPoolCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateCommandPool-pCreateInfo-parameter)"},
- {"VUID-vkCreateCommandPool-queueFamilyIndex-01937", "pCreateInfo->queueFamilyIndex must be the index of a queue family available in the logical device device. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateCommandPool-queueFamilyIndex-01937)"},
- {"VUID-vkCreateComputePipelines-createInfoCount-arraylength", "createInfoCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateComputePipelines-createInfoCount-arraylength)"},
- {"VUID-vkCreateComputePipelines-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateComputePipelines-device-parameter)"},
- {"VUID-vkCreateComputePipelines-flags-00695", "If the flags member of any element of pCreateInfos contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and the basePipelineIndex member of that same element is not -1, basePipelineIndex must be less than the index into pCreateInfos that corresponds to that element (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateComputePipelines-flags-00695)"},
- {"VUID-vkCreateComputePipelines-flags-00696", "If the flags member of any element of pCreateInfos contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, the base pipeline must have been created with the VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT flag set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateComputePipelines-flags-00696)"},
- {"VUID-vkCreateComputePipelines-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateComputePipelines-pAllocator-parameter)"},
- {"VUID-vkCreateComputePipelines-pCreateInfos-parameter", "pCreateInfos must be a valid pointer to an array of createInfoCount valid VkComputePipelineCreateInfo structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateComputePipelines-pCreateInfos-parameter)"},
- {"VUID-vkCreateComputePipelines-pPipelines-parameter", "pPipelines must be a valid pointer to an array of createInfoCount VkPipeline handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateComputePipelines-pPipelines-parameter)"},
- {"VUID-vkCreateComputePipelines-pipelineCache-02873", "If pipelineCache was created with VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT, host access to pipelineCache must be externally synchronized. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateComputePipelines-pipelineCache-02873)"},
- {"VUID-vkCreateComputePipelines-pipelineCache-parameter", "If pipelineCache is not VK_NULL_HANDLE, pipelineCache must be a valid VkPipelineCache handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateComputePipelines-pipelineCache-parameter)"},
- {"VUID-vkCreateComputePipelines-pipelineCache-parent", "If pipelineCache is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateComputePipelines-pipelineCache-parent)"},
- {"VUID-vkCreateDebugReportCallbackEXT-instance-parameter", "instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDebugReportCallbackEXT-instance-parameter)"},
- {"VUID-vkCreateDebugReportCallbackEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDebugReportCallbackEXT-pAllocator-parameter)"},
- {"VUID-vkCreateDebugReportCallbackEXT-pCallback-parameter", "pCallback must be a valid pointer to a VkDebugReportCallbackEXT handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDebugReportCallbackEXT-pCallback-parameter)"},
- {"VUID-vkCreateDebugReportCallbackEXT-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkDebugReportCallbackCreateInfoEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDebugReportCallbackEXT-pCreateInfo-parameter)"},
- {"VUID-vkCreateDebugUtilsMessengerEXT-instance-parameter", "instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDebugUtilsMessengerEXT-instance-parameter)"},
- {"VUID-vkCreateDebugUtilsMessengerEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDebugUtilsMessengerEXT-pAllocator-parameter)"},
- {"VUID-vkCreateDebugUtilsMessengerEXT-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkDebugUtilsMessengerCreateInfoEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDebugUtilsMessengerEXT-pCreateInfo-parameter)"},
- {"VUID-vkCreateDebugUtilsMessengerEXT-pMessenger-parameter", "pMessenger must be a valid pointer to a VkDebugUtilsMessengerEXT handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDebugUtilsMessengerEXT-pMessenger-parameter)"},
- {"VUID-vkCreateDeferredOperationKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDeferredOperationKHR-device-parameter)"},
- {"VUID-vkCreateDeferredOperationKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDeferredOperationKHR-pAllocator-parameter)"},
- {"VUID-vkCreateDeferredOperationKHR-pDeferredOperation-parameter", "pDeferredOperation must be a valid pointer to a VkDeferredOperationKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDeferredOperationKHR-pDeferredOperation-parameter)"},
- {"VUID-vkCreateDescriptorPool-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDescriptorPool-device-parameter)"},
- {"VUID-vkCreateDescriptorPool-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDescriptorPool-pAllocator-parameter)"},
- {"VUID-vkCreateDescriptorPool-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkDescriptorPoolCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDescriptorPool-pCreateInfo-parameter)"},
- {"VUID-vkCreateDescriptorPool-pDescriptorPool-parameter", "pDescriptorPool must be a valid pointer to a VkDescriptorPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDescriptorPool-pDescriptorPool-parameter)"},
- {"VUID-vkCreateDescriptorSetLayout-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDescriptorSetLayout-device-parameter)"},
- {"VUID-vkCreateDescriptorSetLayout-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDescriptorSetLayout-pAllocator-parameter)"},
- {"VUID-vkCreateDescriptorSetLayout-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkDescriptorSetLayoutCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDescriptorSetLayout-pCreateInfo-parameter)"},
- {"VUID-vkCreateDescriptorSetLayout-pSetLayout-parameter", "pSetLayout must be a valid pointer to a VkDescriptorSetLayout handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDescriptorSetLayout-pSetLayout-parameter)"},
- {"VUID-vkCreateDescriptorUpdateTemplate-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDescriptorUpdateTemplate-device-parameter)"},
- {"VUID-vkCreateDescriptorUpdateTemplate-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDescriptorUpdateTemplate-pAllocator-parameter)"},
- {"VUID-vkCreateDescriptorUpdateTemplate-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkDescriptorUpdateTemplateCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDescriptorUpdateTemplate-pCreateInfo-parameter)"},
- {"VUID-vkCreateDescriptorUpdateTemplate-pDescriptorUpdateTemplate-parameter", "pDescriptorUpdateTemplate must be a valid pointer to a VkDescriptorUpdateTemplate handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDescriptorUpdateTemplate-pDescriptorUpdateTemplate-parameter)"},
- {"VUID-vkCreateDevice-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDevice-pAllocator-parameter)"},
- {"VUID-vkCreateDevice-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkDeviceCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDevice-pCreateInfo-parameter)"},
- {"VUID-vkCreateDevice-pDevice-parameter", "pDevice must be a valid pointer to a VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDevice-pDevice-parameter)"},
- {"VUID-vkCreateDevice-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDevice-physicalDevice-parameter)"},
- {"VUID-vkCreateDevice-ppEnabledExtensionNames-01387", "All required extensions for each extension in the VkDeviceCreateInfo::ppEnabledExtensionNames list must also be present in that list. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDevice-ppEnabledExtensionNames-01387)"},
- {"VUID-vkCreateDisplayModeKHR-display-parameter", "display must be a valid VkDisplayKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDisplayModeKHR-display-parameter)"},
- {"VUID-vkCreateDisplayModeKHR-display-parent", "display must have been created, allocated, or retrieved from physicalDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDisplayModeKHR-display-parent)"},
- {"VUID-vkCreateDisplayModeKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDisplayModeKHR-pAllocator-parameter)"},
- {"VUID-vkCreateDisplayModeKHR-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkDisplayModeCreateInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDisplayModeKHR-pCreateInfo-parameter)"},
- {"VUID-vkCreateDisplayModeKHR-pMode-parameter", "pMode must be a valid pointer to a VkDisplayModeKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDisplayModeKHR-pMode-parameter)"},
- {"VUID-vkCreateDisplayModeKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDisplayModeKHR-physicalDevice-parameter)"},
- {"VUID-vkCreateDisplayPlaneSurfaceKHR-instance-parameter", "instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDisplayPlaneSurfaceKHR-instance-parameter)"},
- {"VUID-vkCreateDisplayPlaneSurfaceKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDisplayPlaneSurfaceKHR-pAllocator-parameter)"},
- {"VUID-vkCreateDisplayPlaneSurfaceKHR-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkDisplaySurfaceCreateInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDisplayPlaneSurfaceKHR-pCreateInfo-parameter)"},
- {"VUID-vkCreateDisplayPlaneSurfaceKHR-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateDisplayPlaneSurfaceKHR-pSurface-parameter)"},
- {"VUID-vkCreateEvent-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateEvent-device-parameter)"},
- {"VUID-vkCreateEvent-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateEvent-pAllocator-parameter)"},
- {"VUID-vkCreateEvent-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkEventCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateEvent-pCreateInfo-parameter)"},
- {"VUID-vkCreateEvent-pEvent-parameter", "pEvent must be a valid pointer to a VkEvent handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateEvent-pEvent-parameter)"},
- {"VUID-vkCreateFence-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateFence-device-parameter)"},
- {"VUID-vkCreateFence-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateFence-pAllocator-parameter)"},
- {"VUID-vkCreateFence-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkFenceCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateFence-pCreateInfo-parameter)"},
- {"VUID-vkCreateFence-pFence-parameter", "pFence must be a valid pointer to a VkFence handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateFence-pFence-parameter)"},
- {"VUID-vkCreateFramebuffer-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateFramebuffer-device-parameter)"},
- {"VUID-vkCreateFramebuffer-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateFramebuffer-pAllocator-parameter)"},
- {"VUID-vkCreateFramebuffer-pCreateInfo-02777", "If pCreateInfo->flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, and attachmentCount is not 0, each element of pCreateInfo->pAttachments must have been created on device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateFramebuffer-pCreateInfo-02777)"},
- {"VUID-vkCreateFramebuffer-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkFramebufferCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateFramebuffer-pCreateInfo-parameter)"},
- {"VUID-vkCreateFramebuffer-pFramebuffer-parameter", "pFramebuffer must be a valid pointer to a VkFramebuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateFramebuffer-pFramebuffer-parameter)"},
- {"VUID-vkCreateGraphicsPipelines-createInfoCount-arraylength", "createInfoCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateGraphicsPipelines-createInfoCount-arraylength)"},
- {"VUID-vkCreateGraphicsPipelines-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateGraphicsPipelines-device-parameter)"},
- {"VUID-vkCreateGraphicsPipelines-flags-00720", "If the flags member of any element of pCreateInfos contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and the basePipelineIndex member of that same element is not -1, basePipelineIndex must be less than the index into pCreateInfos that corresponds to that element (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateGraphicsPipelines-flags-00720)"},
- {"VUID-vkCreateGraphicsPipelines-flags-00721", "If the flags member of any element of pCreateInfos contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, the base pipeline must have been created with the VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT flag set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateGraphicsPipelines-flags-00721)"},
- {"VUID-vkCreateGraphicsPipelines-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateGraphicsPipelines-pAllocator-parameter)"},
- {"VUID-vkCreateGraphicsPipelines-pCreateInfos-parameter", "pCreateInfos must be a valid pointer to an array of createInfoCount valid VkGraphicsPipelineCreateInfo structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateGraphicsPipelines-pCreateInfos-parameter)"},
- {"VUID-vkCreateGraphicsPipelines-pPipelines-parameter", "pPipelines must be a valid pointer to an array of createInfoCount VkPipeline handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateGraphicsPipelines-pPipelines-parameter)"},
- {"VUID-vkCreateGraphicsPipelines-pipelineCache-02876", "If pipelineCache was created with VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT, host access to pipelineCache must be externally synchronized. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateGraphicsPipelines-pipelineCache-02876)"},
- {"VUID-vkCreateGraphicsPipelines-pipelineCache-parameter", "If pipelineCache is not VK_NULL_HANDLE, pipelineCache must be a valid VkPipelineCache handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateGraphicsPipelines-pipelineCache-parameter)"},
- {"VUID-vkCreateGraphicsPipelines-pipelineCache-parent", "If pipelineCache is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateGraphicsPipelines-pipelineCache-parent)"},
- {"VUID-vkCreateHeadlessSurfaceEXT-instance-parameter", "instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateHeadlessSurfaceEXT-instance-parameter)"},
- {"VUID-vkCreateHeadlessSurfaceEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateHeadlessSurfaceEXT-pAllocator-parameter)"},
- {"VUID-vkCreateHeadlessSurfaceEXT-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkHeadlessSurfaceCreateInfoEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateHeadlessSurfaceEXT-pCreateInfo-parameter)"},
- {"VUID-vkCreateHeadlessSurfaceEXT-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateHeadlessSurfaceEXT-pSurface-parameter)"},
- {"VUID-vkCreateIOSSurfaceMVK-instance-parameter", "instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateIOSSurfaceMVK-instance-parameter)"},
- {"VUID-vkCreateIOSSurfaceMVK-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateIOSSurfaceMVK-pAllocator-parameter)"},
- {"VUID-vkCreateIOSSurfaceMVK-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkIOSSurfaceCreateInfoMVK structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateIOSSurfaceMVK-pCreateInfo-parameter)"},
- {"VUID-vkCreateIOSSurfaceMVK-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateIOSSurfaceMVK-pSurface-parameter)"},
- {"VUID-vkCreateImage-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateImage-device-parameter)"},
- {"VUID-vkCreateImage-flags-00939", "If the flags member of pCreateInfo includes VK_IMAGE_CREATE_SPARSE_BINDING_BIT, creating this VkImage must not cause the total required sparse memory for all currently valid sparse resources on the device to exceed VkPhysicalDeviceLimits::sparseAddressSpaceSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateImage-flags-00939)"},
- {"VUID-vkCreateImage-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateImage-pAllocator-parameter)"},
- {"VUID-vkCreateImage-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkImageCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateImage-pCreateInfo-parameter)"},
- {"VUID-vkCreateImage-pImage-parameter", "pImage must be a valid pointer to a VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateImage-pImage-parameter)"},
- {"VUID-vkCreateImagePipeSurfaceFUCHSIA-instance-parameter", "instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateImagePipeSurfaceFUCHSIA-instance-parameter)"},
- {"VUID-vkCreateImagePipeSurfaceFUCHSIA-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateImagePipeSurfaceFUCHSIA-pAllocator-parameter)"},
- {"VUID-vkCreateImagePipeSurfaceFUCHSIA-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkImagePipeSurfaceCreateInfoFUCHSIA structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateImagePipeSurfaceFUCHSIA-pCreateInfo-parameter)"},
- {"VUID-vkCreateImagePipeSurfaceFUCHSIA-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateImagePipeSurfaceFUCHSIA-pSurface-parameter)"},
- {"VUID-vkCreateImageView-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateImageView-device-parameter)"},
- {"VUID-vkCreateImageView-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateImageView-pAllocator-parameter)"},
- {"VUID-vkCreateImageView-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkImageViewCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateImageView-pCreateInfo-parameter)"},
- {"VUID-vkCreateImageView-pView-parameter", "pView must be a valid pointer to a VkImageView handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateImageView-pView-parameter)"},
- {"VUID-vkCreateIndirectCommandsLayoutNV-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateIndirectCommandsLayoutNV-device-parameter)"},
- {"VUID-vkCreateIndirectCommandsLayoutNV-deviceGeneratedCommands-02929", "The VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV->deviceGeneratedCommands feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateIndirectCommandsLayoutNV-deviceGeneratedCommands-02929)"},
- {"VUID-vkCreateIndirectCommandsLayoutNV-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateIndirectCommandsLayoutNV-pAllocator-parameter)"},
- {"VUID-vkCreateIndirectCommandsLayoutNV-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkIndirectCommandsLayoutCreateInfoNV structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateIndirectCommandsLayoutNV-pCreateInfo-parameter)"},
- {"VUID-vkCreateIndirectCommandsLayoutNV-pIndirectCommandsLayout-parameter", "pIndirectCommandsLayout must be a valid pointer to a VkIndirectCommandsLayoutNV handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateIndirectCommandsLayoutNV-pIndirectCommandsLayout-parameter)"},
- {"VUID-vkCreateInstance-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateInstance-pAllocator-parameter)"},
- {"VUID-vkCreateInstance-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkInstanceCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateInstance-pCreateInfo-parameter)"},
- {"VUID-vkCreateInstance-pInstance-parameter", "pInstance must be a valid pointer to a VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateInstance-pInstance-parameter)"},
- {"VUID-vkCreateInstance-ppEnabledExtensionNames-01388", "All required extensions for each extension in the VkInstanceCreateInfo::ppEnabledExtensionNames list must also be present in that list. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateInstance-ppEnabledExtensionNames-01388)"},
- {"VUID-vkCreateMacOSSurfaceMVK-instance-parameter", "instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateMacOSSurfaceMVK-instance-parameter)"},
- {"VUID-vkCreateMacOSSurfaceMVK-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateMacOSSurfaceMVK-pAllocator-parameter)"},
- {"VUID-vkCreateMacOSSurfaceMVK-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkMacOSSurfaceCreateInfoMVK structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateMacOSSurfaceMVK-pCreateInfo-parameter)"},
- {"VUID-vkCreateMacOSSurfaceMVK-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateMacOSSurfaceMVK-pSurface-parameter)"},
- {"VUID-vkCreateMetalSurfaceEXT-instance-parameter", "instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateMetalSurfaceEXT-instance-parameter)"},
- {"VUID-vkCreateMetalSurfaceEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateMetalSurfaceEXT-pAllocator-parameter)"},
- {"VUID-vkCreateMetalSurfaceEXT-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkMetalSurfaceCreateInfoEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateMetalSurfaceEXT-pCreateInfo-parameter)"},
- {"VUID-vkCreateMetalSurfaceEXT-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateMetalSurfaceEXT-pSurface-parameter)"},
- {"VUID-vkCreatePipelineCache-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreatePipelineCache-device-parameter)"},
- {"VUID-vkCreatePipelineCache-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreatePipelineCache-pAllocator-parameter)"},
- {"VUID-vkCreatePipelineCache-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkPipelineCacheCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreatePipelineCache-pCreateInfo-parameter)"},
- {"VUID-vkCreatePipelineCache-pPipelineCache-parameter", "pPipelineCache must be a valid pointer to a VkPipelineCache handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreatePipelineCache-pPipelineCache-parameter)"},
- {"VUID-vkCreatePipelineLayout-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreatePipelineLayout-device-parameter)"},
- {"VUID-vkCreatePipelineLayout-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreatePipelineLayout-pAllocator-parameter)"},
- {"VUID-vkCreatePipelineLayout-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkPipelineLayoutCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreatePipelineLayout-pCreateInfo-parameter)"},
- {"VUID-vkCreatePipelineLayout-pPipelineLayout-parameter", "pPipelineLayout must be a valid pointer to a VkPipelineLayout handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreatePipelineLayout-pPipelineLayout-parameter)"},
- {"VUID-vkCreateQueryPool-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateQueryPool-device-parameter)"},
- {"VUID-vkCreateQueryPool-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateQueryPool-pAllocator-parameter)"},
- {"VUID-vkCreateQueryPool-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkQueryPoolCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateQueryPool-pCreateInfo-parameter)"},
- {"VUID-vkCreateQueryPool-pQueryPool-parameter", "pQueryPool must be a valid pointer to a VkQueryPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateQueryPool-pQueryPool-parameter)"},
- {"VUID-vkCreateRayTracingPipelinesKHR-createInfoCount-arraylength", "createInfoCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRayTracingPipelinesKHR-createInfoCount-arraylength)"},
- {"VUID-vkCreateRayTracingPipelinesKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRayTracingPipelinesKHR-device-parameter)"},
- {"VUID-vkCreateRayTracingPipelinesKHR-flags-03415", "If the flags member of any element of pCreateInfos contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and the basePipelineIndex member of that same element is not -1, basePipelineIndex must be less than the index into pCreateInfos that corresponds to that element (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRayTracingPipelinesKHR-flags-03415)"},
- {"VUID-vkCreateRayTracingPipelinesKHR-flags-03416", "If the flags member of any element of pCreateInfos contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, the base pipeline must have been created with the VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT flag set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRayTracingPipelinesKHR-flags-03416)"},
- {"VUID-vkCreateRayTracingPipelinesKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRayTracingPipelinesKHR-pAllocator-parameter)"},
- {"VUID-vkCreateRayTracingPipelinesKHR-pCreateInfos-parameter", "pCreateInfos must be a valid pointer to an array of createInfoCount valid VkRayTracingPipelineCreateInfoKHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRayTracingPipelinesKHR-pCreateInfos-parameter)"},
- {"VUID-vkCreateRayTracingPipelinesKHR-pPipelines-parameter", "pPipelines must be a valid pointer to an array of createInfoCount VkPipeline handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRayTracingPipelinesKHR-pPipelines-parameter)"},
- {"VUID-vkCreateRayTracingPipelinesKHR-pipelineCache-02903", "If pipelineCache was created with VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT, host access to pipelineCache must be externally synchronized. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRayTracingPipelinesKHR-pipelineCache-02903)"},
- {"VUID-vkCreateRayTracingPipelinesKHR-pipelineCache-parameter", "If pipelineCache is not VK_NULL_HANDLE, pipelineCache must be a valid VkPipelineCache handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRayTracingPipelinesKHR-pipelineCache-parameter)"},
- {"VUID-vkCreateRayTracingPipelinesKHR-pipelineCache-parent", "If pipelineCache is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRayTracingPipelinesKHR-pipelineCache-parent)"},
- {"VUID-vkCreateRayTracingPipelinesKHR-rayTracing-03455", "The rayTracing feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRayTracingPipelinesKHR-rayTracing-03455)"},
- {"VUID-vkCreateRayTracingPipelinesNV-createInfoCount-arraylength", "createInfoCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRayTracingPipelinesNV-createInfoCount-arraylength)"},
- {"VUID-vkCreateRayTracingPipelinesNV-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRayTracingPipelinesNV-device-parameter)"},
- {"VUID-vkCreateRayTracingPipelinesNV-flags-03415", "If the flags member of any element of pCreateInfos contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and the basePipelineIndex member of that same element is not -1, basePipelineIndex must be less than the index into pCreateInfos that corresponds to that element (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRayTracingPipelinesNV-flags-03415)"},
- {"VUID-vkCreateRayTracingPipelinesNV-flags-03416", "If the flags member of any element of pCreateInfos contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, the base pipeline must have been created with the VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT flag set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRayTracingPipelinesNV-flags-03416)"},
- {"VUID-vkCreateRayTracingPipelinesNV-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRayTracingPipelinesNV-pAllocator-parameter)"},
- {"VUID-vkCreateRayTracingPipelinesNV-pCreateInfos-parameter", "pCreateInfos must be a valid pointer to an array of createInfoCount valid VkRayTracingPipelineCreateInfoNV structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRayTracingPipelinesNV-pCreateInfos-parameter)"},
- {"VUID-vkCreateRayTracingPipelinesNV-pPipelines-parameter", "pPipelines must be a valid pointer to an array of createInfoCount VkPipeline handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRayTracingPipelinesNV-pPipelines-parameter)"},
- {"VUID-vkCreateRayTracingPipelinesNV-pipelineCache-02903", "If pipelineCache was created with VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT, host access to pipelineCache must be externally synchronized. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRayTracingPipelinesNV-pipelineCache-02903)"},
- {"VUID-vkCreateRayTracingPipelinesNV-pipelineCache-parameter", "If pipelineCache is not VK_NULL_HANDLE, pipelineCache must be a valid VkPipelineCache handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRayTracingPipelinesNV-pipelineCache-parameter)"},
- {"VUID-vkCreateRayTracingPipelinesNV-pipelineCache-parent", "If pipelineCache is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRayTracingPipelinesNV-pipelineCache-parent)"},
- {"VUID-vkCreateRenderPass-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRenderPass-device-parameter)"},
- {"VUID-vkCreateRenderPass-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRenderPass-pAllocator-parameter)"},
- {"VUID-vkCreateRenderPass-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkRenderPassCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRenderPass-pCreateInfo-parameter)"},
- {"VUID-vkCreateRenderPass-pRenderPass-parameter", "pRenderPass must be a valid pointer to a VkRenderPass handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRenderPass-pRenderPass-parameter)"},
- {"VUID-vkCreateRenderPass2-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRenderPass2-device-parameter)"},
- {"VUID-vkCreateRenderPass2-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRenderPass2-pAllocator-parameter)"},
- {"VUID-vkCreateRenderPass2-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkRenderPassCreateInfo2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRenderPass2-pCreateInfo-parameter)"},
- {"VUID-vkCreateRenderPass2-pRenderPass-parameter", "pRenderPass must be a valid pointer to a VkRenderPass handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateRenderPass2-pRenderPass-parameter)"},
- {"VUID-vkCreateSampler-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateSampler-device-parameter)"},
- {"VUID-vkCreateSampler-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateSampler-pAllocator-parameter)"},
- {"VUID-vkCreateSampler-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkSamplerCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateSampler-pCreateInfo-parameter)"},
- {"VUID-vkCreateSampler-pSampler-parameter", "pSampler must be a valid pointer to a VkSampler handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateSampler-pSampler-parameter)"},
- {"VUID-vkCreateSamplerYcbcrConversion-None-01648", "The sampler {YCbCr} conversion feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateSamplerYcbcrConversion-None-01648)"},
- {"VUID-vkCreateSamplerYcbcrConversion-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateSamplerYcbcrConversion-device-parameter)"},
- {"VUID-vkCreateSamplerYcbcrConversion-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateSamplerYcbcrConversion-pAllocator-parameter)"},
- {"VUID-vkCreateSamplerYcbcrConversion-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkSamplerYcbcrConversionCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateSamplerYcbcrConversion-pCreateInfo-parameter)"},
- {"VUID-vkCreateSamplerYcbcrConversion-pYcbcrConversion-parameter", "pYcbcrConversion must be a valid pointer to a VkSamplerYcbcrConversion handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateSamplerYcbcrConversion-pYcbcrConversion-parameter)"},
- {"VUID-vkCreateSemaphore-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateSemaphore-device-parameter)"},
- {"VUID-vkCreateSemaphore-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateSemaphore-pAllocator-parameter)"},
- {"VUID-vkCreateSemaphore-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkSemaphoreCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateSemaphore-pCreateInfo-parameter)"},
- {"VUID-vkCreateSemaphore-pSemaphore-parameter", "pSemaphore must be a valid pointer to a VkSemaphore handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateSemaphore-pSemaphore-parameter)"},
- {"VUID-vkCreateShaderModule-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateShaderModule-device-parameter)"},
- {"VUID-vkCreateShaderModule-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateShaderModule-pAllocator-parameter)"},
- {"VUID-vkCreateShaderModule-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkShaderModuleCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateShaderModule-pCreateInfo-parameter)"},
- {"VUID-vkCreateShaderModule-pShaderModule-parameter", "pShaderModule must be a valid pointer to a VkShaderModule handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateShaderModule-pShaderModule-parameter)"},
- {"VUID-vkCreateSharedSwapchainsKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateSharedSwapchainsKHR-device-parameter)"},
- {"VUID-vkCreateSharedSwapchainsKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateSharedSwapchainsKHR-pAllocator-parameter)"},
- {"VUID-vkCreateSharedSwapchainsKHR-pCreateInfos-parameter", "pCreateInfos must be a valid pointer to an array of swapchainCount valid VkSwapchainCreateInfoKHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateSharedSwapchainsKHR-pCreateInfos-parameter)"},
- {"VUID-vkCreateSharedSwapchainsKHR-pSwapchains-parameter", "pSwapchains must be a valid pointer to an array of swapchainCount VkSwapchainKHR handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateSharedSwapchainsKHR-pSwapchains-parameter)"},
- {"VUID-vkCreateSharedSwapchainsKHR-swapchainCount-arraylength", "swapchainCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateSharedSwapchainsKHR-swapchainCount-arraylength)"},
- {"VUID-vkCreateStreamDescriptorSurfaceGGP-instance-parameter", "instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateStreamDescriptorSurfaceGGP-instance-parameter)"},
- {"VUID-vkCreateStreamDescriptorSurfaceGGP-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateStreamDescriptorSurfaceGGP-pAllocator-parameter)"},
- {"VUID-vkCreateStreamDescriptorSurfaceGGP-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkStreamDescriptorSurfaceCreateInfoGGP structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateStreamDescriptorSurfaceGGP-pCreateInfo-parameter)"},
- {"VUID-vkCreateStreamDescriptorSurfaceGGP-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateStreamDescriptorSurfaceGGP-pSurface-parameter)"},
- {"VUID-vkCreateSwapchainKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateSwapchainKHR-device-parameter)"},
- {"VUID-vkCreateSwapchainKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateSwapchainKHR-pAllocator-parameter)"},
- {"VUID-vkCreateSwapchainKHR-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkSwapchainCreateInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateSwapchainKHR-pCreateInfo-parameter)"},
- {"VUID-vkCreateSwapchainKHR-pSwapchain-parameter", "pSwapchain must be a valid pointer to a VkSwapchainKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateSwapchainKHR-pSwapchain-parameter)"},
- {"VUID-vkCreateValidationCacheEXT-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateValidationCacheEXT-device-parameter)"},
- {"VUID-vkCreateValidationCacheEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateValidationCacheEXT-pAllocator-parameter)"},
- {"VUID-vkCreateValidationCacheEXT-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkValidationCacheCreateInfoEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateValidationCacheEXT-pCreateInfo-parameter)"},
- {"VUID-vkCreateValidationCacheEXT-pValidationCache-parameter", "pValidationCache must be a valid pointer to a VkValidationCacheEXT handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateValidationCacheEXT-pValidationCache-parameter)"},
- {"VUID-vkCreateViSurfaceNN-instance-parameter", "instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateViSurfaceNN-instance-parameter)"},
- {"VUID-vkCreateViSurfaceNN-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateViSurfaceNN-pAllocator-parameter)"},
- {"VUID-vkCreateViSurfaceNN-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkViSurfaceCreateInfoNN structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateViSurfaceNN-pCreateInfo-parameter)"},
- {"VUID-vkCreateViSurfaceNN-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateViSurfaceNN-pSurface-parameter)"},
- {"VUID-vkCreateWaylandSurfaceKHR-instance-parameter", "instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateWaylandSurfaceKHR-instance-parameter)"},
- {"VUID-vkCreateWaylandSurfaceKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateWaylandSurfaceKHR-pAllocator-parameter)"},
- {"VUID-vkCreateWaylandSurfaceKHR-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkWaylandSurfaceCreateInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateWaylandSurfaceKHR-pCreateInfo-parameter)"},
- {"VUID-vkCreateWaylandSurfaceKHR-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateWaylandSurfaceKHR-pSurface-parameter)"},
- {"VUID-vkCreateWin32SurfaceKHR-instance-parameter", "instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateWin32SurfaceKHR-instance-parameter)"},
- {"VUID-vkCreateWin32SurfaceKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateWin32SurfaceKHR-pAllocator-parameter)"},
- {"VUID-vkCreateWin32SurfaceKHR-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkWin32SurfaceCreateInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateWin32SurfaceKHR-pCreateInfo-parameter)"},
- {"VUID-vkCreateWin32SurfaceKHR-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateWin32SurfaceKHR-pSurface-parameter)"},
- {"VUID-vkCreateXcbSurfaceKHR-instance-parameter", "instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateXcbSurfaceKHR-instance-parameter)"},
- {"VUID-vkCreateXcbSurfaceKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateXcbSurfaceKHR-pAllocator-parameter)"},
- {"VUID-vkCreateXcbSurfaceKHR-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkXcbSurfaceCreateInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateXcbSurfaceKHR-pCreateInfo-parameter)"},
- {"VUID-vkCreateXcbSurfaceKHR-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateXcbSurfaceKHR-pSurface-parameter)"},
- {"VUID-vkCreateXlibSurfaceKHR-instance-parameter", "instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateXlibSurfaceKHR-instance-parameter)"},
- {"VUID-vkCreateXlibSurfaceKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateXlibSurfaceKHR-pAllocator-parameter)"},
- {"VUID-vkCreateXlibSurfaceKHR-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkXlibSurfaceCreateInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateXlibSurfaceKHR-pCreateInfo-parameter)"},
- {"VUID-vkCreateXlibSurfaceKHR-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkCreateXlibSurfaceKHR-pSurface-parameter)"},
- {"VUID-vkDebugMarkerSetObjectNameEXT-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDebugMarkerSetObjectNameEXT-device-parameter)"},
- {"VUID-vkDebugMarkerSetObjectNameEXT-pNameInfo-parameter", "pNameInfo must be a valid pointer to a valid VkDebugMarkerObjectNameInfoEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDebugMarkerSetObjectNameEXT-pNameInfo-parameter)"},
- {"VUID-vkDebugMarkerSetObjectTagEXT-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDebugMarkerSetObjectTagEXT-device-parameter)"},
- {"VUID-vkDebugMarkerSetObjectTagEXT-pTagInfo-parameter", "pTagInfo must be a valid pointer to a valid VkDebugMarkerObjectTagInfoEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDebugMarkerSetObjectTagEXT-pTagInfo-parameter)"},
- {"VUID-vkDebugReportMessageEXT-flags-parameter", "flags must be a valid combination of VkDebugReportFlagBitsEXT values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDebugReportMessageEXT-flags-parameter)"},
- {"VUID-vkDebugReportMessageEXT-flags-requiredbitmask", "flags must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDebugReportMessageEXT-flags-requiredbitmask)"},
- {"VUID-vkDebugReportMessageEXT-instance-parameter", "instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDebugReportMessageEXT-instance-parameter)"},
- {"VUID-vkDebugReportMessageEXT-object-01241", "object must be a Vulkan object or VK_NULL_HANDLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDebugReportMessageEXT-object-01241)"},
- {"VUID-vkDebugReportMessageEXT-objectType-01498", "If objectType is not VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT and object is not VK_NULL_HANDLE, object must be a Vulkan object of the corresponding type associated with objectType as defined in VkDebugReportObjectTypeEXT and Vulkan Handle Relationship. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDebugReportMessageEXT-objectType-01498)"},
- {"VUID-vkDebugReportMessageEXT-objectType-parameter", "objectType must be a valid VkDebugReportObjectTypeEXT value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDebugReportMessageEXT-objectType-parameter)"},
- {"VUID-vkDebugReportMessageEXT-pLayerPrefix-parameter", "pLayerPrefix must be a null-terminated UTF-8 string (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDebugReportMessageEXT-pLayerPrefix-parameter)"},
- {"VUID-vkDebugReportMessageEXT-pMessage-parameter", "pMessage must be a null-terminated UTF-8 string (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDebugReportMessageEXT-pMessage-parameter)"},
- {"VUID-vkDeferredOperationJoinKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDeferredOperationJoinKHR-device-parameter)"},
- {"VUID-vkDeferredOperationJoinKHR-operation-parameter", "operation must be a valid VkDeferredOperationKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDeferredOperationJoinKHR-operation-parameter)"},
- {"VUID-vkDeferredOperationJoinKHR-operation-parent", "operation must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDeferredOperationJoinKHR-operation-parent)"},
- {"VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-02442", "All submitted commands that refer to accelerationStructure must have completed execution (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-02442)"},
- {"VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-02443", "If VkAllocationCallbacks were provided when accelerationStructure was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-02443)"},
- {"VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-02444", "If no VkAllocationCallbacks were provided when accelerationStructure was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-02444)"},
- {"VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-parameter", "accelerationStructure must be a valid VkAccelerationStructureKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-parameter)"},
- {"VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-parent", "accelerationStructure must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-parent)"},
- {"VUID-vkDestroyAccelerationStructureKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyAccelerationStructureKHR-device-parameter)"},
- {"VUID-vkDestroyAccelerationStructureKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyAccelerationStructureKHR-pAllocator-parameter)"},
- {"VUID-vkDestroyBuffer-buffer-00922", "All submitted commands that refer to buffer, either directly or via a VkBufferView, must have completed execution (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyBuffer-buffer-00922)"},
- {"VUID-vkDestroyBuffer-buffer-00923", "If VkAllocationCallbacks were provided when buffer was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyBuffer-buffer-00923)"},
- {"VUID-vkDestroyBuffer-buffer-00924", "If no VkAllocationCallbacks were provided when buffer was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyBuffer-buffer-00924)"},
- {"VUID-vkDestroyBuffer-buffer-parameter", "If buffer is not VK_NULL_HANDLE, buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyBuffer-buffer-parameter)"},
- {"VUID-vkDestroyBuffer-buffer-parent", "If buffer is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyBuffer-buffer-parent)"},
- {"VUID-vkDestroyBuffer-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyBuffer-device-parameter)"},
- {"VUID-vkDestroyBuffer-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyBuffer-pAllocator-parameter)"},
- {"VUID-vkDestroyBufferView-bufferView-00936", "All submitted commands that refer to bufferView must have completed execution (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyBufferView-bufferView-00936)"},
- {"VUID-vkDestroyBufferView-bufferView-00937", "If VkAllocationCallbacks were provided when bufferView was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyBufferView-bufferView-00937)"},
- {"VUID-vkDestroyBufferView-bufferView-00938", "If no VkAllocationCallbacks were provided when bufferView was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyBufferView-bufferView-00938)"},
- {"VUID-vkDestroyBufferView-bufferView-parameter", "If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyBufferView-bufferView-parameter)"},
- {"VUID-vkDestroyBufferView-bufferView-parent", "If bufferView is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyBufferView-bufferView-parent)"},
- {"VUID-vkDestroyBufferView-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyBufferView-device-parameter)"},
- {"VUID-vkDestroyBufferView-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyBufferView-pAllocator-parameter)"},
- {"VUID-vkDestroyCommandPool-commandPool-00041", "All VkCommandBuffer objects allocated from commandPool must not be in the pending state. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyCommandPool-commandPool-00041)"},
- {"VUID-vkDestroyCommandPool-commandPool-00042", "If VkAllocationCallbacks were provided when commandPool was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyCommandPool-commandPool-00042)"},
- {"VUID-vkDestroyCommandPool-commandPool-00043", "If no VkAllocationCallbacks were provided when commandPool was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyCommandPool-commandPool-00043)"},
- {"VUID-vkDestroyCommandPool-commandPool-parameter", "If commandPool is not VK_NULL_HANDLE, commandPool must be a valid VkCommandPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyCommandPool-commandPool-parameter)"},
- {"VUID-vkDestroyCommandPool-commandPool-parent", "If commandPool is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyCommandPool-commandPool-parent)"},
- {"VUID-vkDestroyCommandPool-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyCommandPool-device-parameter)"},
- {"VUID-vkDestroyCommandPool-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyCommandPool-pAllocator-parameter)"},
- {"VUID-vkDestroyDebugReportCallbackEXT-callback-parameter", "callback must be a valid VkDebugReportCallbackEXT handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDebugReportCallbackEXT-callback-parameter)"},
- {"VUID-vkDestroyDebugReportCallbackEXT-callback-parent", "callback must have been created, allocated, or retrieved from instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDebugReportCallbackEXT-callback-parent)"},
- {"VUID-vkDestroyDebugReportCallbackEXT-instance-01242", "If VkAllocationCallbacks were provided when callback was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDebugReportCallbackEXT-instance-01242)"},
- {"VUID-vkDestroyDebugReportCallbackEXT-instance-01243", "If no VkAllocationCallbacks were provided when callback was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDebugReportCallbackEXT-instance-01243)"},
- {"VUID-vkDestroyDebugReportCallbackEXT-instance-parameter", "instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDebugReportCallbackEXT-instance-parameter)"},
- {"VUID-vkDestroyDebugReportCallbackEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDebugReportCallbackEXT-pAllocator-parameter)"},
- {"VUID-vkDestroyDebugUtilsMessengerEXT-instance-parameter", "instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDebugUtilsMessengerEXT-instance-parameter)"},
- {"VUID-vkDestroyDebugUtilsMessengerEXT-messenger-01915", "If VkAllocationCallbacks were provided when messenger was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDebugUtilsMessengerEXT-messenger-01915)"},
- {"VUID-vkDestroyDebugUtilsMessengerEXT-messenger-01916", "If no VkAllocationCallbacks were provided when messenger was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDebugUtilsMessengerEXT-messenger-01916)"},
- {"VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parameter", "messenger must be a valid VkDebugUtilsMessengerEXT handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parameter)"},
- {"VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parent", "messenger must have been created, allocated, or retrieved from instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parent)"},
- {"VUID-vkDestroyDebugUtilsMessengerEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDebugUtilsMessengerEXT-pAllocator-parameter)"},
- {"VUID-vkDestroyDeferredOperationKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDeferredOperationKHR-device-parameter)"},
- {"VUID-vkDestroyDeferredOperationKHR-operation-03434", "If VkAllocationCallbacks were provided when operation was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDeferredOperationKHR-operation-03434)"},
- {"VUID-vkDestroyDeferredOperationKHR-operation-03435", "If no VkAllocationCallbacks were provided when operation was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDeferredOperationKHR-operation-03435)"},
- {"VUID-vkDestroyDeferredOperationKHR-operation-03436", "operation must be completed (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDeferredOperationKHR-operation-03436)"},
- {"VUID-vkDestroyDeferredOperationKHR-operation-parameter", "operation must be a valid VkDeferredOperationKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDeferredOperationKHR-operation-parameter)"},
- {"VUID-vkDestroyDeferredOperationKHR-operation-parent", "operation must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDeferredOperationKHR-operation-parent)"},
- {"VUID-vkDestroyDeferredOperationKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDeferredOperationKHR-pAllocator-parameter)"},
- {"VUID-vkDestroyDescriptorPool-descriptorPool-00303", "All submitted commands that refer to descriptorPool (via any allocated descriptor sets) must have completed execution (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDescriptorPool-descriptorPool-00303)"},
- {"VUID-vkDestroyDescriptorPool-descriptorPool-00304", "If VkAllocationCallbacks were provided when descriptorPool was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDescriptorPool-descriptorPool-00304)"},
- {"VUID-vkDestroyDescriptorPool-descriptorPool-00305", "If no VkAllocationCallbacks were provided when descriptorPool was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDescriptorPool-descriptorPool-00305)"},
- {"VUID-vkDestroyDescriptorPool-descriptorPool-parameter", "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDescriptorPool-descriptorPool-parameter)"},
- {"VUID-vkDestroyDescriptorPool-descriptorPool-parent", "If descriptorPool is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDescriptorPool-descriptorPool-parent)"},
- {"VUID-vkDestroyDescriptorPool-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDescriptorPool-device-parameter)"},
- {"VUID-vkDestroyDescriptorPool-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDescriptorPool-pAllocator-parameter)"},
- {"VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-00284", "If VkAllocationCallbacks were provided when descriptorSetLayout was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-00284)"},
- {"VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-00285", "If no VkAllocationCallbacks were provided when descriptorSetLayout was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-00285)"},
- {"VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-parameter", "If descriptorSetLayout is not VK_NULL_HANDLE, descriptorSetLayout must be a valid VkDescriptorSetLayout handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-parameter)"},
- {"VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-parent", "If descriptorSetLayout is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-parent)"},
- {"VUID-vkDestroyDescriptorSetLayout-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDescriptorSetLayout-device-parameter)"},
- {"VUID-vkDestroyDescriptorSetLayout-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDescriptorSetLayout-pAllocator-parameter)"},
- {"VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00356", "If VkAllocationCallbacks were provided when descriptorSetLayout was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00356)"},
- {"VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00357", "If no VkAllocationCallbacks were provided when descriptorSetLayout was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00357)"},
- {"VUID-vkDestroyDescriptorUpdateTemplate-descriptorUpdateTemplate-parameter", "If descriptorUpdateTemplate is not VK_NULL_HANDLE, descriptorUpdateTemplate must be a valid VkDescriptorUpdateTemplate handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDescriptorUpdateTemplate-descriptorUpdateTemplate-parameter)"},
- {"VUID-vkDestroyDescriptorUpdateTemplate-descriptorUpdateTemplate-parent", "If descriptorUpdateTemplate is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDescriptorUpdateTemplate-descriptorUpdateTemplate-parent)"},
- {"VUID-vkDestroyDescriptorUpdateTemplate-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDescriptorUpdateTemplate-device-parameter)"},
- {"VUID-vkDestroyDescriptorUpdateTemplate-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDescriptorUpdateTemplate-pAllocator-parameter)"},
- {"VUID-vkDestroyDevice-device-00378", "All child objects created on device must have been destroyed prior to destroying device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDevice-device-00378)"},
- {"VUID-vkDestroyDevice-device-00379", "If VkAllocationCallbacks were provided when device was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDevice-device-00379)"},
- {"VUID-vkDestroyDevice-device-00380", "If no VkAllocationCallbacks were provided when device was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDevice-device-00380)"},
- {"VUID-vkDestroyDevice-device-parameter", "If device is not NULL, device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDevice-device-parameter)"},
- {"VUID-vkDestroyDevice-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyDevice-pAllocator-parameter)"},
- {"VUID-vkDestroyEvent-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyEvent-device-parameter)"},
- {"VUID-vkDestroyEvent-event-01145", "All submitted commands that refer to event must have completed execution (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyEvent-event-01145)"},
- {"VUID-vkDestroyEvent-event-01146", "If VkAllocationCallbacks were provided when event was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyEvent-event-01146)"},
- {"VUID-vkDestroyEvent-event-01147", "If no VkAllocationCallbacks were provided when event was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyEvent-event-01147)"},
- {"VUID-vkDestroyEvent-event-parameter", "If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyEvent-event-parameter)"},
- {"VUID-vkDestroyEvent-event-parent", "If event is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyEvent-event-parent)"},
- {"VUID-vkDestroyEvent-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyEvent-pAllocator-parameter)"},
- {"VUID-vkDestroyFence-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyFence-device-parameter)"},
- {"VUID-vkDestroyFence-fence-01120", "All queue submission commands that refer to fence must have completed execution (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyFence-fence-01120)"},
- {"VUID-vkDestroyFence-fence-01121", "If VkAllocationCallbacks were provided when fence was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyFence-fence-01121)"},
- {"VUID-vkDestroyFence-fence-01122", "If no VkAllocationCallbacks were provided when fence was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyFence-fence-01122)"},
- {"VUID-vkDestroyFence-fence-parameter", "If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyFence-fence-parameter)"},
- {"VUID-vkDestroyFence-fence-parent", "If fence is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyFence-fence-parent)"},
- {"VUID-vkDestroyFence-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyFence-pAllocator-parameter)"},
- {"VUID-vkDestroyFramebuffer-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyFramebuffer-device-parameter)"},
- {"VUID-vkDestroyFramebuffer-framebuffer-00892", "All submitted commands that refer to framebuffer must have completed execution (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyFramebuffer-framebuffer-00892)"},
- {"VUID-vkDestroyFramebuffer-framebuffer-00893", "If VkAllocationCallbacks were provided when framebuffer was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyFramebuffer-framebuffer-00893)"},
- {"VUID-vkDestroyFramebuffer-framebuffer-00894", "If no VkAllocationCallbacks were provided when framebuffer was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyFramebuffer-framebuffer-00894)"},
- {"VUID-vkDestroyFramebuffer-framebuffer-parameter", "If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyFramebuffer-framebuffer-parameter)"},
- {"VUID-vkDestroyFramebuffer-framebuffer-parent", "If framebuffer is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyFramebuffer-framebuffer-parent)"},
- {"VUID-vkDestroyFramebuffer-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyFramebuffer-pAllocator-parameter)"},
- {"VUID-vkDestroyImage-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyImage-device-parameter)"},
- {"VUID-vkDestroyImage-image-01000", "All submitted commands that refer to image, either directly or via a VkImageView, must have completed execution (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyImage-image-01000)"},
- {"VUID-vkDestroyImage-image-01001", "If VkAllocationCallbacks were provided when image was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyImage-image-01001)"},
- {"VUID-vkDestroyImage-image-01002", "If no VkAllocationCallbacks were provided when image was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyImage-image-01002)"},
- {"VUID-vkDestroyImage-image-parameter", "If image is not VK_NULL_HANDLE, image must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyImage-image-parameter)"},
- {"VUID-vkDestroyImage-image-parent", "If image is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyImage-image-parent)"},
- {"VUID-vkDestroyImage-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyImage-pAllocator-parameter)"},
- {"VUID-vkDestroyImageView-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyImageView-device-parameter)"},
- {"VUID-vkDestroyImageView-imageView-01026", "All submitted commands that refer to imageView must have completed execution (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyImageView-imageView-01026)"},
- {"VUID-vkDestroyImageView-imageView-01027", "If VkAllocationCallbacks were provided when imageView was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyImageView-imageView-01027)"},
- {"VUID-vkDestroyImageView-imageView-01028", "If no VkAllocationCallbacks were provided when imageView was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyImageView-imageView-01028)"},
- {"VUID-vkDestroyImageView-imageView-parameter", "If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyImageView-imageView-parameter)"},
- {"VUID-vkDestroyImageView-imageView-parent", "If imageView is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyImageView-imageView-parent)"},
- {"VUID-vkDestroyImageView-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyImageView-pAllocator-parameter)"},
- {"VUID-vkDestroyIndirectCommandsLayoutNV-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyIndirectCommandsLayoutNV-device-parameter)"},
- {"VUID-vkDestroyIndirectCommandsLayoutNV-deviceGeneratedCommands-02941", "The VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV->deviceGeneratedCommands feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyIndirectCommandsLayoutNV-deviceGeneratedCommands-02941)"},
- {"VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-02938", "All submitted commands that refer to indirectCommandsLayout must have completed execution (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-02938)"},
- {"VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-02939", "If VkAllocationCallbacks were provided when indirectCommandsLayout was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-02939)"},
- {"VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-02940", "If no VkAllocationCallbacks were provided when indirectCommandsLayout was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-02940)"},
- {"VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-parameter", "indirectCommandsLayout must be a valid VkIndirectCommandsLayoutNV handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-parameter)"},
- {"VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-parent", "indirectCommandsLayout must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-parent)"},
- {"VUID-vkDestroyIndirectCommandsLayoutNV-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyIndirectCommandsLayoutNV-pAllocator-parameter)"},
- {"VUID-vkDestroyInstance-instance-00629", "All child objects created using instance must have been destroyed prior to destroying instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyInstance-instance-00629)"},
- {"VUID-vkDestroyInstance-instance-00630", "If VkAllocationCallbacks were provided when instance was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyInstance-instance-00630)"},
- {"VUID-vkDestroyInstance-instance-00631", "If no VkAllocationCallbacks were provided when instance was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyInstance-instance-00631)"},
- {"VUID-vkDestroyInstance-instance-parameter", "If instance is not NULL, instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyInstance-instance-parameter)"},
- {"VUID-vkDestroyInstance-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyInstance-pAllocator-parameter)"},
- {"VUID-vkDestroyPipeline-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyPipeline-device-parameter)"},
- {"VUID-vkDestroyPipeline-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyPipeline-pAllocator-parameter)"},
- {"VUID-vkDestroyPipeline-pipeline-00765", "All submitted commands that refer to pipeline must have completed execution (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyPipeline-pipeline-00765)"},
- {"VUID-vkDestroyPipeline-pipeline-00766", "If VkAllocationCallbacks were provided when pipeline was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyPipeline-pipeline-00766)"},
- {"VUID-vkDestroyPipeline-pipeline-00767", "If no VkAllocationCallbacks were provided when pipeline was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyPipeline-pipeline-00767)"},
- {"VUID-vkDestroyPipeline-pipeline-parameter", "If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyPipeline-pipeline-parameter)"},
- {"VUID-vkDestroyPipeline-pipeline-parent", "If pipeline is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyPipeline-pipeline-parent)"},
- {"VUID-vkDestroyPipelineCache-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyPipelineCache-device-parameter)"},
- {"VUID-vkDestroyPipelineCache-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyPipelineCache-pAllocator-parameter)"},
- {"VUID-vkDestroyPipelineCache-pipelineCache-00771", "If VkAllocationCallbacks were provided when pipelineCache was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyPipelineCache-pipelineCache-00771)"},
- {"VUID-vkDestroyPipelineCache-pipelineCache-00772", "If no VkAllocationCallbacks were provided when pipelineCache was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyPipelineCache-pipelineCache-00772)"},
- {"VUID-vkDestroyPipelineCache-pipelineCache-parameter", "If pipelineCache is not VK_NULL_HANDLE, pipelineCache must be a valid VkPipelineCache handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyPipelineCache-pipelineCache-parameter)"},
- {"VUID-vkDestroyPipelineCache-pipelineCache-parent", "If pipelineCache is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyPipelineCache-pipelineCache-parent)"},
- {"VUID-vkDestroyPipelineLayout-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyPipelineLayout-device-parameter)"},
- {"VUID-vkDestroyPipelineLayout-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyPipelineLayout-pAllocator-parameter)"},
- {"VUID-vkDestroyPipelineLayout-pipelineLayout-00299", "If VkAllocationCallbacks were provided when pipelineLayout was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyPipelineLayout-pipelineLayout-00299)"},
- {"VUID-vkDestroyPipelineLayout-pipelineLayout-00300", "If no VkAllocationCallbacks were provided when pipelineLayout was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyPipelineLayout-pipelineLayout-00300)"},
- {"VUID-vkDestroyPipelineLayout-pipelineLayout-02004", "pipelineLayout must not have been passed to any vkCmd* command for any command buffers that are still in the recording state when vkDestroyPipelineLayout is called (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyPipelineLayout-pipelineLayout-02004)"},
- {"VUID-vkDestroyPipelineLayout-pipelineLayout-parameter", "If pipelineLayout is not VK_NULL_HANDLE, pipelineLayout must be a valid VkPipelineLayout handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyPipelineLayout-pipelineLayout-parameter)"},
- {"VUID-vkDestroyPipelineLayout-pipelineLayout-parent", "If pipelineLayout is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyPipelineLayout-pipelineLayout-parent)"},
- {"VUID-vkDestroyQueryPool-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyQueryPool-device-parameter)"},
- {"VUID-vkDestroyQueryPool-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyQueryPool-pAllocator-parameter)"},
- {"VUID-vkDestroyQueryPool-queryPool-00793", "All submitted commands that refer to queryPool must have completed execution (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyQueryPool-queryPool-00793)"},
- {"VUID-vkDestroyQueryPool-queryPool-00794", "If VkAllocationCallbacks were provided when queryPool was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyQueryPool-queryPool-00794)"},
- {"VUID-vkDestroyQueryPool-queryPool-00795", "If no VkAllocationCallbacks were provided when queryPool was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyQueryPool-queryPool-00795)"},
- {"VUID-vkDestroyQueryPool-queryPool-parameter", "If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyQueryPool-queryPool-parameter)"},
- {"VUID-vkDestroyQueryPool-queryPool-parent", "If queryPool is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyQueryPool-queryPool-parent)"},
- {"VUID-vkDestroyRenderPass-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyRenderPass-device-parameter)"},
- {"VUID-vkDestroyRenderPass-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyRenderPass-pAllocator-parameter)"},
- {"VUID-vkDestroyRenderPass-renderPass-00873", "All submitted commands that refer to renderPass must have completed execution (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyRenderPass-renderPass-00873)"},
- {"VUID-vkDestroyRenderPass-renderPass-00874", "If VkAllocationCallbacks were provided when renderPass was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyRenderPass-renderPass-00874)"},
- {"VUID-vkDestroyRenderPass-renderPass-00875", "If no VkAllocationCallbacks were provided when renderPass was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyRenderPass-renderPass-00875)"},
- {"VUID-vkDestroyRenderPass-renderPass-parameter", "If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyRenderPass-renderPass-parameter)"},
- {"VUID-vkDestroyRenderPass-renderPass-parent", "If renderPass is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyRenderPass-renderPass-parent)"},
- {"VUID-vkDestroySampler-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySampler-device-parameter)"},
- {"VUID-vkDestroySampler-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySampler-pAllocator-parameter)"},
- {"VUID-vkDestroySampler-sampler-01082", "All submitted commands that refer to sampler must have completed execution (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySampler-sampler-01082)"},
- {"VUID-vkDestroySampler-sampler-01083", "If VkAllocationCallbacks were provided when sampler was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySampler-sampler-01083)"},
- {"VUID-vkDestroySampler-sampler-01084", "If no VkAllocationCallbacks were provided when sampler was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySampler-sampler-01084)"},
- {"VUID-vkDestroySampler-sampler-parameter", "If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySampler-sampler-parameter)"},
- {"VUID-vkDestroySampler-sampler-parent", "If sampler is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySampler-sampler-parent)"},
- {"VUID-vkDestroySamplerYcbcrConversion-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySamplerYcbcrConversion-device-parameter)"},
- {"VUID-vkDestroySamplerYcbcrConversion-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySamplerYcbcrConversion-pAllocator-parameter)"},
- {"VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parameter", "If ycbcrConversion is not VK_NULL_HANDLE, ycbcrConversion must be a valid VkSamplerYcbcrConversion handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parameter)"},
- {"VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parent", "If ycbcrConversion is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parent)"},
- {"VUID-vkDestroySemaphore-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySemaphore-device-parameter)"},
- {"VUID-vkDestroySemaphore-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySemaphore-pAllocator-parameter)"},
- {"VUID-vkDestroySemaphore-semaphore-01137", "All submitted batches that refer to semaphore must have completed execution (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySemaphore-semaphore-01137)"},
- {"VUID-vkDestroySemaphore-semaphore-01138", "If VkAllocationCallbacks were provided when semaphore was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySemaphore-semaphore-01138)"},
- {"VUID-vkDestroySemaphore-semaphore-01139", "If no VkAllocationCallbacks were provided when semaphore was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySemaphore-semaphore-01139)"},
- {"VUID-vkDestroySemaphore-semaphore-parameter", "If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySemaphore-semaphore-parameter)"},
- {"VUID-vkDestroySemaphore-semaphore-parent", "If semaphore is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySemaphore-semaphore-parent)"},
- {"VUID-vkDestroyShaderModule-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyShaderModule-device-parameter)"},
- {"VUID-vkDestroyShaderModule-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyShaderModule-pAllocator-parameter)"},
- {"VUID-vkDestroyShaderModule-shaderModule-01092", "If VkAllocationCallbacks were provided when shaderModule was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyShaderModule-shaderModule-01092)"},
- {"VUID-vkDestroyShaderModule-shaderModule-01093", "If no VkAllocationCallbacks were provided when shaderModule was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyShaderModule-shaderModule-01093)"},
- {"VUID-vkDestroyShaderModule-shaderModule-parameter", "If shaderModule is not VK_NULL_HANDLE, shaderModule must be a valid VkShaderModule handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyShaderModule-shaderModule-parameter)"},
- {"VUID-vkDestroyShaderModule-shaderModule-parent", "If shaderModule is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyShaderModule-shaderModule-parent)"},
- {"VUID-vkDestroySurfaceKHR-instance-parameter", "instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySurfaceKHR-instance-parameter)"},
- {"VUID-vkDestroySurfaceKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySurfaceKHR-pAllocator-parameter)"},
- {"VUID-vkDestroySurfaceKHR-surface-01266", "All VkSwapchainKHR objects created for surface must have been destroyed prior to destroying surface (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySurfaceKHR-surface-01266)"},
- {"VUID-vkDestroySurfaceKHR-surface-01267", "If VkAllocationCallbacks were provided when surface was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySurfaceKHR-surface-01267)"},
- {"VUID-vkDestroySurfaceKHR-surface-01268", "If no VkAllocationCallbacks were provided when surface was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySurfaceKHR-surface-01268)"},
- {"VUID-vkDestroySurfaceKHR-surface-parameter", "If surface is not VK_NULL_HANDLE, surface must be a valid VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySurfaceKHR-surface-parameter)"},
- {"VUID-vkDestroySurfaceKHR-surface-parent", "If surface is a valid handle, it must have been created, allocated, or retrieved from instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySurfaceKHR-surface-parent)"},
- {"VUID-vkDestroySwapchainKHR-commonparent", "Both of device, and swapchain that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkInstance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySwapchainKHR-commonparent)"},
- {"VUID-vkDestroySwapchainKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySwapchainKHR-device-parameter)"},
- {"VUID-vkDestroySwapchainKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySwapchainKHR-pAllocator-parameter)"},
- {"VUID-vkDestroySwapchainKHR-swapchain-01282", "All uses of presentable images acquired from swapchain must have completed execution (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySwapchainKHR-swapchain-01282)"},
- {"VUID-vkDestroySwapchainKHR-swapchain-01283", "If VkAllocationCallbacks were provided when swapchain was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySwapchainKHR-swapchain-01283)"},
- {"VUID-vkDestroySwapchainKHR-swapchain-01284", "If no VkAllocationCallbacks were provided when swapchain was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySwapchainKHR-swapchain-01284)"},
- {"VUID-vkDestroySwapchainKHR-swapchain-parameter", "If swapchain is not VK_NULL_HANDLE, swapchain must be a valid VkSwapchainKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroySwapchainKHR-swapchain-parameter)"},
- {"VUID-vkDestroyValidationCacheEXT-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyValidationCacheEXT-device-parameter)"},
- {"VUID-vkDestroyValidationCacheEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyValidationCacheEXT-pAllocator-parameter)"},
- {"VUID-vkDestroyValidationCacheEXT-validationCache-01537", "If VkAllocationCallbacks were provided when validationCache was created, a compatible set of callbacks must be provided here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyValidationCacheEXT-validationCache-01537)"},
- {"VUID-vkDestroyValidationCacheEXT-validationCache-01538", "If no VkAllocationCallbacks were provided when validationCache was created, pAllocator must be NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyValidationCacheEXT-validationCache-01538)"},
- {"VUID-vkDestroyValidationCacheEXT-validationCache-parameter", "If validationCache is not VK_NULL_HANDLE, validationCache must be a valid VkValidationCacheEXT handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyValidationCacheEXT-validationCache-parameter)"},
- {"VUID-vkDestroyValidationCacheEXT-validationCache-parent", "If validationCache is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDestroyValidationCacheEXT-validationCache-parent)"},
- {"VUID-vkDeviceWaitIdle-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDeviceWaitIdle-device-parameter)"},
- {"VUID-vkDisplayPowerControlEXT-commonparent", "Both of device, and display must have been created, allocated, or retrieved from the same VkPhysicalDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDisplayPowerControlEXT-commonparent)"},
- {"VUID-vkDisplayPowerControlEXT-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDisplayPowerControlEXT-device-parameter)"},
- {"VUID-vkDisplayPowerControlEXT-display-parameter", "display must be a valid VkDisplayKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDisplayPowerControlEXT-display-parameter)"},
- {"VUID-vkDisplayPowerControlEXT-pDisplayPowerInfo-parameter", "pDisplayPowerInfo must be a valid pointer to a valid VkDisplayPowerInfoEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkDisplayPowerControlEXT-pDisplayPowerInfo-parameter)"},
- {"VUID-vkEndCommandBuffer-None-01978", "Conditional rendering must not be active (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEndCommandBuffer-None-01978)"},
- {"VUID-vkEndCommandBuffer-commandBuffer-00059", "commandBuffer must be in the recording state. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEndCommandBuffer-commandBuffer-00059)"},
- {"VUID-vkEndCommandBuffer-commandBuffer-00060", "If commandBuffer is a primary command buffer, there must not be an active render pass instance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEndCommandBuffer-commandBuffer-00060)"},
- {"VUID-vkEndCommandBuffer-commandBuffer-00061", "All queries made active during the recording of commandBuffer must have been made inactive (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEndCommandBuffer-commandBuffer-00061)"},
- {"VUID-vkEndCommandBuffer-commandBuffer-00062", "If commandBuffer is a secondary command buffer, there must not be an outstanding vkCmdDebugMarkerBeginEXT command recorded to commandBuffer that has not previously been ended by a call to vkCmdDebugMarkerEndEXT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEndCommandBuffer-commandBuffer-00062)"},
- {"VUID-vkEndCommandBuffer-commandBuffer-01815", "If commandBuffer is a secondary command buffer, there must not be an outstanding vkCmdBeginDebugUtilsLabelEXT command recorded to commandBuffer that has not previously been ended by a call to vkCmdEndDebugUtilsLabelEXT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEndCommandBuffer-commandBuffer-01815)"},
- {"VUID-vkEndCommandBuffer-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEndCommandBuffer-commandBuffer-parameter)"},
- {"VUID-vkEnumerateDeviceExtensionProperties-pLayerName-parameter", "If pLayerName is not NULL, pLayerName must be a null-terminated UTF-8 string (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumerateDeviceExtensionProperties-pLayerName-parameter)"},
- {"VUID-vkEnumerateDeviceExtensionProperties-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkExtensionProperties structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumerateDeviceExtensionProperties-pProperties-parameter)"},
- {"VUID-vkEnumerateDeviceExtensionProperties-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumerateDeviceExtensionProperties-pPropertyCount-parameter)"},
- {"VUID-vkEnumerateDeviceExtensionProperties-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumerateDeviceExtensionProperties-physicalDevice-parameter)"},
- {"VUID-vkEnumerateDeviceLayerProperties-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkLayerProperties structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumerateDeviceLayerProperties-pProperties-parameter)"},
- {"VUID-vkEnumerateDeviceLayerProperties-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumerateDeviceLayerProperties-pPropertyCount-parameter)"},
- {"VUID-vkEnumerateDeviceLayerProperties-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumerateDeviceLayerProperties-physicalDevice-parameter)"},
- {"VUID-vkEnumerateInstanceExtensionProperties-pLayerName-parameter", "If pLayerName is not NULL, pLayerName must be a null-terminated UTF-8 string (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumerateInstanceExtensionProperties-pLayerName-parameter)"},
- {"VUID-vkEnumerateInstanceExtensionProperties-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkExtensionProperties structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumerateInstanceExtensionProperties-pProperties-parameter)"},
- {"VUID-vkEnumerateInstanceExtensionProperties-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumerateInstanceExtensionProperties-pPropertyCount-parameter)"},
- {"VUID-vkEnumerateInstanceLayerProperties-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkLayerProperties structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumerateInstanceLayerProperties-pProperties-parameter)"},
- {"VUID-vkEnumerateInstanceLayerProperties-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumerateInstanceLayerProperties-pPropertyCount-parameter)"},
- {"VUID-vkEnumerateInstanceVersion-pApiVersion-parameter", "pApiVersion must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumerateInstanceVersion-pApiVersion-parameter)"},
- {"VUID-vkEnumeratePhysicalDeviceGroups-instance-parameter", "instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumeratePhysicalDeviceGroups-instance-parameter)"},
- {"VUID-vkEnumeratePhysicalDeviceGroups-pPhysicalDeviceGroupCount-parameter", "pPhysicalDeviceGroupCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumeratePhysicalDeviceGroups-pPhysicalDeviceGroupCount-parameter)"},
- {"VUID-vkEnumeratePhysicalDeviceGroups-pPhysicalDeviceGroupProperties-parameter", "If the value referenced by pPhysicalDeviceGroupCount is not 0, and pPhysicalDeviceGroupProperties is not NULL, pPhysicalDeviceGroupProperties must be a valid pointer to an array of pPhysicalDeviceGroupCount VkPhysicalDeviceGroupProperties structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumeratePhysicalDeviceGroups-pPhysicalDeviceGroupProperties-parameter)"},
- {"VUID-vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR-pCounterCount-parameter", "pCounterCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR-pCounterCount-parameter)"},
- {"VUID-vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR-pCounterDescriptions-parameter", "If the value referenced by pCounterCount is not 0, and pCounterDescriptions is not NULL, pCounterDescriptions must be a valid pointer to an array of pCounterCount VkPerformanceCounterDescriptionKHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR-pCounterDescriptions-parameter)"},
- {"VUID-vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR-pCounters-parameter", "If the value referenced by pCounterCount is not 0, and pCounters is not NULL, pCounters must be a valid pointer to an array of pCounterCount VkPerformanceCounterKHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR-pCounters-parameter)"},
- {"VUID-vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR-physicalDevice-parameter)"},
- {"VUID-vkEnumeratePhysicalDevices-instance-parameter", "instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumeratePhysicalDevices-instance-parameter)"},
- {"VUID-vkEnumeratePhysicalDevices-pPhysicalDeviceCount-parameter", "pPhysicalDeviceCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumeratePhysicalDevices-pPhysicalDeviceCount-parameter)"},
- {"VUID-vkEnumeratePhysicalDevices-pPhysicalDevices-parameter", "If the value referenced by pPhysicalDeviceCount is not 0, and pPhysicalDevices is not NULL, pPhysicalDevices must be a valid pointer to an array of pPhysicalDeviceCount VkPhysicalDevice handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkEnumeratePhysicalDevices-pPhysicalDevices-parameter)"},
- {"VUID-vkFlushMappedMemoryRanges-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFlushMappedMemoryRanges-device-parameter)"},
- {"VUID-vkFlushMappedMemoryRanges-memoryRangeCount-arraylength", "memoryRangeCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFlushMappedMemoryRanges-memoryRangeCount-arraylength)"},
- {"VUID-vkFlushMappedMemoryRanges-pMemoryRanges-parameter", "pMemoryRanges must be a valid pointer to an array of memoryRangeCount valid VkMappedMemoryRange structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFlushMappedMemoryRanges-pMemoryRanges-parameter)"},
- {"VUID-vkFreeCommandBuffers-commandBufferCount-arraylength", "commandBufferCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFreeCommandBuffers-commandBufferCount-arraylength)"},
- {"VUID-vkFreeCommandBuffers-commandPool-parameter", "commandPool must be a valid VkCommandPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFreeCommandBuffers-commandPool-parameter)"},
- {"VUID-vkFreeCommandBuffers-commandPool-parent", "commandPool must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFreeCommandBuffers-commandPool-parent)"},
- {"VUID-vkFreeCommandBuffers-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFreeCommandBuffers-device-parameter)"},
- {"VUID-vkFreeCommandBuffers-pCommandBuffers-00047", "All elements of pCommandBuffers must not be in the pending state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFreeCommandBuffers-pCommandBuffers-00047)"},
- {"VUID-vkFreeCommandBuffers-pCommandBuffers-00048", "pCommandBuffers must be a valid pointer to an array of commandBufferCount VkCommandBuffer handles, each element of which must either be a valid handle or NULL (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFreeCommandBuffers-pCommandBuffers-00048)"},
- {"VUID-vkFreeCommandBuffers-pCommandBuffers-parent", "Each element of pCommandBuffers that is a valid handle must have been created, allocated, or retrieved from commandPool (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFreeCommandBuffers-pCommandBuffers-parent)"},
- {"VUID-vkFreeDescriptorSets-descriptorPool-00312", "descriptorPool must have been created with the VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT flag (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFreeDescriptorSets-descriptorPool-00312)"},
- {"VUID-vkFreeDescriptorSets-descriptorPool-parameter", "descriptorPool must be a valid VkDescriptorPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFreeDescriptorSets-descriptorPool-parameter)"},
- {"VUID-vkFreeDescriptorSets-descriptorPool-parent", "descriptorPool must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFreeDescriptorSets-descriptorPool-parent)"},
- {"VUID-vkFreeDescriptorSets-descriptorSetCount-arraylength", "descriptorSetCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFreeDescriptorSets-descriptorSetCount-arraylength)"},
- {"VUID-vkFreeDescriptorSets-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFreeDescriptorSets-device-parameter)"},
- {"VUID-vkFreeDescriptorSets-pDescriptorSets-00309", "All submitted commands that refer to any element of pDescriptorSets must have completed execution (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFreeDescriptorSets-pDescriptorSets-00309)"},
- {"VUID-vkFreeDescriptorSets-pDescriptorSets-00310", "pDescriptorSets must be a valid pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must either be a valid handle or VK_NULL_HANDLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFreeDescriptorSets-pDescriptorSets-00310)"},
- {"VUID-vkFreeDescriptorSets-pDescriptorSets-00311", "Each valid handle in pDescriptorSets must have been allocated from descriptorPool (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFreeDescriptorSets-pDescriptorSets-00311)"},
- {"VUID-vkFreeDescriptorSets-pDescriptorSets-parent", "Each element of pDescriptorSets that is a valid handle must have been created, allocated, or retrieved from descriptorPool (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFreeDescriptorSets-pDescriptorSets-parent)"},
- {"VUID-vkFreeMemory-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFreeMemory-device-parameter)"},
- {"VUID-vkFreeMemory-memory-00677", "All submitted commands that refer to memory (via images or buffers) must have completed execution (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFreeMemory-memory-00677)"},
- {"VUID-vkFreeMemory-memory-parameter", "If memory is not VK_NULL_HANDLE, memory must be a valid VkDeviceMemory handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFreeMemory-memory-parameter)"},
- {"VUID-vkFreeMemory-memory-parent", "If memory is a valid handle, it must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFreeMemory-memory-parent)"},
- {"VUID-vkFreeMemory-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFreeMemory-pAllocator-parameter)"},
- {"VUID-vkGetAccelerationStructureDeviceAddressKHR-device-03504", "If device was created with multiple physical devices, then the bufferDeviceAddressMultiDevice feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetAccelerationStructureDeviceAddressKHR-device-03504)"},
- {"VUID-vkGetAccelerationStructureDeviceAddressKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetAccelerationStructureDeviceAddressKHR-device-parameter)"},
- {"VUID-vkGetAccelerationStructureDeviceAddressKHR-pInfo-parameter", "pInfo must be a valid pointer to a valid VkAccelerationStructureDeviceAddressInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetAccelerationStructureDeviceAddressKHR-pInfo-parameter)"},
- {"VUID-vkGetAccelerationStructureHandleNV-accelerationStructure-02787", "accelerationStructure must be bound completely and contiguously to a single VkDeviceMemory object via vkBindAccelerationStructureMemoryKHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetAccelerationStructureHandleNV-accelerationStructure-02787)"},
- {"VUID-vkGetAccelerationStructureHandleNV-accelerationStructure-parameter", "accelerationStructure must be a valid VkAccelerationStructureKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetAccelerationStructureHandleNV-accelerationStructure-parameter)"},
- {"VUID-vkGetAccelerationStructureHandleNV-accelerationStructure-parent", "accelerationStructure must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetAccelerationStructureHandleNV-accelerationStructure-parent)"},
- {"VUID-vkGetAccelerationStructureHandleNV-dataSize-02240", "dataSize must be large enough to contain the result of the query, as described above (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetAccelerationStructureHandleNV-dataSize-02240)"},
- {"VUID-vkGetAccelerationStructureHandleNV-dataSize-arraylength", "dataSize must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetAccelerationStructureHandleNV-dataSize-arraylength)"},
- {"VUID-vkGetAccelerationStructureHandleNV-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetAccelerationStructureHandleNV-device-parameter)"},
- {"VUID-vkGetAccelerationStructureHandleNV-pData-parameter", "pData must be a valid pointer to an array of dataSize bytes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetAccelerationStructureHandleNV-pData-parameter)"},
- {"VUID-vkGetAccelerationStructureMemoryRequirementsKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetAccelerationStructureMemoryRequirementsKHR-device-parameter)"},
- {"VUID-vkGetAccelerationStructureMemoryRequirementsKHR-pInfo-parameter", "pInfo must be a valid pointer to a valid VkAccelerationStructureMemoryRequirementsInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetAccelerationStructureMemoryRequirementsKHR-pInfo-parameter)"},
- {"VUID-vkGetAccelerationStructureMemoryRequirementsKHR-pMemoryRequirements-parameter", "pMemoryRequirements must be a valid pointer to a VkMemoryRequirements2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetAccelerationStructureMemoryRequirementsKHR-pMemoryRequirements-parameter)"},
- {"VUID-vkGetAccelerationStructureMemoryRequirementsNV-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetAccelerationStructureMemoryRequirementsNV-device-parameter)"},
- {"VUID-vkGetAccelerationStructureMemoryRequirementsNV-pInfo-parameter", "pInfo must be a valid pointer to a valid VkAccelerationStructureMemoryRequirementsInfoNV structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetAccelerationStructureMemoryRequirementsNV-pInfo-parameter)"},
- {"VUID-vkGetAccelerationStructureMemoryRequirementsNV-pMemoryRequirements-parameter", "pMemoryRequirements must be a valid pointer to a VkMemoryRequirements2KHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetAccelerationStructureMemoryRequirementsNV-pMemoryRequirements-parameter)"},
- {"VUID-vkGetAndroidHardwareBufferPropertiesANDROID-buffer-01884", "buffer must be a valid Android hardware buffer object with at least one of the AHARDWAREBUFFER_USAGE_GPU_* flags in its AHardwareBuffer_Desc::usage (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetAndroidHardwareBufferPropertiesANDROID-buffer-01884)"},
- {"VUID-vkGetAndroidHardwareBufferPropertiesANDROID-buffer-parameter", "buffer must be a valid pointer to a valid AHardwareBuffer value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetAndroidHardwareBufferPropertiesANDROID-buffer-parameter)"},
- {"VUID-vkGetAndroidHardwareBufferPropertiesANDROID-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetAndroidHardwareBufferPropertiesANDROID-device-parameter)"},
- {"VUID-vkGetAndroidHardwareBufferPropertiesANDROID-pProperties-parameter", "pProperties must be a valid pointer to a VkAndroidHardwareBufferPropertiesANDROID structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetAndroidHardwareBufferPropertiesANDROID-pProperties-parameter)"},
- {"VUID-vkGetBufferDeviceAddress-bufferDeviceAddress-03324", "The bufferDeviceAddress or VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::bufferDeviceAddress feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetBufferDeviceAddress-bufferDeviceAddress-03324)"},
- {"VUID-vkGetBufferDeviceAddress-device-03325", "If device was created with multiple physical devices, then the bufferDeviceAddressMultiDevice or VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::bufferDeviceAddressMultiDevice feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetBufferDeviceAddress-device-03325)"},
- {"VUID-vkGetBufferDeviceAddress-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetBufferDeviceAddress-device-parameter)"},
- {"VUID-vkGetBufferDeviceAddress-pInfo-parameter", "pInfo must be a valid pointer to a valid VkBufferDeviceAddressInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetBufferDeviceAddress-pInfo-parameter)"},
- {"VUID-vkGetBufferMemoryRequirements-buffer-parameter", "buffer must be a valid VkBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetBufferMemoryRequirements-buffer-parameter)"},
- {"VUID-vkGetBufferMemoryRequirements-buffer-parent", "buffer must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetBufferMemoryRequirements-buffer-parent)"},
- {"VUID-vkGetBufferMemoryRequirements-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetBufferMemoryRequirements-device-parameter)"},
- {"VUID-vkGetBufferMemoryRequirements-pMemoryRequirements-parameter", "pMemoryRequirements must be a valid pointer to a VkMemoryRequirements structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetBufferMemoryRequirements-pMemoryRequirements-parameter)"},
- {"VUID-vkGetBufferMemoryRequirements2-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetBufferMemoryRequirements2-device-parameter)"},
- {"VUID-vkGetBufferMemoryRequirements2-pInfo-parameter", "pInfo must be a valid pointer to a valid VkBufferMemoryRequirementsInfo2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetBufferMemoryRequirements2-pInfo-parameter)"},
- {"VUID-vkGetBufferMemoryRequirements2-pMemoryRequirements-parameter", "pMemoryRequirements must be a valid pointer to a VkMemoryRequirements2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetBufferMemoryRequirements2-pMemoryRequirements-parameter)"},
- {"VUID-vkGetBufferOpaqueCaptureAddress-None-03326", "The bufferDeviceAddress feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetBufferOpaqueCaptureAddress-None-03326)"},
- {"VUID-vkGetBufferOpaqueCaptureAddress-device-03327", "If device was created with multiple physical devices, then the bufferDeviceAddressMultiDevice feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetBufferOpaqueCaptureAddress-device-03327)"},
- {"VUID-vkGetBufferOpaqueCaptureAddress-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetBufferOpaqueCaptureAddress-device-parameter)"},
- {"VUID-vkGetBufferOpaqueCaptureAddress-pInfo-parameter", "pInfo must be a valid pointer to a valid VkBufferDeviceAddressInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetBufferOpaqueCaptureAddress-pInfo-parameter)"},
- {"VUID-vkGetCalibratedTimestampsEXT-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetCalibratedTimestampsEXT-device-parameter)"},
- {"VUID-vkGetCalibratedTimestampsEXT-pMaxDeviation-parameter", "pMaxDeviation must be a valid pointer to a uint64_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetCalibratedTimestampsEXT-pMaxDeviation-parameter)"},
- {"VUID-vkGetCalibratedTimestampsEXT-pTimestampInfos-parameter", "pTimestampInfos must be a valid pointer to an array of timestampCount valid VkCalibratedTimestampInfoEXT structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetCalibratedTimestampsEXT-pTimestampInfos-parameter)"},
- {"VUID-vkGetCalibratedTimestampsEXT-pTimestamps-parameter", "pTimestamps must be a valid pointer to an array of timestampCount uint64_t values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetCalibratedTimestampsEXT-pTimestamps-parameter)"},
- {"VUID-vkGetCalibratedTimestampsEXT-timestampCount-arraylength", "timestampCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetCalibratedTimestampsEXT-timestampCount-arraylength)"},
- {"VUID-vkGetDeferredOperationMaxConcurrencyKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeferredOperationMaxConcurrencyKHR-device-parameter)"},
- {"VUID-vkGetDeferredOperationMaxConcurrencyKHR-operation-parameter", "operation must be a valid VkDeferredOperationKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeferredOperationMaxConcurrencyKHR-operation-parameter)"},
- {"VUID-vkGetDeferredOperationMaxConcurrencyKHR-operation-parent", "operation must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeferredOperationMaxConcurrencyKHR-operation-parent)"},
- {"VUID-vkGetDeferredOperationResultKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeferredOperationResultKHR-device-parameter)"},
- {"VUID-vkGetDeferredOperationResultKHR-operation-parameter", "operation must be a valid VkDeferredOperationKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeferredOperationResultKHR-operation-parameter)"},
- {"VUID-vkGetDeferredOperationResultKHR-operation-parent", "operation must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeferredOperationResultKHR-operation-parent)"},
- {"VUID-vkGetDescriptorSetLayoutSupport-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDescriptorSetLayoutSupport-device-parameter)"},
- {"VUID-vkGetDescriptorSetLayoutSupport-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkDescriptorSetLayoutCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDescriptorSetLayoutSupport-pCreateInfo-parameter)"},
- {"VUID-vkGetDescriptorSetLayoutSupport-pSupport-parameter", "pSupport must be a valid pointer to a VkDescriptorSetLayoutSupport structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDescriptorSetLayoutSupport-pSupport-parameter)"},
- {"VUID-vkGetDeviceAccelerationStructureCompatibilityKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceAccelerationStructureCompatibilityKHR-device-parameter)"},
- {"VUID-vkGetDeviceAccelerationStructureCompatibilityKHR-rayTracing-03565", "The rayTracing or rayQuery feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceAccelerationStructureCompatibilityKHR-rayTracing-03565)"},
- {"VUID-vkGetDeviceAccelerationStructureCompatibilityKHR-version-parameter", "version must be a valid pointer to a valid VkAccelerationStructureVersionKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceAccelerationStructureCompatibilityKHR-version-parameter)"},
- {"VUID-vkGetDeviceGroupPeerMemoryFeatures-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceGroupPeerMemoryFeatures-device-parameter)"},
- {"VUID-vkGetDeviceGroupPeerMemoryFeatures-heapIndex-00691", "heapIndex must be less than memoryHeapCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceGroupPeerMemoryFeatures-heapIndex-00691)"},
- {"VUID-vkGetDeviceGroupPeerMemoryFeatures-localDeviceIndex-00692", "localDeviceIndex must be a valid device index (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceGroupPeerMemoryFeatures-localDeviceIndex-00692)"},
- {"VUID-vkGetDeviceGroupPeerMemoryFeatures-localDeviceIndex-00694", "localDeviceIndex must not equal remoteDeviceIndex (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceGroupPeerMemoryFeatures-localDeviceIndex-00694)"},
- {"VUID-vkGetDeviceGroupPeerMemoryFeatures-pPeerMemoryFeatures-parameter", "pPeerMemoryFeatures must be a valid pointer to a VkPeerMemoryFeatureFlags value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceGroupPeerMemoryFeatures-pPeerMemoryFeatures-parameter)"},
- {"VUID-vkGetDeviceGroupPeerMemoryFeatures-remoteDeviceIndex-00693", "remoteDeviceIndex must be a valid device index (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceGroupPeerMemoryFeatures-remoteDeviceIndex-00693)"},
- {"VUID-vkGetDeviceGroupPresentCapabilitiesKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceGroupPresentCapabilitiesKHR-device-parameter)"},
- {"VUID-vkGetDeviceGroupPresentCapabilitiesKHR-pDeviceGroupPresentCapabilities-parameter", "pDeviceGroupPresentCapabilities must be a valid pointer to a VkDeviceGroupPresentCapabilitiesKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceGroupPresentCapabilitiesKHR-pDeviceGroupPresentCapabilities-parameter)"},
- {"VUID-vkGetDeviceGroupSurfacePresentModes2EXT-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceGroupSurfacePresentModes2EXT-device-parameter)"},
- {"VUID-vkGetDeviceGroupSurfacePresentModes2EXT-pModes-parameter", "pModes must be a valid pointer to a VkDeviceGroupPresentModeFlagsKHR value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceGroupSurfacePresentModes2EXT-pModes-parameter)"},
- {"VUID-vkGetDeviceGroupSurfacePresentModes2EXT-pSurfaceInfo-parameter", "pSurfaceInfo must be a valid pointer to a valid VkPhysicalDeviceSurfaceInfo2KHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceGroupSurfacePresentModes2EXT-pSurfaceInfo-parameter)"},
- {"VUID-vkGetDeviceGroupSurfacePresentModesKHR-commonparent", "Both of device, and surface must have been created, allocated, or retrieved from the same VkInstance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceGroupSurfacePresentModesKHR-commonparent)"},
- {"VUID-vkGetDeviceGroupSurfacePresentModesKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceGroupSurfacePresentModesKHR-device-parameter)"},
- {"VUID-vkGetDeviceGroupSurfacePresentModesKHR-pModes-parameter", "pModes must be a valid pointer to a VkDeviceGroupPresentModeFlagsKHR value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceGroupSurfacePresentModesKHR-pModes-parameter)"},
- {"VUID-vkGetDeviceGroupSurfacePresentModesKHR-surface-parameter", "surface must be a valid VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceGroupSurfacePresentModesKHR-surface-parameter)"},
- {"VUID-vkGetDeviceMemoryCommitment-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceMemoryCommitment-device-parameter)"},
- {"VUID-vkGetDeviceMemoryCommitment-memory-00690", "memory must have been created with a memory type that reports VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceMemoryCommitment-memory-00690)"},
- {"VUID-vkGetDeviceMemoryCommitment-memory-parameter", "memory must be a valid VkDeviceMemory handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceMemoryCommitment-memory-parameter)"},
- {"VUID-vkGetDeviceMemoryCommitment-memory-parent", "memory must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceMemoryCommitment-memory-parent)"},
- {"VUID-vkGetDeviceMemoryCommitment-pCommittedMemoryInBytes-parameter", "pCommittedMemoryInBytes must be a valid pointer to a VkDeviceSize value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceMemoryCommitment-pCommittedMemoryInBytes-parameter)"},
- {"VUID-vkGetDeviceMemoryOpaqueCaptureAddress-None-03334", "The bufferDeviceAddress feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceMemoryOpaqueCaptureAddress-None-03334)"},
- {"VUID-vkGetDeviceMemoryOpaqueCaptureAddress-device-03335", "If device was created with multiple physical devices, then the bufferDeviceAddressMultiDevice feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceMemoryOpaqueCaptureAddress-device-03335)"},
- {"VUID-vkGetDeviceMemoryOpaqueCaptureAddress-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceMemoryOpaqueCaptureAddress-device-parameter)"},
- {"VUID-vkGetDeviceMemoryOpaqueCaptureAddress-pInfo-parameter", "pInfo must be a valid pointer to a valid VkDeviceMemoryOpaqueCaptureAddressInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceMemoryOpaqueCaptureAddress-pInfo-parameter)"},
- {"VUID-vkGetDeviceProcAddr-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceProcAddr-device-parameter)"},
- {"VUID-vkGetDeviceProcAddr-pName-parameter", "pName must be a null-terminated UTF-8 string (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceProcAddr-pName-parameter)"},
- {"VUID-vkGetDeviceQueue-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceQueue-device-parameter)"},
- {"VUID-vkGetDeviceQueue-flags-01841", "VkDeviceQueueCreateInfo::flags must have been set to zero when device was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceQueue-flags-01841)"},
- {"VUID-vkGetDeviceQueue-pQueue-parameter", "pQueue must be a valid pointer to a VkQueue handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceQueue-pQueue-parameter)"},
- {"VUID-vkGetDeviceQueue-queueFamilyIndex-00384", "queueFamilyIndex must be one of the queue family indices specified when device was created, via the VkDeviceQueueCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceQueue-queueFamilyIndex-00384)"},
- {"VUID-vkGetDeviceQueue-queueIndex-00385", "queueIndex must be less than the number of queues created for the specified queue family index when device was created, via the queueCount member of the VkDeviceQueueCreateInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceQueue-queueIndex-00385)"},
- {"VUID-vkGetDeviceQueue2-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceQueue2-device-parameter)"},
- {"VUID-vkGetDeviceQueue2-pQueue-parameter", "pQueue must be a valid pointer to a VkQueue handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceQueue2-pQueue-parameter)"},
- {"VUID-vkGetDeviceQueue2-pQueueInfo-parameter", "pQueueInfo must be a valid pointer to a valid VkDeviceQueueInfo2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDeviceQueue2-pQueueInfo-parameter)"},
- {"VUID-vkGetDisplayModeProperties2KHR-display-parameter", "display must be a valid VkDisplayKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDisplayModeProperties2KHR-display-parameter)"},
- {"VUID-vkGetDisplayModeProperties2KHR-display-parent", "display must have been created, allocated, or retrieved from physicalDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDisplayModeProperties2KHR-display-parent)"},
- {"VUID-vkGetDisplayModeProperties2KHR-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkDisplayModeProperties2KHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDisplayModeProperties2KHR-pProperties-parameter)"},
- {"VUID-vkGetDisplayModeProperties2KHR-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDisplayModeProperties2KHR-pPropertyCount-parameter)"},
- {"VUID-vkGetDisplayModeProperties2KHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDisplayModeProperties2KHR-physicalDevice-parameter)"},
- {"VUID-vkGetDisplayModePropertiesKHR-display-parameter", "display must be a valid VkDisplayKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDisplayModePropertiesKHR-display-parameter)"},
- {"VUID-vkGetDisplayModePropertiesKHR-display-parent", "display must have been created, allocated, or retrieved from physicalDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDisplayModePropertiesKHR-display-parent)"},
- {"VUID-vkGetDisplayModePropertiesKHR-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkDisplayModePropertiesKHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDisplayModePropertiesKHR-pProperties-parameter)"},
- {"VUID-vkGetDisplayModePropertiesKHR-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDisplayModePropertiesKHR-pPropertyCount-parameter)"},
- {"VUID-vkGetDisplayModePropertiesKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDisplayModePropertiesKHR-physicalDevice-parameter)"},
- {"VUID-vkGetDisplayPlaneCapabilities2KHR-pCapabilities-parameter", "pCapabilities must be a valid pointer to a VkDisplayPlaneCapabilities2KHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDisplayPlaneCapabilities2KHR-pCapabilities-parameter)"},
- {"VUID-vkGetDisplayPlaneCapabilities2KHR-pDisplayPlaneInfo-parameter", "pDisplayPlaneInfo must be a valid pointer to a valid VkDisplayPlaneInfo2KHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDisplayPlaneCapabilities2KHR-pDisplayPlaneInfo-parameter)"},
- {"VUID-vkGetDisplayPlaneCapabilities2KHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDisplayPlaneCapabilities2KHR-physicalDevice-parameter)"},
- {"VUID-vkGetDisplayPlaneCapabilitiesKHR-mode-parameter", "mode must be a valid VkDisplayModeKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDisplayPlaneCapabilitiesKHR-mode-parameter)"},
- {"VUID-vkGetDisplayPlaneCapabilitiesKHR-pCapabilities-parameter", "pCapabilities must be a valid pointer to a VkDisplayPlaneCapabilitiesKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDisplayPlaneCapabilitiesKHR-pCapabilities-parameter)"},
- {"VUID-vkGetDisplayPlaneCapabilitiesKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDisplayPlaneCapabilitiesKHR-physicalDevice-parameter)"},
- {"VUID-vkGetDisplayPlaneSupportedDisplaysKHR-pDisplayCount-parameter", "pDisplayCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDisplayPlaneSupportedDisplaysKHR-pDisplayCount-parameter)"},
- {"VUID-vkGetDisplayPlaneSupportedDisplaysKHR-pDisplays-parameter", "If the value referenced by pDisplayCount is not 0, and pDisplays is not NULL, pDisplays must be a valid pointer to an array of pDisplayCount VkDisplayKHR handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDisplayPlaneSupportedDisplaysKHR-pDisplays-parameter)"},
- {"VUID-vkGetDisplayPlaneSupportedDisplaysKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDisplayPlaneSupportedDisplaysKHR-physicalDevice-parameter)"},
- {"VUID-vkGetDisplayPlaneSupportedDisplaysKHR-planeIndex-01249", "planeIndex must be less than the number of display planes supported by the device as determined by calling vkGetPhysicalDeviceDisplayPlanePropertiesKHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetDisplayPlaneSupportedDisplaysKHR-planeIndex-01249)"},
- {"VUID-vkGetEventStatus-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetEventStatus-device-parameter)"},
- {"VUID-vkGetEventStatus-event-parameter", "event must be a valid VkEvent handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetEventStatus-event-parameter)"},
- {"VUID-vkGetEventStatus-event-parent", "event must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetEventStatus-event-parent)"},
- {"VUID-vkGetFenceFdKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetFenceFdKHR-device-parameter)"},
- {"VUID-vkGetFenceFdKHR-pFd-parameter", "pFd must be a valid pointer to an int value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetFenceFdKHR-pFd-parameter)"},
- {"VUID-vkGetFenceFdKHR-pGetFdInfo-parameter", "pGetFdInfo must be a valid pointer to a valid VkFenceGetFdInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetFenceFdKHR-pGetFdInfo-parameter)"},
- {"VUID-vkGetFenceStatus-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetFenceStatus-device-parameter)"},
- {"VUID-vkGetFenceStatus-fence-parameter", "fence must be a valid VkFence handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetFenceStatus-fence-parameter)"},
- {"VUID-vkGetFenceStatus-fence-parent", "fence must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetFenceStatus-fence-parent)"},
- {"VUID-vkGetFenceWin32HandleKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetFenceWin32HandleKHR-device-parameter)"},
- {"VUID-vkGetFenceWin32HandleKHR-pGetWin32HandleInfo-parameter", "pGetWin32HandleInfo must be a valid pointer to a valid VkFenceGetWin32HandleInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetFenceWin32HandleKHR-pGetWin32HandleInfo-parameter)"},
- {"VUID-vkGetFenceWin32HandleKHR-pHandle-parameter", "pHandle must be a valid pointer to a HANDLE value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetFenceWin32HandleKHR-pHandle-parameter)"},
- {"VUID-vkGetGeneratedCommandsMemoryRequirementsNV-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetGeneratedCommandsMemoryRequirementsNV-device-parameter)"},
- {"VUID-vkGetGeneratedCommandsMemoryRequirementsNV-deviceGeneratedCommands-02906", "The VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV->deviceGeneratedCommands feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetGeneratedCommandsMemoryRequirementsNV-deviceGeneratedCommands-02906)"},
- {"VUID-vkGetGeneratedCommandsMemoryRequirementsNV-pInfo-parameter", "pInfo must be a valid pointer to a valid VkGeneratedCommandsMemoryRequirementsInfoNV structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetGeneratedCommandsMemoryRequirementsNV-pInfo-parameter)"},
- {"VUID-vkGetGeneratedCommandsMemoryRequirementsNV-pMemoryRequirements-parameter", "pMemoryRequirements must be a valid pointer to a VkMemoryRequirements2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetGeneratedCommandsMemoryRequirementsNV-pMemoryRequirements-parameter)"},
- {"VUID-vkGetImageDrmFormatModifierPropertiesEXT-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageDrmFormatModifierPropertiesEXT-device-parameter)"},
- {"VUID-vkGetImageDrmFormatModifierPropertiesEXT-image-02272", "image must have been created with tiling equal to VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageDrmFormatModifierPropertiesEXT-image-02272)"},
- {"VUID-vkGetImageDrmFormatModifierPropertiesEXT-image-parameter", "image must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageDrmFormatModifierPropertiesEXT-image-parameter)"},
- {"VUID-vkGetImageDrmFormatModifierPropertiesEXT-image-parent", "image must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageDrmFormatModifierPropertiesEXT-image-parent)"},
- {"VUID-vkGetImageDrmFormatModifierPropertiesEXT-pProperties-parameter", "pProperties must be a valid pointer to a VkImageDrmFormatModifierPropertiesEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageDrmFormatModifierPropertiesEXT-pProperties-parameter)"},
- {"VUID-vkGetImageMemoryRequirements-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageMemoryRequirements-device-parameter)"},
- {"VUID-vkGetImageMemoryRequirements-image-01588", "image must not have been created with the VK_IMAGE_CREATE_DISJOINT_BIT flag set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageMemoryRequirements-image-01588)"},
- {"VUID-vkGetImageMemoryRequirements-image-parameter", "image must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageMemoryRequirements-image-parameter)"},
- {"VUID-vkGetImageMemoryRequirements-image-parent", "image must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageMemoryRequirements-image-parent)"},
- {"VUID-vkGetImageMemoryRequirements-pMemoryRequirements-parameter", "pMemoryRequirements must be a valid pointer to a VkMemoryRequirements structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageMemoryRequirements-pMemoryRequirements-parameter)"},
- {"VUID-vkGetImageMemoryRequirements2-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageMemoryRequirements2-device-parameter)"},
- {"VUID-vkGetImageMemoryRequirements2-pInfo-parameter", "pInfo must be a valid pointer to a valid VkImageMemoryRequirementsInfo2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageMemoryRequirements2-pInfo-parameter)"},
- {"VUID-vkGetImageMemoryRequirements2-pMemoryRequirements-parameter", "pMemoryRequirements must be a valid pointer to a VkMemoryRequirements2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageMemoryRequirements2-pMemoryRequirements-parameter)"},
- {"VUID-vkGetImageSparseMemoryRequirements-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageSparseMemoryRequirements-device-parameter)"},
- {"VUID-vkGetImageSparseMemoryRequirements-image-parameter", "image must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageSparseMemoryRequirements-image-parameter)"},
- {"VUID-vkGetImageSparseMemoryRequirements-image-parent", "image must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageSparseMemoryRequirements-image-parent)"},
- {"VUID-vkGetImageSparseMemoryRequirements-pSparseMemoryRequirementCount-parameter", "pSparseMemoryRequirementCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageSparseMemoryRequirements-pSparseMemoryRequirementCount-parameter)"},
- {"VUID-vkGetImageSparseMemoryRequirements-pSparseMemoryRequirements-parameter", "If the value referenced by pSparseMemoryRequirementCount is not 0, and pSparseMemoryRequirements is not NULL, pSparseMemoryRequirements must be a valid pointer to an array of pSparseMemoryRequirementCount VkSparseImageMemoryRequirements structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageSparseMemoryRequirements-pSparseMemoryRequirements-parameter)"},
- {"VUID-vkGetImageSparseMemoryRequirements2-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageSparseMemoryRequirements2-device-parameter)"},
- {"VUID-vkGetImageSparseMemoryRequirements2-pInfo-parameter", "pInfo must be a valid pointer to a valid VkImageSparseMemoryRequirementsInfo2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageSparseMemoryRequirements2-pInfo-parameter)"},
- {"VUID-vkGetImageSparseMemoryRequirements2-pSparseMemoryRequirementCount-parameter", "pSparseMemoryRequirementCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageSparseMemoryRequirements2-pSparseMemoryRequirementCount-parameter)"},
- {"VUID-vkGetImageSparseMemoryRequirements2-pSparseMemoryRequirements-parameter", "If the value referenced by pSparseMemoryRequirementCount is not 0, and pSparseMemoryRequirements is not NULL, pSparseMemoryRequirements must be a valid pointer to an array of pSparseMemoryRequirementCount VkSparseImageMemoryRequirements2 structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageSparseMemoryRequirements2-pSparseMemoryRequirements-parameter)"},
- {"VUID-vkGetImageSubresourceLayout-arrayLayer-01717", "The arrayLayer member of pSubresource must be less than the arrayLayers specified in VkImageCreateInfo when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageSubresourceLayout-arrayLayer-01717)"},
- {"VUID-vkGetImageSubresourceLayout-aspectMask-00997", "The aspectMask member of pSubresource must only have a single bit set (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageSubresourceLayout-aspectMask-00997)"},
- {"VUID-vkGetImageSubresourceLayout-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageSubresourceLayout-device-parameter)"},
- {"VUID-vkGetImageSubresourceLayout-format-01581", "If the tiling of the image is VK_IMAGE_TILING_LINEAR and its format is a multi-planar format with two planes, the aspectMask member of pSubresource must be VK_IMAGE_ASPECT_PLANE_0_BIT or VK_IMAGE_ASPECT_PLANE_1_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageSubresourceLayout-format-01581)"},
- {"VUID-vkGetImageSubresourceLayout-format-01582", "If the tiling of the image is VK_IMAGE_TILING_LINEAR and its format is a multi-planar format with three planes, the aspectMask member of pSubresource must be VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT or VK_IMAGE_ASPECT_PLANE_2_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageSubresourceLayout-format-01582)"},
- {"VUID-vkGetImageSubresourceLayout-image-00996", "image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-vkGetImageSubresourceLayout-image-00996)"},
- {"VUID-vkGetImageSubresourceLayout-image-01895", "If image was created with the VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID external memory handle type, then image must be bound to memory. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageSubresourceLayout-image-01895)"},
- {"VUID-vkGetImageSubresourceLayout-image-02270", "image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR or VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageSubresourceLayout-image-02270)"},
- {"VUID-vkGetImageSubresourceLayout-image-parameter", "image must be a valid VkImage handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageSubresourceLayout-image-parameter)"},
- {"VUID-vkGetImageSubresourceLayout-image-parent", "image must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageSubresourceLayout-image-parent)"},
- {"VUID-vkGetImageSubresourceLayout-mipLevel-01716", "The mipLevel member of pSubresource must be less than the mipLevels specified in VkImageCreateInfo when image was created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageSubresourceLayout-mipLevel-01716)"},
- {"VUID-vkGetImageSubresourceLayout-pLayout-parameter", "pLayout must be a valid pointer to a VkSubresourceLayout structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageSubresourceLayout-pLayout-parameter)"},
- {"VUID-vkGetImageSubresourceLayout-pSubresource-parameter", "pSubresource must be a valid pointer to a valid VkImageSubresource structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageSubresourceLayout-pSubresource-parameter)"},
- {"VUID-vkGetImageSubresourceLayout-tiling-02271", "If the tiling of the image is VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then the aspectMask member of pSubresource must be VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT and the index i must be less than the drmFormatModifierPlaneCount associated with the image's format and drmFormatModifier. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageSubresourceLayout-tiling-02271)"},
- {"VUID-vkGetImageViewHandleNVX-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageViewHandleNVX-device-parameter)"},
- {"VUID-vkGetImageViewHandleNVX-pInfo-parameter", "pInfo must be a valid pointer to a valid VkImageViewHandleInfoNVX structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetImageViewHandleNVX-pInfo-parameter)"},
- {"VUID-vkGetInstanceProcAddr-instance-parameter", "If instance is not NULL, instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetInstanceProcAddr-instance-parameter)"},
- {"VUID-vkGetInstanceProcAddr-pName-parameter", "pName must be a null-terminated UTF-8 string (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetInstanceProcAddr-pName-parameter)"},
- {"VUID-vkGetMemoryAndroidHardwareBufferANDROID-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryAndroidHardwareBufferANDROID-device-parameter)"},
- {"VUID-vkGetMemoryAndroidHardwareBufferANDROID-pBuffer-parameter", "pBuffer must be a valid pointer to a valid pointer to an AHardwareBuffer value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryAndroidHardwareBufferANDROID-pBuffer-parameter)"},
- {"VUID-vkGetMemoryAndroidHardwareBufferANDROID-pInfo-parameter", "pInfo must be a valid pointer to a valid VkMemoryGetAndroidHardwareBufferInfoANDROID structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryAndroidHardwareBufferANDROID-pInfo-parameter)"},
- {"VUID-vkGetMemoryFdKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryFdKHR-device-parameter)"},
- {"VUID-vkGetMemoryFdKHR-pFd-parameter", "pFd must be a valid pointer to an int value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryFdKHR-pFd-parameter)"},
- {"VUID-vkGetMemoryFdKHR-pGetFdInfo-parameter", "pGetFdInfo must be a valid pointer to a valid VkMemoryGetFdInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryFdKHR-pGetFdInfo-parameter)"},
- {"VUID-vkGetMemoryFdPropertiesKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryFdPropertiesKHR-device-parameter)"},
- {"VUID-vkGetMemoryFdPropertiesKHR-fd-00673", "fd must be an external memory handle created outside of the Vulkan API. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryFdPropertiesKHR-fd-00673)"},
- {"VUID-vkGetMemoryFdPropertiesKHR-handleType-00674", "handleType must not be VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryFdPropertiesKHR-handleType-00674)"},
- {"VUID-vkGetMemoryFdPropertiesKHR-handleType-parameter", "handleType must be a valid VkExternalMemoryHandleTypeFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryFdPropertiesKHR-handleType-parameter)"},
- {"VUID-vkGetMemoryFdPropertiesKHR-pMemoryFdProperties-parameter", "pMemoryFdProperties must be a valid pointer to a VkMemoryFdPropertiesKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryFdPropertiesKHR-pMemoryFdProperties-parameter)"},
- {"VUID-vkGetMemoryHostPointerPropertiesEXT-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryHostPointerPropertiesEXT-device-parameter)"},
- {"VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-01752", "handleType must be VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT or VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-01752)"},
- {"VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-01754", "If handleType is VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT, pHostPointer must be a pointer to host memory (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-01754)"},
- {"VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-01755", "If handleType is VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT, pHostPointer must be a pointer to host mapped foreign memory (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-01755)"},
- {"VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-parameter", "handleType must be a valid VkExternalMemoryHandleTypeFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-parameter)"},
- {"VUID-vkGetMemoryHostPointerPropertiesEXT-pHostPointer-01753", "pHostPointer must be a pointer aligned to an integer multiple of VkPhysicalDeviceExternalMemoryHostPropertiesEXT::minImportedHostPointerAlignment (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryHostPointerPropertiesEXT-pHostPointer-01753)"},
- {"VUID-vkGetMemoryHostPointerPropertiesEXT-pMemoryHostPointerProperties-parameter", "pMemoryHostPointerProperties must be a valid pointer to a VkMemoryHostPointerPropertiesEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryHostPointerPropertiesEXT-pMemoryHostPointerProperties-parameter)"},
- {"VUID-vkGetMemoryWin32HandleKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryWin32HandleKHR-device-parameter)"},
- {"VUID-vkGetMemoryWin32HandleKHR-pGetWin32HandleInfo-parameter", "pGetWin32HandleInfo must be a valid pointer to a valid VkMemoryGetWin32HandleInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryWin32HandleKHR-pGetWin32HandleInfo-parameter)"},
- {"VUID-vkGetMemoryWin32HandleKHR-pHandle-parameter", "pHandle must be a valid pointer to a HANDLE value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryWin32HandleKHR-pHandle-parameter)"},
- {"VUID-vkGetMemoryWin32HandleNV-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryWin32HandleNV-device-parameter)"},
- {"VUID-vkGetMemoryWin32HandleNV-handleType-01326", "handleType must be a flag specified in VkExportMemoryAllocateInfoNV::handleTypes when allocating memory (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryWin32HandleNV-handleType-01326)"},
- {"VUID-vkGetMemoryWin32HandleNV-handleType-parameter", "handleType must be a valid combination of VkExternalMemoryHandleTypeFlagBitsNV values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryWin32HandleNV-handleType-parameter)"},
- {"VUID-vkGetMemoryWin32HandleNV-handleType-requiredbitmask", "handleType must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryWin32HandleNV-handleType-requiredbitmask)"},
- {"VUID-vkGetMemoryWin32HandleNV-memory-parameter", "memory must be a valid VkDeviceMemory handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryWin32HandleNV-memory-parameter)"},
- {"VUID-vkGetMemoryWin32HandleNV-memory-parent", "memory must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryWin32HandleNV-memory-parent)"},
- {"VUID-vkGetMemoryWin32HandleNV-pHandle-parameter", "pHandle must be a valid pointer to a HANDLE value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryWin32HandleNV-pHandle-parameter)"},
- {"VUID-vkGetMemoryWin32HandlePropertiesKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryWin32HandlePropertiesKHR-device-parameter)"},
- {"VUID-vkGetMemoryWin32HandlePropertiesKHR-handle-00665", "handle must be an external memory handle created outside of the Vulkan API. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryWin32HandlePropertiesKHR-handle-00665)"},
- {"VUID-vkGetMemoryWin32HandlePropertiesKHR-handleType-00666", "handleType must not be one of the handle types defined as opaque. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryWin32HandlePropertiesKHR-handleType-00666)"},
- {"VUID-vkGetMemoryWin32HandlePropertiesKHR-handleType-parameter", "handleType must be a valid VkExternalMemoryHandleTypeFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryWin32HandlePropertiesKHR-handleType-parameter)"},
- {"VUID-vkGetMemoryWin32HandlePropertiesKHR-pMemoryWin32HandleProperties-parameter", "pMemoryWin32HandleProperties must be a valid pointer to a VkMemoryWin32HandlePropertiesKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetMemoryWin32HandlePropertiesKHR-pMemoryWin32HandleProperties-parameter)"},
- {"VUID-vkGetPastPresentationTimingGOOGLE-commonparent", "Both of device, and swapchain must have been created, allocated, or retrieved from the same VkInstance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPastPresentationTimingGOOGLE-commonparent)"},
- {"VUID-vkGetPastPresentationTimingGOOGLE-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPastPresentationTimingGOOGLE-device-parameter)"},
- {"VUID-vkGetPastPresentationTimingGOOGLE-pPresentationTimingCount-parameter", "pPresentationTimingCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPastPresentationTimingGOOGLE-pPresentationTimingCount-parameter)"},
- {"VUID-vkGetPastPresentationTimingGOOGLE-pPresentationTimings-parameter", "If the value referenced by pPresentationTimingCount is not 0, and pPresentationTimings is not NULL, pPresentationTimings must be a valid pointer to an array of pPresentationTimingCount VkPastPresentationTimingGOOGLE structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPastPresentationTimingGOOGLE-pPresentationTimings-parameter)"},
- {"VUID-vkGetPastPresentationTimingGOOGLE-swapchain-parameter", "swapchain must be a valid VkSwapchainKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPastPresentationTimingGOOGLE-swapchain-parameter)"},
- {"VUID-vkGetPerformanceParameterINTEL-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPerformanceParameterINTEL-device-parameter)"},
- {"VUID-vkGetPerformanceParameterINTEL-pValue-parameter", "pValue must be a valid pointer to a VkPerformanceValueINTEL structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPerformanceParameterINTEL-pValue-parameter)"},
- {"VUID-vkGetPerformanceParameterINTEL-parameter-parameter", "parameter must be a valid VkPerformanceParameterTypeINTEL value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPerformanceParameterINTEL-parameter-parameter)"},
- {"VUID-vkGetPhysicalDeviceCalibrateableTimeDomainsEXT-pTimeDomainCount-parameter", "pTimeDomainCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceCalibrateableTimeDomainsEXT-pTimeDomainCount-parameter)"},
- {"VUID-vkGetPhysicalDeviceCalibrateableTimeDomainsEXT-pTimeDomains-parameter", "If the value referenced by pTimeDomainCount is not 0, and pTimeDomains is not NULL, pTimeDomains must be a valid pointer to an array of pTimeDomainCount VkTimeDomainEXT values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceCalibrateableTimeDomainsEXT-pTimeDomains-parameter)"},
- {"VUID-vkGetPhysicalDeviceCalibrateableTimeDomainsEXT-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceCalibrateableTimeDomainsEXT-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceCooperativeMatrixPropertiesNV-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkCooperativeMatrixPropertiesNV structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceCooperativeMatrixPropertiesNV-pProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceCooperativeMatrixPropertiesNV-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceCooperativeMatrixPropertiesNV-pPropertyCount-parameter)"},
- {"VUID-vkGetPhysicalDeviceCooperativeMatrixPropertiesNV-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceCooperativeMatrixPropertiesNV-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceDisplayPlaneProperties2KHR-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkDisplayPlaneProperties2KHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceDisplayPlaneProperties2KHR-pProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceDisplayPlaneProperties2KHR-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceDisplayPlaneProperties2KHR-pPropertyCount-parameter)"},
- {"VUID-vkGetPhysicalDeviceDisplayPlaneProperties2KHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceDisplayPlaneProperties2KHR-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceDisplayPlanePropertiesKHR-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkDisplayPlanePropertiesKHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceDisplayPlanePropertiesKHR-pProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceDisplayPlanePropertiesKHR-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceDisplayPlanePropertiesKHR-pPropertyCount-parameter)"},
- {"VUID-vkGetPhysicalDeviceDisplayPlanePropertiesKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceDisplayPlanePropertiesKHR-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceDisplayProperties2KHR-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkDisplayProperties2KHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceDisplayProperties2KHR-pProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceDisplayProperties2KHR-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceDisplayProperties2KHR-pPropertyCount-parameter)"},
- {"VUID-vkGetPhysicalDeviceDisplayProperties2KHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceDisplayProperties2KHR-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceDisplayPropertiesKHR-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkDisplayPropertiesKHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceDisplayPropertiesKHR-pProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceDisplayPropertiesKHR-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceDisplayPropertiesKHR-pPropertyCount-parameter)"},
- {"VUID-vkGetPhysicalDeviceDisplayPropertiesKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceDisplayPropertiesKHR-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceExternalBufferProperties-pExternalBufferInfo-parameter", "pExternalBufferInfo must be a valid pointer to a valid VkPhysicalDeviceExternalBufferInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalBufferProperties-pExternalBufferInfo-parameter)"},
- {"VUID-vkGetPhysicalDeviceExternalBufferProperties-pExternalBufferProperties-parameter", "pExternalBufferProperties must be a valid pointer to a VkExternalBufferProperties structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalBufferProperties-pExternalBufferProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceExternalBufferProperties-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalBufferProperties-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceExternalFenceProperties-pExternalFenceInfo-parameter", "pExternalFenceInfo must be a valid pointer to a valid VkPhysicalDeviceExternalFenceInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalFenceProperties-pExternalFenceInfo-parameter)"},
- {"VUID-vkGetPhysicalDeviceExternalFenceProperties-pExternalFenceProperties-parameter", "pExternalFenceProperties must be a valid pointer to a VkExternalFenceProperties structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalFenceProperties-pExternalFenceProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceExternalFenceProperties-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalFenceProperties-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-externalHandleType-parameter", "externalHandleType must be a valid combination of VkExternalMemoryHandleTypeFlagBitsNV values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-externalHandleType-parameter)"},
- {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-flags-parameter", "flags must be a valid combination of VkImageCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-flags-parameter)"},
- {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-format-parameter", "format must be a valid VkFormat value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-format-parameter)"},
- {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-pExternalImageFormatProperties-parameter", "pExternalImageFormatProperties must be a valid pointer to a VkExternalImageFormatPropertiesNV structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-pExternalImageFormatProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-tiling-parameter", "tiling must be a valid VkImageTiling value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-tiling-parameter)"},
- {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-type-parameter", "type must be a valid VkImageType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-type-parameter)"},
- {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-usage-parameter", "usage must be a valid combination of VkImageUsageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-usage-parameter)"},
- {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-usage-requiredbitmask", "usage must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-usage-requiredbitmask)"},
- {"VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-pExternalSemaphoreInfo-parameter", "pExternalSemaphoreInfo must be a valid pointer to a valid VkPhysicalDeviceExternalSemaphoreInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-pExternalSemaphoreInfo-parameter)"},
- {"VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-pExternalSemaphoreProperties-parameter", "pExternalSemaphoreProperties must be a valid pointer to a VkExternalSemaphoreProperties structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-pExternalSemaphoreProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceFeatures-pFeatures-parameter", "pFeatures must be a valid pointer to a VkPhysicalDeviceFeatures structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceFeatures-pFeatures-parameter)"},
- {"VUID-vkGetPhysicalDeviceFeatures-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceFeatures-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceFeatures2-pFeatures-parameter", "pFeatures must be a valid pointer to a VkPhysicalDeviceFeatures2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceFeatures2-pFeatures-parameter)"},
- {"VUID-vkGetPhysicalDeviceFeatures2-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceFeatures2-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceFormatProperties-format-parameter", "format must be a valid VkFormat value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceFormatProperties-format-parameter)"},
- {"VUID-vkGetPhysicalDeviceFormatProperties-pFormatProperties-parameter", "pFormatProperties must be a valid pointer to a VkFormatProperties structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceFormatProperties-pFormatProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceFormatProperties-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceFormatProperties-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceFormatProperties2-format-parameter", "format must be a valid VkFormat value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceFormatProperties2-format-parameter)"},
- {"VUID-vkGetPhysicalDeviceFormatProperties2-pFormatProperties-parameter", "pFormatProperties must be a valid pointer to a VkFormatProperties2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceFormatProperties2-pFormatProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceFormatProperties2-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceFormatProperties2-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceImageFormatProperties-flags-parameter", "flags must be a valid combination of VkImageCreateFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties-flags-parameter)"},
- {"VUID-vkGetPhysicalDeviceImageFormatProperties-format-parameter", "format must be a valid VkFormat value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties-format-parameter)"},
- {"VUID-vkGetPhysicalDeviceImageFormatProperties-pImageFormatProperties-parameter", "pImageFormatProperties must be a valid pointer to a VkImageFormatProperties structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties-pImageFormatProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceImageFormatProperties-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceImageFormatProperties-tiling-02248", "tiling must not be VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT. (Use vkGetPhysicalDeviceImageFormatProperties2 instead). (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties-tiling-02248)"},
- {"VUID-vkGetPhysicalDeviceImageFormatProperties-tiling-parameter", "tiling must be a valid VkImageTiling value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties-tiling-parameter)"},
- {"VUID-vkGetPhysicalDeviceImageFormatProperties-type-parameter", "type must be a valid VkImageType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties-type-parameter)"},
- {"VUID-vkGetPhysicalDeviceImageFormatProperties-usage-parameter", "usage must be a valid combination of VkImageUsageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties-usage-parameter)"},
- {"VUID-vkGetPhysicalDeviceImageFormatProperties-usage-requiredbitmask", "usage must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties-usage-requiredbitmask)"},
- {"VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatInfo-parameter", "pImageFormatInfo must be a valid pointer to a valid VkPhysicalDeviceImageFormatInfo2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatInfo-parameter)"},
- {"VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatProperties-parameter", "pImageFormatProperties must be a valid pointer to a VkImageFormatProperties2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceImageFormatProperties2-pNext-01868", "If the pNext chain of pImageFormatProperties includes a VkAndroidHardwareBufferUsageANDROID structure, the pNext chain of pImageFormatInfo must include a VkPhysicalDeviceExternalImageFormatInfo structure with handleType set to VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties2-pNext-01868)"},
- {"VUID-vkGetPhysicalDeviceImageFormatProperties2-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceImageFormatProperties2-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceMemoryProperties-pMemoryProperties-parameter", "pMemoryProperties must be a valid pointer to a VkPhysicalDeviceMemoryProperties structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceMemoryProperties-pMemoryProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceMemoryProperties-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceMemoryProperties-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceMemoryProperties2-pMemoryProperties-parameter", "pMemoryProperties must be a valid pointer to a VkPhysicalDeviceMemoryProperties2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceMemoryProperties2-pMemoryProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceMemoryProperties2-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceMemoryProperties2-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceMultisamplePropertiesEXT-pMultisampleProperties-parameter", "pMultisampleProperties must be a valid pointer to a VkMultisamplePropertiesEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceMultisamplePropertiesEXT-pMultisampleProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceMultisamplePropertiesEXT-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceMultisamplePropertiesEXT-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceMultisamplePropertiesEXT-samples-parameter", "samples must be a valid VkSampleCountFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceMultisamplePropertiesEXT-samples-parameter)"},
- {"VUID-vkGetPhysicalDevicePresentRectanglesKHR-commonparent", "Both of physicalDevice, and surface must have been created, allocated, or retrieved from the same VkInstance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDevicePresentRectanglesKHR-commonparent)"},
- {"VUID-vkGetPhysicalDevicePresentRectanglesKHR-pRectCount-parameter", "pRectCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDevicePresentRectanglesKHR-pRectCount-parameter)"},
- {"VUID-vkGetPhysicalDevicePresentRectanglesKHR-pRects-parameter", "If the value referenced by pRectCount is not 0, and pRects is not NULL, pRects must be a valid pointer to an array of pRectCount VkRect2D structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDevicePresentRectanglesKHR-pRects-parameter)"},
- {"VUID-vkGetPhysicalDevicePresentRectanglesKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDevicePresentRectanglesKHR-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDevicePresentRectanglesKHR-surface-parameter", "surface must be a valid VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDevicePresentRectanglesKHR-surface-parameter)"},
- {"VUID-vkGetPhysicalDeviceProperties-pProperties-parameter", "pProperties must be a valid pointer to a VkPhysicalDeviceProperties structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceProperties-pProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceProperties-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceProperties-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceProperties2-pProperties-parameter", "pProperties must be a valid pointer to a VkPhysicalDeviceProperties2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceProperties2-pProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceProperties2-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceProperties2-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR-pNumPasses-parameter", "pNumPasses must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR-pNumPasses-parameter)"},
- {"VUID-vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR-pPerformanceQueryCreateInfo-parameter", "pPerformanceQueryCreateInfo must be a valid pointer to a valid VkQueryPoolPerformanceCreateInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR-pPerformanceQueryCreateInfo-parameter)"},
- {"VUID-vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceQueueFamilyProperties-pQueueFamilyProperties-parameter", "If the value referenced by pQueueFamilyPropertyCount is not 0, and pQueueFamilyProperties is not NULL, pQueueFamilyProperties must be a valid pointer to an array of pQueueFamilyPropertyCount VkQueueFamilyProperties structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceQueueFamilyProperties-pQueueFamilyProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceQueueFamilyProperties-pQueueFamilyPropertyCount-parameter", "pQueueFamilyPropertyCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceQueueFamilyProperties-pQueueFamilyPropertyCount-parameter)"},
- {"VUID-vkGetPhysicalDeviceQueueFamilyProperties-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceQueueFamilyProperties-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceQueueFamilyProperties2-pQueueFamilyProperties-parameter", "If the value referenced by pQueueFamilyPropertyCount is not 0, and pQueueFamilyProperties is not NULL, pQueueFamilyProperties must be a valid pointer to an array of pQueueFamilyPropertyCount VkQueueFamilyProperties2 structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceQueueFamilyProperties2-pQueueFamilyProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceQueueFamilyProperties2-pQueueFamilyPropertyCount-parameter", "pQueueFamilyPropertyCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceQueueFamilyProperties2-pQueueFamilyPropertyCount-parameter)"},
- {"VUID-vkGetPhysicalDeviceQueueFamilyProperties2-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceQueueFamilyProperties2-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-format-parameter", "format must be a valid VkFormat value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties-format-parameter)"},
- {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkSparseImageFormatProperties structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties-pProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties-pPropertyCount-parameter)"},
- {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-samples-01094", "samples must be a bit value that is set in VkImageFormatProperties::sampleCounts returned by vkGetPhysicalDeviceImageFormatProperties with format, type, tiling, and usage equal to those in this command and flags equal to the value that is set in VkImageCreateInfo::flags when the image is created (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties-samples-01094)"},
- {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-samples-parameter", "samples must be a valid VkSampleCountFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties-samples-parameter)"},
- {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-tiling-parameter", "tiling must be a valid VkImageTiling value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties-tiling-parameter)"},
- {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-type-parameter", "type must be a valid VkImageType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties-type-parameter)"},
- {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-usage-parameter", "usage must be a valid combination of VkImageUsageFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties-usage-parameter)"},
- {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-usage-requiredbitmask", "usage must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties-usage-requiredbitmask)"},
- {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pFormatInfo-parameter", "pFormatInfo must be a valid pointer to a valid VkPhysicalDeviceSparseImageFormatInfo2 structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pFormatInfo-parameter)"},
- {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkSparseImageFormatProperties2 structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pPropertyCount-parameter)"},
- {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV-pCombinationCount-parameter", "pCombinationCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV-pCombinationCount-parameter)"},
- {"VUID-vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV-pCombinations-parameter", "If the value referenced by pCombinationCount is not 0, and pCombinations is not NULL, pCombinations must be a valid pointer to an array of pCombinationCount VkFramebufferMixedSamplesCombinationNV structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV-pCombinations-parameter)"},
- {"VUID-vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-commonparent", "Both of physicalDevice, and surface must have been created, allocated, or retrieved from the same VkInstance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-commonparent)"},
- {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-pSurfaceCapabilities-parameter", "pSurfaceCapabilities must be a valid pointer to a VkSurfaceCapabilities2EXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-pSurfaceCapabilities-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-surface-parameter", "surface must be a valid VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-surface-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2KHR-pNext-02671", "If a VkSurfaceCapabilitiesFullScreenExclusiveEXT structure is included in the pNext chain of pSurfaceCapabilities, a VkSurfaceFullScreenExclusiveWin32InfoEXT structure must be included in the pNext chain of pSurfaceInfo. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceCapabilities2KHR-pNext-02671)"},
- {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2KHR-pSurfaceCapabilities-parameter", "pSurfaceCapabilities must be a valid pointer to a VkSurfaceCapabilities2KHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceCapabilities2KHR-pSurfaceCapabilities-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2KHR-pSurfaceInfo-parameter", "pSurfaceInfo must be a valid pointer to a valid VkPhysicalDeviceSurfaceInfo2KHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceCapabilities2KHR-pSurfaceInfo-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2KHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceCapabilities2KHR-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfaceCapabilitiesKHR-commonparent", "Both of physicalDevice, and surface must have been created, allocated, or retrieved from the same VkInstance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceCapabilitiesKHR-commonparent)"},
- {"VUID-vkGetPhysicalDeviceSurfaceCapabilitiesKHR-pSurfaceCapabilities-parameter", "pSurfaceCapabilities must be a valid pointer to a VkSurfaceCapabilitiesKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceCapabilitiesKHR-pSurfaceCapabilities-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfaceCapabilitiesKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceCapabilitiesKHR-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfaceCapabilitiesKHR-surface-parameter", "surface must be a valid VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceCapabilitiesKHR-surface-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-pSurfaceFormatCount-parameter", "pSurfaceFormatCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-pSurfaceFormatCount-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-pSurfaceFormats-parameter", "If the value referenced by pSurfaceFormatCount is not 0, and pSurfaceFormats is not NULL, pSurfaceFormats must be a valid pointer to an array of pSurfaceFormatCount VkSurfaceFormat2KHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-pSurfaceFormats-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-pSurfaceInfo-02740", "pSurfaceInfo->surface must be supported by physicalDevice, as reported by vkGetPhysicalDeviceSurfaceSupportKHR or an equivalent platform-specific mechanism. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-pSurfaceInfo-02740)"},
- {"VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-pSurfaceInfo-parameter", "pSurfaceInfo must be a valid pointer to a valid VkPhysicalDeviceSurfaceInfo2KHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-pSurfaceInfo-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-commonparent", "Both of physicalDevice, and surface must have been created, allocated, or retrieved from the same VkInstance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-commonparent)"},
- {"VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-pSurfaceFormatCount-parameter", "pSurfaceFormatCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-pSurfaceFormatCount-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-pSurfaceFormats-parameter", "If the value referenced by pSurfaceFormatCount is not 0, and pSurfaceFormats is not NULL, pSurfaceFormats must be a valid pointer to an array of pSurfaceFormatCount VkSurfaceFormatKHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-pSurfaceFormats-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-surface-02739", "surface must be supported by physicalDevice, as reported by vkGetPhysicalDeviceSurfaceSupportKHR or an equivalent platform-specific mechanism. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-surface-02739)"},
- {"VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-surface-parameter", "surface must be a valid VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-surface-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfacePresentModes2EXT-pPresentModeCount-parameter", "pPresentModeCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfacePresentModes2EXT-pPresentModeCount-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfacePresentModes2EXT-pPresentModes-parameter", "If the value referenced by pPresentModeCount is not 0, and pPresentModes is not NULL, pPresentModes must be a valid pointer to an array of pPresentModeCount VkPresentModeKHR values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfacePresentModes2EXT-pPresentModes-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfacePresentModes2EXT-pSurfaceInfo-parameter", "pSurfaceInfo must be a valid pointer to a valid VkPhysicalDeviceSurfaceInfo2KHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfacePresentModes2EXT-pSurfaceInfo-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfacePresentModes2EXT-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfacePresentModes2EXT-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-commonparent", "Both of physicalDevice, and surface must have been created, allocated, or retrieved from the same VkInstance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-commonparent)"},
- {"VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-pPresentModeCount-parameter", "pPresentModeCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-pPresentModeCount-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-pPresentModes-parameter", "If the value referenced by pPresentModeCount is not 0, and pPresentModes is not NULL, pPresentModes must be a valid pointer to an array of pPresentModeCount VkPresentModeKHR values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-pPresentModes-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-surface-parameter", "surface must be a valid VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-surface-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfaceSupportKHR-commonparent", "Both of physicalDevice, and surface must have been created, allocated, or retrieved from the same VkInstance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceSupportKHR-commonparent)"},
- {"VUID-vkGetPhysicalDeviceSurfaceSupportKHR-pSupported-parameter", "pSupported must be a valid pointer to a VkBool32 value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceSupportKHR-pSupported-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfaceSupportKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceSupportKHR-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceSurfaceSupportKHR-queueFamilyIndex-01269", "queueFamilyIndex must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the given physicalDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceSupportKHR-queueFamilyIndex-01269)"},
- {"VUID-vkGetPhysicalDeviceSurfaceSupportKHR-surface-parameter", "surface must be a valid VkSurfaceKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceSupportKHR-surface-parameter)"},
- {"VUID-vkGetPhysicalDeviceToolPropertiesEXT-pToolCount-parameter", "pToolCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceToolPropertiesEXT-pToolCount-parameter)"},
- {"VUID-vkGetPhysicalDeviceToolPropertiesEXT-pToolProperties-parameter", "If the value referenced by pToolCount is not 0, and pToolProperties is not NULL, pToolProperties must be a valid pointer to an array of pToolCount VkPhysicalDeviceToolPropertiesEXT structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceToolPropertiesEXT-pToolProperties-parameter)"},
- {"VUID-vkGetPhysicalDeviceToolPropertiesEXT-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceToolPropertiesEXT-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceWaylandPresentationSupportKHR-display-parameter", "display must be a valid pointer to a wl_display value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceWaylandPresentationSupportKHR-display-parameter)"},
- {"VUID-vkGetPhysicalDeviceWaylandPresentationSupportKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceWaylandPresentationSupportKHR-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceWaylandPresentationSupportKHR-queueFamilyIndex-01306", "queueFamilyIndex must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the given physicalDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceWaylandPresentationSupportKHR-queueFamilyIndex-01306)"},
- {"VUID-vkGetPhysicalDeviceWin32PresentationSupportKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceWin32PresentationSupportKHR-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceWin32PresentationSupportKHR-queueFamilyIndex-01309", "queueFamilyIndex must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the given physicalDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceWin32PresentationSupportKHR-queueFamilyIndex-01309)"},
- {"VUID-vkGetPhysicalDeviceXcbPresentationSupportKHR-connection-parameter", "connection must be a valid pointer to an xcb_connection_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceXcbPresentationSupportKHR-connection-parameter)"},
- {"VUID-vkGetPhysicalDeviceXcbPresentationSupportKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceXcbPresentationSupportKHR-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceXcbPresentationSupportKHR-queueFamilyIndex-01312", "queueFamilyIndex must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the given physicalDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceXcbPresentationSupportKHR-queueFamilyIndex-01312)"},
- {"VUID-vkGetPhysicalDeviceXlibPresentationSupportKHR-dpy-parameter", "dpy must be a valid pointer to a Display value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceXlibPresentationSupportKHR-dpy-parameter)"},
- {"VUID-vkGetPhysicalDeviceXlibPresentationSupportKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceXlibPresentationSupportKHR-physicalDevice-parameter)"},
- {"VUID-vkGetPhysicalDeviceXlibPresentationSupportKHR-queueFamilyIndex-01315", "queueFamilyIndex must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the given physicalDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPhysicalDeviceXlibPresentationSupportKHR-queueFamilyIndex-01315)"},
- {"VUID-vkGetPipelineCacheData-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineCacheData-device-parameter)"},
- {"VUID-vkGetPipelineCacheData-pData-parameter", "If the value referenced by pDataSize is not 0, and pData is not NULL, pData must be a valid pointer to an array of pDataSize bytes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineCacheData-pData-parameter)"},
- {"VUID-vkGetPipelineCacheData-pDataSize-parameter", "pDataSize must be a valid pointer to a size_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineCacheData-pDataSize-parameter)"},
- {"VUID-vkGetPipelineCacheData-pipelineCache-parameter", "pipelineCache must be a valid VkPipelineCache handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineCacheData-pipelineCache-parameter)"},
- {"VUID-vkGetPipelineCacheData-pipelineCache-parent", "pipelineCache must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineCacheData-pipelineCache-parent)"},
- {"VUID-vkGetPipelineExecutableInternalRepresentationsKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineExecutableInternalRepresentationsKHR-device-parameter)"},
- {"VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pExecutableInfo-parameter", "pExecutableInfo must be a valid pointer to a valid VkPipelineExecutableInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pExecutableInfo-parameter)"},
- {"VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pInternalRepresentationCount-parameter", "pInternalRepresentationCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pInternalRepresentationCount-parameter)"},
- {"VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pInternalRepresentations-parameter", "If the value referenced by pInternalRepresentationCount is not 0, and pInternalRepresentations is not NULL, pInternalRepresentations must be a valid pointer to an array of pInternalRepresentationCount VkPipelineExecutableInternalRepresentationKHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pInternalRepresentations-parameter)"},
- {"VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pipeline-03277", "pipeline member of pExecutableInfo must have been created with device. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pipeline-03277)"},
- {"VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pipeline-03278", "pipeline member of pExecutableInfo must have been created with VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR set in the flags field of VkGraphicsPipelineCreateInfo or VkComputePipelineCreateInfo. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pipeline-03278)"},
- {"VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pipelineExecutableInfo-03276", "pipelineExecutableInfo must be enabled. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pipelineExecutableInfo-03276)"},
- {"VUID-vkGetPipelineExecutablePropertiesKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineExecutablePropertiesKHR-device-parameter)"},
- {"VUID-vkGetPipelineExecutablePropertiesKHR-pExecutableCount-parameter", "pExecutableCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineExecutablePropertiesKHR-pExecutableCount-parameter)"},
- {"VUID-vkGetPipelineExecutablePropertiesKHR-pPipelineInfo-parameter", "pPipelineInfo must be a valid pointer to a valid VkPipelineInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineExecutablePropertiesKHR-pPipelineInfo-parameter)"},
- {"VUID-vkGetPipelineExecutablePropertiesKHR-pProperties-parameter", "If the value referenced by pExecutableCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pExecutableCount VkPipelineExecutablePropertiesKHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineExecutablePropertiesKHR-pProperties-parameter)"},
- {"VUID-vkGetPipelineExecutablePropertiesKHR-pipeline-03271", "pipeline member of pPipelineInfo must have been created with device. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineExecutablePropertiesKHR-pipeline-03271)"},
- {"VUID-vkGetPipelineExecutablePropertiesKHR-pipelineExecutableInfo-03270", "pipelineExecutableInfo must be enabled. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineExecutablePropertiesKHR-pipelineExecutableInfo-03270)"},
- {"VUID-vkGetPipelineExecutableStatisticsKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineExecutableStatisticsKHR-device-parameter)"},
- {"VUID-vkGetPipelineExecutableStatisticsKHR-pExecutableInfo-parameter", "pExecutableInfo must be a valid pointer to a valid VkPipelineExecutableInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineExecutableStatisticsKHR-pExecutableInfo-parameter)"},
- {"VUID-vkGetPipelineExecutableStatisticsKHR-pStatisticCount-parameter", "pStatisticCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineExecutableStatisticsKHR-pStatisticCount-parameter)"},
- {"VUID-vkGetPipelineExecutableStatisticsKHR-pStatistics-parameter", "If the value referenced by pStatisticCount is not 0, and pStatistics is not NULL, pStatistics must be a valid pointer to an array of pStatisticCount VkPipelineExecutableStatisticKHR structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineExecutableStatisticsKHR-pStatistics-parameter)"},
- {"VUID-vkGetPipelineExecutableStatisticsKHR-pipeline-03273", "pipeline member of pExecutableInfo must have been created with device. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineExecutableStatisticsKHR-pipeline-03273)"},
- {"VUID-vkGetPipelineExecutableStatisticsKHR-pipeline-03274", "pipeline member of pExecutableInfo must have been created with VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR set in the flags field of VkGraphicsPipelineCreateInfo or VkComputePipelineCreateInfo. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineExecutableStatisticsKHR-pipeline-03274)"},
- {"VUID-vkGetPipelineExecutableStatisticsKHR-pipelineExecutableInfo-03272", "pipelineExecutableInfo must be enabled. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetPipelineExecutableStatisticsKHR-pipelineExecutableInfo-03272)"},
- {"VUID-vkGetQueryPoolResults-dataSize-00817", "dataSize must be large enough to contain the result of each query, as described here (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetQueryPoolResults-dataSize-00817)"},
- {"VUID-vkGetQueryPoolResults-dataSize-arraylength", "dataSize must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetQueryPoolResults-dataSize-arraylength)"},
- {"VUID-vkGetQueryPoolResults-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetQueryPoolResults-device-parameter)"},
- {"VUID-vkGetQueryPoolResults-firstQuery-00813", "firstQuery must be less than the number of queries in queryPool (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetQueryPoolResults-firstQuery-00813)"},
- {"VUID-vkGetQueryPoolResults-firstQuery-00816", "The sum of firstQuery and queryCount must be less than or equal to the number of queries in queryPool (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetQueryPoolResults-firstQuery-00816)"},
- {"VUID-vkGetQueryPoolResults-flags-00815", "If VK_QUERY_RESULT_64_BIT is set in flags then pData and stride must be multiples of 8 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetQueryPoolResults-flags-00815)"},
- {"VUID-vkGetQueryPoolResults-flags-02827", "If VK_QUERY_RESULT_64_BIT is not set in flags, then pData and stride must be multiples of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetQueryPoolResults-flags-02827)"},
- {"VUID-vkGetQueryPoolResults-flags-02828", "If VK_QUERY_RESULT_64_BIT is not set in flags and the queryType used to create queryPool was not VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, then pData and stride must be multiples of 4 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetQueryPoolResults-flags-02828)"},
- {"VUID-vkGetQueryPoolResults-flags-parameter", "flags must be a valid combination of VkQueryResultFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetQueryPoolResults-flags-parameter)"},
- {"VUID-vkGetQueryPoolResults-pData-parameter", "pData must be a valid pointer to an array of dataSize bytes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetQueryPoolResults-pData-parameter)"},
- {"VUID-vkGetQueryPoolResults-queryPool-parameter", "queryPool must be a valid VkQueryPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetQueryPoolResults-queryPool-parameter)"},
- {"VUID-vkGetQueryPoolResults-queryPool-parent", "queryPool must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetQueryPoolResults-queryPool-parent)"},
- {"VUID-vkGetQueryPoolResults-queryType-00818", "If the queryType used to create queryPool was VK_QUERY_TYPE_TIMESTAMP, flags must not contain VK_QUERY_RESULT_PARTIAL_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetQueryPoolResults-queryType-00818)"},
- {"VUID-vkGetQueryPoolResults-queryType-03229", "If the queryType used to create queryPool was VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, then pData and stride must be multiples of the size of VkPerformanceCounterResultKHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetQueryPoolResults-queryType-03229)"},
- {"VUID-vkGetQueryPoolResults-queryType-03230", "If the queryType used to create queryPool was VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, flags must not contain VK_QUERY_RESULT_WITH_AVAILABILITY_BIT, VK_QUERY_RESULT_PARTIAL_BIT or VK_QUERY_RESULT_64_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetQueryPoolResults-queryType-03230)"},
- {"VUID-vkGetQueryPoolResults-queryType-03231", "If the queryType used to create queryPool was VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, the queryPool must have been recorded once for each pass as retrieved via a call to vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetQueryPoolResults-queryType-03231)"},
- {"VUID-vkGetQueueCheckpointDataNV-pCheckpointData-parameter", "If the value referenced by pCheckpointDataCount is not 0, and pCheckpointData is not NULL, pCheckpointData must be a valid pointer to an array of pCheckpointDataCount VkCheckpointDataNV structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetQueueCheckpointDataNV-pCheckpointData-parameter)"},
- {"VUID-vkGetQueueCheckpointDataNV-pCheckpointDataCount-parameter", "pCheckpointDataCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetQueueCheckpointDataNV-pCheckpointDataCount-parameter)"},
- {"VUID-vkGetQueueCheckpointDataNV-queue-02025", "The device that queue belongs to must be in the lost state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetQueueCheckpointDataNV-queue-02025)"},
- {"VUID-vkGetQueueCheckpointDataNV-queue-parameter", "queue must be a valid VkQueue handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetQueueCheckpointDataNV-queue-parameter)"},
- {"VUID-vkGetRandROutputDisplayEXT-dpy-parameter", "dpy must be a valid pointer to a Display value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRandROutputDisplayEXT-dpy-parameter)"},
- {"VUID-vkGetRandROutputDisplayEXT-pDisplay-parameter", "pDisplay must be a valid pointer to a VkDisplayKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRandROutputDisplayEXT-pDisplay-parameter)"},
- {"VUID-vkGetRandROutputDisplayEXT-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRandROutputDisplayEXT-physicalDevice-parameter)"},
- {"VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-dataSize-03484", "dataSize must be at least VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleCaptureReplaySize {times} groupCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-dataSize-03484)"},
- {"VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-dataSize-arraylength", "dataSize must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-dataSize-arraylength)"},
- {"VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-device-parameter)"},
- {"VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-firstGroup-03483", "The sum of firstGroup and groupCount must be less than the number of shader groups in pipeline. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-firstGroup-03483)"},
- {"VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pData-parameter", "pData must be a valid pointer to an array of dataSize bytes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pData-parameter)"},
- {"VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pipeline-parameter", "pipeline must be a valid VkPipeline handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pipeline-parameter)"},
- {"VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pipeline-parent", "pipeline must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pipeline-parent)"},
- {"VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-rayTracingShaderGroupHandleCaptureReplay-03485", "VkPhysicalDeviceRayTracingFeaturesKHR::rayTracingShaderGroupHandleCaptureReplay must be enabled to call this function. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-rayTracingShaderGroupHandleCaptureReplay-03485)"},
- {"VUID-vkGetRayTracingShaderGroupHandlesKHR-dataSize-02420", "dataSize must be at least VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize {times} groupCount (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRayTracingShaderGroupHandlesKHR-dataSize-02420)"},
- {"VUID-vkGetRayTracingShaderGroupHandlesKHR-dataSize-arraylength", "dataSize must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRayTracingShaderGroupHandlesKHR-dataSize-arraylength)"},
- {"VUID-vkGetRayTracingShaderGroupHandlesKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRayTracingShaderGroupHandlesKHR-device-parameter)"},
- {"VUID-vkGetRayTracingShaderGroupHandlesKHR-firstGroup-02419", "The sum of firstGroup and groupCount must be less than the number of shader groups in pipeline. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRayTracingShaderGroupHandlesKHR-firstGroup-02419)"},
- {"VUID-vkGetRayTracingShaderGroupHandlesKHR-pData-parameter", "pData must be a valid pointer to an array of dataSize bytes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRayTracingShaderGroupHandlesKHR-pData-parameter)"},
- {"VUID-vkGetRayTracingShaderGroupHandlesKHR-pipeline-03482", "pipeline must have not been created with VK_PIPELINE_CREATE_LIBRARY_BIT_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRayTracingShaderGroupHandlesKHR-pipeline-03482)"},
- {"VUID-vkGetRayTracingShaderGroupHandlesKHR-pipeline-parameter", "pipeline must be a valid VkPipeline handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRayTracingShaderGroupHandlesKHR-pipeline-parameter)"},
- {"VUID-vkGetRayTracingShaderGroupHandlesKHR-pipeline-parent", "pipeline must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRayTracingShaderGroupHandlesKHR-pipeline-parent)"},
- {"VUID-vkGetRefreshCycleDurationGOOGLE-commonparent", "Both of device, and swapchain must have been created, allocated, or retrieved from the same VkInstance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRefreshCycleDurationGOOGLE-commonparent)"},
- {"VUID-vkGetRefreshCycleDurationGOOGLE-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRefreshCycleDurationGOOGLE-device-parameter)"},
- {"VUID-vkGetRefreshCycleDurationGOOGLE-pDisplayTimingProperties-parameter", "pDisplayTimingProperties must be a valid pointer to a VkRefreshCycleDurationGOOGLE structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRefreshCycleDurationGOOGLE-pDisplayTimingProperties-parameter)"},
- {"VUID-vkGetRefreshCycleDurationGOOGLE-swapchain-parameter", "swapchain must be a valid VkSwapchainKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRefreshCycleDurationGOOGLE-swapchain-parameter)"},
- {"VUID-vkGetRenderAreaGranularity-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRenderAreaGranularity-device-parameter)"},
- {"VUID-vkGetRenderAreaGranularity-pGranularity-parameter", "pGranularity must be a valid pointer to a VkExtent2D structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRenderAreaGranularity-pGranularity-parameter)"},
- {"VUID-vkGetRenderAreaGranularity-renderPass-parameter", "renderPass must be a valid VkRenderPass handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRenderAreaGranularity-renderPass-parameter)"},
- {"VUID-vkGetRenderAreaGranularity-renderPass-parent", "renderPass must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetRenderAreaGranularity-renderPass-parent)"},
- {"VUID-vkGetSemaphoreCounterValue-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSemaphoreCounterValue-device-parameter)"},
- {"VUID-vkGetSemaphoreCounterValue-pValue-parameter", "pValue must be a valid pointer to a uint64_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSemaphoreCounterValue-pValue-parameter)"},
- {"VUID-vkGetSemaphoreCounterValue-semaphore-03255", "semaphore must have been created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSemaphoreCounterValue-semaphore-03255)"},
- {"VUID-vkGetSemaphoreCounterValue-semaphore-parameter", "semaphore must be a valid VkSemaphore handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSemaphoreCounterValue-semaphore-parameter)"},
- {"VUID-vkGetSemaphoreCounterValue-semaphore-parent", "semaphore must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSemaphoreCounterValue-semaphore-parent)"},
- {"VUID-vkGetSemaphoreFdKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSemaphoreFdKHR-device-parameter)"},
- {"VUID-vkGetSemaphoreFdKHR-pFd-parameter", "pFd must be a valid pointer to an int value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSemaphoreFdKHR-pFd-parameter)"},
- {"VUID-vkGetSemaphoreFdKHR-pGetFdInfo-parameter", "pGetFdInfo must be a valid pointer to a valid VkSemaphoreGetFdInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSemaphoreFdKHR-pGetFdInfo-parameter)"},
- {"VUID-vkGetSemaphoreWin32HandleKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSemaphoreWin32HandleKHR-device-parameter)"},
- {"VUID-vkGetSemaphoreWin32HandleKHR-pGetWin32HandleInfo-parameter", "pGetWin32HandleInfo must be a valid pointer to a valid VkSemaphoreGetWin32HandleInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSemaphoreWin32HandleKHR-pGetWin32HandleInfo-parameter)"},
- {"VUID-vkGetSemaphoreWin32HandleKHR-pHandle-parameter", "pHandle must be a valid pointer to a HANDLE value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSemaphoreWin32HandleKHR-pHandle-parameter)"},
- {"VUID-vkGetShaderInfoAMD-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetShaderInfoAMD-device-parameter)"},
- {"VUID-vkGetShaderInfoAMD-infoType-parameter", "infoType must be a valid VkShaderInfoTypeAMD value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetShaderInfoAMD-infoType-parameter)"},
- {"VUID-vkGetShaderInfoAMD-pInfo-parameter", "If the value referenced by pInfoSize is not 0, and pInfo is not NULL, pInfo must be a valid pointer to an array of pInfoSize bytes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetShaderInfoAMD-pInfo-parameter)"},
- {"VUID-vkGetShaderInfoAMD-pInfoSize-parameter", "pInfoSize must be a valid pointer to a size_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetShaderInfoAMD-pInfoSize-parameter)"},
- {"VUID-vkGetShaderInfoAMD-pipeline-parameter", "pipeline must be a valid VkPipeline handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetShaderInfoAMD-pipeline-parameter)"},
- {"VUID-vkGetShaderInfoAMD-pipeline-parent", "pipeline must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetShaderInfoAMD-pipeline-parent)"},
- {"VUID-vkGetShaderInfoAMD-shaderStage-parameter", "shaderStage must be a valid VkShaderStageFlagBits value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetShaderInfoAMD-shaderStage-parameter)"},
- {"VUID-vkGetSwapchainCounterEXT-commonparent", "Both of device, and swapchain must have been created, allocated, or retrieved from the same VkInstance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSwapchainCounterEXT-commonparent)"},
- {"VUID-vkGetSwapchainCounterEXT-counter-parameter", "counter must be a valid VkSurfaceCounterFlagBitsEXT value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSwapchainCounterEXT-counter-parameter)"},
- {"VUID-vkGetSwapchainCounterEXT-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSwapchainCounterEXT-device-parameter)"},
- {"VUID-vkGetSwapchainCounterEXT-pCounterValue-parameter", "pCounterValue must be a valid pointer to a uint64_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSwapchainCounterEXT-pCounterValue-parameter)"},
- {"VUID-vkGetSwapchainCounterEXT-swapchain-01245", "One or more present commands on swapchain must have been processed by the presentation engine. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSwapchainCounterEXT-swapchain-01245)"},
- {"VUID-vkGetSwapchainCounterEXT-swapchain-parameter", "swapchain must be a valid VkSwapchainKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSwapchainCounterEXT-swapchain-parameter)"},
- {"VUID-vkGetSwapchainImagesKHR-commonparent", "Both of device, and swapchain must have been created, allocated, or retrieved from the same VkInstance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSwapchainImagesKHR-commonparent)"},
- {"VUID-vkGetSwapchainImagesKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSwapchainImagesKHR-device-parameter)"},
- {"VUID-vkGetSwapchainImagesKHR-pSwapchainImageCount-parameter", "pSwapchainImageCount must be a valid pointer to a uint32_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSwapchainImagesKHR-pSwapchainImageCount-parameter)"},
- {"VUID-vkGetSwapchainImagesKHR-pSwapchainImages-parameter", "If the value referenced by pSwapchainImageCount is not 0, and pSwapchainImages is not NULL, pSwapchainImages must be a valid pointer to an array of pSwapchainImageCount VkImage handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSwapchainImagesKHR-pSwapchainImages-parameter)"},
- {"VUID-vkGetSwapchainImagesKHR-swapchain-parameter", "swapchain must be a valid VkSwapchainKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSwapchainImagesKHR-swapchain-parameter)"},
- {"VUID-vkGetSwapchainStatusKHR-commonparent", "Both of device, and swapchain must have been created, allocated, or retrieved from the same VkInstance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSwapchainStatusKHR-commonparent)"},
- {"VUID-vkGetSwapchainStatusKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSwapchainStatusKHR-device-parameter)"},
- {"VUID-vkGetSwapchainStatusKHR-swapchain-parameter", "swapchain must be a valid VkSwapchainKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetSwapchainStatusKHR-swapchain-parameter)"},
- {"VUID-vkGetValidationCacheDataEXT-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetValidationCacheDataEXT-device-parameter)"},
- {"VUID-vkGetValidationCacheDataEXT-pData-parameter", "If the value referenced by pDataSize is not 0, and pData is not NULL, pData must be a valid pointer to an array of pDataSize bytes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetValidationCacheDataEXT-pData-parameter)"},
- {"VUID-vkGetValidationCacheDataEXT-pDataSize-parameter", "pDataSize must be a valid pointer to a size_t value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetValidationCacheDataEXT-pDataSize-parameter)"},
- {"VUID-vkGetValidationCacheDataEXT-validationCache-parameter", "validationCache must be a valid VkValidationCacheEXT handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetValidationCacheDataEXT-validationCache-parameter)"},
- {"VUID-vkGetValidationCacheDataEXT-validationCache-parent", "validationCache must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkGetValidationCacheDataEXT-validationCache-parent)"},
- {"VUID-vkImportFenceFdKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkImportFenceFdKHR-device-parameter)"},
- {"VUID-vkImportFenceFdKHR-fence-01463", "fence must not be associated with any queue command that has not yet completed execution on that queue (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkImportFenceFdKHR-fence-01463)"},
- {"VUID-vkImportFenceFdKHR-pImportFenceFdInfo-parameter", "pImportFenceFdInfo must be a valid pointer to a valid VkImportFenceFdInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkImportFenceFdKHR-pImportFenceFdInfo-parameter)"},
- {"VUID-vkImportFenceWin32HandleKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkImportFenceWin32HandleKHR-device-parameter)"},
- {"VUID-vkImportFenceWin32HandleKHR-pImportFenceWin32HandleInfo-parameter", "pImportFenceWin32HandleInfo must be a valid pointer to a valid VkImportFenceWin32HandleInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkImportFenceWin32HandleKHR-pImportFenceWin32HandleInfo-parameter)"},
- {"VUID-vkImportSemaphoreFdKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkImportSemaphoreFdKHR-device-parameter)"},
- {"VUID-vkImportSemaphoreFdKHR-pImportSemaphoreFdInfo-parameter", "pImportSemaphoreFdInfo must be a valid pointer to a valid VkImportSemaphoreFdInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkImportSemaphoreFdKHR-pImportSemaphoreFdInfo-parameter)"},
- {"VUID-vkImportSemaphoreFdKHR-semaphore-01142", "semaphore must not be associated with any queue command that has not yet completed execution on that queue (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkImportSemaphoreFdKHR-semaphore-01142)"},
- {"VUID-vkImportSemaphoreWin32HandleKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkImportSemaphoreWin32HandleKHR-device-parameter)"},
- {"VUID-vkImportSemaphoreWin32HandleKHR-pImportSemaphoreWin32HandleInfo-parameter", "pImportSemaphoreWin32HandleInfo must be a valid pointer to a valid VkImportSemaphoreWin32HandleInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkImportSemaphoreWin32HandleKHR-pImportSemaphoreWin32HandleInfo-parameter)"},
- {"VUID-vkInitializePerformanceApiINTEL-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkInitializePerformanceApiINTEL-device-parameter)"},
- {"VUID-vkInitializePerformanceApiINTEL-pInitializeInfo-parameter", "pInitializeInfo must be a valid pointer to a valid VkInitializePerformanceApiInfoINTEL structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkInitializePerformanceApiINTEL-pInitializeInfo-parameter)"},
- {"VUID-vkInvalidateMappedMemoryRanges-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkInvalidateMappedMemoryRanges-device-parameter)"},
- {"VUID-vkInvalidateMappedMemoryRanges-memoryRangeCount-arraylength", "memoryRangeCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkInvalidateMappedMemoryRanges-memoryRangeCount-arraylength)"},
- {"VUID-vkInvalidateMappedMemoryRanges-pMemoryRanges-parameter", "pMemoryRanges must be a valid pointer to an array of memoryRangeCount valid VkMappedMemoryRange structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkInvalidateMappedMemoryRanges-pMemoryRanges-parameter)"},
- {"VUID-vkMapMemory-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMapMemory-device-parameter)"},
- {"VUID-vkMapMemory-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMapMemory-flags-zerobitmask)"},
- {"VUID-vkMapMemory-memory-00678", "memory must not be currently host mapped (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMapMemory-memory-00678)"},
- {"VUID-vkMapMemory-memory-00682", "memory must have been created with a memory type that reports VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMapMemory-memory-00682)"},
- {"VUID-vkMapMemory-memory-00683", "memory must not have been allocated with multiple instances. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMapMemory-memory-00683)"},
- {"VUID-vkMapMemory-memory-parameter", "memory must be a valid VkDeviceMemory handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMapMemory-memory-parameter)"},
- {"VUID-vkMapMemory-memory-parent", "memory must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMapMemory-memory-parent)"},
- {"VUID-vkMapMemory-offset-00679", "offset must be less than the size of memory (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMapMemory-offset-00679)"},
- {"VUID-vkMapMemory-ppData-parameter", "ppData must be a valid pointer to a pointer value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMapMemory-ppData-parameter)"},
- {"VUID-vkMapMemory-size-00680", "If size is not equal to VK_WHOLE_SIZE, size must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMapMemory-size-00680)"},
- {"VUID-vkMapMemory-size-00681", "If size is not equal to VK_WHOLE_SIZE, size must be less than or equal to the size of the memory minus offset (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMapMemory-size-00681)"},
- {"VUID-vkMergePipelineCaches-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMergePipelineCaches-device-parameter)"},
- {"VUID-vkMergePipelineCaches-dstCache-00770", "dstCache must not appear in the list of source caches (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMergePipelineCaches-dstCache-00770)"},
- {"VUID-vkMergePipelineCaches-dstCache-parameter", "dstCache must be a valid VkPipelineCache handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMergePipelineCaches-dstCache-parameter)"},
- {"VUID-vkMergePipelineCaches-dstCache-parent", "dstCache must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMergePipelineCaches-dstCache-parent)"},
- {"VUID-vkMergePipelineCaches-pSrcCaches-parameter", "pSrcCaches must be a valid pointer to an array of srcCacheCount valid VkPipelineCache handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMergePipelineCaches-pSrcCaches-parameter)"},
- {"VUID-vkMergePipelineCaches-pSrcCaches-parent", "Each element of pSrcCaches must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMergePipelineCaches-pSrcCaches-parent)"},
- {"VUID-vkMergePipelineCaches-srcCacheCount-arraylength", "srcCacheCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMergePipelineCaches-srcCacheCount-arraylength)"},
- {"VUID-vkMergeValidationCachesEXT-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMergeValidationCachesEXT-device-parameter)"},
- {"VUID-vkMergeValidationCachesEXT-dstCache-01536", "dstCache must not appear in the list of source caches (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMergeValidationCachesEXT-dstCache-01536)"},
- {"VUID-vkMergeValidationCachesEXT-dstCache-parameter", "dstCache must be a valid VkValidationCacheEXT handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMergeValidationCachesEXT-dstCache-parameter)"},
- {"VUID-vkMergeValidationCachesEXT-dstCache-parent", "dstCache must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMergeValidationCachesEXT-dstCache-parent)"},
- {"VUID-vkMergeValidationCachesEXT-pSrcCaches-parameter", "pSrcCaches must be a valid pointer to an array of srcCacheCount valid VkValidationCacheEXT handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMergeValidationCachesEXT-pSrcCaches-parameter)"},
- {"VUID-vkMergeValidationCachesEXT-pSrcCaches-parent", "Each element of pSrcCaches must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMergeValidationCachesEXT-pSrcCaches-parent)"},
- {"VUID-vkMergeValidationCachesEXT-srcCacheCount-arraylength", "srcCacheCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkMergeValidationCachesEXT-srcCacheCount-arraylength)"},
- {"VUID-vkQueueBeginDebugUtilsLabelEXT-pLabelInfo-parameter", "pLabelInfo must be a valid pointer to a valid VkDebugUtilsLabelEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueBeginDebugUtilsLabelEXT-pLabelInfo-parameter)"},
- {"VUID-vkQueueBeginDebugUtilsLabelEXT-queue-parameter", "queue must be a valid VkQueue handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueBeginDebugUtilsLabelEXT-queue-parameter)"},
- {"VUID-vkQueueBindSparse-commonparent", "Both of fence, and queue that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueBindSparse-commonparent)"},
- {"VUID-vkQueueBindSparse-fence-01113", "If fence is not VK_NULL_HANDLE, fence must be unsignaled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueBindSparse-fence-01113)"},
- {"VUID-vkQueueBindSparse-fence-01114", "If fence is not VK_NULL_HANDLE, fence must not be associated with any other queue command that has not yet completed execution on that queue (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueBindSparse-fence-01114)"},
- {"VUID-vkQueueBindSparse-fence-parameter", "If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueBindSparse-fence-parameter)"},
- {"VUID-vkQueueBindSparse-pBindInfo-parameter", "If bindInfoCount is not 0, pBindInfo must be a valid pointer to an array of bindInfoCount valid VkBindSparseInfo structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueBindSparse-pBindInfo-parameter)"},
- {"VUID-vkQueueBindSparse-pSignalSemaphores-01115", "Each element of the pSignalSemaphores member of each element of pBindInfo must be unsignaled when the semaphore signal operation it defines is executed on the device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueBindSparse-pSignalSemaphores-01115)"},
- {"VUID-vkQueueBindSparse-pWaitSemaphores-01116", "When a semaphore wait operation referring to a binary semaphore defined by any element of the pWaitSemaphores member of any element of pBindInfo executes on queue, there must be no other queues waiting on the same semaphore. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueBindSparse-pWaitSemaphores-01116)"},
- {"VUID-vkQueueBindSparse-pWaitSemaphores-01117", "All elements of the pWaitSemaphores member of all elements of pBindInfo member referring to a binary semaphore must be semaphores that are signaled, or have semaphore signal operations previously submitted for execution. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueBindSparse-pWaitSemaphores-01117)"},
- {"VUID-vkQueueBindSparse-pWaitSemaphores-03245", "All elements of the pWaitSemaphores member of all elements of pBindInfo created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_BINARY must reference a semaphore signal operation that has been submitted for execution and any semaphore signal operations on which it depends (if any) must have also been submitted for execution. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueBindSparse-pWaitSemaphores-03245)"},
- {"VUID-vkQueueBindSparse-queue-parameter", "queue must be a valid VkQueue handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueBindSparse-queue-parameter)"},
- {"VUID-vkQueueBindSparse-queuetype", "The queue must support sparse binding operations (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueBindSparse-queuetype)"},
- {"VUID-vkQueueEndDebugUtilsLabelEXT-None-01911", "There must be an outstanding vkQueueBeginDebugUtilsLabelEXT command prior to the vkQueueEndDebugUtilsLabelEXT on the queue (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueEndDebugUtilsLabelEXT-None-01911)"},
- {"VUID-vkQueueEndDebugUtilsLabelEXT-queue-parameter", "queue must be a valid VkQueue handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueEndDebugUtilsLabelEXT-queue-parameter)"},
- {"VUID-vkQueueInsertDebugUtilsLabelEXT-pLabelInfo-parameter", "pLabelInfo must be a valid pointer to a valid VkDebugUtilsLabelEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueInsertDebugUtilsLabelEXT-pLabelInfo-parameter)"},
- {"VUID-vkQueueInsertDebugUtilsLabelEXT-queue-parameter", "queue must be a valid VkQueue handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueInsertDebugUtilsLabelEXT-queue-parameter)"},
- {"VUID-vkQueuePresentKHR-pPresentInfo-parameter", "pPresentInfo must be a valid pointer to a valid VkPresentInfoKHR structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueuePresentKHR-pPresentInfo-parameter)"},
- {"VUID-vkQueuePresentKHR-pSwapchains-01292", "Each element of pSwapchains member of pPresentInfo must be a swapchain that is created for a surface for which presentation is supported from queue as determined using a call to vkGetPhysicalDeviceSurfaceSupportKHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueuePresentKHR-pSwapchains-01292)"},
- {"VUID-vkQueuePresentKHR-pSwapchains-01293", "If more than one member of pSwapchains was created from a display surface, all display surfaces referenced that refer to the same display must use the same display mode (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueuePresentKHR-pSwapchains-01293)"},
- {"VUID-vkQueuePresentKHR-pWaitSemaphores-01294", "When a semaphore wait operation referring to a binary semaphore defined by the elements of the pWaitSemaphores member of pPresentInfo executes on queue, there must be no other queues waiting on the same semaphore. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueuePresentKHR-pWaitSemaphores-01294)"},
- {"VUID-vkQueuePresentKHR-pWaitSemaphores-01295", "All elements of the pWaitSemaphores member of pPresentInfo must be semaphores that are signaled, or have semaphore signal operations previously submitted for execution. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueuePresentKHR-pWaitSemaphores-01295)"},
- {"VUID-vkQueuePresentKHR-pWaitSemaphores-03267", "All elements of the pWaitSemaphores member of pPresentInfo must be created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_BINARY. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueuePresentKHR-pWaitSemaphores-03267)"},
- {"VUID-vkQueuePresentKHR-pWaitSemaphores-03268", "All elements of the pWaitSemaphores member of pPresentInfo must reference a semaphore signal operation that has been submitted for execution and any semaphore signal operations on which it depends (if any) must have also been submitted for execution. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueuePresentKHR-pWaitSemaphores-03268)"},
- {"VUID-vkQueuePresentKHR-queue-parameter", "queue must be a valid VkQueue handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueuePresentKHR-queue-parameter)"},
- {"VUID-vkQueueSetPerformanceConfigurationINTEL-commonparent", "Both of configuration, and queue must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueSetPerformanceConfigurationINTEL-commonparent)"},
- {"VUID-vkQueueSetPerformanceConfigurationINTEL-configuration-parameter", "configuration must be a valid VkPerformanceConfigurationINTEL handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueSetPerformanceConfigurationINTEL-configuration-parameter)"},
- {"VUID-vkQueueSetPerformanceConfigurationINTEL-queue-parameter", "queue must be a valid VkQueue handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueSetPerformanceConfigurationINTEL-queue-parameter)"},
- {"VUID-vkQueueSubmit-commonparent", "Both of fence, and queue that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueSubmit-commonparent)"},
- {"VUID-vkQueueSubmit-fence-00063", "If fence is not VK_NULL_HANDLE, fence must be unsignaled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueSubmit-fence-00063)"},
- {"VUID-vkQueueSubmit-fence-00064", "If fence is not VK_NULL_HANDLE, fence must not be associated with any other queue command that has not yet completed execution on that queue (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueSubmit-fence-00064)"},
- {"VUID-vkQueueSubmit-fence-parameter", "If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueSubmit-fence-parameter)"},
- {"VUID-vkQueueSubmit-pCommandBuffers-00065", "Any calls to vkCmdSetEvent, vkCmdResetEvent or vkCmdWaitEvents that have been recorded into any of the command buffer elements of the pCommandBuffers member of any element of pSubmits, must not reference any VkEvent that is referenced by any of those commands in a command buffer that has been submitted to another queue and is still in the pending state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueSubmit-pCommandBuffers-00065)"},
- {"VUID-vkQueueSubmit-pCommandBuffers-00070", "Each element of the pCommandBuffers member of each element of pSubmits must be in the pending or executable state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueSubmit-pCommandBuffers-00070)"},
- {"VUID-vkQueueSubmit-pCommandBuffers-00071", "If any element of the pCommandBuffers member of any element of pSubmits was not recorded with the VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, it must not be in the pending state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueSubmit-pCommandBuffers-00071)"},
- {"VUID-vkQueueSubmit-pCommandBuffers-00072", "Any secondary command buffers recorded into any element of the pCommandBuffers member of any element of pSubmits must be in the pending or executable state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueSubmit-pCommandBuffers-00072)"},
- {"VUID-vkQueueSubmit-pCommandBuffers-00073", "If any secondary command buffers recorded into any element of the pCommandBuffers member of any element of pSubmits was not recorded with the VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, it must not be in the pending state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueSubmit-pCommandBuffers-00073)"},
- {"VUID-vkQueueSubmit-pCommandBuffers-00074", "Each element of the pCommandBuffers member of each element of pSubmits must have been allocated from a VkCommandPool that was created for the same queue family queue belongs to (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueSubmit-pCommandBuffers-00074)"},
- {"VUID-vkQueueSubmit-pCommandBuffers-03220", "If a command recorded into any element of pCommandBuffers was a vkCmdBeginQuery whose queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, the profiling lock must have been held continuously on the VkDevice that queue was retrieved from, throughout recording of those command buffers (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueSubmit-pCommandBuffers-03220)"},
- {"VUID-vkQueueSubmit-pSignalSemaphores-00067", "Each element of the pSignalSemaphores member of any element of pSubmits must be unsignaled when the semaphore signal operation it defines is executed on the device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueSubmit-pSignalSemaphores-00067)"},
- {"VUID-vkQueueSubmit-pSubmits-02207", "If any element of pSubmits->pCommandBuffers includes a Queue Family Transfer Acquire Operation, there must exist a previously submitted Queue Family Transfer Release Operation on a queue in the queue family identified by the acquire operation, with parameters matching the acquire operation as defined in the definition of such acquire operations, and which happens-before the acquire operation (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueSubmit-pSubmits-02207)"},
- {"VUID-vkQueueSubmit-pSubmits-02808", "Any resource created with VK_SHARING_MODE_EXCLUSIVE that is read by an operation specified by pSubmits must not be owned by any queue family other than the one which queue belongs to, at the time it is executed (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueSubmit-pSubmits-02808)"},
- {"VUID-vkQueueSubmit-pSubmits-parameter", "If submitCount is not 0, pSubmits must be a valid pointer to an array of submitCount valid VkSubmitInfo structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueSubmit-pSubmits-parameter)"},
- {"VUID-vkQueueSubmit-pWaitDstStageMask-00066", "Any stage flag included in any element of the pWaitDstStageMask member of any element of pSubmits must be a pipeline stage supported by one of the capabilities of queue, as specified in the table of supported pipeline stages (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueSubmit-pWaitDstStageMask-00066)"},
- {"VUID-vkQueueSubmit-pWaitSemaphores-00068", "When a semaphore wait operation referring to a binary semaphore defined by any element of the pWaitSemaphores member of any element of pSubmits executes on queue, there must be no other queues waiting on the same semaphore (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueSubmit-pWaitSemaphores-00068)"},
- {"VUID-vkQueueSubmit-pWaitSemaphores-00069", "All elements of the pWaitSemaphores member of all elements of pSubmits must be semaphores that are signaled, or have semaphore signal operations previously submitted for execution (https://www.khronos.org/registry/vulkan/specs/1.1/html/vkspec.html#VUID-vkQueueSubmit-pWaitSemaphores-00069)"},
- {"VUID-vkQueueSubmit-pWaitSemaphores-03238", "All elements of the pWaitSemaphores member of all elements of pSubmits created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_BINARY must reference a semaphore signal operation that has been submitted for execution and any semaphore signal operations on which it depends (if any) must have also been submitted for execution (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueSubmit-pWaitSemaphores-03238)"},
- {"VUID-vkQueueSubmit-queue-parameter", "queue must be a valid VkQueue handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueSubmit-queue-parameter)"},
- {"VUID-vkQueueWaitIdle-queue-parameter", "queue must be a valid VkQueue handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkQueueWaitIdle-queue-parameter)"},
- {"VUID-vkRegisterDeviceEventEXT-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkRegisterDeviceEventEXT-device-parameter)"},
- {"VUID-vkRegisterDeviceEventEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkRegisterDeviceEventEXT-pAllocator-parameter)"},
- {"VUID-vkRegisterDeviceEventEXT-pDeviceEventInfo-parameter", "pDeviceEventInfo must be a valid pointer to a valid VkDeviceEventInfoEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkRegisterDeviceEventEXT-pDeviceEventInfo-parameter)"},
- {"VUID-vkRegisterDeviceEventEXT-pFence-parameter", "pFence must be a valid pointer to a VkFence handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkRegisterDeviceEventEXT-pFence-parameter)"},
- {"VUID-vkRegisterDisplayEventEXT-commonparent", "Both of device, and display must have been created, allocated, or retrieved from the same VkPhysicalDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkRegisterDisplayEventEXT-commonparent)"},
- {"VUID-vkRegisterDisplayEventEXT-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkRegisterDisplayEventEXT-device-parameter)"},
- {"VUID-vkRegisterDisplayEventEXT-display-parameter", "display must be a valid VkDisplayKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkRegisterDisplayEventEXT-display-parameter)"},
- {"VUID-vkRegisterDisplayEventEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkRegisterDisplayEventEXT-pAllocator-parameter)"},
- {"VUID-vkRegisterDisplayEventEXT-pDisplayEventInfo-parameter", "pDisplayEventInfo must be a valid pointer to a valid VkDisplayEventInfoEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkRegisterDisplayEventEXT-pDisplayEventInfo-parameter)"},
- {"VUID-vkRegisterDisplayEventEXT-pFence-parameter", "pFence must be a valid pointer to a VkFence handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkRegisterDisplayEventEXT-pFence-parameter)"},
- {"VUID-vkReleaseDisplayEXT-display-parameter", "display must be a valid VkDisplayKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkReleaseDisplayEXT-display-parameter)"},
- {"VUID-vkReleaseDisplayEXT-display-parent", "display must have been created, allocated, or retrieved from physicalDevice (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkReleaseDisplayEXT-display-parent)"},
- {"VUID-vkReleaseDisplayEXT-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkReleaseDisplayEXT-physicalDevice-parameter)"},
- {"VUID-vkReleaseFullScreenExclusiveModeEXT-swapchain-02677", "swapchain must not be in the retired state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkReleaseFullScreenExclusiveModeEXT-swapchain-02677)"},
- {"VUID-vkReleaseFullScreenExclusiveModeEXT-swapchain-02678", "swapchain must be a swapchain created with a VkSurfaceFullScreenExclusiveInfoEXT structure, with fullScreenExclusive set to VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkReleaseFullScreenExclusiveModeEXT-swapchain-02678)"},
- {"VUID-vkReleasePerformanceConfigurationINTEL-configuration-02737", "configuration must not be released before all command buffers submitted while the configuration was set are in pending state. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkReleasePerformanceConfigurationINTEL-configuration-02737)"},
- {"VUID-vkReleasePerformanceConfigurationINTEL-configuration-parameter", "configuration must be a valid VkPerformanceConfigurationINTEL handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkReleasePerformanceConfigurationINTEL-configuration-parameter)"},
- {"VUID-vkReleasePerformanceConfigurationINTEL-configuration-parent", "configuration must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkReleasePerformanceConfigurationINTEL-configuration-parent)"},
- {"VUID-vkReleasePerformanceConfigurationINTEL-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkReleasePerformanceConfigurationINTEL-device-parameter)"},
- {"VUID-vkReleaseProfilingLockKHR-device-03235", "The profiling lock of device must have been held via a previous successful call to vkAcquireProfilingLockKHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkReleaseProfilingLockKHR-device-03235)"},
- {"VUID-vkReleaseProfilingLockKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkReleaseProfilingLockKHR-device-parameter)"},
- {"VUID-vkResetCommandBuffer-commandBuffer-00045", "commandBuffer must not be in the pending state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetCommandBuffer-commandBuffer-00045)"},
- {"VUID-vkResetCommandBuffer-commandBuffer-00046", "commandBuffer must have been allocated from a pool that was created with the VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetCommandBuffer-commandBuffer-00046)"},
- {"VUID-vkResetCommandBuffer-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetCommandBuffer-commandBuffer-parameter)"},
- {"VUID-vkResetCommandBuffer-flags-parameter", "flags must be a valid combination of VkCommandBufferResetFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetCommandBuffer-flags-parameter)"},
- {"VUID-vkResetCommandPool-commandPool-00040", "All VkCommandBuffer objects allocated from commandPool must not be in the pending state (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetCommandPool-commandPool-00040)"},
- {"VUID-vkResetCommandPool-commandPool-parameter", "commandPool must be a valid VkCommandPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetCommandPool-commandPool-parameter)"},
- {"VUID-vkResetCommandPool-commandPool-parent", "commandPool must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetCommandPool-commandPool-parent)"},
- {"VUID-vkResetCommandPool-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetCommandPool-device-parameter)"},
- {"VUID-vkResetCommandPool-flags-parameter", "flags must be a valid combination of VkCommandPoolResetFlagBits values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetCommandPool-flags-parameter)"},
- {"VUID-vkResetDescriptorPool-descriptorPool-00313", "All uses of descriptorPool (via any allocated descriptor sets) must have completed execution (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetDescriptorPool-descriptorPool-00313)"},
- {"VUID-vkResetDescriptorPool-descriptorPool-parameter", "descriptorPool must be a valid VkDescriptorPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetDescriptorPool-descriptorPool-parameter)"},
- {"VUID-vkResetDescriptorPool-descriptorPool-parent", "descriptorPool must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetDescriptorPool-descriptorPool-parent)"},
- {"VUID-vkResetDescriptorPool-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetDescriptorPool-device-parameter)"},
- {"VUID-vkResetDescriptorPool-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetDescriptorPool-flags-zerobitmask)"},
- {"VUID-vkResetEvent-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetEvent-device-parameter)"},
- {"VUID-vkResetEvent-event-01148", "event must not be waited on by a vkCmdWaitEvents command that is currently executing (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetEvent-event-01148)"},
- {"VUID-vkResetEvent-event-parameter", "event must be a valid VkEvent handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetEvent-event-parameter)"},
- {"VUID-vkResetEvent-event-parent", "event must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetEvent-event-parent)"},
- {"VUID-vkResetFences-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetFences-device-parameter)"},
- {"VUID-vkResetFences-fenceCount-arraylength", "fenceCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetFences-fenceCount-arraylength)"},
- {"VUID-vkResetFences-pFences-01123", "Each element of pFences must not be currently associated with any queue command that has not yet completed execution on that queue (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetFences-pFences-01123)"},
- {"VUID-vkResetFences-pFences-parameter", "pFences must be a valid pointer to an array of fenceCount valid VkFence handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetFences-pFences-parameter)"},
- {"VUID-vkResetFences-pFences-parent", "Each element of pFences must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetFences-pFences-parent)"},
- {"VUID-vkResetQueryPool-None-02665", "The hostQueryReset feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetQueryPool-None-02665)"},
- {"VUID-vkResetQueryPool-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetQueryPool-device-parameter)"},
- {"VUID-vkResetQueryPool-firstQuery-02666", "firstQuery must be less than the number of queries in queryPool (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetQueryPool-firstQuery-02666)"},
- {"VUID-vkResetQueryPool-firstQuery-02667", "The sum of firstQuery and queryCount must be less than or equal to the number of queries in queryPool (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetQueryPool-firstQuery-02667)"},
- {"VUID-vkResetQueryPool-firstQuery-02741", "Submitted commands that refer to the range specified by firstQuery and queryCount in queryPool must have completed execution (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetQueryPool-firstQuery-02741)"},
- {"VUID-vkResetQueryPool-firstQuery-02742", "The range of queries specified by firstQuery and queryCount in queryPool must not be in use by calls to vkGetQueryPoolResults or vkResetQueryPool in other threads (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetQueryPool-firstQuery-02742)"},
- {"VUID-vkResetQueryPool-queryPool-parameter", "queryPool must be a valid VkQueryPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetQueryPool-queryPool-parameter)"},
- {"VUID-vkResetQueryPool-queryPool-parent", "queryPool must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkResetQueryPool-queryPool-parent)"},
- {"VUID-vkSetDebugUtilsObjectNameEXT-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSetDebugUtilsObjectNameEXT-device-parameter)"},
- {"VUID-vkSetDebugUtilsObjectNameEXT-pNameInfo-02587", "pNameInfo->objectType must not be VK_OBJECT_TYPE_UNKNOWN (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSetDebugUtilsObjectNameEXT-pNameInfo-02587)"},
- {"VUID-vkSetDebugUtilsObjectNameEXT-pNameInfo-02588", "pNameInfo->objectHandle must not be VK_NULL_HANDLE (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSetDebugUtilsObjectNameEXT-pNameInfo-02588)"},
- {"VUID-vkSetDebugUtilsObjectNameEXT-pNameInfo-parameter", "pNameInfo must be a valid pointer to a valid VkDebugUtilsObjectNameInfoEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSetDebugUtilsObjectNameEXT-pNameInfo-parameter)"},
- {"VUID-vkSetDebugUtilsObjectTagEXT-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSetDebugUtilsObjectTagEXT-device-parameter)"},
- {"VUID-vkSetDebugUtilsObjectTagEXT-pTagInfo-parameter", "pTagInfo must be a valid pointer to a valid VkDebugUtilsObjectTagInfoEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSetDebugUtilsObjectTagEXT-pTagInfo-parameter)"},
- {"VUID-vkSetEvent-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSetEvent-device-parameter)"},
- {"VUID-vkSetEvent-event-parameter", "event must be a valid VkEvent handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSetEvent-event-parameter)"},
- {"VUID-vkSetEvent-event-parent", "event must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSetEvent-event-parent)"},
- {"VUID-vkSetHdrMetadataEXT-commonparent", "Both of device, and the elements of pSwapchains must have been created, allocated, or retrieved from the same VkInstance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSetHdrMetadataEXT-commonparent)"},
- {"VUID-vkSetHdrMetadataEXT-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSetHdrMetadataEXT-device-parameter)"},
- {"VUID-vkSetHdrMetadataEXT-pMetadata-parameter", "pMetadata must be a valid pointer to an array of swapchainCount valid VkHdrMetadataEXT structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSetHdrMetadataEXT-pMetadata-parameter)"},
- {"VUID-vkSetHdrMetadataEXT-pSwapchains-parameter", "pSwapchains must be a valid pointer to an array of swapchainCount valid VkSwapchainKHR handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSetHdrMetadataEXT-pSwapchains-parameter)"},
- {"VUID-vkSetHdrMetadataEXT-swapchainCount-arraylength", "swapchainCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSetHdrMetadataEXT-swapchainCount-arraylength)"},
- {"VUID-vkSetLocalDimmingAMD-XXXXX", "It is only valid to call vkSetLocalDimmingAMD if VkDisplayNativeHdrSurfaceCapabilitiesAMD::localDimmingSupport is supported. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSetLocalDimmingAMD-XXXXX)"},
- {"VUID-vkSetLocalDimmingAMD-commonparent", "Both of device, and swapChain must have been created, allocated, or retrieved from the same VkInstance (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSetLocalDimmingAMD-commonparent)"},
- {"VUID-vkSetLocalDimmingAMD-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSetLocalDimmingAMD-device-parameter)"},
- {"VUID-vkSetLocalDimmingAMD-swapChain-parameter", "swapChain must be a valid VkSwapchainKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSetLocalDimmingAMD-swapChain-parameter)"},
- {"VUID-vkSignalSemaphore-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSignalSemaphore-device-parameter)"},
- {"VUID-vkSignalSemaphore-pSignalInfo-parameter", "pSignalInfo must be a valid pointer to a valid VkSemaphoreSignalInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSignalSemaphore-pSignalInfo-parameter)"},
- {"VUID-vkSubmitDebugUtilsMessageEXT-instance-parameter", "instance must be a valid VkInstance handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSubmitDebugUtilsMessageEXT-instance-parameter)"},
- {"VUID-vkSubmitDebugUtilsMessageEXT-messageSeverity-parameter", "messageSeverity must be a valid VkDebugUtilsMessageSeverityFlagBitsEXT value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSubmitDebugUtilsMessageEXT-messageSeverity-parameter)"},
- {"VUID-vkSubmitDebugUtilsMessageEXT-messageTypes-parameter", "messageTypes must be a valid combination of VkDebugUtilsMessageTypeFlagBitsEXT values (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSubmitDebugUtilsMessageEXT-messageTypes-parameter)"},
- {"VUID-vkSubmitDebugUtilsMessageEXT-messageTypes-requiredbitmask", "messageTypes must not be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSubmitDebugUtilsMessageEXT-messageTypes-requiredbitmask)"},
- {"VUID-vkSubmitDebugUtilsMessageEXT-objectType-02591", "The objectType member of each element of pCallbackData->pObjects must not be VK_OBJECT_TYPE_UNKNOWN (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSubmitDebugUtilsMessageEXT-objectType-02591)"},
- {"VUID-vkSubmitDebugUtilsMessageEXT-pCallbackData-parameter", "pCallbackData must be a valid pointer to a valid VkDebugUtilsMessengerCallbackDataEXT structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkSubmitDebugUtilsMessageEXT-pCallbackData-parameter)"},
- {"VUID-vkTrimCommandPool-commandPool-parameter", "commandPool must be a valid VkCommandPool handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkTrimCommandPool-commandPool-parameter)"},
- {"VUID-vkTrimCommandPool-commandPool-parent", "commandPool must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkTrimCommandPool-commandPool-parent)"},
- {"VUID-vkTrimCommandPool-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkTrimCommandPool-device-parameter)"},
- {"VUID-vkTrimCommandPool-flags-zerobitmask", "flags must be 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkTrimCommandPool-flags-zerobitmask)"},
- {"VUID-vkUninitializePerformanceApiINTEL-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkUninitializePerformanceApiINTEL-device-parameter)"},
- {"VUID-vkUnmapMemory-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkUnmapMemory-device-parameter)"},
- {"VUID-vkUnmapMemory-memory-00689", "memory must be currently host mapped (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkUnmapMemory-memory-00689)"},
- {"VUID-vkUnmapMemory-memory-parameter", "memory must be a valid VkDeviceMemory handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkUnmapMemory-memory-parameter)"},
- {"VUID-vkUnmapMemory-memory-parent", "memory must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkUnmapMemory-memory-parent)"},
- {"VUID-vkUpdateDescriptorSetWithTemplate-descriptorSet-parameter", "descriptorSet must be a valid VkDescriptorSet handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSetWithTemplate-descriptorSet-parameter)"},
- {"VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parameter", "descriptorUpdateTemplate must be a valid VkDescriptorUpdateTemplate handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parameter)"},
- {"VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parent", "descriptorUpdateTemplate must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parent)"},
- {"VUID-vkUpdateDescriptorSetWithTemplate-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSetWithTemplate-device-parameter)"},
- {"VUID-vkUpdateDescriptorSetWithTemplate-pData-01685", "pData must be a valid pointer to a memory containing one or more valid instances of VkDescriptorImageInfo, VkDescriptorBufferInfo, or VkBufferView in a layout defined by descriptorUpdateTemplate when it was created with vkCreateDescriptorUpdateTemplate (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSetWithTemplate-pData-01685)"},
- {"VUID-vkUpdateDescriptorSets-None-03047", "Descriptor bindings updated by this command which were created without the VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT or VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT bits set must not be used by any command that was recorded to a command buffer which is in the pending state. (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSets-None-03047)"},
- {"VUID-vkUpdateDescriptorSets-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSets-device-parameter)"},
- {"VUID-vkUpdateDescriptorSets-dstSet-00314", "The dstSet member of each element of pDescriptorWrites or pDescriptorCopies must not be used by any command that was recorded to a command buffer which is in the pending state. (https://www.khronos.org/registry/vulkan/specs/1.1-khr-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSets-dstSet-00314)"},
- {"VUID-vkUpdateDescriptorSets-pDescriptorCopies-parameter", "If descriptorCopyCount is not 0, pDescriptorCopies must be a valid pointer to an array of descriptorCopyCount valid VkCopyDescriptorSet structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSets-pDescriptorCopies-parameter)"},
- {"VUID-vkUpdateDescriptorSets-pDescriptorWrites-parameter", "If descriptorWriteCount is not 0, pDescriptorWrites must be a valid pointer to an array of descriptorWriteCount valid VkWriteDescriptorSet structures (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkUpdateDescriptorSets-pDescriptorWrites-parameter)"},
- {"VUID-vkWaitForFences-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkWaitForFences-device-parameter)"},
- {"VUID-vkWaitForFences-fenceCount-arraylength", "fenceCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkWaitForFences-fenceCount-arraylength)"},
- {"VUID-vkWaitForFences-pFences-parameter", "pFences must be a valid pointer to an array of fenceCount valid VkFence handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkWaitForFences-pFences-parameter)"},
- {"VUID-vkWaitForFences-pFences-parent", "Each element of pFences must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkWaitForFences-pFences-parent)"},
- {"VUID-vkWaitSemaphores-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkWaitSemaphores-device-parameter)"},
- {"VUID-vkWaitSemaphores-pWaitInfo-parameter", "pWaitInfo must be a valid pointer to a valid VkSemaphoreWaitInfo structure (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkWaitSemaphores-pWaitInfo-parameter)"},
- {"VUID-vkWriteAccelerationStructuresPropertiesKHR-accelerationStructureCount-arraylength", "accelerationStructureCount must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkWriteAccelerationStructuresPropertiesKHR-accelerationStructureCount-arraylength)"},
- {"VUID-vkWriteAccelerationStructuresPropertiesKHR-accelerationStructures-03431", "All acceleration structures in accelerationStructures must have been built with VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR if queryType is VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkWriteAccelerationStructuresPropertiesKHR-accelerationStructures-03431)"},
- {"VUID-vkWriteAccelerationStructuresPropertiesKHR-dataSize-03452", "dataSize must be greater than or equal to accelerationStructureCount*stride (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkWriteAccelerationStructuresPropertiesKHR-dataSize-03452)"},
- {"VUID-vkWriteAccelerationStructuresPropertiesKHR-dataSize-arraylength", "dataSize must be greater than 0 (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkWriteAccelerationStructuresPropertiesKHR-dataSize-arraylength)"},
- {"VUID-vkWriteAccelerationStructuresPropertiesKHR-device-parameter", "device must be a valid VkDevice handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkWriteAccelerationStructuresPropertiesKHR-device-parameter)"},
- {"VUID-vkWriteAccelerationStructuresPropertiesKHR-pAccelerationStructures-03453", "The acceleration structures referenced by pAccelerationStructures must be bound to host-visible memory (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkWriteAccelerationStructuresPropertiesKHR-pAccelerationStructures-03453)"},
- {"VUID-vkWriteAccelerationStructuresPropertiesKHR-pAccelerationStructures-parameter", "pAccelerationStructures must be a valid pointer to an array of accelerationStructureCount valid VkAccelerationStructureKHR handles (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkWriteAccelerationStructuresPropertiesKHR-pAccelerationStructures-parameter)"},
- {"VUID-vkWriteAccelerationStructuresPropertiesKHR-pAccelerationStructures-parent", "Each element of pAccelerationStructures must have been created, allocated, or retrieved from device (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkWriteAccelerationStructuresPropertiesKHR-pAccelerationStructures-parent)"},
- {"VUID-vkWriteAccelerationStructuresPropertiesKHR-pData-parameter", "pData must be a valid pointer to an array of dataSize bytes (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkWriteAccelerationStructuresPropertiesKHR-pData-parameter)"},
- {"VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03432", "queryType must be VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR or VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03432)"},
- {"VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03448", "If queryType is VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR, then stride must be a multiple of the size of VkDeviceSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03448)"},
- {"VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03449", "If queryType is VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR, then data must point to a VkDeviceSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03449)"},
- {"VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03450", "If queryType is VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR, then stride must be a multiple of the size of VkDeviceSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03450)"},
- {"VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03451", "If queryType is VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR, then data must point to a VkDeviceSize (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03451)"},
- {"VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-parameter", "queryType must be a valid VkQueryType value (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-parameter)"},
- {"VUID-vkWriteAccelerationStructuresPropertiesKHR-rayTracingHostAccelerationStructureCommands-03454", "the VkPhysicalDeviceRayTracingFeaturesKHR->rayTracingHostAccelerationStructureCommands feature must be enabled (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkWriteAccelerationStructuresPropertiesKHR-rayTracingHostAccelerationStructureCommands-03454)"},
+ {"VUID-VkAabbPositionsKHR-minX-03546", "minX must be less than or equal to maxX", "1.2-extensions"},
+ {"VUID-VkAabbPositionsKHR-minY-03547", "minY must be less than or equal to maxY", "1.2-extensions"},
+ {"VUID-VkAabbPositionsKHR-minZ-03548", "minZ must be less than or equal to maxZ", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-commonparent", "Both of dstAccelerationStructure, and srcAccelerationStructure that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-dstAccelerationStructure-parameter", "dstAccelerationStructure must be a valid VkAccelerationStructureKHR handle", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-flags-parameter", "flags must be a valid combination of VkBuildAccelerationStructureFlagBitsKHR values", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkDeferredOperationInfoKHR", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-scratchData-03539", "scratchData must have been created with VK_BUFFER_USAGE_RAY_TRACING_BIT_KHR usage flag", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-scratchData-parameter", "scratchData must be a valid VkDeviceOrHostAddressKHR union", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-srcAccelerationStructure-parameter", "If srcAccelerationStructure is not VK_NULL_HANDLE, srcAccelerationStructure must be a valid VkAccelerationStructureKHR handle", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-type-parameter", "type must be a valid VkAccelerationStructureTypeKHR value", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-update-03537", "If update is VK_TRUE, srcAccelerationStructure must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-update-03538", "If update is VK_TRUE, srcAccelerationStructure must have been built before with VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR set in VkAccelerationStructureBuildGeometryInfoKHR::flags", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureBuildGeometryInfoKHR-update-03540", "If update is VK_TRUE, the srcAccelerationStructure and dstAccelerationStructure objects must either be the same object or not have any memory aliasing", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureBuildOffsetInfoKHR-primitiveOffset-03551", "For geometries of type VK_GEOMETRY_TYPE_TRIANGLES_KHR, if the geometry uses indices, the offset primitiveOffset from VkAccelerationStructureGeometryTrianglesDataKHR::indexData must be a multiple of the element size of VkAccelerationStructureGeometryTrianglesDataKHR::indexType", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureBuildOffsetInfoKHR-primitiveOffset-03552", "For geometries of type VK_GEOMETRY_TYPE_TRIANGLES_KHR, if the geometry doesn't use indices, the offset primitiveOffset from VkAccelerationStructureGeometryTrianglesDataKHR::vertexData must be a multiple of the component size of VkAccelerationStructureGeometryTrianglesDataKHR::vertexFormat", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureBuildOffsetInfoKHR-primitiveOffset-03554", "For geometries of type VK_GEOMETRY_TYPE_AABBS_KHR, the offset primitiveOffset from VkAccelerationStructureGeometryAabbsDataKHR::data must be a multiple of 8", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureBuildOffsetInfoKHR-primitiveOffset-03555", "For geometries of type VK_GEOMETRY_TYPE_INSTANCES_KHR, the offset primitiveOffset from VkAccelerationStructureGeometryInstancesDataKHR::data must be a multiple of 16 // TODO - Almost certainly should be more here", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureBuildOffsetInfoKHR-transformOffset-03553", "For geometries of type VK_GEOMETRY_TYPE_TRIANGLES_KHR, the offset transformOffset from VkAccelerationStructureGeometryTrianglesDataKHR::transformData must be a multiple of 16", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-geometryType-03501", "If geometryType is VK_GEOMETRY_TYPE_TRIANGLES_KHR, vertexFormat must support the VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR in VkFormatProperties::bufferFeatures as returned by vkGetPhysicalDeviceFormatProperties2", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-geometryType-03502", "If geometryType is VK_GEOMETRY_TYPE_TRIANGLES_KHR, indexType must be VK_INDEX_TYPE_UINT16, VK_INDEX_TYPE_UINT32, or VK_INDEX_TYPE_NONE_KHR", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-geometryType-parameter", "geometryType must be a valid VkGeometryTypeKHR value", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-indexType-parameter", "indexType must be a valid VkIndexType value", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_GEOMETRY_TYPE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-vertexFormat-parameter", "If vertexFormat is not 0, vertexFormat must be a valid VkFormat value", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateInfoKHR-compactedSize-02993", "If compactedSize is 0 then maxGeometryCount must not be 0", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateInfoKHR-compactedSize-03490", "If compactedSize is not 0 then maxGeometryCount must be 0", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateInfoKHR-deviceAddress-03500", "If deviceAddress is not 0, VkPhysicalDeviceRayTracingFeaturesKHR::rayTracingAccelerationStructureCaptureReplay must be VK_TRUE", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateInfoKHR-flags-03499", "If flags has the VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR bit set, then it must not have the VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_KHR bit set", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateInfoKHR-flags-parameter", "flags must be a valid combination of VkBuildAccelerationStructureFlagBitsKHR values", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateInfoKHR-maxPrimitiveCount-03493", "The total number of triangles in all geometries must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxPrimitiveCount", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateInfoKHR-maxPrimitiveCount-03494", "The total number of AABBs in all geometries must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxPrimitiveCount", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateInfoKHR-pGeometryInfos-parameter", "If maxGeometryCount is not 0, pGeometryInfos must be a valid pointer to an array of maxGeometryCount valid VkAccelerationStructureCreateGeometryTypeInfoKHR structures", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateInfoKHR-type-03491", "If type is VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR then maxGeometryCount must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxGeometryCount", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateInfoKHR-type-03492", "If type is VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR then the maxPrimitiveCount member of each element of the pGeometryInfos array must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxInstanceCount", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateInfoKHR-type-03495", "If type is VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR and compactedSize is 0, maxGeometryCount must be 1", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateInfoKHR-type-03496", "If type is VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR and compactedSize is 0, the geometryType member of elements of pGeometryInfos must be VK_GEOMETRY_TYPE_INSTANCES_KHR", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateInfoKHR-type-03497", "If type is VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR and compactedSize is 0, the geometryType member of elements of pGeometryInfos must not be VK_GEOMETRY_TYPE_INSTANCES_KHR", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateInfoKHR-type-03498", "If type is VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR then the geometryType member of each geometry in pGeometryInfos must be the same", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateInfoKHR-type-parameter", "type must be a valid VkAccelerationStructureTypeKHR value", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateInfoNV-compactedSize-02421", "If compactedSize is not 0 then both info.geometryCount and info.instanceCount must be 0", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateInfoNV-info-parameter", "info must be a valid VkAccelerationStructureInfoNV structure", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateInfoNV-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureDeviceAddressInfoKHR-accelerationStructure-parameter", "accelerationStructure must be a valid VkAccelerationStructureKHR handle", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureDeviceAddressInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureDeviceAddressInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryAabbsDataKHR-data-03544", "data must be aligned to 8 bytes", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryAabbsDataKHR-data-parameter", "data must be a valid VkDeviceOrHostAddressConstKHR union", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryAabbsDataKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryAabbsDataKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_AABBS_DATA_KHR", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryAabbsDataKHR-stride-03545", "stride must be a multiple of 8", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryInstancesDataKHR-arrayOfPointers-03550", "If arrayOfPointers is true, each pointer must be aligned to 16 bytes", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryInstancesDataKHR-data-03549", "data must be aligned to 16 bytes", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryInstancesDataKHR-data-parameter", "data must be a valid VkDeviceOrHostAddressConstKHR union", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryInstancesDataKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryInstancesDataKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryKHR-aabbs-parameter", "If geometryType is VK_GEOMETRY_TYPE_AABBS_KHR, the aabbs member of geometry must be a valid VkAccelerationStructureGeometryAabbsDataKHR structure", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryKHR-flags-parameter", "flags must be a valid combination of VkGeometryFlagBitsKHR values", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryKHR-geometryType-03541", "If geometryType is VK_GEOMETRY_TYPE_AABBS_KHR, the aabbs member of geometry must be a valid VkAccelerationStructureGeometryAabbsDataKHR structure", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryKHR-geometryType-03542", "If geometryType is VK_GEOMETRY_TYPE_TRIANGLES_KHR, the triangles member of geometry must be a valid VkAccelerationStructureGeometryTrianglesDataKHR structure", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryKHR-geometryType-03543", "If geometryType is VK_GEOMETRY_TYPE_INSTANCES_KHR, the instances member of geometry must be a valid VkAccelerationStructureGeometryInstancesDataKHR structure", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryKHR-geometryType-parameter", "geometryType must be a valid VkGeometryTypeKHR value", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryKHR-instances-parameter", "If geometryType is VK_GEOMETRY_TYPE_INSTANCES_KHR, the instances member of geometry must be a valid VkAccelerationStructureGeometryInstancesDataKHR structure", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryKHR-triangles-parameter", "If geometryType is VK_GEOMETRY_TYPE_TRIANGLES_KHR, the triangles member of geometry must be a valid VkAccelerationStructureGeometryTrianglesDataKHR structure", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryTrianglesDataKHR-indexData-parameter", "If indexData is not 0, indexData must be a valid VkDeviceOrHostAddressConstKHR union", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryTrianglesDataKHR-indexType-parameter", "indexType must be a valid VkIndexType value", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryTrianglesDataKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryTrianglesDataKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryTrianglesDataKHR-transformData-parameter", "If transformData is not 0, transformData must be a valid VkDeviceOrHostAddressConstKHR union", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryTrianglesDataKHR-vertexData-parameter", "vertexData must be a valid VkDeviceOrHostAddressConstKHR union", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureGeometryTrianglesDataKHR-vertexFormat-parameter", "vertexFormat must be a valid VkFormat value", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureInfoNV-flags-02592", "If flags has the VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_NV bit set, then it must not have the VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_NV bit set", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureInfoNV-flags-parameter", "flags must be a valid combination of VkBuildAccelerationStructureFlagBitsNV values", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureInfoNV-geometryCount-02422", "geometryCount must be less than or equal to VkPhysicalDeviceRayTracingPropertiesNV::maxGeometryCount", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureInfoNV-instanceCount-02423", "instanceCount must be less than or equal to VkPhysicalDeviceRayTracingPropertiesNV::maxInstanceCount", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureInfoNV-instanceData-02782", "If instanceData is not VK_NULL_HANDLE, instanceData must have been created with VK_BUFFER_USAGE_RAY_TRACING_BIT_NV usage flag", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureInfoNV-maxTriangleCount-02424", "The total number of triangles in all geometries must be less than or equal to VkPhysicalDeviceRayTracingPropertiesNV::maxTriangleCount", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureInfoNV-pGeometries-parameter", "If geometryCount is not 0, pGeometries must be a valid pointer to an array of geometryCount valid VkGeometryNV structures", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureInfoNV-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureInfoNV-scratch-02781", "scratch must have been created with VK_BUFFER_USAGE_RAY_TRACING_BIT_NV usage flag", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureInfoNV-type-02425", "If type is VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV then geometryCount must be 0", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureInfoNV-type-02426", "If type is VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV then instanceCount must be 0", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureInfoNV-type-02786", "If type is VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV then the geometryType member of each geometry in pGeometries must be the same", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureInfoNV-type-parameter", "type must be a valid VkAccelerationStructureTypeNV value", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureInstanceKHR-flags-parameter", "flags must be a valid combination of VkGeometryInstanceFlagBitsKHR values", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureMemoryRequirementsInfoKHR-accelerationStructure-parameter", "accelerationStructure must be a valid VkAccelerationStructureKHR handle", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureMemoryRequirementsInfoKHR-buildType-parameter", "buildType must be a valid VkAccelerationStructureBuildTypeKHR value", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureMemoryRequirementsInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureMemoryRequirementsInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureMemoryRequirementsInfoKHR-type-parameter", "type must be a valid VkAccelerationStructureMemoryRequirementsTypeKHR value", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureMemoryRequirementsInfoNV-accelerationStructure-parameter", "accelerationStructure must be a valid VkAccelerationStructureNV handle", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureMemoryRequirementsInfoNV-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureMemoryRequirementsInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureMemoryRequirementsInfoNV-type-parameter", "type must be a valid VkAccelerationStructureMemoryRequirementsTypeNV value", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureVersionKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureVersionKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_VERSION_KHR", "1.2-extensions"},
+ {"VUID-VkAccelerationStructureVersionKHR-versionData-parameter", "versionData must be a valid pointer to an array of 2*VK_UUID_SIZE uint8_t values", "1.2-extensions"},
+ {"VUID-VkAcquireNextImageInfoKHR-commonparent", "Each of fence, semaphore, and swapchain that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkInstance", "1.2-extensions"},
+ {"VUID-VkAcquireNextImageInfoKHR-deviceMask-01290", "deviceMask must be a valid device mask", "1.2-extensions"},
+ {"VUID-VkAcquireNextImageInfoKHR-deviceMask-01291", "deviceMask must not be zero", "1.2-extensions"},
+ {"VUID-VkAcquireNextImageInfoKHR-fence-01289", "If fence is not VK_NULL_HANDLE it must be unsignaled and must not be associated with any other queue command that has not yet completed execution on that queue", "1.2-extensions"},
+ {"VUID-VkAcquireNextImageInfoKHR-fence-parameter", "If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle", "1.2-extensions"},
+ {"VUID-VkAcquireNextImageInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkAcquireNextImageInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkAcquireNextImageInfoKHR-semaphore-01288", "If semaphore is not VK_NULL_HANDLE it must be unsignaled", "1.2-extensions"},
+ {"VUID-VkAcquireNextImageInfoKHR-semaphore-01781", "If semaphore is not VK_NULL_HANDLE it must not have any uncompleted signal or wait operations pending", "1.2-extensions"},
+ {"VUID-VkAcquireNextImageInfoKHR-semaphore-01782", "semaphore and fence must not both be equal to VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-VkAcquireNextImageInfoKHR-semaphore-03266", "semaphore must have a VkSemaphoreType of VK_SEMAPHORE_TYPE_BINARY", "1.2-extensions"},
+ {"VUID-VkAcquireNextImageInfoKHR-semaphore-parameter", "If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle", "1.2-extensions"},
+ {"VUID-VkAcquireNextImageInfoKHR-swapchain-01675", "swapchain must not be in the retired state", "1.2-extensions"},
+ {"VUID-VkAcquireNextImageInfoKHR-swapchain-parameter", "swapchain must be a valid VkSwapchainKHR handle", "1.2-extensions"},
+ {"VUID-VkAcquireProfilingLockInfoKHR-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkAcquireProfilingLockInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkAcquireProfilingLockInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ACQUIRE_PROFILING_LOCK_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkAllocationCallbacks-pfnAllocation-00632", "pfnAllocation must be a valid pointer to a valid user-defined PFN_vkAllocationFunction", "1.2-extensions"},
+ {"VUID-VkAllocationCallbacks-pfnFree-00634", "pfnFree must be a valid pointer to a valid user-defined PFN_vkFreeFunction", "1.2-extensions"},
+ {"VUID-VkAllocationCallbacks-pfnInternalAllocation-00635", "If either of pfnInternalAllocation or pfnInternalFree is not NULL, both must be valid callbacks", "1.2-extensions"},
+ {"VUID-VkAllocationCallbacks-pfnReallocation-00633", "pfnReallocation must be a valid pointer to a valid user-defined PFN_vkReallocationFunction", "1.2-extensions"},
+ {"VUID-VkAndroidHardwareBufferFormatPropertiesANDROID-sType-sType", "sType must be VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID", "1.2-extensions"},
+ {"VUID-VkAndroidHardwareBufferPropertiesANDROID-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkAndroidHardwareBufferFormatPropertiesANDROID", "1.2-extensions"},
+ {"VUID-VkAndroidHardwareBufferPropertiesANDROID-sType-sType", "sType must be VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID", "1.2-extensions"},
+ {"VUID-VkAndroidHardwareBufferPropertiesANDROID-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkAndroidHardwareBufferUsageANDROID-sType-sType", "sType must be VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID", "1.2-extensions"},
+ {"VUID-VkAndroidSurfaceCreateInfoKHR-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkAndroidSurfaceCreateInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkAndroidSurfaceCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkAndroidSurfaceCreateInfoKHR-window-01248", "window must point to a valid Android ANativeWindow", "1.2-extensions"},
+ {"VUID-VkApplicationInfo-apiVersion-04010", "If apiVersion is not 0, then it must be greater or equal to VK_API_VERSION_1_0", "1.2-extensions"},
+ {"VUID-VkApplicationInfo-pApplicationName-parameter", "If pApplicationName is not NULL, pApplicationName must be a null-terminated UTF-8 string", "1.2-extensions"},
+ {"VUID-VkApplicationInfo-pEngineName-parameter", "If pEngineName is not NULL, pEngineName must be a null-terminated UTF-8 string", "1.2-extensions"},
+ {"VUID-VkApplicationInfo-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkApplicationInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_APPLICATION_INFO", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-finalLayout-00843", "finalLayout must not be VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-finalLayout-parameter", "finalLayout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-flags-parameter", "flags must be a valid combination of VkAttachmentDescriptionFlagBits values", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-format-03280", "If format is a color format, initialLayout must not be VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-format-03281", "If format is a depth/stencil format, initialLayout must not be VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-format-03282", "If format is a color format, finalLayout must not be VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-format-03283", "If format is a depth/stencil format, finalLayout must not be VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-format-03286", "If format is a color format, initialLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-format-03287", "If format is a color format, finalLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-format-03288", "If format is a depth/stencil format which includes both depth and stencil aspects, initialLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-format-03289", "If format is a depth/stencil format which includes both depth and stencil aspects, finalLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-format-03290", "If format is a depth/stencil format which includes only the depth aspect, initialLayout must not be VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-format-03291", "If format is a depth/stencil format which includes only the depth aspect, finalLayout must not be VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-format-03292", "If format is a depth/stencil format which includes only the stencil aspect, initialLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-format-03293", "If format is a depth/stencil format which includes only the stencil aspect, finalLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-format-parameter", "format must be a valid VkFormat value", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-initialLayout-parameter", "initialLayout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-loadOp-parameter", "loadOp must be a valid VkAttachmentLoadOp value", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-samples-parameter", "samples must be a valid VkSampleCountFlagBits value", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-separateDepthStencilLayouts-03284", "If the separateDepthStencilLayouts feature is not enabled, initialLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-separateDepthStencilLayouts-03285", "If the separateDepthStencilLayouts feature is not enabled, finalLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-stencilLoadOp-parameter", "stencilLoadOp must be a valid VkAttachmentLoadOp value", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-stencilStoreOp-parameter", "stencilStoreOp must be a valid VkAttachmentStoreOp value", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription-storeOp-parameter", "storeOp must be a valid VkAttachmentStoreOp value", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-finalLayout-03061", "finalLayout must not be VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-finalLayout-parameter", "finalLayout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-flags-parameter", "flags must be a valid combination of VkAttachmentDescriptionFlagBits values", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-format-03294", "If format is a color format, initialLayout must not be VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-format-03295", "If format is a depth/stencil format, initialLayout must not be VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-format-03296", "If format is a color format, finalLayout must not be VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-format-03297", "If format is a depth/stencil format, finalLayout must not be VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-format-03300", "If format is a color format, initialLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-format-03301", "If format is a color format, finalLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-format-03302", "If format is a depth/stencil format which includes both depth and stencil aspects, and initialLayout is VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, the pNext chain must include a VkAttachmentDescriptionStencilLayout structure", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-format-03303", "If format is a depth/stencil format which includes both depth and stencil aspects, and finalLayout is VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, the pNext chain must include a VkAttachmentDescriptionStencilLayout structure", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-format-03304", "If format is a depth/stencil format which includes only the depth aspect, initialLayout must not be VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-format-03305", "If format is a depth/stencil format which includes only the depth aspect, finalLayout must not be VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-format-03306", "If format is a depth/stencil format which includes only the stencil aspect, initialLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-format-03307", "If format is a depth/stencil format which includes only the stencil aspect, finalLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-format-parameter", "format must be a valid VkFormat value", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-initialLayout-parameter", "initialLayout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-loadOp-parameter", "loadOp must be a valid VkAttachmentLoadOp value", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-sType-sType", "sType must be VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-samples-parameter", "samples must be a valid VkSampleCountFlagBits value", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-separateDepthStencilLayouts-03298", "If the separateDepthStencilLayouts feature is not enabled, initialLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-separateDepthStencilLayouts-03299", "If the separateDepthStencilLayouts feature is not enabled, finalLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-stencilLoadOp-parameter", "stencilLoadOp must be a valid VkAttachmentLoadOp value", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-stencilStoreOp-parameter", "stencilStoreOp must be a valid VkAttachmentStoreOp value", "1.2-extensions"},
+ {"VUID-VkAttachmentDescription2-storeOp-parameter", "storeOp must be a valid VkAttachmentStoreOp value", "1.2-extensions"},
+ {"VUID-VkAttachmentDescriptionStencilLayout-sType-sType", "sType must be VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT", "1.2-extensions"},
+ {"VUID-VkAttachmentDescriptionStencilLayout-stencilFinalLayout-03309", "stencilFinalLayout must not be VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescriptionStencilLayout-stencilFinalLayout-03310", "stencilFinalLayout must not be VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED", "1.2-extensions"},
+ {"VUID-VkAttachmentDescriptionStencilLayout-stencilFinalLayout-parameter", "stencilFinalLayout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-VkAttachmentDescriptionStencilLayout-stencilInitialLayout-03308", "stencilInitialLayout must not be VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentDescriptionStencilLayout-stencilInitialLayout-parameter", "stencilInitialLayout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-VkAttachmentReference-layout-00857", "If attachment is not VK_ATTACHMENT_UNUSED, layout must not be VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR", "1.2-extensions"},
+ {"VUID-VkAttachmentReference-layout-parameter", "layout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-VkAttachmentReference2-attachment-03311", "If attachment is not VK_ATTACHMENT_UNUSED, and aspectMask does not include VK_IMAGE_ASPECT_STENCIL_BIT or VK_IMAGE_ASPECT_DEPTH_BIT, layout must not be VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentReference2-attachment-03312", "If attachment is not VK_ATTACHMENT_UNUSED, and aspectMask does not include VK_IMAGE_ASPECT_COLOR_BIT, layout must not be VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentReference2-attachment-03314", "If attachment is not VK_ATTACHMENT_UNUSED, and aspectMask includes VK_IMAGE_ASPECT_COLOR_BIT, layout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,", "1.2-extensions"},
+ {"VUID-VkAttachmentReference2-attachment-03315", "If attachment is not VK_ATTACHMENT_UNUSED, and aspectMask includes both VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT, and layout is VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, the pNext chain must include a VkAttachmentReferenceStencilLayout structure", "1.2-extensions"},
+ {"VUID-VkAttachmentReference2-attachment-03316", "If attachment is not VK_ATTACHMENT_UNUSED, and aspectMask includes only VK_IMAGE_ASPECT_DEPTH_BIT then layout must not be VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentReference2-attachment-03317", "If attachment is not VK_ATTACHMENT_UNUSED, and aspectMask includes only VK_IMAGE_ASPECT_STENCIL_BIT then layout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkAttachmentReference2-layout-03077", "If attachment is not VK_ATTACHMENT_UNUSED, layout must not be VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_PREINITIALIZED, or VK_IMAGE_LAYOUT_PRESENT_SRC_KHR", "1.2-extensions"},
+ {"VUID-VkAttachmentReference2-layout-parameter", "layout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-VkAttachmentReference2-sType-sType", "sType must be VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2", "1.2-extensions"},
+ {"VUID-VkAttachmentReference2-separateDepthStencilLayouts-03313", "If the separateDepthStencilLayouts feature is not enabled, and attachment is not VK_ATTACHMENT_UNUSED, layout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL,", "1.2-extensions"},
+ {"VUID-VkAttachmentReferenceStencilLayout-sType-sType", "sType must be VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT", "1.2-extensions"},
+ {"VUID-VkAttachmentReferenceStencilLayout-stencilLayout-03318", "stencilLayout must not be VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_PREINITIALIZED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_PRESENT_SRC_KHR", "1.2-extensions"},
+ {"VUID-VkAttachmentReferenceStencilLayout-stencilLayout-parameter", "stencilLayout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-VkAttachmentSampleLocationsEXT-attachmentIndex-01531", "attachmentIndex must be less than the attachmentCount specified in VkRenderPassCreateInfo the render pass specified by VkRenderPassBeginInfo::renderPass was created with", "1.2-extensions"},
+ {"VUID-VkAttachmentSampleLocationsEXT-sampleLocationsInfo-parameter", "sampleLocationsInfo must be a valid VkSampleLocationsInfoEXT structure", "1.2-extensions"},
+ {"VUID-VkBindAccelerationStructureMemoryInfoKHR-accelerationStructure-02450", "accelerationStructure must not already be backed by a memory object", "1.2-extensions"},
+ {"VUID-VkBindAccelerationStructureMemoryInfoKHR-accelerationStructure-parameter", "accelerationStructure must be a valid VkAccelerationStructureKHR handle", "1.2-extensions"},
+ {"VUID-VkBindAccelerationStructureMemoryInfoKHR-commonparent", "Both of accelerationStructure, and memory must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkBindAccelerationStructureMemoryInfoKHR-memory-02593", "memory must have been allocated using one of the memory types allowed in the memoryTypeBits member of the VkMemoryRequirements structure returned from a call to vkGetAccelerationStructureMemoryRequirementsKHR with accelerationStructure and type of VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_KHR", "1.2-extensions"},
+ {"VUID-VkBindAccelerationStructureMemoryInfoKHR-memory-parameter", "memory must be a valid VkDeviceMemory handle", "1.2-extensions"},
+ {"VUID-VkBindAccelerationStructureMemoryInfoKHR-memoryOffset-02451", "memoryOffset must be less than the size of memory", "1.2-extensions"},
+ {"VUID-VkBindAccelerationStructureMemoryInfoKHR-memoryOffset-02594", "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from a call to vkGetAccelerationStructureMemoryRequirementsKHR with accelerationStructure and type of VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_KHR", "1.2-extensions"},
+ {"VUID-VkBindAccelerationStructureMemoryInfoKHR-pDeviceIndices-parameter", "If deviceIndexCount is not 0, pDeviceIndices must be a valid pointer to an array of deviceIndexCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkBindAccelerationStructureMemoryInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkBindAccelerationStructureMemoryInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkBindAccelerationStructureMemoryInfoKHR-size-02595", "The size member of the VkMemoryRequirements structure returned from a call to vkGetAccelerationStructureMemoryRequirementsKHR with accelerationStructure and type of VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_KHR must be less than or equal to the size of memory minus memoryOffset", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryDeviceGroupInfo-deviceIndexCount-01606", "deviceIndexCount must either be zero or equal to the number of physical devices in the logical device", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryDeviceGroupInfo-pDeviceIndices-01607", "All elements of pDeviceIndices must be valid device indices", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryDeviceGroupInfo-pDeviceIndices-parameter", "If deviceIndexCount is not 0, pDeviceIndices must be a valid pointer to an array of deviceIndexCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryDeviceGroupInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-buffer-01593", "buffer must not already be backed by a memory object", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-buffer-01594", "buffer must not have been created with any sparse memory binding flags", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-buffer-01602", "If buffer requires a dedicated allocation(as reported by vkGetBufferMemoryRequirements2 in VkMemoryDedicatedRequirements::requiresDedicatedAllocation for buffer), memory must have been created with VkMemoryDedicatedAllocateInfo::buffer equal to buffer and memoryOffset must be zero", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-buffer-01603", "If buffer was created with VkDedicatedAllocationBufferCreateInfoNV::dedicatedAllocation equal to VK_TRUE, memory must have been created with VkDedicatedAllocationMemoryAllocateInfoNV::buffer equal to buffer and memoryOffset must be zero", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-buffer-01604", "If buffer was not created with VkDedicatedAllocationBufferCreateInfoNV::dedicatedAllocation equal to VK_TRUE, memory must not have been allocated dedicated for a specific buffer or image", "default"},
+ {"VUID-VkBindBufferMemoryInfo-buffer-04122", "If buffer was created with the VK_BUFFER_CREATE_PROTECTED_BIT bit set, the buffer must be bound to a memory object allocated with a memory type that reports VK_MEMORY_PROPERTY_PROTECTED_BIT", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-buffer-04123", "If buffer was created with the VK_BUFFER_CREATE_PROTECTED_BIT bit not set, the buffer must not be bound to a memory object created with a memory type that reports VK_MEMORY_PROPERTY_PROTECTED_BIT", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-buffer-parameter", "buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-bufferDeviceAddress-02838", "If the VkPhysicalDeviceBufferDeviceAddressFeaturesKHR::bufferDeviceAddress feature is enabled and buffer was created with the VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR bit set, memory must have been allocated with the VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR bit set", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-commonparent", "Both of buffer, and memory must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-handleTypes-02791", "If the value of VkExportMemoryAllocateInfo::handleTypes used to allocate memory is not 0, it must include at least one of the handles set in VkExternalMemoryBufferCreateInfo::handleTypes when buffer was created", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-memory-01599", "memory must have been allocated using one of the memory types allowed in the memoryTypeBits member of the VkMemoryRequirements structure returned from a call to vkGetBufferMemoryRequirements with buffer", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-memory-01900", "If the VkMemoryAllocateInfo provided when memory was allocated included a VkMemoryDedicatedAllocateInfo structure in its pNext chain, and VkMemoryDedicatedAllocateInfo::buffer was not VK_NULL_HANDLE, then buffer must equal VkMemoryDedicatedAllocateInfo::buffer and memoryOffset must be zero", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-memory-02792", "If memory was created by a memory import operation, the external handle type of the imported memory must also have been set in VkExternalMemoryBufferCreateInfo::handleTypes when buffer was created", "1.2-khr-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-memory-02987", "If memory was created by a memory import operation, that is not VkImportAndroidHardwareBufferInfoANDROID with a non-NULL buffer value, the external handle type of the imported memory must also have been set in VkExternalMemoryBufferCreateInfo::handleTypes when buffer was created", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-memory-02988", "If memory was created with the VkImportAndroidHardwareBufferInfoANDROID memory import operation with a non-NULL buffer value, VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID must also have been set in VkExternalMemoryBufferCreateInfo::handleTypes when buffer was created", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-memory-parameter", "memory must be a valid VkDeviceMemory handle", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-memoryOffset-01595", "memoryOffset must be less than the size of memory", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-memoryOffset-01600", "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from a call to vkGetBufferMemoryRequirements with buffer", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-pNext-01605", "If the pNext chain includes a VkBindBufferMemoryDeviceGroupInfo structure, all instances of memory specified by VkBindBufferMemoryDeviceGroupInfo::pDeviceIndices must have been allocated", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkBindBufferMemoryDeviceGroupInfo", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkBindBufferMemoryInfo-size-01601", "The size member of the VkMemoryRequirements structure returned from a call to vkGetBufferMemoryRequirements with buffer must be less than or equal to the size of memory minus memoryOffset", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryDeviceGroupInfo-deviceIndexCount-01633", "At least one of deviceIndexCount and splitInstanceBindRegionCount must be zero", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryDeviceGroupInfo-deviceIndexCount-01634", "deviceIndexCount must either be zero or equal to the number of physical devices in the logical device", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryDeviceGroupInfo-extent-01640", "The extent.width member of any element of pSplitInstanceBindRegions must either be a multiple of the sparse image block width of all non-metadata aspects of the image, or else extent.width + offset.x must equal the width of the image subresource", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryDeviceGroupInfo-extent-01641", "The extent.height member of any element of pSplitInstanceBindRegions must either be a multiple of the sparse image block height of all non-metadata aspects of the image, or else extent.height + offset.y must equal the width of the image subresource", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryDeviceGroupInfo-offset-01638", "The offset.x member of any element of pSplitInstanceBindRegions must be a multiple of the sparse image block width (VkSparseImageFormatProperties::imageGranularity.width) of all non-metadata aspects of the image", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryDeviceGroupInfo-offset-01639", "The offset.y member of any element of pSplitInstanceBindRegions must be a multiple of the sparse image block height (VkSparseImageFormatProperties::imageGranularity.height) of all non-metadata aspects of the image", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryDeviceGroupInfo-pDeviceIndices-01635", "All elements of pDeviceIndices must be valid device indices", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryDeviceGroupInfo-pDeviceIndices-parameter", "If deviceIndexCount is not 0, pDeviceIndices must be a valid pointer to an array of deviceIndexCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryDeviceGroupInfo-pSplitInstanceBindRegions-01637", "Elements of pSplitInstanceBindRegions that correspond to the same instance of an image must not overlap", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryDeviceGroupInfo-pSplitInstanceBindRegions-parameter", "If splitInstanceBindRegionCount is not 0, pSplitInstanceBindRegions must be a valid pointer to an array of splitInstanceBindRegionCount VkRect2D structures", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryDeviceGroupInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryDeviceGroupInfo-splitInstanceBindRegionCount-01636", "splitInstanceBindRegionCount must either be zero or equal to the number of physical devices in the logical device squared", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-None-04124", "If image was created with the VK_IMAGE_CREATE_PROTECTED_BIT bit set, the image must be bound to a memory object allocated with a memory type that reports VK_MEMORY_PROPERTY_PROTECTED_BIT", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-None-04125", "If image was created with the VK_IMAGE_CREATE_PROTECTED_BIT bit not set, the image must not be bound to a memory object created with a memory type that reports VK_MEMORY_PROPERTY_PROTECTED_BIT", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-commonparent", "Both of image, and memory that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-handleTypes-02793", "If the value of VkExportMemoryAllocateInfo::handleTypes used to allocate memory is not 0, it must include at least one of the handles set in VkExternalMemoryImageCreateInfo::handleTypes when image was created", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-image-01609", "image must not already be backed by a memory object", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-image-01610", "image must not have been created with any sparse memory binding flags", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-image-01622", "If image requires a dedicated allocation (as reported by vkGetImageMemoryRequirements2 in VkMemoryDedicatedRequirements::requiresDedicatedAllocation for image), memory must have been created with VkMemoryDedicatedAllocateInfo::image equal to image and memoryOffset must be zero", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-image-01623", "If image was created with VkDedicatedAllocationImageCreateInfoNV::dedicatedAllocation equal to VK_TRUE, memory must have been created with VkDedicatedAllocationMemoryAllocateInfoNV::image equal to image and memoryOffset must be zero", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-image-01624", "If image was not created with VkDedicatedAllocationImageCreateInfoNV::dedicatedAllocation equal to VK_TRUE, memory must not have been allocated dedicated for a specific buffer or image", "default"},
+ {"VUID-VkBindImageMemoryInfo-image-01630", "If image was created with a valid swapchain handle in VkImageSwapchainCreateInfoKHR::swapchain, then the pNext chain must include a VkBindImageMemorySwapchainInfoKHR structure containing the same swapchain handle", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-image-parameter", "image must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-memory-01612", "memory must have been allocated using one of the memory types allowed in the memoryTypeBits member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements with image", "default"},
+ {"VUID-VkBindImageMemoryInfo-memory-01614", "The difference of the size of memory and memoryOffset must be greater than or equal to the size member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements with the same image", "default"},
+ {"VUID-VkBindImageMemoryInfo-memory-01625", "memory must be a valid VkDeviceMemory handle", "1.2"},
+ {"VUID-VkBindImageMemoryInfo-memory-01903", "If the VkMemoryAllocateInfo provided when memory was allocated included a VkMemoryDedicatedAllocateInfo structure in its pNext chain, and VkMemoryDedicatedAllocateInfo::image was not VK_NULL_HANDLE, then image must equal VkMemoryDedicatedAllocateInfo::image and memoryOffset must be zero", "1.2-khr-extensions"},
+ {"VUID-VkBindImageMemoryInfo-memory-02630", "If the dedicated allocation image aliasing feature is not enabled, and the VkMemoryAllocateInfo provided when memory was allocated included a VkMemoryDedicatedAllocateInfo structure in its pNext chain, and VkMemoryDedicatedAllocateInfo::image was not VK_NULL_HANDLE, then image must equal VkMemoryDedicatedAllocateInfo::image and memoryOffset must be zero", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-memory-02631", "If the dedicated allocation image aliasing feature is enabled, and the VkMemoryAllocateInfo provided when memory was allocated included a VkMemoryDedicatedAllocateInfo structure in its pNext chain, and VkMemoryDedicatedAllocateInfo::image was not VK_NULL_HANDLE, then memoryOffset must be zero, and image must be either equal to VkMemoryDedicatedAllocateInfo::image or an image that was created using the same parameters in VkImageCreateInfo, with the exception that extent and arrayLayers may differ subject to the following restrictions: every dimension in the extent parameter of the image being bound must be equal to or smaller than the original image for which the allocation was created; and the arrayLayers parameter of the image being bound must be equal to or smaller than the original image for which the allocation was created", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-memory-02794", "If memory was created by a memory import operation, the external handle type of the imported memory must also have been set in VkExternalMemoryImageCreateInfo::handleTypes when image was created", "1.2-khr-extensions"},
+ {"VUID-VkBindImageMemoryInfo-memory-02991", "If memory was created by a memory import operation, that is not VkImportAndroidHardwareBufferInfoANDROID with a non-NULL buffer value, the external handle type of the imported memory must also have been set in VkExternalMemoryImageCreateInfo::handleTypes when image was created", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-memory-02992", "If memory was created with the VkImportAndroidHardwareBufferInfoANDROID memory import operation with a non-NULL buffer value, VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID must also have been set in VkExternalMemoryImageCreateInfo::handleTypes when image was created", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-memoryOffset-01611", "memoryOffset must be less than the size of memory", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-memoryOffset-01613", "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements with image", "default"},
+ {"VUID-VkBindImageMemoryInfo-pNext-01615", "If the pNext chain does not include a VkBindImagePlaneMemoryInfo structure, memory must have been allocated using one of the memory types allowed in the memoryTypeBits member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements2 with image", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-pNext-01616", "If the pNext chain does not include a VkBindImagePlaneMemoryInfo structure, memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements2 with image", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-pNext-01617", "If the pNext chain does not include a VkBindImagePlaneMemoryInfo structure, the difference of the size of memory and memoryOffset must be greater than or equal to the size member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements2 with the same image", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-pNext-01618", "If the pNext chain includes a VkBindImagePlaneMemoryInfo structure, image must have been created with the VK_IMAGE_CREATE_DISJOINT_BIT bit set", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-pNext-01619", "If the pNext chain includes a VkBindImagePlaneMemoryInfo structure, memory must have been allocated using one of the memory types allowed in the memoryTypeBits member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements2 with image and where VkBindImagePlaneMemoryInfo::planeAspect corresponds to the VkImagePlaneMemoryRequirementsInfo::planeAspect in the VkImageMemoryRequirementsInfo2 structure's pNext chain", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-pNext-01620", "If the pNext chain includes a VkBindImagePlaneMemoryInfo structure, memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements2 with image and where VkBindImagePlaneMemoryInfo::planeAspect corresponds to the VkImagePlaneMemoryRequirementsInfo::planeAspect in the VkImageMemoryRequirementsInfo2 structure's pNext chain", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-pNext-01621", "If the pNext chain includes a VkBindImagePlaneMemoryInfo structure, the difference of the size of memory and memoryOffset must be greater than or equal to the size member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements2 with the same image and where VkBindImagePlaneMemoryInfo::planeAspect corresponds to the VkImagePlaneMemoryRequirementsInfo::planeAspect in the VkImageMemoryRequirementsInfo2 structure's pNext chain", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-pNext-01626", "If the pNext chain includes a VkBindImageMemoryDeviceGroupInfo structure, all instances of memory specified by VkBindImageMemoryDeviceGroupInfo::pDeviceIndices must have been allocated", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-pNext-01627", "If the pNext chain includes a VkBindImageMemoryDeviceGroupInfo structure, and VkBindImageMemoryDeviceGroupInfo::splitInstanceBindRegionCount is not zero, then image must have been created with the VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT bit set", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-pNext-01628", "If the pNext chain includes a VkBindImageMemoryDeviceGroupInfo structure, all elements of VkBindImageMemoryDeviceGroupInfo::pSplitInstanceBindRegions must be valid rectangles contained within the dimensions of image", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-pNext-01629", "If the pNext chain includes a VkBindImageMemoryDeviceGroupInfo structure, the union of the areas of all elements of VkBindImageMemoryDeviceGroupInfo::pSplitInstanceBindRegions that correspond to the same instance of image must cover the entire image", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-pNext-01631", "If the pNext chain includes a VkBindImageMemorySwapchainInfoKHR structure, memory must be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-pNext-01632", "If the pNext chain does not include a VkBindImageMemorySwapchainInfoKHR structure, memory must be a valid VkDeviceMemory handle", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkBindImageMemoryDeviceGroupInfo, VkBindImageMemorySwapchainInfoKHR, or VkBindImagePlaneMemoryInfo", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO", "1.2-extensions"},
+ {"VUID-VkBindImageMemoryInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkBindImageMemorySwapchainInfoKHR-imageIndex-01644", "imageIndex must be less than the number of images in swapchain", "1.2-extensions"},
+ {"VUID-VkBindImageMemorySwapchainInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkBindImageMemorySwapchainInfoKHR-swapchain-parameter", "swapchain must be a valid VkSwapchainKHR handle", "1.2-extensions"},
+ {"VUID-VkBindImagePlaneMemoryInfo-planeAspect-02283", "If the image's tiling is VK_IMAGE_TILING_LINEAR or VK_IMAGE_TILING_OPTIMAL, then planeAspect must be a single valid format plane for the image (that is, for a two-plane image planeAspect must be VK_IMAGE_ASPECT_PLANE_0_BIT or VK_IMAGE_ASPECT_PLANE_1_BIT, and for a three-plane image planeAspect must be VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT or VK_IMAGE_ASPECT_PLANE_2_BIT)", "1.2-extensions"},
+ {"VUID-VkBindImagePlaneMemoryInfo-planeAspect-02284", "If the image's tiling is VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then planeAspect must be a single valid memory plane for the image (that is, aspectMask must specify a plane index that is less than the VkDrmFormatModifierPropertiesEXT::drmFormatModifierPlaneCount associated with the image's format and VkImageDrmFormatModifierPropertiesEXT::drmFormatModifier)", "1.2-extensions"},
+ {"VUID-VkBindImagePlaneMemoryInfo-planeAspect-parameter", "planeAspect must be a valid VkImageAspectFlagBits value", "1.2-extensions"},
+ {"VUID-VkBindImagePlaneMemoryInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO", "1.2-extensions"},
+ {"VUID-VkBindIndexBufferIndirectCommandNV-None-02946", "The buffer's usage flag from which the address was acquired must have the VK_BUFFER_USAGE_INDEX_BUFFER_BIT bit set", "1.2-extensions"},
+ {"VUID-VkBindIndexBufferIndirectCommandNV-None-02948", "Each element of the buffer from which the address was acquired and that is non-sparse must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-VkBindIndexBufferIndirectCommandNV-bufferAddress-02947", "The bufferAddress must be aligned to the indexType used", "1.2-extensions"},
+ {"VUID-VkBindIndexBufferIndirectCommandNV-indexType-parameter", "indexType must be a valid VkIndexType value", "1.2-extensions"},
+ {"VUID-VkBindShaderGroupIndirectCommandNV-None-02944", "The current bound graphics pipeline, as well as the pipelines it may reference, must have been created with VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV", "1.2-extensions"},
+ {"VUID-VkBindShaderGroupIndirectCommandNV-index-02945", "The index must be within range of the accessible shader groups of the current bound graphics pipeline. See vkCmdBindPipelineShaderGroupNV for further details", "1.2-extensions"},
+ {"VUID-VkBindSparseInfo-commonparent", "Both of the elements of pSignalSemaphores, and the elements of pWaitSemaphores that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkBindSparseInfo-pBufferBinds-parameter", "If bufferBindCount is not 0, pBufferBinds must be a valid pointer to an array of bufferBindCount valid VkSparseBufferMemoryBindInfo structures", "1.2-extensions"},
+ {"VUID-VkBindSparseInfo-pImageBinds-parameter", "If imageBindCount is not 0, pImageBinds must be a valid pointer to an array of imageBindCount valid VkSparseImageMemoryBindInfo structures", "1.2-extensions"},
+ {"VUID-VkBindSparseInfo-pImageOpaqueBinds-parameter", "If imageOpaqueBindCount is not 0, pImageOpaqueBinds must be a valid pointer to an array of imageOpaqueBindCount valid VkSparseImageOpaqueMemoryBindInfo structures", "1.2-extensions"},
+ {"VUID-VkBindSparseInfo-pNext-03247", "If the pNext chain of this structure includes a VkTimelineSemaphoreSubmitInfo structure and any element of pWaitSemaphores was created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE then its waitSemaphoreValueCount member must equal waitSemaphoreCount", "1.2-extensions"},
+ {"VUID-VkBindSparseInfo-pNext-03248", "If the pNext chain of this structure includes a VkTimelineSemaphoreSubmitInfo structure and any element of pSignalSemaphores was created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE then its signalSemaphoreValueCount member must equal signalSemaphoreCount", "1.2-extensions"},
+ {"VUID-VkBindSparseInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkDeviceGroupBindSparseInfo or VkTimelineSemaphoreSubmitInfo", "1.2-extensions"},
+ {"VUID-VkBindSparseInfo-pSignalSemaphores-03249", "For each element of pSignalSemaphores created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE the corresponding element of VkTimelineSemaphoreSubmitInfo::pSignalSemaphoreValues must have a value greater than the current value of the semaphore when the semaphore signal operation is executed", "1.2-extensions"},
+ {"VUID-VkBindSparseInfo-pSignalSemaphores-03251", "For each element of pSignalSemaphores created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE the corresponding element of VkTimelineSemaphoreSubmitInfo::pSignalSemaphoreValues must have a value which does not differ from the current value of the semaphore or from the value of any outstanding semaphore wait or signal operation on that semaphore by more than maxTimelineSemaphoreValueDifference", "1.2-extensions"},
+ {"VUID-VkBindSparseInfo-pSignalSemaphores-parameter", "If signalSemaphoreCount is not 0, pSignalSemaphores must be a valid pointer to an array of signalSemaphoreCount valid VkSemaphore handles", "1.2-extensions"},
+ {"VUID-VkBindSparseInfo-pWaitSemaphores-03246", "If any element of pWaitSemaphores or pSignalSemaphores was created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE then the pNext chain must include a VkTimelineSemaphoreSubmitInfo structure", "1.2-extensions"},
+ {"VUID-VkBindSparseInfo-pWaitSemaphores-03250", "For each element of pWaitSemaphores created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE the corresponding element of VkTimelineSemaphoreSubmitInfo::pWaitSemaphoreValues must have a value which does not differ from the current value of the semaphore or from the value of any outstanding semaphore wait or signal operation on that semaphore by more than maxTimelineSemaphoreValueDifference", "1.2-extensions"},
+ {"VUID-VkBindSparseInfo-pWaitSemaphores-parameter", "If waitSemaphoreCount is not 0, pWaitSemaphores must be a valid pointer to an array of waitSemaphoreCount valid VkSemaphore handles", "1.2-extensions"},
+ {"VUID-VkBindSparseInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_BIND_SPARSE_INFO", "1.2-extensions"},
+ {"VUID-VkBindSparseInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkBindVertexBufferIndirectCommandNV-None-02949", "The buffer's usage flag from which the address was acquired must have the VK_BUFFER_USAGE_VERTEX_BUFFER_BIT bit set", "1.2-extensions"},
+ {"VUID-VkBindVertexBufferIndirectCommandNV-None-02950", "Each element of the buffer from which the address was acquired and that is non-sparse must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-VkBufferCopy-size-01988", "The size must be greater than 0", "1.2-extensions"},
+ {"VUID-VkBufferCreateInfo-None-01888", "If any of the bits VK_BUFFER_CREATE_SPARSE_BINDING_BIT, VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT, or VK_BUFFER_CREATE_SPARSE_ALIASED_BIT are set, VK_BUFFER_CREATE_PROTECTED_BIT must not also be set", "1.2-extensions"},
+ {"VUID-VkBufferCreateInfo-deviceAddress-02604", "If VkBufferDeviceAddressCreateInfoEXT::deviceAddress is not zero, flags must include VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT", "1.2-extensions"},
+ {"VUID-VkBufferCreateInfo-flags-00915", "If the sparse bindings feature is not enabled, flags must not contain VK_BUFFER_CREATE_SPARSE_BINDING_BIT", "1.2-extensions"},
+ {"VUID-VkBufferCreateInfo-flags-00916", "If the sparse buffer residency feature is not enabled, flags must not contain VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT", "1.2-extensions"},
+ {"VUID-VkBufferCreateInfo-flags-00917", "If the sparse aliased residency feature is not enabled, flags must not contain VK_BUFFER_CREATE_SPARSE_ALIASED_BIT", "1.2-extensions"},
+ {"VUID-VkBufferCreateInfo-flags-00918", "If flags contains VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT or VK_BUFFER_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_BUFFER_CREATE_SPARSE_BINDING_BIT", "1.2-extensions"},
+ {"VUID-VkBufferCreateInfo-flags-01887", "If the protected memory feature is not enabled, flags must not contain VK_BUFFER_CREATE_PROTECTED_BIT", "1.2-extensions"},
+ {"VUID-VkBufferCreateInfo-flags-03338", "If flags includes VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT, the bufferDeviceAddressCaptureReplay or VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::bufferDeviceAddressCaptureReplay feature must be enabled", "1.2-extensions"},
+ {"VUID-VkBufferCreateInfo-flags-parameter", "flags must be a valid combination of VkBufferCreateFlagBits values", "1.2-extensions"},
+ {"VUID-VkBufferCreateInfo-opaqueCaptureAddress-03337", "If VkBufferOpaqueCaptureAddressCreateInfo::opaqueCaptureAddress is not zero, flags must include VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT", "1.2-extensions"},
+ {"VUID-VkBufferCreateInfo-pNext-00920", "If the pNext chain includes a VkExternalMemoryBufferCreateInfo structure, its handleTypes member must only contain bits that are also in VkExternalBufferProperties::externalMemoryProperties.compatibleHandleTypes, as returned by vkGetPhysicalDeviceExternalBufferProperties with pExternalBufferInfo->handleType equal to any one of the handle types specified in VkExternalMemoryBufferCreateInfo::handleTypes", "1.2-extensions"},
+ {"VUID-VkBufferCreateInfo-pNext-01571", "If the pNext chain includes a VkDedicatedAllocationBufferCreateInfoNV structure, and the dedicatedAllocation member of the chained structure is VK_TRUE, then flags must not include VK_BUFFER_CREATE_SPARSE_BINDING_BIT, VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT, or VK_BUFFER_CREATE_SPARSE_ALIASED_BIT", "1.2-extensions"},
+ {"VUID-VkBufferCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkBufferDeviceAddressCreateInfoEXT, VkBufferOpaqueCaptureAddressCreateInfo, VkDedicatedAllocationBufferCreateInfoNV, or VkExternalMemoryBufferCreateInfo", "1.2-extensions"},
+ {"VUID-VkBufferCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkBufferCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkBufferCreateInfo-sharingMode-00913", "If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a valid pointer to an array of queueFamilyIndexCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkBufferCreateInfo-sharingMode-00914", "If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1", "1.2-extensions"},
+ {"VUID-VkBufferCreateInfo-sharingMode-01391", "If sharingMode is VK_SHARING_MODE_CONCURRENT, each element of pQueueFamilyIndices must be unique and must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the physicalDevice that was used to create device", "1.0"},
+ {"VUID-VkBufferCreateInfo-sharingMode-01419", "If sharingMode is VK_SHARING_MODE_CONCURRENT, each element of pQueueFamilyIndices must be unique and must be less than pQueueFamilyPropertyCount returned by either vkGetPhysicalDeviceQueueFamilyProperties or vkGetPhysicalDeviceQueueFamilyProperties2 for the physicalDevice that was used to create device", "1.2-extensions"},
+ {"VUID-VkBufferCreateInfo-sharingMode-parameter", "sharingMode must be a valid VkSharingMode value", "1.2-extensions"},
+ {"VUID-VkBufferCreateInfo-size-00912", "size must be greater than 0", "1.2-extensions"},
+ {"VUID-VkBufferCreateInfo-usage-parameter", "usage must be a valid combination of VkBufferUsageFlagBits values", "1.2-extensions"},
+ {"VUID-VkBufferCreateInfo-usage-requiredbitmask", "usage must not be 0", "1.2-extensions"},
+ {"VUID-VkBufferDeviceAddressCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkBufferDeviceAddressInfo-buffer-02600", "If buffer is non-sparse and was not created with the VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT flag, then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-VkBufferDeviceAddressInfo-buffer-02601", "buffer must have been created with VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT", "1.2-extensions"},
+ {"VUID-VkBufferDeviceAddressInfo-buffer-parameter", "buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-VkBufferDeviceAddressInfo-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkBufferDeviceAddressInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO", "1.2-extensions"},
+ {"VUID-VkBufferImageCopy-None-00214", "When copying to the depth aspect of an image subresource, the data in the source buffer must be in the range [0,1]", "1.2-khr-extensions"},
+ {"VUID-VkBufferImageCopy-None-01735", "If the calling command's VkImage parameter is a compressed image, or a single-plane, \"_422\" image format, bufferRowLength must be a multiple of the compressed texel block width", "1.2-extensions"},
+ {"VUID-VkBufferImageCopy-None-01736", "If the calling command's VkImage parameter is a compressed image, or a single-plane, \"_422\" image format, bufferImageHeight must be a multiple of the compressed texel block height", "1.2-extensions"},
+ {"VUID-VkBufferImageCopy-None-01737", "If the calling command's VkImage parameter is a compressed image, or a single-plane, \"_422\" image format, all members of imageOffset must be a multiple of the corresponding dimensions of the compressed texel block", "1.2-extensions"},
+ {"VUID-VkBufferImageCopy-None-01738", "If the calling command's VkImage parameter is a compressed image, or a single-plane, \"_422\" image format, bufferOffset must be a multiple of the compressed texel block size in bytes", "1.2-extensions"},
+ {"VUID-VkBufferImageCopy-None-01739", "If the calling command's VkImage parameter is a compressed image, or a single-plane, \"_422\" image format, imageExtent.width must be a multiple of the compressed texel block width or (imageExtent.width + imageOffset.x) must equal the image subresource width", "1.2-extensions"},
+ {"VUID-VkBufferImageCopy-None-01740", "If the calling command's VkImage parameter is a compressed image, or a single-plane, \"_422\" image format, imageExtent.height must be a multiple of the compressed texel block height or (imageExtent.height + imageOffset.y) must equal the image subresource height", "1.2-extensions"},
+ {"VUID-VkBufferImageCopy-None-01741", "If the calling command's VkImage parameter is a compressed image, or a single-plane, \"_422\" image format, imageExtent.depth must be a multiple of the compressed texel block depth or (imageExtent.depth + imageOffset.z) must equal the image subresource depth", "1.2-extensions"},
+ {"VUID-VkBufferImageCopy-aspectMask-00211", "The aspectMask member of imageSubresource must specify aspects present in the calling command's VkImage parameter", "1.2-extensions"},
+ {"VUID-VkBufferImageCopy-aspectMask-00212", "The aspectMask member of imageSubresource must only have a single bit set", "1.2-extensions"},
+ {"VUID-VkBufferImageCopy-aspectMask-01560", "If the calling command's VkImage parameter's format is a multi-planar format, then the aspectMask member of imageSubresource must be VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT, or VK_IMAGE_ASPECT_PLANE_2_BIT (with VK_IMAGE_ASPECT_PLANE_2_BIT valid only for image formats with three planes)", "1.2-extensions"},
+ {"VUID-VkBufferImageCopy-baseArrayLayer-00213", "If the calling command's VkImage parameter is of VkImageType VK_IMAGE_TYPE_3D, the baseArrayLayer and layerCount members of imageSubresource must be 0 and 1, respectively", "1.2-extensions"},
+ {"VUID-VkBufferImageCopy-bufferImageHeight-00196", "bufferImageHeight must be 0, or greater than or equal to the height member of imageExtent", "1.2-extensions"},
+ {"VUID-VkBufferImageCopy-bufferImageHeight-00204", "If the calling command's VkImage parameter is a compressed image, bufferImageHeight must be a multiple of the compressed texel block height", "1.0"},
+ {"VUID-VkBufferImageCopy-bufferOffset-00193", "If the calling command's VkImage parameter's format is not a depth/stencil format, then bufferOffset must be a multiple of the format's texel block size", "1.0"},
+ {"VUID-VkBufferImageCopy-bufferOffset-00206", "If the calling command's VkImage parameter is a compressed image, bufferOffset must be a multiple of the compressed texel block size in bytes", "1.0"},
+ {"VUID-VkBufferImageCopy-bufferOffset-01558", "If the calling command's VkImage parameter's format is not a depth/stencil format or a multi-planar format, then bufferOffset must be a multiple of the format's texel block size", "1.2-extensions"},
+ {"VUID-VkBufferImageCopy-bufferOffset-01559", "If the calling command's VkImage parameter's format is a multi-planar format, then bufferOffset must be a multiple of the element size of the compatible format for the format and the aspectMask of the imageSubresource as defined in Compatible formats of planes of multi-planar formats", "1.2-extensions"},
+ {"VUID-VkBufferImageCopy-bufferRowLength-00195", "bufferRowLength must be 0, or greater than or equal to the width member of imageExtent", "1.2-extensions"},
+ {"VUID-VkBufferImageCopy-bufferRowLength-00203", "If the calling command's VkImage parameter is a compressed image, bufferRowLength must be a multiple of the compressed texel block width", "1.0"},
+ {"VUID-VkBufferImageCopy-imageExtent-00207", "If the calling command's VkImage parameter is a compressed image, imageExtent.width must be a multiple of the compressed texel block width or (imageExtent.width + imageOffset.x) must equal the image subresource width", "1.0"},
+ {"VUID-VkBufferImageCopy-imageExtent-00208", "If the calling command's VkImage parameter is a compressed image, imageExtent.height must be a multiple of the compressed texel block height or (imageExtent.height + imageOffset.y) must equal the image subresource height", "1.0"},
+ {"VUID-VkBufferImageCopy-imageExtent-00209", "If the calling command's VkImage parameter is a compressed image, imageExtent.depth must be a multiple of the compressed texel block depth or (imageExtent.depth + imageOffset.z) must equal the image subresource depth", "1.0"},
+ {"VUID-VkBufferImageCopy-imageOffset-00197", "imageOffset.x and (imageExtent.width + imageOffset.x) must both be greater than or equal to 0 and less than or equal to the image subresource width", "1.2-extensions"},
+ {"VUID-VkBufferImageCopy-imageOffset-00198", "imageOffset.y and (imageExtent.height + imageOffset.y) must both be greater than or equal to 0 and less than or equal to the image subresource height", "1.2-extensions"},
+ {"VUID-VkBufferImageCopy-imageOffset-00200", "imageOffset.z and (imageExtent.depth + imageOffset.z) must both be greater than or equal to 0 and less than or equal to the image subresource depth", "1.2-extensions"},
+ {"VUID-VkBufferImageCopy-imageOffset-00205", "If the calling command's VkImage parameter is a compressed image, all members of imageOffset must be a multiple of the corresponding dimensions of the compressed texel block", "1.0"},
+ {"VUID-VkBufferImageCopy-imageSubresource-parameter", "imageSubresource must be a valid VkImageSubresourceLayers structure", "1.2-extensions"},
+ {"VUID-VkBufferImageCopy-srcImage-00199", "If the calling command's srcImage (vkCmdCopyImageToBuffer) or dstImage (vkCmdCopyBufferToImage) is of type VK_IMAGE_TYPE_1D, then imageOffset.y must be 0 and imageExtent.height must be 1", "1.2-extensions"},
+ {"VUID-VkBufferImageCopy-srcImage-00201", "If the calling command's srcImage (vkCmdCopyImageToBuffer) or dstImage (vkCmdCopyBufferToImage) is of type VK_IMAGE_TYPE_1D or VK_IMAGE_TYPE_2D, then imageOffset.z must be 0 and imageExtent.depth must be 1", "1.2-extensions"},
+ {"VUID-VkBufferMemoryBarrier-buffer-01190", "If buffer was created with a sharing mode of VK_SHARING_MODE_CONCURRENT, srcQueueFamilyIndex and dstQueueFamilyIndex must both be VK_QUEUE_FAMILY_IGNORED", "1.0"},
+ {"VUID-VkBufferMemoryBarrier-buffer-01191", "If buffer was created with a sharing mode of VK_SHARING_MODE_CONCURRENT, at least one of srcQueueFamilyIndex and dstQueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED", "1.2-extensions"},
+ {"VUID-VkBufferMemoryBarrier-buffer-01931", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-VkBufferMemoryBarrier-buffer-04086", "If buffer was created with a sharing mode of VK_SHARING_MODE_EXCLUSIVE, and srcQueueFamilyIndex and dstQueueFamilyIndex are not equal, srcQueueFamilyIndex and dstQueueFamilyIndex must be valid queue families", "1.0"},
+ {"VUID-VkBufferMemoryBarrier-buffer-04088", "If buffer was created with a sharing mode of VK_SHARING_MODE_CONCURRENT, srcQueueFamilyIndex and dstQueueFamilyIndex are not equal, and one of srcQueueFamilyIndex and dstQueueFamilyIndex is a special queue family values reserved for external memory transfers, the other must be VK_QUEUE_FAMILY_IGNORED", "1.2-extensions"},
+ {"VUID-VkBufferMemoryBarrier-buffer-04089", "If buffer was created with a sharing mode of VK_SHARING_MODE_EXCLUSIVE, and srcQueueFamilyIndex and dstQueueFamilyIndex are not equal, srcQueueFamilyIndex and dstQueueFamilyIndex must both be valid queue families, or one of the special queue family values reserved for external memory transfers, as described in Queue Family Ownership Transfer", "1.2-extensions"},
+ {"VUID-VkBufferMemoryBarrier-buffer-parameter", "buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-VkBufferMemoryBarrier-offset-01187", "offset must be less than the size of buffer", "1.2-extensions"},
+ {"VUID-VkBufferMemoryBarrier-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkBufferMemoryBarrier-sType-sType", "sType must be VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER", "1.2-extensions"},
+ {"VUID-VkBufferMemoryBarrier-size-01188", "If size is not equal to VK_WHOLE_SIZE, size must be greater than 0", "1.2-extensions"},
+ {"VUID-VkBufferMemoryBarrier-size-01189", "If size is not equal to VK_WHOLE_SIZE, size must be less than or equal to than the size of buffer minus offset", "1.2-extensions"},
+ {"VUID-VkBufferMemoryBarrier-srcQueueFamilyIndex-04087", "If srcQueueFamilyIndex is not equal to dstQueueFamilyIndex, at least one must not be a special queue family reserved for external memory ownership transfers, as described in Queue Family Ownership Transfer", "1.2-extensions"},
+ {"VUID-VkBufferMemoryRequirementsInfo2-buffer-parameter", "buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-VkBufferMemoryRequirementsInfo2-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkBufferMemoryRequirementsInfo2-sType-sType", "sType must be VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2", "1.2-extensions"},
+ {"VUID-VkBufferOpaqueCaptureAddressCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkBufferViewCreateInfo-buffer-00932", "buffer must have been created with a usage value containing at least one of VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT", "1.2-extensions"},
+ {"VUID-VkBufferViewCreateInfo-buffer-00933", "If buffer was created with usage containing VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, format must be supported for uniform texel buffers, as specified by the VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT flag in VkFormatProperties::bufferFeatures returned by vkGetPhysicalDeviceFormatProperties", "1.2-extensions"},
+ {"VUID-VkBufferViewCreateInfo-buffer-00934", "If buffer was created with usage containing VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, format must be supported for storage texel buffers, as specified by the VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT flag in VkFormatProperties::bufferFeatures returned by vkGetPhysicalDeviceFormatProperties", "1.2-extensions"},
+ {"VUID-VkBufferViewCreateInfo-buffer-00935", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-VkBufferViewCreateInfo-buffer-02750", "If the texelBufferAlignment feature is enabled and if buffer was created with usage containing VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, offset must be a multiple of the lesser of VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT::storageTexelBufferOffsetAlignmentBytes or, if VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT::storageTexelBufferOffsetSingleTexelAlignment is VK_TRUE, the size of a texel of the requested format. If the size of a texel is a multiple of three bytes, then the size of a single component of format is used instead", "1.2-extensions"},
+ {"VUID-VkBufferViewCreateInfo-buffer-02751", "If the texelBufferAlignment feature is enabled and if buffer was created with usage containing VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, offset must be a multiple of the lesser of VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT::uniformTexelBufferOffsetAlignmentBytes or, if VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT::uniformTexelBufferOffsetSingleTexelAlignment is VK_TRUE, the size of a texel of the requested format. If the size of a texel is a multiple of three bytes, then the size of a single component of format is used instead", "1.2-extensions"},
+ {"VUID-VkBufferViewCreateInfo-buffer-parameter", "buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-VkBufferViewCreateInfo-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkBufferViewCreateInfo-format-parameter", "format must be a valid VkFormat value", "1.2-extensions"},
+ {"VUID-VkBufferViewCreateInfo-offset-00925", "offset must be less than the size of buffer", "1.2-extensions"},
+ {"VUID-VkBufferViewCreateInfo-offset-00926", "offset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment", "1.2-khr-extensions"},
+ {"VUID-VkBufferViewCreateInfo-offset-00931", "If range is not equal to VK_WHOLE_SIZE, the sum of offset and range must be less than or equal to the size of buffer", "1.2-extensions"},
+ {"VUID-VkBufferViewCreateInfo-offset-02749", "If the texelBufferAlignment feature is not enabled, offset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment", "1.2-extensions"},
+ {"VUID-VkBufferViewCreateInfo-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkBufferViewCreateInfo-range-00928", "If range is not equal to VK_WHOLE_SIZE, range must be greater than 0", "1.2-extensions"},
+ {"VUID-VkBufferViewCreateInfo-range-00929", "If range is not equal to VK_WHOLE_SIZE, range must be an integer multiple of the texel block size of format", "1.2-extensions"},
+ {"VUID-VkBufferViewCreateInfo-range-00930", "If range is not equal to VK_WHOLE_SIZE, the number of texel buffer elements given by ({lfloor}range / (texel block size){rfloor} {times} (texels per block)) where texel block size and texels per block are as defined in the Compatible Formats table for format, must be less than or equal to VkPhysicalDeviceLimits::maxTexelBufferElements", "1.2-extensions"},
+ {"VUID-VkBufferViewCreateInfo-range-04059", "If range is equal to VK_WHOLE_SIZE, the number of texel buffer elements given by ({lfloor}(size - offset) / (texel block size){rfloor} {times} (texels per block)) where size is the size of buffer, and texel block size and texels per block are as defined in the Compatible Formats table for format, must be less than or equal to VkPhysicalDeviceLimits::maxTexelBufferElements", "1.2-extensions"},
+ {"VUID-VkBufferViewCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkCalibratedTimestampInfoEXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkCalibratedTimestampInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkCalibratedTimestampInfoEXT-timeDomain-02354", "timeDomain must be one of the VkTimeDomainEXT values returned by vkGetPhysicalDeviceCalibrateableTimeDomainsEXT", "1.2-extensions"},
+ {"VUID-VkCalibratedTimestampInfoEXT-timeDomain-parameter", "timeDomain must be a valid VkTimeDomainEXT value", "1.2-extensions"},
+ {"VUID-VkCheckpointDataNV-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkCheckpointDataNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV", "1.2-extensions"},
+ {"VUID-VkClearAttachment-aspectMask-00019", "If aspectMask includes VK_IMAGE_ASPECT_COLOR_BIT, it must not include VK_IMAGE_ASPECT_DEPTH_BIT or VK_IMAGE_ASPECT_STENCIL_BIT", "1.2-extensions"},
+ {"VUID-VkClearAttachment-aspectMask-00020", "aspectMask must not include VK_IMAGE_ASPECT_METADATA_BIT", "1.2-extensions"},
+ {"VUID-VkClearAttachment-aspectMask-02246", "aspectMask must not include VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT for any index i", "1.2-extensions"},
+ {"VUID-VkClearAttachment-aspectMask-parameter", "aspectMask must be a valid combination of VkImageAspectFlagBits values", "1.2-extensions"},
+ {"VUID-VkClearAttachment-aspectMask-requiredbitmask", "aspectMask must not be 0", "1.2-extensions"},
+ {"VUID-VkClearAttachment-clearValue-00021", "clearValue must be a valid VkClearValue union", "1.2-extensions"},
+ {"VUID-VkClearDepthStencilValue-depth-00022", "Unless the VK_EXT_depth_range_unrestricted extension is enabled depth must be between 0.0 and 1.0, inclusive", "1.2-extensions"},
+ {"VUID-VkClearDepthStencilValue-depth-02506", "depth must be between 0.0 and 1.0, inclusive", "1.2-khr-extensions"},
+ {"VUID-VkCoarseSampleLocationNV-pixelX-02078", "pixelX must be less than the width (in pixels) of the fragment", "1.2-extensions"},
+ {"VUID-VkCoarseSampleLocationNV-pixelY-02079", "pixelY must be less than the height (in pixels) of the fragment", "1.2-extensions"},
+ {"VUID-VkCoarseSampleLocationNV-sample-02080", "sample must be less than the number of coverage samples in each pixel belonging to the fragment", "1.2-extensions"},
+ {"VUID-VkCoarseSampleOrderCustomNV-pSampleLocations-02077", "The array pSampleLocations must contain exactly one entry for every combination of valid values for pixelX, pixelY, and sample in the structure VkCoarseSampleOrderCustomNV", "1.2-extensions"},
+ {"VUID-VkCoarseSampleOrderCustomNV-pSampleLocations-parameter", "pSampleLocations must be a valid pointer to an array of sampleLocationCount VkCoarseSampleLocationNV structures", "1.2-extensions"},
+ {"VUID-VkCoarseSampleOrderCustomNV-sampleCount-02074", "sampleCount must correspond to a sample count enumerated in VkSampleCountFlags whose corresponding bit is set in VkPhysicalDeviceLimits::framebufferNoAttachmentsSampleCounts", "1.2-extensions"},
+ {"VUID-VkCoarseSampleOrderCustomNV-sampleLocationCount-02075", "sampleLocationCount must be equal to the product of sampleCount, the fragment width for shadingRate, and the fragment height for shadingRate", "1.2-extensions"},
+ {"VUID-VkCoarseSampleOrderCustomNV-sampleLocationCount-02076", "sampleLocationCount must be less than or equal to the value of VkPhysicalDeviceShadingRateImagePropertiesNV::shadingRateMaxCoarseSamples", "1.2-extensions"},
+ {"VUID-VkCoarseSampleOrderCustomNV-sampleLocationCount-arraylength", "sampleLocationCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkCoarseSampleOrderCustomNV-shadingRate-02073", "shadingRate must be a shading rate that generates fragments with more than one pixel", "1.2-extensions"},
+ {"VUID-VkCoarseSampleOrderCustomNV-shadingRate-parameter", "shadingRate must be a valid VkShadingRatePaletteEntryNV value", "1.2-extensions"},
+ {"VUID-VkCommandBufferAllocateInfo-commandBufferCount-00044", "commandBufferCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkCommandBufferAllocateInfo-commandPool-parameter", "commandPool must be a valid VkCommandPool handle", "1.2-extensions"},
+ {"VUID-VkCommandBufferAllocateInfo-level-parameter", "level must be a valid VkCommandBufferLevel value", "1.2-extensions"},
+ {"VUID-VkCommandBufferAllocateInfo-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkCommandBufferAllocateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO", "1.2-extensions"},
+ {"VUID-VkCommandBufferBeginInfo-flags-00053", "If flags contains VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, the renderPass member of pInheritanceInfo must be a valid VkRenderPass", "1.2-extensions"},
+ {"VUID-VkCommandBufferBeginInfo-flags-00054", "If flags contains VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, the subpass member of pInheritanceInfo must be a valid subpass index within the renderPass member of pInheritanceInfo", "1.2-extensions"},
+ {"VUID-VkCommandBufferBeginInfo-flags-00055", "If flags contains VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT, the framebuffer member of pInheritanceInfo must be either VK_NULL_HANDLE, or a valid VkFramebuffer that is compatible with the renderPass member of pInheritanceInfo", "1.2-extensions"},
+ {"VUID-VkCommandBufferBeginInfo-flags-parameter", "flags must be a valid combination of VkCommandBufferUsageFlagBits values", "1.2-extensions"},
+ {"VUID-VkCommandBufferBeginInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkDeviceGroupCommandBufferBeginInfo", "1.2-extensions"},
+ {"VUID-VkCommandBufferBeginInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO", "1.2-extensions"},
+ {"VUID-VkCommandBufferBeginInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkCommandBufferInheritanceConditionalRenderingInfoEXT-conditionalRenderingEnable-01977", "If the inherited conditional rendering feature is not enabled, conditionalRenderingEnable must be VK_FALSE", "1.2-extensions"},
+ {"VUID-VkCommandBufferInheritanceConditionalRenderingInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkCommandBufferInheritanceInfo-commonparent", "Both of framebuffer, and renderPass that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkCommandBufferInheritanceInfo-occlusionQueryEnable-00056", "If the inherited queries feature is not enabled, occlusionQueryEnable must be VK_FALSE", "1.2-extensions"},
+ {"VUID-VkCommandBufferInheritanceInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkCommandBufferInheritanceConditionalRenderingInfoEXT or VkCommandBufferInheritanceRenderPassTransformInfoQCOM", "1.2-extensions"},
+ {"VUID-VkCommandBufferInheritanceInfo-pipelineStatistics-00058", "If the pipeline statistics queries feature is not enabled, pipelineStatistics must be 0", "1.2-extensions"},
+ {"VUID-VkCommandBufferInheritanceInfo-pipelineStatistics-02789", "If the pipeline statistics queries feature is enabled, pipelineStatistics must be a valid combination of VkQueryPipelineStatisticFlagBits values", "1.2-extensions"},
+ {"VUID-VkCommandBufferInheritanceInfo-queryFlags-00057", "If the inherited queries feature is enabled, queryFlags must be a valid combination of VkQueryControlFlagBits values", "1.2-extensions"},
+ {"VUID-VkCommandBufferInheritanceInfo-queryFlags-02788", "If the inherited queries feature is not enabled, queryFlags must be 0", "1.2-extensions"},
+ {"VUID-VkCommandBufferInheritanceInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO", "1.2-extensions"},
+ {"VUID-VkCommandBufferInheritanceInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkCommandBufferInheritanceRenderPassTransformInfoQCOM-sType-sType", "sType must be VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM", "1.2-extensions"},
+ {"VUID-VkCommandBufferInheritanceRenderPassTransformInfoQCOM-transform-02864", "transform must be VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR, VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR, VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR, or VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkCommandPoolCreateInfo-flags-02860", "If the protected memory feature is not enabled, the VK_COMMAND_POOL_CREATE_PROTECTED_BIT bit of flags must not be set", "1.2-extensions"},
+ {"VUID-VkCommandPoolCreateInfo-flags-parameter", "flags must be a valid combination of VkCommandPoolCreateFlagBits values", "1.2-extensions"},
+ {"VUID-VkCommandPoolCreateInfo-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkCommandPoolCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkComponentMapping-a-parameter", "a must be a valid VkComponentSwizzle value", "1.2-extensions"},
+ {"VUID-VkComponentMapping-b-parameter", "b must be a valid VkComponentSwizzle value", "1.2-extensions"},
+ {"VUID-VkComponentMapping-g-parameter", "g must be a valid VkComponentSwizzle value", "1.2-extensions"},
+ {"VUID-VkComponentMapping-r-parameter", "r must be a valid VkComponentSwizzle value", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-commonparent", "Both of basePipelineHandle, and layout that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-flags-00697", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineIndex is -1, basePipelineHandle must be a valid handle to a compute VkPipeline", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-flags-00698", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineHandle is VK_NULL_HANDLE, basePipelineIndex must be a valid index into the calling command's pCreateInfos parameter", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-flags-00699", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineIndex is not -1, basePipelineHandle must be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-flags-00700", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineHandle is not VK_NULL_HANDLE, basePipelineIndex must be -1", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-flags-02874", "flags must not include VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-flags-03364", "flags must not include VK_PIPELINE_CREATE_LIBRARY_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-flags-03365", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-flags-03366", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-flags-03367", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-flags-03368", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-flags-03369", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-flags-03370", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-flags-parameter", "flags must be a valid combination of VkPipelineCreateFlagBits values", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-layout-00703", "layout must be consistent with the layout of the compute shader specified in stage", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-layout-01687", "The number of resources in layout accessible to the compute shader stage must be less than or equal to VkPhysicalDeviceLimits::maxPerStageResources", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-layout-parameter", "layout must be a valid VkPipelineLayout handle", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkPipelineCompilerControlCreateInfoAMD or VkPipelineCreationFeedbackCreateInfoEXT", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-pipelineCreationCacheControl-02875", "If the pipelineCreationCacheControl feature is not enabled, flags must not include VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT or VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-stage-00701", "The stage member of stage must be VK_SHADER_STAGE_COMPUTE_BIT", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-stage-00702", "The shader code for the entry point identified by stage and the rest of the state identified by this structure must adhere to the pipeline linking rules described in the Shader Interfaces chapter", "1.2-extensions"},
+ {"VUID-VkComputePipelineCreateInfo-stage-parameter", "stage must be a valid VkPipelineShaderStageCreateInfo structure", "1.2-extensions"},
+ {"VUID-VkConditionalRenderingBeginInfoEXT-buffer-01981", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-VkConditionalRenderingBeginInfoEXT-buffer-01982", "buffer must have been created with the VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT bit set", "1.2-extensions"},
+ {"VUID-VkConditionalRenderingBeginInfoEXT-buffer-parameter", "buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-VkConditionalRenderingBeginInfoEXT-flags-parameter", "flags must be a valid combination of VkConditionalRenderingFlagBitsEXT values", "1.2-extensions"},
+ {"VUID-VkConditionalRenderingBeginInfoEXT-offset-01983", "offset must be less than the size of buffer by at least 32 bits", "1.2-extensions"},
+ {"VUID-VkConditionalRenderingBeginInfoEXT-offset-01984", "offset must be a multiple of 4", "1.2-extensions"},
+ {"VUID-VkConditionalRenderingBeginInfoEXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkConditionalRenderingBeginInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkCooperativeMatrixPropertiesNV-AType-parameter", "AType must be a valid VkComponentTypeNV value", "1.2-extensions"},
+ {"VUID-VkCooperativeMatrixPropertiesNV-BType-parameter", "BType must be a valid VkComponentTypeNV value", "1.2-extensions"},
+ {"VUID-VkCooperativeMatrixPropertiesNV-CType-parameter", "CType must be a valid VkComponentTypeNV value", "1.2-extensions"},
+ {"VUID-VkCooperativeMatrixPropertiesNV-DType-parameter", "DType must be a valid VkComponentTypeNV value", "1.2-extensions"},
+ {"VUID-VkCooperativeMatrixPropertiesNV-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkCooperativeMatrixPropertiesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_NV", "1.2-extensions"},
+ {"VUID-VkCooperativeMatrixPropertiesNV-scope-parameter", "scope must be a valid VkScopeNV value", "1.2-extensions"},
+ {"VUID-VkCopyAccelerationStructureInfoKHR-commonparent", "Both of dst, and src must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkCopyAccelerationStructureInfoKHR-dst-parameter", "dst must be a valid VkAccelerationStructureKHR handle", "1.2-extensions"},
+ {"VUID-VkCopyAccelerationStructureInfoKHR-mode-03410", "mode must be VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR or VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR", "1.2-extensions"},
+ {"VUID-VkCopyAccelerationStructureInfoKHR-mode-parameter", "mode must be a valid VkCopyAccelerationStructureModeKHR value", "1.2-extensions"},
+ {"VUID-VkCopyAccelerationStructureInfoKHR-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkDeferredOperationInfoKHR", "1.2-extensions"},
+ {"VUID-VkCopyAccelerationStructureInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_COPY_ACCELERATION_STRUCTURE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkCopyAccelerationStructureInfoKHR-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkCopyAccelerationStructureInfoKHR-src-03411", "src must have been built with VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR if mode is VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR", "1.2-extensions"},
+ {"VUID-VkCopyAccelerationStructureInfoKHR-src-parameter", "src must be a valid VkAccelerationStructureKHR handle", "1.2-extensions"},
+ {"VUID-VkCopyAccelerationStructureToMemoryInfoKHR-dst-03561", "The memory pointed to by dst must be at least as large as the serialization size of src, as reported by VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR", "1.2-extensions"},
+ {"VUID-VkCopyAccelerationStructureToMemoryInfoKHR-dst-parameter", "dst must be a valid VkDeviceOrHostAddressKHR union", "1.2-extensions"},
+ {"VUID-VkCopyAccelerationStructureToMemoryInfoKHR-mode-03412", "mode must be VK_COPY_ACCELERATION_STRUCTURE_MODE_SERIALIZE_KHR", "1.2-extensions"},
+ {"VUID-VkCopyAccelerationStructureToMemoryInfoKHR-mode-parameter", "mode must be a valid VkCopyAccelerationStructureModeKHR value", "1.2-extensions"},
+ {"VUID-VkCopyAccelerationStructureToMemoryInfoKHR-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkDeferredOperationInfoKHR", "1.2-extensions"},
+ {"VUID-VkCopyAccelerationStructureToMemoryInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_COPY_ACCELERATION_STRUCTURE_TO_MEMORY_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkCopyAccelerationStructureToMemoryInfoKHR-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkCopyAccelerationStructureToMemoryInfoKHR-src-parameter", "src must be a valid VkAccelerationStructureKHR handle", "1.2-extensions"},
+ {"VUID-VkCopyDescriptorSet-commonparent", "Both of dstSet, and srcSet must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkCopyDescriptorSet-dstArrayElement-00348", "The sum of dstArrayElement and descriptorCount must be less than or equal to the number of array elements in the descriptor set binding specified by dstBinding, and all applicable consecutive bindings, as described by consecutive binding updates", "1.2-extensions"},
+ {"VUID-VkCopyDescriptorSet-dstBinding-00347", "dstBinding must be a valid binding within dstSet", "1.2-extensions"},
+ {"VUID-VkCopyDescriptorSet-dstBinding-02224", "If the descriptor type of the descriptor set binding specified by dstBinding is VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, dstArrayElement must be an integer multiple of 4", "1.2-extensions"},
+ {"VUID-VkCopyDescriptorSet-dstBinding-02632", "The type of dstBinding within dstSet must be equal to the type of srcBinding within srcSet", "1.2-extensions"},
+ {"VUID-VkCopyDescriptorSet-dstBinding-02753", "If the descriptor type of the descriptor set binding specified by dstBinding is VK_DESCRIPTOR_TYPE_SAMPLER, then dstSet must not have been allocated with a layout that included immutable samplers for dstBinding", "1.2-extensions"},
+ {"VUID-VkCopyDescriptorSet-dstSet-parameter", "dstSet must be a valid VkDescriptorSet handle", "1.2-extensions"},
+ {"VUID-VkCopyDescriptorSet-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkCopyDescriptorSet-sType-sType", "sType must be VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET", "1.2-extensions"},
+ {"VUID-VkCopyDescriptorSet-srcArrayElement-00346", "The sum of srcArrayElement and descriptorCount must be less than or equal to the number of array elements in the descriptor set binding specified by srcBinding, and all applicable consecutive bindings, as described by consecutive binding updates", "1.2-extensions"},
+ {"VUID-VkCopyDescriptorSet-srcBinding-00345", "srcBinding must be a valid binding within srcSet", "1.2-extensions"},
+ {"VUID-VkCopyDescriptorSet-srcBinding-02223", "If the descriptor type of the descriptor set binding specified by srcBinding is VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, srcArrayElement must be an integer multiple of 4", "1.2-extensions"},
+ {"VUID-VkCopyDescriptorSet-srcBinding-02225", "If the descriptor type of the descriptor set binding specified by either srcBinding or dstBinding is VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, descriptorCount must be an integer multiple of 4", "1.2-extensions"},
+ {"VUID-VkCopyDescriptorSet-srcSet-00349", "If srcSet is equal to dstSet, then the source and destination ranges of descriptors must not overlap, where the ranges may include array elements from consecutive bindings as described by consecutive binding updates", "1.2-extensions"},
+ {"VUID-VkCopyDescriptorSet-srcSet-01918", "If srcSet's layout was created with the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT flag set, then dstSet's layout must also have been created with the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT flag set", "1.2-extensions"},
+ {"VUID-VkCopyDescriptorSet-srcSet-01919", "If srcSet's layout was created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT flag set, then dstSet's layout must also have been created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT flag set", "1.2-extensions"},
+ {"VUID-VkCopyDescriptorSet-srcSet-01920", "If the descriptor pool from which srcSet was allocated was created with the VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT flag set, then the descriptor pool from which dstSet was allocated must also have been created with the VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT flag set", "1.2-extensions"},
+ {"VUID-VkCopyDescriptorSet-srcSet-01921", "If the descriptor pool from which srcSet was allocated was created without the VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT flag set, then the descriptor pool from which dstSet was allocated must also have been created without the VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT flag set", "1.2-extensions"},
+ {"VUID-VkCopyDescriptorSet-srcSet-parameter", "srcSet must be a valid VkDescriptorSet handle", "1.2-extensions"},
+ {"VUID-VkCopyMemoryToAccelerationStructureInfoKHR-dst-parameter", "dst must be a valid VkAccelerationStructureKHR handle", "1.2-extensions"},
+ {"VUID-VkCopyMemoryToAccelerationStructureInfoKHR-mode-03413", "mode must be VK_COPY_ACCELERATION_STRUCTURE_MODE_DESERIALIZE_KHR", "1.2-extensions"},
+ {"VUID-VkCopyMemoryToAccelerationStructureInfoKHR-mode-parameter", "mode must be a valid VkCopyAccelerationStructureModeKHR value", "1.2-extensions"},
+ {"VUID-VkCopyMemoryToAccelerationStructureInfoKHR-pInfo-03414", "The data in pInfo->src must have a format compatible with the destination physical device as returned by vkGetDeviceAccelerationStructureCompatibilityKHR", "1.2-extensions"},
+ {"VUID-VkCopyMemoryToAccelerationStructureInfoKHR-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkDeferredOperationInfoKHR", "1.2-extensions"},
+ {"VUID-VkCopyMemoryToAccelerationStructureInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_COPY_MEMORY_TO_ACCELERATION_STRUCTURE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkCopyMemoryToAccelerationStructureInfoKHR-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkCopyMemoryToAccelerationStructureInfoKHR-src-parameter", "src must be a valid VkDeviceOrHostAddressConstKHR union", "1.2-extensions"},
+ {"VUID-VkD3D12FenceSubmitInfoKHR-pSignalSemaphoreValues-parameter", "If signalSemaphoreValuesCount is not 0, and pSignalSemaphoreValues is not NULL, pSignalSemaphoreValues must be a valid pointer to an array of signalSemaphoreValuesCount uint64_t values", "1.2-extensions"},
+ {"VUID-VkD3D12FenceSubmitInfoKHR-pWaitSemaphoreValues-parameter", "If waitSemaphoreValuesCount is not 0, and pWaitSemaphoreValues is not NULL, pWaitSemaphoreValues must be a valid pointer to an array of waitSemaphoreValuesCount uint64_t values", "1.2-extensions"},
+ {"VUID-VkD3D12FenceSubmitInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkD3D12FenceSubmitInfoKHR-signalSemaphoreValuesCount-00080", "signalSemaphoreValuesCount must be the same value as VkSubmitInfo::signalSemaphoreCount, where VkSubmitInfo is in the pNext chain of this VkD3D12FenceSubmitInfoKHR structure", "1.2-extensions"},
+ {"VUID-VkD3D12FenceSubmitInfoKHR-waitSemaphoreValuesCount-00079", "waitSemaphoreValuesCount must be the same value as VkSubmitInfo::waitSemaphoreCount, where VkSubmitInfo is in the pNext chain of this VkD3D12FenceSubmitInfoKHR structure", "1.2-extensions"},
+ {"VUID-VkDebugMarkerMarkerInfoEXT-pMarkerName-parameter", "pMarkerName must be a null-terminated UTF-8 string", "1.2-extensions"},
+ {"VUID-VkDebugMarkerMarkerInfoEXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkDebugMarkerMarkerInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkDebugMarkerObjectNameInfoEXT-object-01491", "object must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-VkDebugMarkerObjectNameInfoEXT-object-01492", "object must be a Vulkan object of the type associated with objectType as defined in VkDebugReportObjectTypeEXT and Vulkan Handle Relationship", "1.2-extensions"},
+ {"VUID-VkDebugMarkerObjectNameInfoEXT-objectType-01490", "objectType must not be VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT", "1.2-extensions"},
+ {"VUID-VkDebugMarkerObjectNameInfoEXT-objectType-parameter", "objectType must be a valid VkDebugReportObjectTypeEXT value", "1.2-extensions"},
+ {"VUID-VkDebugMarkerObjectNameInfoEXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkDebugMarkerObjectNameInfoEXT-pObjectName-parameter", "pObjectName must be a null-terminated UTF-8 string", "1.2-extensions"},
+ {"VUID-VkDebugMarkerObjectNameInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkDebugMarkerObjectTagInfoEXT-object-01494", "object must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-VkDebugMarkerObjectTagInfoEXT-object-01495", "object must be a Vulkan object of the type associated with objectType as defined in VkDebugReportObjectTypeEXT and Vulkan Handle Relationship", "1.2-extensions"},
+ {"VUID-VkDebugMarkerObjectTagInfoEXT-objectType-01493", "objectType must not be VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT", "1.2-extensions"},
+ {"VUID-VkDebugMarkerObjectTagInfoEXT-objectType-parameter", "objectType must be a valid VkDebugReportObjectTypeEXT value", "1.2-extensions"},
+ {"VUID-VkDebugMarkerObjectTagInfoEXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkDebugMarkerObjectTagInfoEXT-pTag-parameter", "pTag must be a valid pointer to an array of tagSize bytes", "1.2-extensions"},
+ {"VUID-VkDebugMarkerObjectTagInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkDebugMarkerObjectTagInfoEXT-tagSize-arraylength", "tagSize must be greater than 0", "1.2-extensions"},
+ {"VUID-VkDebugReportCallbackCreateInfoEXT-flags-parameter", "flags must be a valid combination of VkDebugReportFlagBitsEXT values", "1.2-extensions"},
+ {"VUID-VkDebugReportCallbackCreateInfoEXT-pfnCallback-parameter", "pfnCallback must be a valid PFN_vkDebugReportCallbackEXT value", "1.2-extensions"},
+ {"VUID-VkDebugReportCallbackCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkDebugUtilsLabelEXT-pLabelName-parameter", "pLabelName must be a null-terminated UTF-8 string", "1.2-extensions"},
+ {"VUID-VkDebugUtilsLabelEXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkDebugUtilsLabelEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT", "1.2-extensions"},
+ {"VUID-VkDebugUtilsMessengerCallbackDataEXT-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkDebugUtilsMessengerCallbackDataEXT-pCmdBufLabels-parameter", "If cmdBufLabelCount is not 0, pCmdBufLabels must be a valid pointer to an array of cmdBufLabelCount valid VkDebugUtilsLabelEXT structures", "1.2-extensions"},
+ {"VUID-VkDebugUtilsMessengerCallbackDataEXT-pMessage-parameter", "pMessage must be a null-terminated UTF-8 string", "1.2-extensions"},
+ {"VUID-VkDebugUtilsMessengerCallbackDataEXT-pMessageIdName-parameter", "If pMessageIdName is not NULL, pMessageIdName must be a null-terminated UTF-8 string", "1.2-extensions"},
+ {"VUID-VkDebugUtilsMessengerCallbackDataEXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkDebugUtilsMessengerCallbackDataEXT-pObjects-parameter", "If objectCount is not 0, pObjects must be a valid pointer to an array of objectCount valid VkDebugUtilsObjectNameInfoEXT structures", "1.2-extensions"},
+ {"VUID-VkDebugUtilsMessengerCallbackDataEXT-pQueueLabels-parameter", "If queueLabelCount is not 0, pQueueLabels must be a valid pointer to an array of queueLabelCount valid VkDebugUtilsLabelEXT structures", "1.2-extensions"},
+ {"VUID-VkDebugUtilsMessengerCallbackDataEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT", "1.2-extensions"},
+ {"VUID-VkDebugUtilsMessengerCreateInfoEXT-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkDebugUtilsMessengerCreateInfoEXT-messageSeverity-parameter", "messageSeverity must be a valid combination of VkDebugUtilsMessageSeverityFlagBitsEXT values", "1.2-extensions"},
+ {"VUID-VkDebugUtilsMessengerCreateInfoEXT-messageSeverity-requiredbitmask", "messageSeverity must not be 0", "1.2-extensions"},
+ {"VUID-VkDebugUtilsMessengerCreateInfoEXT-messageType-parameter", "messageType must be a valid combination of VkDebugUtilsMessageTypeFlagBitsEXT values", "1.2-extensions"},
+ {"VUID-VkDebugUtilsMessengerCreateInfoEXT-messageType-requiredbitmask", "messageType must not be 0", "1.2-extensions"},
+ {"VUID-VkDebugUtilsMessengerCreateInfoEXT-pfnUserCallback-01914", "pfnUserCallback must be a valid PFN_vkDebugUtilsMessengerCallbackEXT", "1.2-extensions"},
+ {"VUID-VkDebugUtilsMessengerCreateInfoEXT-pfnUserCallback-parameter", "pfnUserCallback must be a valid PFN_vkDebugUtilsMessengerCallbackEXT value", "1.2-extensions"},
+ {"VUID-VkDebugUtilsMessengerCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkDebugUtilsObjectNameInfoEXT-objectType-02589", "If objectType is VK_OBJECT_TYPE_UNKNOWN, objectHandle must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-VkDebugUtilsObjectNameInfoEXT-objectType-02590", "If objectType is not VK_OBJECT_TYPE_UNKNOWN, objectHandle must be VK_NULL_HANDLE or a valid Vulkan handle of the type associated with objectType as defined in the VkObjectType and Vulkan Handle Relationship table", "1.2-extensions"},
+ {"VUID-VkDebugUtilsObjectNameInfoEXT-objectType-parameter", "objectType must be a valid VkObjectType value", "1.2-extensions"},
+ {"VUID-VkDebugUtilsObjectNameInfoEXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkDebugUtilsObjectNameInfoEXT-pObjectName-parameter", "If pObjectName is not NULL, pObjectName must be a null-terminated UTF-8 string", "1.2-extensions"},
+ {"VUID-VkDebugUtilsObjectNameInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkDebugUtilsObjectTagInfoEXT-objectHandle-01910", "objectHandle must be a valid Vulkan handle of the type associated with objectType as defined in the VkObjectType and Vulkan Handle Relationship table", "1.2-extensions"},
+ {"VUID-VkDebugUtilsObjectTagInfoEXT-objectType-01908", "objectType must not be VK_OBJECT_TYPE_UNKNOWN", "1.2-extensions"},
+ {"VUID-VkDebugUtilsObjectTagInfoEXT-objectType-parameter", "objectType must be a valid VkObjectType value", "1.2-extensions"},
+ {"VUID-VkDebugUtilsObjectTagInfoEXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkDebugUtilsObjectTagInfoEXT-pTag-parameter", "pTag must be a valid pointer to an array of tagSize bytes", "1.2-extensions"},
+ {"VUID-VkDebugUtilsObjectTagInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkDebugUtilsObjectTagInfoEXT-tagSize-arraylength", "tagSize must be greater than 0", "1.2-extensions"},
+ {"VUID-VkDedicatedAllocationBufferCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkDedicatedAllocationImageCreateInfoNV-dedicatedAllocation-00994", "If dedicatedAllocation is VK_TRUE, VkImageCreateInfo::flags must not include VK_IMAGE_CREATE_SPARSE_BINDING_BIT, VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT, or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT", "1.2-extensions"},
+ {"VUID-VkDedicatedAllocationImageCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-00651", "If buffer is not VK_NULL_HANDLE, the buffer must have been created with VkDedicatedAllocationBufferCreateInfoNV::dedicatedAllocation equal to VK_TRUE", "1.2-extensions"},
+ {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-00653", "If buffer is not VK_NULL_HANDLE, VkMemoryAllocateInfo::allocationSize must equal the VkMemoryRequirements::size of the buffer", "1.2-extensions"},
+ {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-00655", "If buffer is not VK_NULL_HANDLE and VkMemoryAllocateInfo defines a memory import operation, the memory being imported must also be a dedicated buffer allocation and buffer must be identical to the buffer associated with the imported memory", "1.2-extensions"},
+ {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-buffer-parameter", "If buffer is not VK_NULL_HANDLE, buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-commonparent", "Both of buffer, and image that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00649", "At least one of image and buffer must be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00650", "If image is not VK_NULL_HANDLE, the image must have been created with VkDedicatedAllocationImageCreateInfoNV::dedicatedAllocation equal to VK_TRUE", "1.2-extensions"},
+ {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00652", "If image is not VK_NULL_HANDLE, VkMemoryAllocateInfo::allocationSize must equal the VkMemoryRequirements::size of the image", "1.2-extensions"},
+ {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-00654", "If image is not VK_NULL_HANDLE and VkMemoryAllocateInfo defines a memory import operation, the memory being imported must also be a dedicated image allocation and image must be identical to the image associated with the imported memory", "1.2-extensions"},
+ {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-image-parameter", "If image is not VK_NULL_HANDLE, image must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-VkDedicatedAllocationMemoryAllocateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkDeferredOperationInfoKHR-operationHandle-03433", "Any previous deferred operation that was associated with operationHandle must be complete", "1.2-extensions"},
+ {"VUID-VkDeferredOperationInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEFERRED_OPERATION_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkDescriptorBufferInfo-buffer-02998", "If the nullDescriptor feature is not enabled, buffer must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-VkDescriptorBufferInfo-buffer-02999", "If buffer is VK_NULL_HANDLE, offset must be zero and range must be VK_WHOLE_SIZE", "1.2-extensions"},
+ {"VUID-VkDescriptorBufferInfo-buffer-parameter", "If buffer is not VK_NULL_HANDLE, buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-VkDescriptorBufferInfo-offset-00340", "offset must be less than the size of buffer", "1.2-extensions"},
+ {"VUID-VkDescriptorBufferInfo-range-00341", "If range is not equal to VK_WHOLE_SIZE, range must be greater than 0", "1.2-extensions"},
+ {"VUID-VkDescriptorBufferInfo-range-00342", "If range is not equal to VK_WHOLE_SIZE, range must be less than or equal to the size of buffer minus offset", "1.2-extensions"},
+ {"VUID-VkDescriptorImageInfo-commonparent", "Both of imageView, and sampler that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkDescriptorImageInfo-imageLayout-00344", "imageLayout must match the actual VkImageLayout of each subresource accessible from imageView at the time this descriptor is accessed as defined by the image layout matching rules", "1.2-extensions"},
+ {"VUID-VkDescriptorImageInfo-imageView-00343", "imageView must not be 2D or 2D array image view created from a 3D image", "1.2-extensions"},
+ {"VUID-VkDescriptorImageInfo-imageView-01976", "If imageView is created from a depth/stencil image, the aspectMask used to create the imageView must include either VK_IMAGE_ASPECT_DEPTH_BIT or VK_IMAGE_ASPECT_STENCIL_BIT but not both", "1.2-extensions"},
+ {"VUID-VkDescriptorImageInfo-sampler-01564", "If sampler is used and the VkFormat of the image is a multi-planar format, the image must have been created with VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT, and the aspectMask of the imageView must be VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT or (for three-plane formats only) VK_IMAGE_ASPECT_PLANE_2_BIT", "1.2-extensions"},
+ {"VUID-VkDescriptorPoolCreateInfo-flags-parameter", "flags must be a valid combination of VkDescriptorPoolCreateFlagBits values", "1.2-extensions"},
+ {"VUID-VkDescriptorPoolCreateInfo-maxSets-00301", "maxSets must be greater than 0", "1.2-extensions"},
+ {"VUID-VkDescriptorPoolCreateInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkDescriptorPoolInlineUniformBlockCreateInfoEXT", "1.2-extensions"},
+ {"VUID-VkDescriptorPoolCreateInfo-pPoolSizes-parameter", "pPoolSizes must be a valid pointer to an array of poolSizeCount valid VkDescriptorPoolSize structures", "1.2-extensions"},
+ {"VUID-VkDescriptorPoolCreateInfo-poolSizeCount-arraylength", "poolSizeCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkDescriptorPoolCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkDescriptorPoolCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkDescriptorPoolInlineUniformBlockCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkDescriptorPoolSize-descriptorCount-00302", "descriptorCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkDescriptorPoolSize-type-02218", "If type is VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then descriptorCount must be a multiple of 4", "1.2-extensions"},
+ {"VUID-VkDescriptorPoolSize-type-parameter", "type must be a valid VkDescriptorType value", "1.2-extensions"},
+ {"VUID-VkDescriptorSetAllocateInfo-commonparent", "Both of descriptorPool, and the elements of pSetLayouts must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkDescriptorSetAllocateInfo-descriptorPool-00307", "descriptorPool must have enough free descriptor capacity remaining to allocate the descriptor sets of the specified layouts", "1.0"},
+ {"VUID-VkDescriptorSetAllocateInfo-descriptorPool-parameter", "descriptorPool must be a valid VkDescriptorPool handle", "1.2-extensions"},
+ {"VUID-VkDescriptorSetAllocateInfo-descriptorSetCount-00306", "descriptorSetCount must not be greater than the number of sets that are currently available for allocation in descriptorPool", "1.0"},
+ {"VUID-VkDescriptorSetAllocateInfo-descriptorSetCount-arraylength", "descriptorSetCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkDescriptorSetAllocateInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkDescriptorSetVariableDescriptorCountAllocateInfo", "1.2-extensions"},
+ {"VUID-VkDescriptorSetAllocateInfo-pSetLayouts-00308", "Each element of pSetLayouts must not have been created with VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR set", "1.2-extensions"},
+ {"VUID-VkDescriptorSetAllocateInfo-pSetLayouts-03044", "If any element of pSetLayouts was created with the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set, descriptorPool must have been created with the VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT flag set", "1.2-extensions"},
+ {"VUID-VkDescriptorSetAllocateInfo-pSetLayouts-parameter", "pSetLayouts must be a valid pointer to an array of descriptorSetCount valid VkDescriptorSetLayout handles", "1.2-extensions"},
+ {"VUID-VkDescriptorSetAllocateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO", "1.2-extensions"},
+ {"VUID-VkDescriptorSetAllocateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBinding-descriptorCount-00283", "If descriptorCount is not 0, stageFlags must be a valid combination of VkShaderStageFlagBits values", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBinding-descriptorType-00282", "If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and descriptorCount is not 0 and pImmutableSamplers is not NULL, pImmutableSamplers must be a valid pointer to an array of descriptorCount valid VkSampler handles", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBinding-descriptorType-01510", "If descriptorType is VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT and descriptorCount is not 0, then stageFlags must be 0 or VK_SHADER_STAGE_FRAGMENT_BIT", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBinding-descriptorType-02209", "If descriptorType is VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then descriptorCount must be a multiple of 4", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBinding-descriptorType-02210", "If descriptorType is VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT then descriptorCount must be less than or equal to VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxInlineUniformBlockSize", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBinding-descriptorType-parameter", "descriptorType must be a valid VkDescriptorType value", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBinding-pImmutableSamplers-04009", "The sampler objects indicated by pImmutableSamplers must not have a borderColor with one of the values VK_BORDER_COLOR_FLOAT_CUSTOM_EXT or VK_BORDER_COLOR_INT_CUSTOM_EXT", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-None-03011", "All bindings with descriptor type VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-bindingCount-03002", "If bindingCount is not zero, bindingCount must equal VkDescriptorSetLayoutCreateInfo::bindingCount", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingInlineUniformBlockUpdateAfterBind-02211", "If VkPhysicalDeviceInlineUniformBlockFeaturesEXT::descriptorBindingInlineUniformBlockUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingPartiallyBound-03013", "If VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingPartiallyBound is not enabled, all elements of pBindingFlags must not include VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingSampledImageUpdateAfterBind-03006", "If VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingSampledImageUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, or VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingStorageBufferUpdateAfterBind-03008", "If VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingStorageBufferUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_STORAGE_BUFFER must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingStorageImageUpdateAfterBind-03007", "If VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingStorageImageUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_STORAGE_IMAGE must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingStorageTexelBufferUpdateAfterBind-03010", "If VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingStorageTexelBufferUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingUniformBufferUpdateAfterBind-03005", "If VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingUniformBufferUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingUniformTexelBufferUpdateAfterBind-03009", "If VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingUniformTexelBufferUpdateAfterBind is not enabled, all bindings with descriptor type VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER must not use VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingUpdateUnusedWhilePending-03012", "If VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingUpdateUnusedWhilePending is not enabled, all elements of pBindingFlags must not include VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-descriptorBindingVariableDescriptorCount-03014", "If VkPhysicalDeviceDescriptorIndexingFeatures::descriptorBindingVariableDescriptorCount is not enabled, all elements of pBindingFlags must not include VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-flags-03003", "If VkDescriptorSetLayoutCreateInfo::flags includes VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, then all elements of pBindingFlags must not include VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT, VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT, or VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-pBindingFlags-03004", "If an element of pBindingFlags includes VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT, then all other elements of VkDescriptorSetLayoutCreateInfo::pBindings must have a smaller value of binding", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-pBindingFlags-03015", "If an element of pBindingFlags includes VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT, that element's descriptorType must not be VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-pBindingFlags-parameter", "If bindingCount is not 0, pBindingFlags must be a valid pointer to an array of bindingCount valid combinations of VkDescriptorBindingFlagBits values", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutBindingFlagsCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutCreateInfo-binding-00279", "The VkDescriptorSetLayoutBinding::binding members of the elements of the pBindings array must each have different values", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutCreateInfo-descriptorType-03001", "If any binding has the VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT bit set, then all bindings must not have descriptorType of VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutCreateInfo-flags-00280", "If flags contains VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, then all elements of pBindings must not have a descriptorType of VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutCreateInfo-flags-00281", "If flags contains VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, then the total number of elements of all bindings must be less than or equal to VkPhysicalDevicePushDescriptorPropertiesKHR::maxPushDescriptors", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutCreateInfo-flags-02208", "If flags contains VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR, then all elements of pBindings must not have a descriptorType of VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutCreateInfo-flags-03000", "If any binding has the VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT bit set, flags must include VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutCreateInfo-flags-parameter", "flags must be a valid combination of VkDescriptorSetLayoutCreateFlagBits values", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutCreateInfo-pBindings-parameter", "If bindingCount is not 0, pBindings must be a valid pointer to an array of bindingCount valid VkDescriptorSetLayoutBinding structures", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutCreateInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkDescriptorSetLayoutBindingFlagsCreateInfo", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutSupport-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkDescriptorSetVariableDescriptorCountLayoutSupport", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutSupport-sType-sType", "sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT", "1.2-extensions"},
+ {"VUID-VkDescriptorSetLayoutSupport-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkDescriptorSetVariableDescriptorCountAllocateInfo-descriptorSetCount-03045", "If descriptorSetCount is not zero, descriptorSetCount must equal VkDescriptorSetAllocateInfo::descriptorSetCount", "1.2-extensions"},
+ {"VUID-VkDescriptorSetVariableDescriptorCountAllocateInfo-pDescriptorCounts-parameter", "If descriptorSetCount is not 0, pDescriptorCounts must be a valid pointer to an array of descriptorSetCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkDescriptorSetVariableDescriptorCountAllocateInfo-pSetLayouts-03046", "If VkDescriptorSetAllocateInfo::pSetLayouts[i] has a variable descriptor count binding, then pDescriptorCounts[i] must be less than or equal to the descriptor count specified for that binding when the descriptor set layout was created", "1.2-extensions"},
+ {"VUID-VkDescriptorSetVariableDescriptorCountAllocateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO", "1.2-extensions"},
+ {"VUID-VkDescriptorSetVariableDescriptorCountLayoutSupport-sType-sType", "sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT", "1.2-extensions"},
+ {"VUID-VkDescriptorUpdateTemplateCreateInfo-commonparent", "Both of descriptorSetLayout, and pipelineLayout that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkDescriptorUpdateTemplateCreateInfo-descriptorUpdateEntryCount-arraylength", "descriptorUpdateEntryCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkDescriptorUpdateTemplateCreateInfo-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkDescriptorUpdateTemplateCreateInfo-pDescriptorUpdateEntries-parameter", "pDescriptorUpdateEntries must be a valid pointer to an array of descriptorUpdateEntryCount valid VkDescriptorUpdateTemplateEntry structures", "1.2-extensions"},
+ {"VUID-VkDescriptorUpdateTemplateCreateInfo-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkDescriptorUpdateTemplateCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00350", "If templateType is VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_DESCRIPTOR_SET, descriptorSetLayout must be a valid VkDescriptorSetLayout handle", "1.2-extensions"},
+ {"VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00351", "If templateType is VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, pipelineBindPoint must be a valid VkPipelineBindPoint value", "1.2-extensions"},
+ {"VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00352", "If templateType is VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, pipelineLayout must be a valid VkPipelineLayout handle", "1.2-extensions"},
+ {"VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-00353", "If templateType is VK_DESCRIPTOR_UPDATE_TEMPLATE_TYPE_PUSH_DESCRIPTORS_KHR, set must be the unique set number in the pipeline layout that uses a descriptor set layout that was created with VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkDescriptorUpdateTemplateCreateInfo-templateType-parameter", "templateType must be a valid VkDescriptorUpdateTemplateType value", "1.2-extensions"},
+ {"VUID-VkDescriptorUpdateTemplateEntry-descriptor-02226", "If descriptor type is VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, dstArrayElement must be an integer multiple of 4", "1.2-extensions"},
+ {"VUID-VkDescriptorUpdateTemplateEntry-descriptor-02227", "If descriptor type is VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, descriptorCount must be an integer multiple of 4", "1.2-extensions"},
+ {"VUID-VkDescriptorUpdateTemplateEntry-descriptorType-parameter", "descriptorType must be a valid VkDescriptorType value", "1.2-extensions"},
+ {"VUID-VkDescriptorUpdateTemplateEntry-dstArrayElement-00355", "dstArrayElement and descriptorCount must be less than or equal to the number of array elements in the descriptor set binding implicitly specified when using a descriptor update template to update descriptors, and all applicable consecutive bindings, as described by consecutive binding updates", "1.2-extensions"},
+ {"VUID-VkDescriptorUpdateTemplateEntry-dstBinding-00354", "dstBinding must be a valid binding in the descriptor set layout implicitly specified when using a descriptor update template to update descriptors", "1.2-extensions"},
+ {"VUID-VkDeviceCreateInfo-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkDeviceCreateInfo-pEnabledFeatures-parameter", "If pEnabledFeatures is not NULL, pEnabledFeatures must be a valid pointer to a valid VkPhysicalDeviceFeatures structure", "1.2-extensions"},
+ {"VUID-VkDeviceCreateInfo-pNext-00373", "If the pNext chain includes a VkPhysicalDeviceFeatures2 structure, then pEnabledFeatures must be NULL", "1.2-extensions"},
+ {"VUID-VkDeviceCreateInfo-pNext-02829", "If the pNext chain includes a VkPhysicalDeviceVulkan11Features structure, then it must not include a VkPhysicalDevice16BitStorageFeatures, VkPhysicalDeviceMultiviewFeatures, VkPhysicalDeviceVariablePointersFeatures, VkPhysicalDeviceProtectedMemoryFeatures, VkPhysicalDeviceSamplerYcbcrConversionFeatures, or VkPhysicalDeviceShaderDrawParametersFeatures structure", "1.2-extensions"},
+ {"VUID-VkDeviceCreateInfo-pNext-02830", "If the pNext chain includes a VkPhysicalDeviceVulkan12Features structure, then it must not include a VkPhysicalDevice8BitStorageFeatures, VkPhysicalDeviceShaderAtomicInt64Features, VkPhysicalDeviceShaderFloat16Int8Features, VkPhysicalDeviceDescriptorIndexingFeatures, VkPhysicalDeviceScalarBlockLayoutFeatures, VkPhysicalDeviceImagelessFramebufferFeatures, VkPhysicalDeviceUniformBufferStandardLayoutFeatures, VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures, VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures, VkPhysicalDeviceHostQueryResetFeatures, VkPhysicalDeviceTimelineSemaphoreFeatures, VkPhysicalDeviceBufferDeviceAddressFeatures, or VkPhysicalDeviceVulkanMemoryModelFeatures structure", "1.2-extensions"},
+ {"VUID-VkDeviceCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkDeviceDiagnosticsConfigCreateInfoNV, VkDeviceGroupDeviceCreateInfo, VkDeviceMemoryOverallocationCreateInfoAMD, VkDevicePrivateDataCreateInfoEXT, VkPhysicalDevice16BitStorageFeatures, VkPhysicalDevice8BitStorageFeatures, VkPhysicalDeviceASTCDecodeFeaturesEXT, VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT, VkPhysicalDeviceBufferDeviceAddressFeatures, VkPhysicalDeviceBufferDeviceAddressFeaturesEXT, VkPhysicalDeviceCoherentMemoryFeaturesAMD, VkPhysicalDeviceComputeShaderDerivativesFeaturesNV, VkPhysicalDeviceConditionalRenderingFeaturesEXT, VkPhysicalDeviceCooperativeMatrixFeaturesNV, VkPhysicalDeviceCornerSampledImageFeaturesNV, VkPhysicalDeviceCoverageReductionModeFeaturesNV, VkPhysicalDeviceCustomBorderColorFeaturesEXT, VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV, VkPhysicalDeviceDepthClipEnableFeaturesEXT, VkPhysicalDeviceDescriptorIndexingFeatures, VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV, VkPhysicalDeviceDiagnosticsConfigFeaturesNV, VkPhysicalDeviceExclusiveScissorFeaturesNV, VkPhysicalDeviceExtendedDynamicStateFeaturesEXT, VkPhysicalDeviceFeatures2, VkPhysicalDeviceFragmentDensityMap2FeaturesEXT, VkPhysicalDeviceFragmentDensityMapFeaturesEXT, VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV, VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT, VkPhysicalDeviceHostQueryResetFeatures, VkPhysicalDeviceImageRobustnessFeaturesEXT, VkPhysicalDeviceImagelessFramebufferFeatures, VkPhysicalDeviceIndexTypeUint8FeaturesEXT, VkPhysicalDeviceInlineUniformBlockFeaturesEXT, VkPhysicalDeviceLineRasterizationFeaturesEXT, VkPhysicalDeviceMemoryPriorityFeaturesEXT, VkPhysicalDeviceMeshShaderFeaturesNV, VkPhysicalDeviceMultiviewFeatures, VkPhysicalDevicePerformanceQueryFeaturesKHR, VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT, VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR, VkPhysicalDevicePrivateDataFeaturesEXT, VkPhysicalDeviceProtectedMemoryFeatures, VkPhysicalDeviceRayTracingFeaturesKHR, VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV, VkPhysicalDeviceRobustness2FeaturesEXT, VkPhysicalDeviceSamplerYcbcrConversionFeatures, VkPhysicalDeviceScalarBlockLayoutFeatures, VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures, VkPhysicalDeviceShaderAtomicFloatFeaturesEXT, VkPhysicalDeviceShaderAtomicInt64Features, VkPhysicalDeviceShaderClockFeaturesKHR, VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT, VkPhysicalDeviceShaderDrawParametersFeatures, VkPhysicalDeviceShaderFloat16Int8Features, VkPhysicalDeviceShaderImageFootprintFeaturesNV, VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL, VkPhysicalDeviceShaderSMBuiltinsFeaturesNV, VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures, VkPhysicalDeviceShadingRateImageFeaturesNV, VkPhysicalDeviceSubgroupSizeControlFeaturesEXT, VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT, VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT, VkPhysicalDeviceTimelineSemaphoreFeatures, VkPhysicalDeviceTransformFeedbackFeaturesEXT, VkPhysicalDeviceUniformBufferStandardLayoutFeatures, VkPhysicalDeviceVariablePointersFeatures, VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT, VkPhysicalDeviceVulkan11Features, VkPhysicalDeviceVulkan12Features, VkPhysicalDeviceVulkanMemoryModelFeatures, or VkPhysicalDeviceYcbcrImageArraysFeaturesEXT", "1.2-extensions"},
+ {"VUID-VkDeviceCreateInfo-pQueueCreateInfos-parameter", "pQueueCreateInfos must be a valid pointer to an array of queueCreateInfoCount valid VkDeviceQueueCreateInfo structures", "1.2-extensions"},
+ {"VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-00374", "ppEnabledExtensionNames must not contain both VK_KHR_maintenance1 and VK_AMD_negative_viewport_height", "1.0-extensions"},
+ {"VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-01840", "ppEnabledExtensionNames must not contain VK_AMD_negative_viewport_height", "1.2-extensions"},
+ {"VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-03328", "ppEnabledExtensionNames must not contain both VK_KHR_buffer_device_address and VK_EXT_buffer_device_address", "1.2-extensions"},
+ {"VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-parameter", "If enabledExtensionCount is not 0, ppEnabledExtensionNames must be a valid pointer to an array of enabledExtensionCount null-terminated UTF-8 strings", "1.2-extensions"},
+ {"VUID-VkDeviceCreateInfo-ppEnabledExtensions-02831", "If ppEnabledExtensions contains \"VK_KHR_draw_indirect_count\" and the pNext chain includes a VkPhysicalDeviceVulkan12Features structure, then VkPhysicalDeviceVulkan12Features::drawIndirectCount must be VK_TRUE", "1.2-extensions"},
+ {"VUID-VkDeviceCreateInfo-ppEnabledExtensions-02832", "If ppEnabledExtensions contains \"VK_KHR_sampler_mirror_clamp_to_edge\" and the pNext chain includes a VkPhysicalDeviceVulkan12Features structure, then VkPhysicalDeviceVulkan12Features::samplerMirrorClampToEdge must be VK_TRUE", "1.2-extensions"},
+ {"VUID-VkDeviceCreateInfo-ppEnabledExtensions-02833", "If ppEnabledExtensions contains \"VK_EXT_descriptor_indexing\" and the pNext chain includes a VkPhysicalDeviceVulkan12Features structure, then VkPhysicalDeviceVulkan12Features::descriptorIndexing must be VK_TRUE", "1.2-extensions"},
+ {"VUID-VkDeviceCreateInfo-ppEnabledExtensions-02834", "If ppEnabledExtensions contains \"VK_EXT_sampler_filter_minmax\" and the pNext chain includes a VkPhysicalDeviceVulkan12Features structure, then VkPhysicalDeviceVulkan12Features::samplerFilterMinmax must be VK_TRUE", "1.2-extensions"},
+ {"VUID-VkDeviceCreateInfo-ppEnabledExtensions-02835", "If ppEnabledExtensions contains \"VK_EXT_shader_viewport_index_layer\" and the pNext chain includes a VkPhysicalDeviceVulkan12Features structure, then VkPhysicalDeviceVulkan12Features::shaderOutputViewportIndex and VkPhysicalDeviceVulkan12Features::shaderOutputLayer must both be VK_TRUE", "1.2-extensions"},
+ {"VUID-VkDeviceCreateInfo-ppEnabledLayerNames-parameter", "If enabledLayerCount is not 0, ppEnabledLayerNames must be a valid pointer to an array of enabledLayerCount null-terminated UTF-8 strings", "1.2-extensions"},
+ {"VUID-VkDeviceCreateInfo-queueCreateInfoCount-arraylength", "queueCreateInfoCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkDeviceCreateInfo-queueFamilyIndex-00372", "The queueFamilyIndex member of each element of pQueueCreateInfos must be unique within pQueueCreateInfos", "1.0-extensions"},
+ {"VUID-VkDeviceCreateInfo-queueFamilyIndex-02802", "The queueFamilyIndex member of each element of pQueueCreateInfos must be unique within pQueueCreateInfos, except that two members can share the same queueFamilyIndex if one is a protected-capable queue and one is not a protected-capable queue", "1.2-extensions"},
+ {"VUID-VkDeviceCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkDeviceCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique, with the exception of structures of type VkDevicePrivateDataCreateInfoEXT", "1.2-extensions"},
+ {"VUID-VkDeviceDiagnosticsConfigCreateInfoNV-flags-parameter", "flags must be a valid combination of VkDeviceDiagnosticsConfigFlagBitsNV values", "1.2-extensions"},
+ {"VUID-VkDeviceDiagnosticsConfigCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkDeviceEventInfoEXT-deviceEvent-parameter", "deviceEvent must be a valid VkDeviceEventTypeEXT value", "1.2-extensions"},
+ {"VUID-VkDeviceEventInfoEXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkDeviceEventInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_EVENT_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkDeviceGroupBindSparseInfo-memoryDeviceIndex-01119", "Each memory allocation bound in this batch must have allocated an instance for memoryDeviceIndex", "1.2-extensions"},
+ {"VUID-VkDeviceGroupBindSparseInfo-resourceDeviceIndex-01118", "resourceDeviceIndex and memoryDeviceIndex must both be valid device indices", "1.2-extensions"},
+ {"VUID-VkDeviceGroupBindSparseInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO", "1.2-extensions"},
+ {"VUID-VkDeviceGroupCommandBufferBeginInfo-deviceMask-00106", "deviceMask must be a valid device mask value", "1.2-extensions"},
+ {"VUID-VkDeviceGroupCommandBufferBeginInfo-deviceMask-00107", "deviceMask must not be zero", "1.2-extensions"},
+ {"VUID-VkDeviceGroupCommandBufferBeginInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO", "1.2-extensions"},
+ {"VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-00375", "Each element of pPhysicalDevices must be unique", "1.2-extensions"},
+ {"VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-00376", "All elements of pPhysicalDevices must be in the same device group as enumerated by vkEnumeratePhysicalDeviceGroups", "1.2-extensions"},
+ {"VUID-VkDeviceGroupDeviceCreateInfo-pPhysicalDevices-parameter", "If physicalDeviceCount is not 0, pPhysicalDevices must be a valid pointer to an array of physicalDeviceCount valid VkPhysicalDevice handles", "1.2-extensions"},
+ {"VUID-VkDeviceGroupDeviceCreateInfo-physicalDeviceCount-00377", "If physicalDeviceCount is not 0, the physicalDevice parameter of vkCreateDevice must be an element of pPhysicalDevices", "1.2-extensions"},
+ {"VUID-VkDeviceGroupDeviceCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkDeviceGroupPresentCapabilitiesKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkDeviceGroupPresentCapabilitiesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR", "1.2-extensions"},
+ {"VUID-VkDeviceGroupPresentInfoKHR-mode-01298", "If mode is VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_BIT_KHR, then each element of pDeviceMasks must have exactly one bit set, and the corresponding element of VkDeviceGroupPresentCapabilitiesKHR::presentMask must be non-zero", "1.2-extensions"},
+ {"VUID-VkDeviceGroupPresentInfoKHR-mode-01299", "If mode is VK_DEVICE_GROUP_PRESENT_MODE_REMOTE_BIT_KHR, then each element of pDeviceMasks must have exactly one bit set, and some physical device in the logical device must include that bit in its VkDeviceGroupPresentCapabilitiesKHR::presentMask", "1.2-extensions"},
+ {"VUID-VkDeviceGroupPresentInfoKHR-mode-01300", "If mode is VK_DEVICE_GROUP_PRESENT_MODE_SUM_BIT_KHR, then each element of pDeviceMasks must have a value for which all set bits are set in one of the elements of VkDeviceGroupPresentCapabilitiesKHR::presentMask", "1.2-extensions"},
+ {"VUID-VkDeviceGroupPresentInfoKHR-mode-01301", "If mode is VK_DEVICE_GROUP_PRESENT_MODE_LOCAL_MULTI_DEVICE_BIT_KHR, then for each bit set in each element of pDeviceMasks, the corresponding element of VkDeviceGroupPresentCapabilitiesKHR::presentMask must be non-zero", "1.2-extensions"},
+ {"VUID-VkDeviceGroupPresentInfoKHR-mode-01303", "mode must have exactly one bit set, and that bit must have been included in VkDeviceGroupSwapchainCreateInfoKHR::modes", "1.2-extensions"},
+ {"VUID-VkDeviceGroupPresentInfoKHR-mode-parameter", "mode must be a valid VkDeviceGroupPresentModeFlagBitsKHR value", "1.2-extensions"},
+ {"VUID-VkDeviceGroupPresentInfoKHR-pDeviceMasks-01302", "The value of each element of pDeviceMasks must be equal to the device mask passed in VkAcquireNextImageInfoKHR::deviceMask when the image index was last acquired", "1.2-extensions"},
+ {"VUID-VkDeviceGroupPresentInfoKHR-pDeviceMasks-parameter", "If swapchainCount is not 0, pDeviceMasks must be a valid pointer to an array of swapchainCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkDeviceGroupPresentInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkDeviceGroupPresentInfoKHR-swapchainCount-01297", "swapchainCount must equal 0 or VkPresentInfoKHR::swapchainCount", "1.2-extensions"},
+ {"VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00905", "deviceMask must be a valid device mask value", "1.2-extensions"},
+ {"VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00906", "deviceMask must not be zero", "1.2-extensions"},
+ {"VUID-VkDeviceGroupRenderPassBeginInfo-deviceMask-00907", "deviceMask must be a subset of the command buffer's initial device mask", "1.2-extensions"},
+ {"VUID-VkDeviceGroupRenderPassBeginInfo-deviceRenderAreaCount-00908", "deviceRenderAreaCount must either be zero or equal to the number of physical devices in the logical device", "1.2-extensions"},
+ {"VUID-VkDeviceGroupRenderPassBeginInfo-pDeviceRenderAreas-parameter", "If deviceRenderAreaCount is not 0, pDeviceRenderAreas must be a valid pointer to an array of deviceRenderAreaCount VkRect2D structures", "1.2-extensions"},
+ {"VUID-VkDeviceGroupRenderPassBeginInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO", "1.2-extensions"},
+ {"VUID-VkDeviceGroupSubmitInfo-commandBufferCount-00083", "commandBufferCount must equal VkSubmitInfo::commandBufferCount", "1.2-extensions"},
+ {"VUID-VkDeviceGroupSubmitInfo-pCommandBufferDeviceMasks-00086", "All elements of pCommandBufferDeviceMasks must be valid device masks", "1.2-extensions"},
+ {"VUID-VkDeviceGroupSubmitInfo-pCommandBufferDeviceMasks-parameter", "If commandBufferCount is not 0, pCommandBufferDeviceMasks must be a valid pointer to an array of commandBufferCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkDeviceGroupSubmitInfo-pSignalSemaphoreDeviceIndices-parameter", "If signalSemaphoreCount is not 0, pSignalSemaphoreDeviceIndices must be a valid pointer to an array of signalSemaphoreCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkDeviceGroupSubmitInfo-pWaitSemaphoreDeviceIndices-00085", "All elements of pWaitSemaphoreDeviceIndices and pSignalSemaphoreDeviceIndices must be valid device indices", "1.2-extensions"},
+ {"VUID-VkDeviceGroupSubmitInfo-pWaitSemaphoreDeviceIndices-parameter", "If waitSemaphoreCount is not 0, pWaitSemaphoreDeviceIndices must be a valid pointer to an array of waitSemaphoreCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkDeviceGroupSubmitInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO", "1.2-extensions"},
+ {"VUID-VkDeviceGroupSubmitInfo-signalSemaphoreCount-00084", "signalSemaphoreCount must equal VkSubmitInfo::signalSemaphoreCount", "1.2-extensions"},
+ {"VUID-VkDeviceGroupSubmitInfo-waitSemaphoreCount-00082", "waitSemaphoreCount must equal VkSubmitInfo::waitSemaphoreCount", "1.2-extensions"},
+ {"VUID-VkDeviceGroupSwapchainCreateInfoKHR-modes-parameter", "modes must be a valid combination of VkDeviceGroupPresentModeFlagBitsKHR values", "1.2-extensions"},
+ {"VUID-VkDeviceGroupSwapchainCreateInfoKHR-modes-requiredbitmask", "modes must not be 0", "1.2-extensions"},
+ {"VUID-VkDeviceGroupSwapchainCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkDeviceMemoryOpaqueCaptureAddressInfo-memory-03336", "memory must have been allocated with VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT", "1.2-extensions"},
+ {"VUID-VkDeviceMemoryOpaqueCaptureAddressInfo-memory-parameter", "memory must be a valid VkDeviceMemory handle", "1.2-extensions"},
+ {"VUID-VkDeviceMemoryOpaqueCaptureAddressInfo-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkDeviceMemoryOpaqueCaptureAddressInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO", "1.2-extensions"},
+ {"VUID-VkDeviceMemoryOverallocationCreateInfoAMD-overallocationBehavior-parameter", "overallocationBehavior must be a valid VkMemoryOverallocationBehaviorAMD value", "1.2-extensions"},
+ {"VUID-VkDeviceMemoryOverallocationCreateInfoAMD-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD", "1.2-extensions"},
+ {"VUID-VkDevicePrivateDataCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_PRIVATE_DATA_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkDeviceQueueCreateInfo-flags-02861", "If the protected memory feature is not enabled, the VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT bit of flags must not be set", "1.2-extensions"},
+ {"VUID-VkDeviceQueueCreateInfo-flags-parameter", "flags must be a valid combination of VkDeviceQueueCreateFlagBits values", "1.2-extensions"},
+ {"VUID-VkDeviceQueueCreateInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkDeviceQueueGlobalPriorityCreateInfoEXT", "1.2-extensions"},
+ {"VUID-VkDeviceQueueCreateInfo-pQueuePriorities-00383", "Each element of pQueuePriorities must be between 0.0 and 1.0 inclusive", "1.2-extensions"},
+ {"VUID-VkDeviceQueueCreateInfo-pQueuePriorities-parameter", "pQueuePriorities must be a valid pointer to an array of queueCount float values", "1.2-extensions"},
+ {"VUID-VkDeviceQueueCreateInfo-queueCount-00382", "queueCount must be less than or equal to the queueCount member of the VkQueueFamilyProperties structure, as returned by vkGetPhysicalDeviceQueueFamilyProperties in the pQueueFamilyProperties[queueFamilyIndex]", "1.2-extensions"},
+ {"VUID-VkDeviceQueueCreateInfo-queueCount-arraylength", "queueCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkDeviceQueueCreateInfo-queueFamilyIndex-00381", "queueFamilyIndex must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties", "1.2-extensions"},
+ {"VUID-VkDeviceQueueCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkDeviceQueueCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkDeviceQueueGlobalPriorityCreateInfoEXT-globalPriority-parameter", "globalPriority must be a valid VkQueueGlobalPriorityEXT value", "1.2-extensions"},
+ {"VUID-VkDeviceQueueGlobalPriorityCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkDeviceQueueInfo2-flags-parameter", "flags must be a valid combination of VkDeviceQueueCreateFlagBits values", "1.2-extensions"},
+ {"VUID-VkDeviceQueueInfo2-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkDeviceQueueInfo2-queueFamilyIndex-01842", "queueFamilyIndex must be one of the queue family indices specified when device was created, via the VkDeviceQueueCreateInfo structure", "1.2-extensions"},
+ {"VUID-VkDeviceQueueInfo2-queueIndex-01843", "queueIndex must be less than the number of queues created for the specified queue family index and VkDeviceQueueCreateFlags member flags equal to this flags value when device was created, via the queueCount member of the VkDeviceQueueCreateInfo structure", "1.2-extensions"},
+ {"VUID-VkDeviceQueueInfo2-sType-sType", "sType must be VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2", "1.2-extensions"},
+ {"VUID-VkDirectFBSurfaceCreateInfoEXT-dfb-04117", "dfb must point to a valid DirectFB IDirectFB", "1.2-extensions"},
+ {"VUID-VkDirectFBSurfaceCreateInfoEXT-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkDirectFBSurfaceCreateInfoEXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkDirectFBSurfaceCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkDirectFBSurfaceCreateInfoEXT-surface-04118", "surface must point to a valid DirectFB IDirectFBSurface", "1.2-extensions"},
+ {"VUID-VkDispatchIndirectCommand-x-00417", "x must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]", "1.2-extensions"},
+ {"VUID-VkDispatchIndirectCommand-y-00418", "y must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1]", "1.2-extensions"},
+ {"VUID-VkDispatchIndirectCommand-z-00419", "z must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]", "1.2-extensions"},
+ {"VUID-VkDisplayEventInfoEXT-displayEvent-parameter", "displayEvent must be a valid VkDisplayEventTypeEXT value", "1.2-extensions"},
+ {"VUID-VkDisplayEventInfoEXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkDisplayEventInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DISPLAY_EVENT_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkDisplayModeCreateInfoKHR-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkDisplayModeCreateInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkDisplayModeCreateInfoKHR-parameters-parameter", "parameters must be a valid VkDisplayModeParametersKHR structure", "1.2-extensions"},
+ {"VUID-VkDisplayModeCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkDisplayModeParametersKHR-height-01991", "The height member of visibleRegion must be greater than 0", "1.2-extensions"},
+ {"VUID-VkDisplayModeParametersKHR-refreshRate-01992", "refreshRate must be greater than 0", "1.2-extensions"},
+ {"VUID-VkDisplayModeParametersKHR-width-01990", "The width member of visibleRegion must be greater than 0", "1.2-extensions"},
+ {"VUID-VkDisplayModeProperties2KHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkDisplayModeProperties2KHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DISPLAY_MODE_PROPERTIES_2_KHR", "1.2-extensions"},
+ {"VUID-VkDisplayNativeHdrSurfaceCapabilitiesAMD-sType-sType", "sType must be VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD", "1.2-extensions"},
+ {"VUID-VkDisplayPlaneCapabilities2KHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkDisplayPlaneCapabilities2KHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DISPLAY_PLANE_CAPABILITIES_2_KHR", "1.2-extensions"},
+ {"VUID-VkDisplayPlaneInfo2KHR-mode-parameter", "mode must be a valid VkDisplayModeKHR handle", "1.2-extensions"},
+ {"VUID-VkDisplayPlaneInfo2KHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkDisplayPlaneInfo2KHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DISPLAY_PLANE_INFO_2_KHR", "1.2-extensions"},
+ {"VUID-VkDisplayPlaneProperties2KHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkDisplayPlaneProperties2KHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DISPLAY_PLANE_PROPERTIES_2_KHR", "1.2-extensions"},
+ {"VUID-VkDisplayPowerInfoEXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkDisplayPowerInfoEXT-powerState-parameter", "powerState must be a valid VkDisplayPowerStateEXT value", "1.2-extensions"},
+ {"VUID-VkDisplayPowerInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DISPLAY_POWER_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkDisplayPresentInfoKHR-dstRect-01258", "dstRect must specify a rectangular region that is a subset of the visibleRegion parameter of the display mode the swapchain being presented uses", "1.2-extensions"},
+ {"VUID-VkDisplayPresentInfoKHR-persistentContent-01259", "If the persistentContent member of the VkDisplayPropertiesKHR structure returned by vkGetPhysicalDeviceDisplayPropertiesKHR for the display the present operation targets then persistent must be VK_FALSE", "1.2-extensions"},
+ {"VUID-VkDisplayPresentInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkDisplayPresentInfoKHR-srcRect-01257", "srcRect must specify a rectangular region that is a subset of the image being presented", "1.2-extensions"},
+ {"VUID-VkDisplayProperties2KHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkDisplayProperties2KHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DISPLAY_PROPERTIES_2_KHR", "1.2-extensions"},
+ {"VUID-VkDisplaySurfaceCreateInfoKHR-alphaMode-01254", "If alphaMode is VK_DISPLAY_PLANE_ALPHA_GLOBAL_BIT_KHR then globalAlpha must be between 0 and 1, inclusive", "1.2-extensions"},
+ {"VUID-VkDisplaySurfaceCreateInfoKHR-alphaMode-01255", "alphaMode must be 0 or one of the bits present in the supportedAlpha member of VkDisplayPlaneCapabilitiesKHR returned by vkGetDisplayPlaneCapabilitiesKHR for the display plane corresponding to displayMode", "1.2-extensions"},
+ {"VUID-VkDisplaySurfaceCreateInfoKHR-alphaMode-parameter", "alphaMode must be a valid VkDisplayPlaneAlphaFlagBitsKHR value", "1.2-extensions"},
+ {"VUID-VkDisplaySurfaceCreateInfoKHR-displayMode-parameter", "displayMode must be a valid VkDisplayModeKHR handle", "1.2-extensions"},
+ {"VUID-VkDisplaySurfaceCreateInfoKHR-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkDisplaySurfaceCreateInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkDisplaySurfaceCreateInfoKHR-planeIndex-01252", "planeIndex must be less than the number of display planes supported by the device as determined by calling vkGetPhysicalDeviceDisplayPlanePropertiesKHR", "1.2-extensions"},
+ {"VUID-VkDisplaySurfaceCreateInfoKHR-planeReorderPossible-01253", "If the planeReorderPossible member of the VkDisplayPropertiesKHR structure returned by vkGetPhysicalDeviceDisplayPropertiesKHR for the display corresponding to displayMode is VK_TRUE then planeStackIndex must be less than the number of display planes supported by the device as determined by calling vkGetPhysicalDeviceDisplayPlanePropertiesKHR; otherwise planeStackIndex must equal the currentStackIndex member of VkDisplayPlanePropertiesKHR returned by vkGetPhysicalDeviceDisplayPlanePropertiesKHR for the display plane corresponding to displayMode", "1.2-extensions"},
+ {"VUID-VkDisplaySurfaceCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkDisplaySurfaceCreateInfoKHR-transform-parameter", "transform must be a valid VkSurfaceTransformFlagBitsKHR value", "1.2-extensions"},
+ {"VUID-VkDisplaySurfaceCreateInfoKHR-width-01256", "The width and height members of imageExtent must be less than the maxImageDimensions2D member of VkPhysicalDeviceLimits", "1.2-extensions"},
+ {"VUID-VkDrawIndexedIndirectCommand-None-00552", "For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in Vertex Input Description", "1.2-extensions"},
+ {"VUID-VkDrawIndexedIndirectCommand-firstInstance-00554", "If the drawIndirectFirstInstance feature is not enabled, firstInstance must be 0", "1.2-extensions"},
+ {"VUID-VkDrawIndexedIndirectCommand-indexSize-00553", "(indexSize {times} (firstIndex + indexCount) + offset) must be less than or equal to the size of the bound index buffer, with indexSize being based on the type specified by indexType, where the index buffer, indexType, and offset are specified via vkCmdBindIndexBuffer", "1.2-extensions"},
+ {"VUID-VkDrawIndirectCommand-None-00500", "For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in Vertex Input Description", "1.2-extensions"},
+ {"VUID-VkDrawIndirectCommand-firstInstance-00501", "If the drawIndirectFirstInstance feature is not enabled, firstInstance must be 0", "1.2-extensions"},
+ {"VUID-VkDrawMeshTasksIndirectCommandNV-taskCount-02175", "taskCount must be less than or equal to VkPhysicalDeviceMeshShaderPropertiesNV::maxDrawMeshTasksCount", "1.2-extensions"},
+ {"VUID-VkDrmFormatModifierPropertiesListEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT", "1.2-extensions"},
+ {"VUID-VkEventCreateInfo-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkEventCreateInfo-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkEventCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_EVENT_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkExportFenceCreateInfo-handleTypes-01446", "The bits in handleTypes must be supported and compatible, as reported by VkExternalFenceProperties", "1.2-extensions"},
+ {"VUID-VkExportFenceCreateInfo-handleTypes-parameter", "handleTypes must be a valid combination of VkExternalFenceHandleTypeFlagBits values", "1.2-extensions"},
+ {"VUID-VkExportFenceCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkExportFenceWin32HandleInfoKHR-handleTypes-01447", "If VkExportFenceCreateInfo::handleTypes does not include VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT, a VkExportFenceWin32HandleInfoKHR structure must not be included in the pNext chain of VkFenceCreateInfo", "1.2-extensions"},
+ {"VUID-VkExportFenceWin32HandleInfoKHR-pAttributes-parameter", "If pAttributes is not NULL, pAttributes must be a valid pointer to a valid SECURITY_ATTRIBUTES value", "1.2-extensions"},
+ {"VUID-VkExportFenceWin32HandleInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkExportMemoryAllocateInfo-handleTypes-00656", "The bits in handleTypes must be supported and compatible, as reported by VkExternalImageFormatProperties or VkExternalBufferProperties", "1.2-extensions"},
+ {"VUID-VkExportMemoryAllocateInfo-handleTypes-parameter", "handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBits values", "1.2-extensions"},
+ {"VUID-VkExportMemoryAllocateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO", "1.2-extensions"},
+ {"VUID-VkExportMemoryAllocateInfoNV-handleTypes-parameter", "handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBitsNV values", "1.2-extensions"},
+ {"VUID-VkExportMemoryAllocateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkExportMemoryWin32HandleInfoKHR-handleTypes-00657", "If VkExportMemoryAllocateInfo::handleTypes does not include VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT, or VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT, a VkExportMemoryWin32HandleInfoKHR structure must not be included in the pNext chain of VkMemoryAllocateInfo", "1.2-extensions"},
+ {"VUID-VkExportMemoryWin32HandleInfoKHR-pAttributes-parameter", "If pAttributes is not NULL, pAttributes must be a valid pointer to a valid SECURITY_ATTRIBUTES value", "1.2-extensions"},
+ {"VUID-VkExportMemoryWin32HandleInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkExportMemoryWin32HandleInfoNV-pAttributes-parameter", "If pAttributes is not NULL, pAttributes must be a valid pointer to a valid SECURITY_ATTRIBUTES value", "1.2-extensions"},
+ {"VUID-VkExportMemoryWin32HandleInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkExportSemaphoreCreateInfo-handleTypes-01124", "The bits in handleTypes must be supported and compatible, as reported by VkExternalSemaphoreProperties", "1.2-extensions"},
+ {"VUID-VkExportSemaphoreCreateInfo-handleTypes-parameter", "handleTypes must be a valid combination of VkExternalSemaphoreHandleTypeFlagBits values", "1.2-extensions"},
+ {"VUID-VkExportSemaphoreCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkExportSemaphoreWin32HandleInfoKHR-handleTypes-01125", "If VkExportSemaphoreCreateInfo::handleTypes does not include VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT or VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT, VkExportSemaphoreWin32HandleInfoKHR must not be included in the pNext chain of VkSemaphoreCreateInfo", "1.2-extensions"},
+ {"VUID-VkExportSemaphoreWin32HandleInfoKHR-pAttributes-parameter", "If pAttributes is not NULL, pAttributes must be a valid pointer to a valid SECURITY_ATTRIBUTES value", "1.2-extensions"},
+ {"VUID-VkExportSemaphoreWin32HandleInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkExternalBufferProperties-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkExternalBufferProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES", "1.2-extensions"},
+ {"VUID-VkExternalFenceProperties-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkExternalFenceProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES", "1.2-extensions"},
+ {"VUID-VkExternalFormatANDROID-externalFormat-01894", "externalFormat must be 0 or a value returned in the externalFormat member of VkAndroidHardwareBufferFormatPropertiesANDROID by an earlier call to vkGetAndroidHardwareBufferPropertiesANDROID", "1.2-extensions"},
+ {"VUID-VkExternalFormatANDROID-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID", "1.2-extensions"},
+ {"VUID-VkExternalImageFormatProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES", "1.2-extensions"},
+ {"VUID-VkExternalMemoryBufferCreateInfo-handleTypes-parameter", "handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBits values", "1.2-extensions"},
+ {"VUID-VkExternalMemoryBufferCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkExternalMemoryImageCreateInfo-handleTypes-parameter", "handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBits values", "1.2-extensions"},
+ {"VUID-VkExternalMemoryImageCreateInfo-handleTypes-requiredbitmask", "handleTypes must not be 0", "1.2-extensions"},
+ {"VUID-VkExternalMemoryImageCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkExternalMemoryImageCreateInfoNV-handleTypes-parameter", "handleTypes must be a valid combination of VkExternalMemoryHandleTypeFlagBitsNV values", "1.2-extensions"},
+ {"VUID-VkExternalMemoryImageCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkExternalSemaphoreProperties-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkExternalSemaphoreProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES", "1.2-extensions"},
+ {"VUID-VkFenceCreateInfo-flags-parameter", "flags must be a valid combination of VkFenceCreateFlagBits values", "1.2-extensions"},
+ {"VUID-VkFenceCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkExportFenceCreateInfo or VkExportFenceWin32HandleInfoKHR", "1.2-extensions"},
+ {"VUID-VkFenceCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_FENCE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkFenceCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkFenceGetFdInfoKHR-fence-01455", "fence must not currently have its payload replaced by an imported payload as described below in Importing Fence Payloads unless that imported payload's handle type was included in VkExternalFenceProperties::exportFromImportedHandleTypes for handleType", "1.2-extensions"},
+ {"VUID-VkFenceGetFdInfoKHR-fence-parameter", "fence must be a valid VkFence handle", "1.2-extensions"},
+ {"VUID-VkFenceGetFdInfoKHR-handleType-01453", "handleType must have been included in VkExportFenceCreateInfo::handleTypes when fence's current payload was created", "1.2-extensions"},
+ {"VUID-VkFenceGetFdInfoKHR-handleType-01454", "If handleType refers to a handle type with copy payload transference semantics, fence must be signaled, or have an associated fence signal operation pending execution", "1.2-extensions"},
+ {"VUID-VkFenceGetFdInfoKHR-handleType-01456", "handleType must be defined as a POSIX file descriptor handle", "1.2-extensions"},
+ {"VUID-VkFenceGetFdInfoKHR-handleType-parameter", "handleType must be a valid VkExternalFenceHandleTypeFlagBits value", "1.2-extensions"},
+ {"VUID-VkFenceGetFdInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkFenceGetFdInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkFenceGetWin32HandleInfoKHR-fence-01450", "fence must not currently have its payload replaced by an imported payload as described below in Importing Fence Payloads unless that imported payload's handle type was included in VkExternalFenceProperties::exportFromImportedHandleTypes for handleType", "1.2-extensions"},
+ {"VUID-VkFenceGetWin32HandleInfoKHR-fence-parameter", "fence must be a valid VkFence handle", "1.2-extensions"},
+ {"VUID-VkFenceGetWin32HandleInfoKHR-handleType-01448", "handleType must have been included in VkExportFenceCreateInfo::handleTypes when the fence's current payload was created", "1.2-extensions"},
+ {"VUID-VkFenceGetWin32HandleInfoKHR-handleType-01449", "If handleType is defined as an NT handle, vkGetFenceWin32HandleKHR must be called no more than once for each valid unique combination of fence and handleType", "1.2-extensions"},
+ {"VUID-VkFenceGetWin32HandleInfoKHR-handleType-01451", "If handleType refers to a handle type with copy payload transference semantics, fence must be signaled, or have an associated fence signal operation pending execution", "1.2-extensions"},
+ {"VUID-VkFenceGetWin32HandleInfoKHR-handleType-01452", "handleType must be defined as an NT handle or a global share handle", "1.2-extensions"},
+ {"VUID-VkFenceGetWin32HandleInfoKHR-handleType-parameter", "handleType must be a valid VkExternalFenceHandleTypeFlagBits value", "1.2-extensions"},
+ {"VUID-VkFenceGetWin32HandleInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkFenceGetWin32HandleInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkFilterCubicImageViewImageFormatPropertiesEXT-pNext-02627", "If the pNext chain of the VkImageFormatProperties2 structure includes a VkFilterCubicImageViewImageFormatPropertiesEXT structure, the pNext chain of the VkPhysicalDeviceImageFormatInfo2 structure must include a VkPhysicalDeviceImageViewImageFormatInfoEXT structure with an imageViewType that is compatible with imageType", "1.2-extensions"},
+ {"VUID-VkFilterCubicImageViewImageFormatPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT", "1.2-extensions"},
+ {"VUID-VkFormatProperties2-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkDrmFormatModifierPropertiesListEXT", "1.2-extensions"},
+ {"VUID-VkFormatProperties2-sType-sType", "sType must be VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2", "1.2-extensions"},
+ {"VUID-VkFormatProperties2-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkFramebufferAttachmentImageInfo-flags-parameter", "flags must be a valid combination of VkImageCreateFlagBits values", "1.2-extensions"},
+ {"VUID-VkFramebufferAttachmentImageInfo-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkFramebufferAttachmentImageInfo-pViewFormats-parameter", "If viewFormatCount is not 0, pViewFormats must be a valid pointer to an array of viewFormatCount valid VkFormat values", "1.2-extensions"},
+ {"VUID-VkFramebufferAttachmentImageInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO", "1.2-extensions"},
+ {"VUID-VkFramebufferAttachmentImageInfo-usage-parameter", "usage must be a valid combination of VkImageUsageFlagBits values", "1.2-extensions"},
+ {"VUID-VkFramebufferAttachmentImageInfo-usage-requiredbitmask", "usage must not be 0", "1.2-extensions"},
+ {"VUID-VkFramebufferAttachmentsCreateInfo-pAttachmentImageInfos-parameter", "If attachmentImageInfoCount is not 0, pAttachmentImageInfos must be a valid pointer to an array of attachmentImageInfoCount valid VkFramebufferAttachmentImageInfo structures", "1.2-extensions"},
+ {"VUID-VkFramebufferAttachmentsCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-attachmentCount-00876", "attachmentCount must be equal to the attachment count specified in renderPass", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-commonparent", "Both of renderPass, and the elements of pAttachments that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-flags-02778", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, and attachmentCount is not 0, pAttachments must be a valid pointer to an array of attachmentCount valid VkImageView handles", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-flags-03189", "If the imageless framebuffer feature is not enabled, flags must not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-flags-03190", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the pNext chain must include a VkFramebufferAttachmentsCreateInfo structure", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-flags-03191", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the attachmentImageInfoCount member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain must be equal to either zero or attachmentCount", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-flags-03192", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the width member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain must be greater than or equal to width", "1.2-khr-extensions"},
+ {"VUID-VkFramebufferCreateInfo-flags-03193", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the height member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain must be greater than or equal to height", "1.2-khr-extensions"},
+ {"VUID-VkFramebufferCreateInfo-flags-03194", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the width member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain must be greater than or equal to width, except for any element that is referenced by VkRenderPassFragmentDensityMapCreateInfoEXT::fragmentDensityMapAttachment in renderPass", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-flags-03195", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the height member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain must be greater than or equal to height, except for any element that is referenced by VkRenderPassFragmentDensityMapCreateInfoEXT::fragmentDensityMapAttachment in renderPass", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-flags-03196", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the width member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain that is referenced by VkRenderPassFragmentDensityMapCreateInfoEXT::fragmentDensityMapAttachment in renderPass must be greater than or equal to the ceiling of width/maxFragmentDensityTexelSize.width", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-flags-03197", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the height member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain that is referenced by VkRenderPassFragmentDensityMapCreateInfoEXT::fragmentDensityMapAttachment in renderPass must be greater than or equal to the ceiling of height/maxFragmentDensityTexelSize.height", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-flags-03200", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the layerCount member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain must be greater than or equal to layers", "1.2"},
+ {"VUID-VkFramebufferCreateInfo-flags-03201", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the usage member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain that refers to an attachment used as a color attachment or resolve attachment by renderPass must include VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-flags-03202", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the usage member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain that refers to an attachment used as a depth/stencil attachment by renderPass must include VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-flags-03203", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the usage member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain that refers to an attachment used as a depth/stencil resolve attachment by renderPass must include VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-flags-03204", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the usage member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain that refers to an attachment used as an input attachment by renderPass must include VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-flags-03205", "If flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, at least one element of the pViewFormats member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain must be equal to the corresponding value of VkAttachmentDescription::format used to create renderPass", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-flags-04113", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments must have been created with VkImageViewCreateInfo::viewType not equal to VK_IMAGE_VIEW_TYPE_3D", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-flags-parameter", "flags must be a valid combination of VkFramebufferCreateFlagBits values", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-height-00887", "height must be greater than 0", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-height-00888", "height must be less than or equal to VkPhysicalDeviceLimits::maxFramebufferHeight", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-layers-00889", "layers must be greater than 0", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-layers-00890", "layers must be less than or equal to VkPhysicalDeviceLimits::maxFramebufferLayers", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-pAttachments-00877", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments that is used as a color attachment or resolve attachment by renderPass must have been created with a usage value including VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-pAttachments-00879", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments that is used as an input attachment by renderPass must have been created with a usage value including VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-pAttachments-00880", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments must have been created with a VkFormat value that matches the VkFormat specified by the corresponding VkAttachmentDescription in renderPass", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-pAttachments-00881", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments must have been created with a samples value that matches the samples value specified by the corresponding VkAttachmentDescription in renderPass", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-pAttachments-00882", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments must have dimensions at least as large as the corresponding framebuffer dimension", "1.2-khr-extensions"},
+ {"VUID-VkFramebufferCreateInfo-pAttachments-00883", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments must only specify a single mip level", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-pAttachments-00884", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments must have been created with the identity swizzle", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-pAttachments-00891", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments that is a 2D or 2D array image view taken from a 3D image must not be a depth/stencil format", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-pAttachments-02552", "Each element of pAttachments that is used as a fragment density map attachment by renderPass must not have been created with a flags value including VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-pAttachments-02554", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments must have dimensions at least as large as the corresponding framebuffer dimension except for any element that is referenced by fragmentDensityMapAttachment", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-pAttachments-02555", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, an element of pAttachments that is referenced by fragmentDensityMapAttachment must have a width at least as large as the ceiling of width/maxFragmentDensityTexelSize.width", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-pAttachments-02556", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, an element of pAttachments that is referenced by fragmentDensityMapAttachment must have a height at least as large as the ceiling of height/maxFragmentDensityTexelSize.height", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-pAttachments-02633", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments that is used as a depth/stencil attachment by renderPass must have been created with a usage value including VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-pAttachments-02634", "If flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of pAttachments that is used as a depth/stencil resolve attachment by renderPass must have been created with a usage value including VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-pAttachments-02744", "An element of pAttachments that is referenced by fragmentDensityMapAttachment must have a layerCount equal to 1", "default"},
+ {"VUID-VkFramebufferCreateInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkFramebufferAttachmentsCreateInfo", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-renderPass-02531", "If renderPass was specified with non-zero view masks, layers must be 1", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-renderPass-02553", "If renderPass has a fragment density map attachment and non-subsample image feature is not enabled, each element of pAttachments must have been created with a flags value including VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT unless that element is the fragment density map attachment", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-renderPass-02743", "If renderPass was specified with non-zero view masks, each element of pAttachments must have a layerCount greater than the index of the most significant bit set in any of those view masks", "1.2-khr-extensions"},
+ {"VUID-VkFramebufferCreateInfo-renderPass-02745", "If renderPass was specified with non-zero view masks, each element of pAttachments that is not referenced by fragmentDensityMapAttachment must have a layerCount greater than the index of the most significant bit set in any of those view masks", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-renderPass-02746", "If renderPass was specified with non-zero view masks, each element of pAttachments that is referenced by fragmentDensityMapAttachment must have a layerCount equal to 1 or greater than the index of the most significant bit set in any of those view masks", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-renderPass-02747", "If renderPass was not specified with non-zero view masks, each element of pAttachments that is referenced by fragmentDensityMapAttachment must have a layerCount equal to 1", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-renderPass-03198", "If multiview is enabled for renderPass, and flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the layerCount member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain must be greater than the maximum bit index set in the view mask in the subpasses in which it is used in renderPass", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-renderPass-03199", "If multiview is not enabled for renderPass, and flags includes VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the layerCount member of any element of the pAttachmentImageInfos member of a VkFramebufferAttachmentsCreateInfo structure included in the pNext chain must be greater than or equal to layers", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-renderPass-parameter", "renderPass must be a valid VkRenderPass handle", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-width-00885", "width must be greater than 0", "1.2-extensions"},
+ {"VUID-VkFramebufferCreateInfo-width-00886", "width must be less than or equal to VkPhysicalDeviceLimits::maxFramebufferWidth", "1.2-extensions"},
+ {"VUID-VkFramebufferMixedSamplesCombinationNV-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkFramebufferMixedSamplesCombinationNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_FRAMEBUFFER_MIXED_SAMPLES_COMBINATION_NV", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-commonparent", "Each of indirectCommandsLayout, pipeline, preprocessBuffer, sequencesCountBuffer, and sequencesIndexBuffer that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-02913", "If the indirectCommandsLayout uses a token of VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV, then the pipeline must have been created with multiple shader groups", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-02914", "If the indirectCommandsLayout uses a token of VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV, then the pipeline must have been created with VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV set in VkGraphicsPipelineCreateInfo::flags", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-02915", "If the indirectCommandsLayout uses a token of VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, then the pipeline`s VkPipelineLayout must match the VkIndirectCommandsLayoutTokenNV::pushconstantPipelineLayout", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-indirectCommandsLayout-parameter", "indirectCommandsLayout must be a valid VkIndirectCommandsLayoutNV handle", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-pStreams-parameter", "pStreams must be a valid pointer to an array of streamCount valid VkIndirectCommandsStreamNV structures", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-pipeline-02912", "The provided pipeline must match the pipeline bound at execution time", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-pipeline-parameter", "pipeline must be a valid VkPipeline handle", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-pipelineBindPoint-parameter", "pipelineBindPoint must be a valid VkPipelineBindPoint value", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-preprocessBuffer-02918", "preprocessBuffer must have the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set in its usage flag", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-preprocessBuffer-02971", "If preprocessBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-preprocessBuffer-parameter", "preprocessBuffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-preprocessOffset-02919", "preprocessOffset must be aligned to VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::minIndirectCommandsBufferOffsetAlignment", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-preprocessSize-02920", "preprocessSize must be at least equal to the memory requirement`s size returned by vkGetGeneratedCommandsMemoryRequirementsNV using the matching inputs (indirectCommandsLayout, ...) as within this structure", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_GENERATED_COMMANDS_INFO_NV", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-sequencesCount-02917", "sequencesCount must be less or equal to VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectSequenceCount and VkGeneratedCommandsMemoryRequirementsInfoNV::maxSequencesCount that was used to determine the preprocessSize", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-02921", "sequencesCountBuffer can be set if the actual used count of sequences is sourced from the provided buffer. In that case the sequencesCount serves as upper bound", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-02922", "If sequencesCountBuffer is not VK_NULL_HANDLE, its usage flag must have the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-02923", "If sequencesCountBuffer is not VK_NULL_HANDLE, sequencesCountOffset must be aligned to VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::minSequencesCountBufferOffsetAlignment", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-02972", "If sequencesCountBuffer is not VK_NULL_HANDLE and is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-sequencesCountBuffer-parameter", "If sequencesCountBuffer is not VK_NULL_HANDLE, sequencesCountBuffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-02924", "If indirectCommandsLayout's VK_INDIRECT_COMMANDS_LAYOUT_USAGE_INDEXED_SEQUENCES_BIT_NV is set, sequencesIndexBuffer must be set otherwise it must be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-02925", "If sequencesIndexBuffer is not VK_NULL_HANDLE, its usage flag must have the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-02926", "If sequencesIndexBuffer is not VK_NULL_HANDLE, sequencesIndexOffset must be aligned to VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::minSequencesIndexBufferOffsetAlignment", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-02973", "If sequencesIndexBuffer is not VK_NULL_HANDLE and is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-sequencesIndexBuffer-parameter", "If sequencesIndexBuffer is not VK_NULL_HANDLE, sequencesIndexBuffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-streamCount-02916", "streamCount must match the indirectCommandsLayout's streamCount", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsInfoNV-streamCount-arraylength", "streamCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-commonparent", "Both of indirectCommandsLayout, and pipeline must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-indirectCommandsLayout-parameter", "indirectCommandsLayout must be a valid VkIndirectCommandsLayoutNV handle", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-maxSequencesCount-02907", "maxSequencesCount must be less or equal to VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectSequenceCount", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-pipeline-parameter", "pipeline must be a valid VkPipeline handle", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-pipelineBindPoint-parameter", "pipelineBindPoint must be a valid VkPipelineBindPoint value", "1.2-extensions"},
+ {"VUID-VkGeneratedCommandsMemoryRequirementsInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_NV", "1.2-extensions"},
+ {"VUID-VkGeometryAABBNV-aabbData-parameter", "If aabbData is not VK_NULL_HANDLE, aabbData must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-VkGeometryAABBNV-offset-02439", "offset must be less than the size of aabbData", "1.2-extensions"},
+ {"VUID-VkGeometryAABBNV-offset-02440", "offset must be a multiple of 8", "1.2-extensions"},
+ {"VUID-VkGeometryAABBNV-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkGeometryAABBNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV", "1.2-extensions"},
+ {"VUID-VkGeometryAABBNV-stride-02441", "stride must be a multiple of 8", "1.2-extensions"},
+ {"VUID-VkGeometryDataNV-aabbs-parameter", "aabbs must be a valid VkGeometryAABBNV structure", "1.2-extensions"},
+ {"VUID-VkGeometryDataNV-triangles-parameter", "triangles must be a valid VkGeometryTrianglesNV structure", "1.2-extensions"},
+ {"VUID-VkGeometryNV-flags-parameter", "flags must be a valid combination of VkGeometryFlagBitsKHR values", "1.2-extensions"},
+ {"VUID-VkGeometryNV-geometry-parameter", "geometry must be a valid VkGeometryDataNV structure", "1.2-extensions"},
+ {"VUID-VkGeometryNV-geometryType-03503", "geometryType must be VK_GEOMETRY_TYPE_TRIANGLES_NV or VK_GEOMETRY_TYPE_AABBS_NV", "1.2-extensions"},
+ {"VUID-VkGeometryNV-geometryType-parameter", "geometryType must be a valid VkGeometryTypeKHR value", "1.2-extensions"},
+ {"VUID-VkGeometryNV-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkGeometryNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_GEOMETRY_NV", "1.2-extensions"},
+ {"VUID-VkGeometryTrianglesNV-commonparent", "Each of indexData, transformData, and vertexData that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkGeometryTrianglesNV-indexCount-02436", "indexCount must be 0 if indexType is VK_INDEX_TYPE_NONE_NV", "1.2-extensions"},
+ {"VUID-VkGeometryTrianglesNV-indexData-02434", "indexData must be VK_NULL_HANDLE if indexType is VK_INDEX_TYPE_NONE_NV", "1.2-extensions"},
+ {"VUID-VkGeometryTrianglesNV-indexData-02435", "indexData must be a valid VkBuffer handle if indexType is not VK_INDEX_TYPE_NONE_NV", "1.2-extensions"},
+ {"VUID-VkGeometryTrianglesNV-indexData-parameter", "If indexData is not VK_NULL_HANDLE, indexData must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-VkGeometryTrianglesNV-indexOffset-02431", "indexOffset must be less than the size of indexData", "1.2-extensions"},
+ {"VUID-VkGeometryTrianglesNV-indexOffset-02432", "indexOffset must be a multiple of the element size of indexType", "1.2-extensions"},
+ {"VUID-VkGeometryTrianglesNV-indexType-02433", "indexType must be VK_INDEX_TYPE_UINT16, VK_INDEX_TYPE_UINT32, or VK_INDEX_TYPE_NONE_NV", "1.2-extensions"},
+ {"VUID-VkGeometryTrianglesNV-indexType-parameter", "indexType must be a valid VkIndexType value", "1.2-extensions"},
+ {"VUID-VkGeometryTrianglesNV-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkGeometryTrianglesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV", "1.2-extensions"},
+ {"VUID-VkGeometryTrianglesNV-transformData-parameter", "If transformData is not VK_NULL_HANDLE, transformData must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-VkGeometryTrianglesNV-transformOffset-02437", "transformOffset must be less than the size of transformData", "1.2-extensions"},
+ {"VUID-VkGeometryTrianglesNV-transformOffset-02438", "transformOffset must be a multiple of 16", "1.2-extensions"},
+ {"VUID-VkGeometryTrianglesNV-vertexData-parameter", "If vertexData is not VK_NULL_HANDLE, vertexData must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-VkGeometryTrianglesNV-vertexFormat-02430", "vertexFormat must be one of VK_FORMAT_R32G32B32_SFLOAT, VK_FORMAT_R32G32_SFLOAT, VK_FORMAT_R16G16B16_SFLOAT, VK_FORMAT_R16G16_SFLOAT, VK_FORMAT_R16G16_SNORM, or VK_FORMAT_R16G16B16_SNORM", "1.2-extensions"},
+ {"VUID-VkGeometryTrianglesNV-vertexFormat-parameter", "vertexFormat must be a valid VkFormat value", "1.2-extensions"},
+ {"VUID-VkGeometryTrianglesNV-vertexOffset-02428", "vertexOffset must be less than the size of vertexData", "1.2-extensions"},
+ {"VUID-VkGeometryTrianglesNV-vertexOffset-02429", "vertexOffset must be a multiple of the component size of vertexFormat", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-None-02322", "If there are any mesh shader stages in the pipeline there must not be any shader stage in the pipeline with a Xfb execution mode", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-attachmentCount-00746", "If rasterization is not disabled and the subpass uses color attachments, the attachmentCount member of pColorBlendState must be equal to the colorAttachmentCount used to create subpass", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-blendEnable-02023", "If rasterization is not disabled and the subpass uses color attachments, then for each color attachment in the subpass the blendEnable member of the corresponding element of the pAttachment member of pColorBlendState must be VK_FALSE if the attached image's format features does not contain VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-commonparent", "Each of basePipelineHandle, layout, and renderPass that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-coverageReductionMode-02722", "If the VK_NV_coverage_reduction_mode extension is enabled, the coverage reduction mode specified by VkPipelineCoverageReductionStateCreateInfoNV::coverageReductionMode, the rasterizationSamples member of pMultisampleState and the sample counts for the color and depth/stencil attachments (if the subpass has them) must be a valid combination returned by vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-flags-00722", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineIndex is -1, basePipelineHandle must be a valid handle to a graphics VkPipeline", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-flags-00723", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineHandle is VK_NULL_HANDLE, basePipelineIndex must be a valid index into the calling command's pCreateInfos parameter", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-flags-00724", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineIndex is not -1, basePipelineHandle must be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-flags-00725", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineHandle is not VK_NULL_HANDLE, basePipelineIndex must be -1", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-flags-00764", "flags must not contain the VK_PIPELINE_CREATE_DISPATCH_BASE flag", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-flags-02877", "If flags includes VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV, then the VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::deviceGeneratedCommands feature must be enabled", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-flags-02966", "If flags includes VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV, then all stages must not specify Xfb execution mode", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-flags-03371", "flags must not include VK_PIPELINE_CREATE_LIBRARY_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-flags-03372", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-flags-03373", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-flags-03374", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-flags-03375", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-flags-03376", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-flags-03377", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-flags-parameter", "flags must be a valid combination of VkPipelineCreateFlagBits values", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-geometryStreams-02321", "If the last vertex processing stage is a geometry shader, and that geometry shader uses the GeometryStreams capability, then VkPhysicalDeviceTransformFeedbackFeaturesEXT::geometryStreams feature must be enabled", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-layout-00756", "layout must be consistent with all shaders specified in pStages", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-layout-01688", "The number of resources in layout accessible to each shader stage that is used by the pipeline must be less than or equal to VkPhysicalDeviceLimits::maxPerStageResources", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-layout-parameter", "layout must be a valid VkPipelineLayout handle", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-lineRasterizationMode-02766", "If the lineRasterizationMode member of a VkPipelineRasterizationLineStateCreateInfoEXT structure included in the pNext chain of pRasterizationState is VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT or VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT and if rasterization is enabled, then the alphaToCoverageEnable, alphaToOneEnable, and sampleShadingEnable members of pMultisampleState must all be VK_FALSE", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pDynamicState-parameter", "If pDynamicState is not NULL, pDynamicState must be a valid pointer to a valid VkPipelineDynamicStateCreateInfo structure", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00747", "If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT, the pViewports member of pViewportState must be a valid pointer to an array of pViewportState->viewportCount valid VkViewport structures", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00748", "If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SCISSOR, the pScissors member of pViewportState must be a valid pointer to an array of pViewportState->scissorCount VkRect2D structures", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00749", "If the wide lines feature is not enabled, and no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_LINE_WIDTH, the lineWidth member of pRasterizationState must be 1.0", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00754", "If the depth bias clamping feature is not enabled, no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_DEPTH_BIAS, and the depthBiasEnable member of pRasterizationState is VK_TRUE, the depthBiasClamp member of pRasterizationState must be 0.0", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-00755", "If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_DEPTH_BOUNDS, and the depthBoundsTestEnable member of pDepthStencilState is VK_TRUE, the minDepthBounds and maxDepthBounds members of pDepthStencilState must be between 0.0 and 1.0, inclusive", "1.2-khr-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01521", "If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT, and the sampleLocationsEnable member of a VkPipelineSampleLocationsStateCreateInfoEXT structure included in the pNext chain of pMultisampleState is VK_TRUE, sampleLocationsInfo.sampleLocationGridSize.width must evenly divide VkMultisamplePropertiesEXT::sampleLocationGridSize.width as returned by vkGetPhysicalDeviceMultisamplePropertiesEXT with a samples parameter equaling rasterizationSamples", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01522", "If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT, and the sampleLocationsEnable member of a VkPipelineSampleLocationsStateCreateInfoEXT structure included in the pNext chain of pMultisampleState is VK_TRUE, sampleLocationsInfo.sampleLocationGridSize.height must evenly divide VkMultisamplePropertiesEXT::sampleLocationGridSize.height as returned by vkGetPhysicalDeviceMultisamplePropertiesEXT with a samples parameter equaling rasterizationSamples", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01523", "If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT, and the sampleLocationsEnable member of a VkPipelineSampleLocationsStateCreateInfoEXT structure included in the pNext chain of pMultisampleState is VK_TRUE, sampleLocationsInfo.sampleLocationsPerPixel must equal rasterizationSamples", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715", "If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV, and the viewportWScalingEnable member of a VkPipelineViewportWScalingStateCreateInfoNV structure, included in the pNext chain of pViewportState, is VK_TRUE, the pViewportWScalings member of the VkPipelineViewportWScalingStateCreateInfoNV must be a pointer to an array of VkPipelineViewportWScalingStateCreateInfoNV::viewportCount valid VkViewportWScalingNV structures", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-02510", "If the VK_EXT_depth_range_unrestricted extension is not enabled and no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_DEPTH_BOUNDS, and the depthBoundsTestEnable member of pDepthStencilState is VK_TRUE, the minDepthBounds and maxDepthBounds members of pDepthStencilState must be between 0.0 and 1.0, inclusive", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03378", "If the extendedDynamicState feature is not enabled, there must be no element of the pDynamicStates member of pDynamicState set to VK_DYNAMIC_STATE_CULL_MODE_EXT, VK_DYNAMIC_STATE_FRONT_FACE_EXT, VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT, VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT, VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT, VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT, VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT, VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT, VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT, VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT, VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT, or VK_DYNAMIC_STATE_STENCIL_OP_EXT", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03379", "If VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT is included in the pDynamicStates array then viewportCount must be zero", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03380", "If VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT is included in the pDynamicStates array then scissorCount must be zero", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04056", "If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV, and if pViewportState->pNext chain includes a VkPipelineViewportExclusiveScissorStateCreateInfoNV structure, and if its exclusiveScissorCount member is not 0, then its pExclusiveScissors member must be a valid pointer to an array of exclusiveScissorCount VkRect2D structures", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04057", "If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV, and if pViewportState->pNext chain includes a VkPipelineViewportShadingRateImageStateCreateInfoNV structure, then its pShadingRatePalettes member must be a valid pointer to an array of viewportCount valid VkShadingRatePaletteNV structures", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04058", "If no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_DISCARD_RECTANGLE_EXT, and if pNext chain includes a VkPipelineDiscardRectangleStateCreateInfoEXT structure, and if its discardRectangleCount member is not 0, then its pDiscardRectangles member must be a valid pointer to an array of discardRectangleCount VkRect2D structures", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkGraphicsPipelineShaderGroupsCreateInfoNV, VkPipelineCompilerControlCreateInfoAMD, VkPipelineCreationFeedbackCreateInfoEXT, VkPipelineDiscardRectangleStateCreateInfoEXT, or VkPipelineRepresentativeFragmentTestStateCreateInfoNV", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pRasterizationState-parameter", "pRasterizationState must be a valid pointer to a valid VkPipelineRasterizationStateCreateInfo structure", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pStages-00729", "If pStages includes a tessellation control shader stage, it must include a tessellation evaluation shader stage", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pStages-00730", "If pStages includes a tessellation evaluation shader stage, it must include a tessellation control shader stage", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pStages-00731", "If pStages includes a tessellation control shader stage and a tessellation evaluation shader stage, pTessellationState must be a valid pointer to a valid VkPipelineTessellationStateCreateInfo structure", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pStages-00732", "If pStages includes tessellation shader stages, the shader code of at least one stage must contain an OpExecutionMode instruction that specifies the type of subdivision in the pipeline", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pStages-00733", "If pStages includes tessellation shader stages, and the shader code of both stages contain an OpExecutionMode instruction that specifies the type of subdivision in the pipeline, they must both specify the same subdivision mode", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pStages-00734", "If pStages includes tessellation shader stages, the shader code of at least one stage must contain an OpExecutionMode instruction that specifies the output patch size in the pipeline", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pStages-00735", "If pStages includes tessellation shader stages, and the shader code of both contain an OpExecutionMode instruction that specifies the out patch size in the pipeline, they must both specify the same patch size", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pStages-00736", "If pStages includes tessellation shader stages, the topology member of pInputAssembly must be VK_PRIMITIVE_TOPOLOGY_PATCH_LIST", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pStages-00738", "If pStages includes a geometry shader stage, and does not include any tessellation shader stages, its shader code must contain an OpExecutionMode instruction that specifies an input primitive type that is compatible with the primitive topology specified in pInputAssembly", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pStages-00739", "If pStages includes a geometry shader stage, and also includes tessellation shader stages, its shader code must contain an OpExecutionMode instruction that specifies an input primitive type that is compatible with the primitive topology that is output by the tessellation stages", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pStages-00740", "If pStages includes a fragment shader stage and a geometry shader stage, and the fragment shader code reads from an input variable that is decorated with PrimitiveID, then the geometry shader code must write to a matching output variable, decorated with PrimitiveID, in all execution paths", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pStages-00741", "If pStages includes a fragment shader stage, its shader code must not read from any input attachment that is defined as VK_ATTACHMENT_UNUSED in subpass", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pStages-00742", "The shader code for the entry points identified by pStages, and the rest of the state identified by this structure must adhere to the pipeline linking rules described in the Shader Interfaces chapter", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pStages-01565", "If pStages includes a fragment shader stage and an input attachment was referenced by an aspectMask at renderPass creation time, its shader code must only read from the aspects that were specified for that input attachment", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pStages-02095", "The geometric shader stages provided in pStages must be either from the mesh shading pipeline (stage is VK_SHADER_STAGE_TASK_BIT_NV or VK_SHADER_STAGE_MESH_BIT_NV) or from the primitive shading pipeline (stage is VK_SHADER_STAGE_VERTEX_BIT, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, or VK_SHADER_STAGE_GEOMETRY_BIT)", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pStages-02097", "If pStages includes a vertex shader stage, pVertexInputState must be a valid pointer to a valid VkPipelineVertexInputStateCreateInfo structure", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pStages-02098", "If pStages includes a vertex shader stage, pInputAssemblyState must be a valid pointer to a valid VkPipelineInputAssemblyStateCreateInfo structure", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pStages-02317", "The Xfb execution mode can be specified by only one shader stage in pStages", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pStages-02318", "If any shader stage in pStages specifies Xfb execution mode it must be the last vertex processing stage", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pStages-parameter", "pStages must be a valid pointer to an array of stageCount valid VkPipelineShaderStageCreateInfo structures", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-pipelineCreationCacheControl-02878", "If the pipelineCreationCacheControl feature is not enabled, flags must not include VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT or VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-rasterizationStream-02319", "If a VkPipelineRasterizationStateStreamCreateInfoEXT::rasterizationStream value other than zero is specified, all variables in the output interface of the entry point being compiled decorated with Position, PointSize, ClipDistance, or CullDistance must all be decorated with identical Stream values that match the rasterizationStream", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-rasterizationStream-02320", "If VkPipelineRasterizationStateStreamCreateInfoEXT::rasterizationStream is zero, or not specified, all variables in the output interface of the entry point being compiled decorated with Position, PointSize, ClipDistance, or CullDistance must all be decorated with a Stream value of zero, or must not specify the Stream decoration", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00750", "If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pViewportState must be a valid pointer to a valid VkPipelineViewportStateCreateInfo structure", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00751", "If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, pMultisampleState must be a valid pointer to a valid VkPipelineMultisampleStateCreateInfo structure", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00752", "If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, and subpass uses a depth/stencil attachment, pDepthStencilState must be a valid pointer to a valid VkPipelineDepthStencilStateCreateInfo structure", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-rasterizerDiscardEnable-00753", "If the rasterizerDiscardEnable member of pRasterizationState is VK_FALSE, and subpass uses color attachments, pColorBlendState must be a valid pointer to a valid VkPipelineColorBlendStateCreateInfo structure", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-renderPass-00760", "If the renderPass has multiview enabled and subpass has more than one bit set in the view mask and multiviewTessellationShader is not enabled, then pStages must not include tessellation shaders", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-renderPass-00761", "If the renderPass has multiview enabled and subpass has more than one bit set in the view mask and multiviewGeometryShader is not enabled, then pStages must not include a geometry shader", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-renderPass-00762", "If the renderPass has multiview enabled and subpass has more than one bit set in the view mask, shaders in the pipeline must not write to the Layer built-in output", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-renderPass-00763", "If the renderPass has multiview enabled, then all shaders must not include variables decorated with the Layer built-in decoration in their interfaces", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-renderPass-parameter", "renderPass must be a valid VkRenderPass handle", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-sampleLocationsEnable-01524", "If the sampleLocationsEnable member of a VkPipelineSampleLocationsStateCreateInfoEXT structure included in the pNext chain of pMultisampleState is VK_TRUE, the fragment shader code must not statically use the extended instruction InterpolateAtSample", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-stage-00726", "The stage member of each element of pStages must be unique", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-stage-00727", "The stage member of one element of pStages must be VK_SHADER_STAGE_VERTEX_BIT", "1.2-khr-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-stage-00728", "The stage member of each element of pStages must not be VK_SHADER_STAGE_COMPUTE_BIT", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-stage-02096", "The stage member of one element of pStages must be either VK_SHADER_STAGE_VERTEX_BIT or VK_SHADER_STAGE_MESH_BIT_NV", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-stageCount-arraylength", "stageCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-stippledLineEnable-02767", "If the stippledLineEnable member of VkPipelineRasterizationLineStateCreateInfoEXT is VK_TRUE and no element of the pDynamicStates member of pDynamicState is VK_DYNAMIC_STATE_LINE_STIPPLE_EXT, then the lineStippleFactor member of VkPipelineRasterizationLineStateCreateInfoEXT must be in the range [1,256]", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-subpass-00743", "If rasterization is not disabled and subpass uses a depth/stencil attachment in renderPass that has a layout of VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL in the VkAttachmentReference defined by subpass, the depthWriteEnable member of pDepthStencilState must be VK_FALSE", "1.0"},
+ {"VUID-VkGraphicsPipelineCreateInfo-subpass-00744", "If rasterization is not disabled and subpass uses a depth/stencil attachment in renderPass that has a layout of VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL in the VkAttachmentReference defined by subpass, the failOp, passOp and depthFailOp members of each of the front and back members of pDepthStencilState must be VK_STENCIL_OP_KEEP", "1.0"},
+ {"VUID-VkGraphicsPipelineCreateInfo-subpass-00757", "If neither the VK_AMD_mixed_attachment_samples nor the VK_NV_framebuffer_mixed_samples extensions are enabled, and if subpass uses color and/or depth/stencil attachments, then the rasterizationSamples member of pMultisampleState must be the same as the sample count for those subpass attachments", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-subpass-00758", "If subpass does not use any color and/or depth/stencil attachments, then the rasterizationSamples member of pMultisampleState must follow the rules for a zero-attachment subpass", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-subpass-00759", "subpass must be a valid subpass within renderPass", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-subpass-01411", "If the VK_NV_framebuffer_mixed_samples extension is enabled, and if subpass has a depth/stencil attachment and depth test, stencil test, or depth bounds test are enabled, then the rasterizationSamples member of pMultisampleState must be the same as the sample count of the depth/stencil attachment", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-subpass-01412", "If the VK_NV_framebuffer_mixed_samples extension is enabled, and if subpass has any color attachments, then the rasterizationSamples member of pMultisampleState must be greater than or equal to the sample count for those subpass attachments", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-subpass-01505", "If the VK_AMD_mixed_attachment_samples extension is enabled, and if subpass uses color and/or depth/stencil attachments, then the rasterizationSamples member of pMultisampleState must equal the maximum of the sample counts of those subpass attachments", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-subpass-01756", "If rasterization is not disabled and subpass uses a depth/stencil attachment in renderPass that has a layout of VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL in the VkAttachmentReference defined by subpass, the depthWriteEnable member of pDepthStencilState must be VK_FALSE", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-subpass-01757", "If rasterization is not disabled and subpass uses a depth/stencil attachment in renderPass that has a layout of VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL or VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL in the VkAttachmentReference defined by subpass, the failOp, passOp and depthFailOp members of each of the front and back members of pDepthStencilState must be VK_STENCIL_OP_KEEP", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineCreateInfo-topology-00737", "If the topology member of pInputAssembly is VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, pStages must include tessellation shader stages", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-deviceGeneratedCommands-02887", "The VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::deviceGeneratedCommands feature must be enabled", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-groupCount-02879", "groupCount must be at least 1 and as maximum VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxGraphicsShaderGroupCount", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-groupCount-02880", "The sum of groupCount including those groups added from referenced pPipelines must also be as maximum VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxGraphicsShaderGroupCount", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-groupCount-arraylength", "groupCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02881", "The state of the first element of pGroups must match its equivalent within the parent's VkGraphicsPipelineCreateInfo", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02882", "Each element of pGroups must in combination with the rest of the pipeline state yield a valid state configuration", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02883", "All elements of pGroups must use the same shader stage combinations", "default"},
+ {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02884", "All elements of pGroups must use the same shader stage combinations unless any mesh shader stage is used, then either combination of task and mesh or just mesh shader is valid", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-02885", "Mesh and regular primitive shading stages cannot be mixed across pGroups", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pGroups-parameter", "pGroups must be a valid pointer to an array of groupCount valid VkGraphicsShaderGroupCreateInfoNV structures", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pPipelines-02886", "Each element of the pPipelines member of libraries must have been created with identical state to the pipeline currently created except the state that can be overriden by VkGraphicsShaderGroupCreateInfoNV", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-pPipelines-parameter", "If pipelineCount is not 0, pPipelines must be a valid pointer to an array of pipelineCount valid VkPipeline handles", "1.2-extensions"},
+ {"VUID-VkGraphicsPipelineShaderGroupsCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkGraphicsShaderGroupCreateInfoNV-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkGraphicsShaderGroupCreateInfoNV-pStages-02889", "For pStages, the same restrictions as in VkGraphicsPipelineCreateInfo::pStages apply", "1.2-extensions"},
+ {"VUID-VkGraphicsShaderGroupCreateInfoNV-pStages-parameter", "pStages must be a valid pointer to an array of stageCount valid VkPipelineShaderStageCreateInfo structures", "1.2-extensions"},
+ {"VUID-VkGraphicsShaderGroupCreateInfoNV-pTessellationState-02891", "For pTessellationState, the same restrictions as in VkGraphicsPipelineCreateInfo::pTessellationState apply", "1.2-extensions"},
+ {"VUID-VkGraphicsShaderGroupCreateInfoNV-pVertexInputState-02890", "For pVertexInputState, the same restrictions as in VkGraphicsPipelineCreateInfo::pVertexInputState apply", "1.2-extensions"},
+ {"VUID-VkGraphicsShaderGroupCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_GRAPHICS_SHADER_GROUP_CREATE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkGraphicsShaderGroupCreateInfoNV-stageCount-02888", "For stageCount, the same restrictions as in VkGraphicsPipelineCreateInfo::stageCount apply", "1.2-extensions"},
+ {"VUID-VkGraphicsShaderGroupCreateInfoNV-stageCount-arraylength", "stageCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkHdrMetadataEXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkHdrMetadataEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_HDR_METADATA_EXT", "1.2-extensions"},
+ {"VUID-VkHeadlessSurfaceCreateInfoEXT-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkHeadlessSurfaceCreateInfoEXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkHeadlessSurfaceCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkIOSSurfaceCreateInfoMVK-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkIOSSurfaceCreateInfoMVK-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkIOSSurfaceCreateInfoMVK-pView-01316", "pView must be a valid UIView and must be backed by a CALayer instance of type CAMetalLayer", "1.2-extensions"},
+ {"VUID-VkIOSSurfaceCreateInfoMVK-sType-sType", "sType must be VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK", "1.2-extensions"},
+ {"VUID-VkImageBlit-aspectMask-00238", "The aspectMask member of srcSubresource and dstSubresource must match", "1.2-extensions"},
+ {"VUID-VkImageBlit-aspectMask-00241", "The aspectMask member of srcSubresource must specify aspects present in the calling command's srcImage", "1.2-extensions"},
+ {"VUID-VkImageBlit-aspectMask-00242", "The aspectMask member of dstSubresource must specify aspects present in the calling command's dstImage", "1.2-extensions"},
+ {"VUID-VkImageBlit-dstImage-00250", "If the calling command's dstImage is of type VK_IMAGE_TYPE_1D, then dstOffset[0].y must be 0 and dstOffset[1].y must be 1", "1.2-extensions"},
+ {"VUID-VkImageBlit-dstImage-00252", "If the calling command's dstImage is of type VK_IMAGE_TYPE_1D or VK_IMAGE_TYPE_2D, then dstOffset[0].z must be 0 and dstOffset[1].z must be 1", "1.2-extensions"},
+ {"VUID-VkImageBlit-dstOffset-00248", "dstOffset[0].x and dstOffset[1].x must both be greater than or equal to 0 and less than or equal to the destination image subresource width", "1.2-extensions"},
+ {"VUID-VkImageBlit-dstOffset-00249", "dstOffset[0].y and dstOffset[1].y must both be greater than or equal to 0 and less than or equal to the destination image subresource height", "1.2-extensions"},
+ {"VUID-VkImageBlit-dstOffset-00251", "dstOffset[0].z and dstOffset[1].z must both be greater than or equal to 0 and less than or equal to the destination image subresource depth", "1.2-extensions"},
+ {"VUID-VkImageBlit-dstSubresource-parameter", "dstSubresource must be a valid VkImageSubresourceLayers structure", "1.2-extensions"},
+ {"VUID-VkImageBlit-layerCount-00239", "The layerCount member of srcSubresource and dstSubresource must match", "1.2-extensions"},
+ {"VUID-VkImageBlit-srcImage-00240", "If either of the calling command's srcImage or dstImage parameters are of VkImageType VK_IMAGE_TYPE_3D, the baseArrayLayer and layerCount members of both srcSubresource and dstSubresource must be 0 and 1, respectively", "1.2-extensions"},
+ {"VUID-VkImageBlit-srcImage-00245", "If the calling command's srcImage is of type VK_IMAGE_TYPE_1D, then srcOffset[0].y must be 0 and srcOffset[1].y must be 1", "1.2-extensions"},
+ {"VUID-VkImageBlit-srcImage-00247", "If the calling command's srcImage is of type VK_IMAGE_TYPE_1D or VK_IMAGE_TYPE_2D, then srcOffset[0].z must be 0 and srcOffset[1].z must be 1", "1.2-extensions"},
+ {"VUID-VkImageBlit-srcOffset-00243", "srcOffset[0].x and srcOffset[1].x must both be greater than or equal to 0 and less than or equal to the source image subresource width", "1.2-extensions"},
+ {"VUID-VkImageBlit-srcOffset-00244", "srcOffset[0].y and srcOffset[1].y must both be greater than or equal to 0 and less than or equal to the source image subresource height", "1.2-extensions"},
+ {"VUID-VkImageBlit-srcOffset-00246", "srcOffset[0].z and srcOffset[1].z must both be greater than or equal to 0 and less than or equal to the source image subresource depth", "1.2-extensions"},
+ {"VUID-VkImageBlit-srcSubresource-parameter", "srcSubresource must be a valid VkImageSubresourceLayers structure", "1.2-extensions"},
+ {"VUID-VkImageCopy-aspectMask-00137", "The aspectMask member of srcSubresource and dstSubresource must match", "1.0"},
+ {"VUID-VkImageCopy-aspectMask-00142", "The aspectMask member of srcSubresource must specify aspects present in the calling command's srcImage", "1.2-extensions"},
+ {"VUID-VkImageCopy-aspectMask-00143", "The aspectMask member of dstSubresource must specify aspects present in the calling command's dstImage", "1.2-extensions"},
+ {"VUID-VkImageCopy-dstImage-00152", "If the calling command's dstImage is of type VK_IMAGE_TYPE_1D, then dstOffset.y must be 0 and extent.height must be 1", "1.2-extensions"},
+ {"VUID-VkImageCopy-dstImage-01554", "If the calling command's dstImage has a VkFormat with two planes then the dstSubresource aspectMask must be VK_IMAGE_ASPECT_PLANE_0_BIT or VK_IMAGE_ASPECT_PLANE_1_BIT", "1.2-extensions"},
+ {"VUID-VkImageCopy-dstImage-01555", "If the calling command's dstImage has a VkFormat with three planes then the dstSubresource aspectMask must be VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT, or VK_IMAGE_ASPECT_PLANE_2_BIT", "1.2-extensions"},
+ {"VUID-VkImageCopy-dstImage-01557", "If the calling command's dstImage has a multi-planar image format and the srcImage does not have a multi-planar image format, the srcSubresource aspectMask must be VK_IMAGE_ASPECT_COLOR_BIT", "1.2-extensions"},
+ {"VUID-VkImageCopy-dstImage-01731", "If the calling command's dstImage is a compressed format image, or a single-plane, \"_422\" image format, all members of dstOffset must be a multiple of the corresponding dimensions of the compressed texel block", "1.2-extensions"},
+ {"VUID-VkImageCopy-dstImage-01732", "If the calling command's dstImage is a compressed format image, or a single-plane, \"_422\" image format, extent.width must be a multiple of the compressed texel block width or (extent.width + dstOffset.x) must equal the destination image subresource width", "1.2-extensions"},
+ {"VUID-VkImageCopy-dstImage-01733", "If the calling command's dstImage is a compressed format image, or a single-plane, \"_422\" image format, extent.height must be a multiple of the compressed texel block height or (extent.height + dstOffset.y) must equal the destination image subresource height", "1.2-extensions"},
+ {"VUID-VkImageCopy-dstImage-01734", "If the calling command's dstImage is a compressed format image, or a single-plane, \"_422\" image format, extent.depth must be a multiple of the compressed texel block depth or (extent.depth + dstOffset.z) must equal the destination image subresource depth", "1.2-extensions"},
+ {"VUID-VkImageCopy-dstImage-01786", "If the calling command's dstImage is of type VK_IMAGE_TYPE_1D, then dstOffset.z must be 0 and extent.depth must be 1", "1.2-extensions"},
+ {"VUID-VkImageCopy-dstImage-01788", "If the calling command's dstImage is of type VK_IMAGE_TYPE_2D, then dstOffset.z must be 0", "1.2-extensions"},
+ {"VUID-VkImageCopy-dstImage-01792", "If the calling command's dstImage is of type VK_IMAGE_TYPE_2D, and the srcImage is of type VK_IMAGE_TYPE_3D, then extent.depth must equal to the layerCount member of dstSubresource", "1.2-extensions"},
+ {"VUID-VkImageCopy-dstOffset-00150", "dstOffset.x and (extent.width + dstOffset.x) must both be greater than or equal to 0 and less than or equal to the destination image subresource width", "1.2-extensions"},
+ {"VUID-VkImageCopy-dstOffset-00151", "dstOffset.y and (extent.height + dstOffset.y) must both be greater than or equal to 0 and less than or equal to the destination image subresource height", "1.2-extensions"},
+ {"VUID-VkImageCopy-dstOffset-00153", "dstOffset.z and (extent.depth + dstOffset.z) must both be greater than or equal to 0 and less than or equal to the destination image subresource depth", "1.2-extensions"},
+ {"VUID-VkImageCopy-dstOffset-00162", "If the calling command's dstImage is a compressed format image, all members of dstOffset must be a multiple of the corresponding dimensions of the compressed texel block", "1.0"},
+ {"VUID-VkImageCopy-dstSubresource-parameter", "dstSubresource must be a valid VkImageSubresourceLayers structure", "1.2-extensions"},
+ {"VUID-VkImageCopy-extent-00140", "The number of slices of the extent (for 3D) or layers of the srcSubresource (for non-3D) must match the number of slices of the extent (for 3D) or layers of the dstSubresource (for non-3D)", "1.2-extensions"},
+ {"VUID-VkImageCopy-extent-00158", "If the calling command's srcImage is a compressed image, extent.width must be a multiple of the compressed texel block width or (extent.width + srcOffset.x) must equal the source image subresource width", "1.0"},
+ {"VUID-VkImageCopy-extent-00159", "If the calling command's srcImage is a compressed image, extent.height must be a multiple of the compressed texel block height or (extent.height + srcOffset.y) must equal the source image subresource height", "1.0"},
+ {"VUID-VkImageCopy-extent-00160", "If the calling command's srcImage is a compressed image, extent.depth must be a multiple of the compressed texel block depth or (extent.depth + srcOffset.z) must equal the source image subresource depth", "1.0"},
+ {"VUID-VkImageCopy-extent-00163", "If the calling command's dstImage is a compressed format image, extent.width must be a multiple of the compressed texel block width or (extent.width + dstOffset.x) must equal the destination image subresource width", "1.0"},
+ {"VUID-VkImageCopy-extent-00164", "If the calling command's dstImage is a compressed format image, extent.height must be a multiple of the compressed texel block height or (extent.height + dstOffset.y) must equal the destination image subresource height", "1.0"},
+ {"VUID-VkImageCopy-extent-00165", "If the calling command's dstImage is a compressed format image, extent.depth must be a multiple of the compressed texel block depth or (extent.depth + dstOffset.z) must equal the destination image subresource depth", "1.0"},
+ {"VUID-VkImageCopy-layerCount-00138", "The layerCount member of srcSubresource and dstSubresource must match", "1.0"},
+ {"VUID-VkImageCopy-srcImage-00139", "If either of the calling command's srcImage or dstImage parameters are of VkImageType VK_IMAGE_TYPE_3D, the baseArrayLayer and layerCount members of both srcSubresource and dstSubresource must be 0 and 1, respectively", "1.0"},
+ {"VUID-VkImageCopy-srcImage-00141", "If either of the calling command's srcImage or dstImage parameters are of VkImageType VK_IMAGE_TYPE_3D, the baseArrayLayer and layerCount members of the corresponding subresource must be 0 and 1, respectively", "1.2-extensions"},
+ {"VUID-VkImageCopy-srcImage-00146", "If the calling command's srcImage is of type VK_IMAGE_TYPE_1D, then srcOffset.y must be 0 and extent.height must be 1", "1.2-extensions"},
+ {"VUID-VkImageCopy-srcImage-01551", "If neither the calling command's srcImage nor the calling command's dstImage has a multi-planar image format then the aspectMask member of srcSubresource and dstSubresource must match", "1.2-extensions"},
+ {"VUID-VkImageCopy-srcImage-01552", "If the calling command's srcImage has a VkFormat with two planes then the srcSubresource aspectMask must be VK_IMAGE_ASPECT_PLANE_0_BIT or VK_IMAGE_ASPECT_PLANE_1_BIT", "1.2-extensions"},
+ {"VUID-VkImageCopy-srcImage-01553", "If the calling command's srcImage has a VkFormat with three planes then the srcSubresource aspectMask must be VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT, or VK_IMAGE_ASPECT_PLANE_2_BIT", "1.2-extensions"},
+ {"VUID-VkImageCopy-srcImage-01556", "If the calling command's srcImage has a multi-planar image format and the dstImage does not have a multi-planar image format, the dstSubresource aspectMask must be VK_IMAGE_ASPECT_COLOR_BIT", "1.2-extensions"},
+ {"VUID-VkImageCopy-srcImage-01727", "If the calling command's srcImage is a compressed image, or a single-plane, \"_422\" image format, all members of srcOffset must be a multiple of the corresponding dimensions of the compressed texel block", "1.2-extensions"},
+ {"VUID-VkImageCopy-srcImage-01728", "If the calling command's srcImage is a compressed image, or a single-plane, \"_422\" image format, extent.width must be a multiple of the compressed texel block width or (extent.width + srcOffset.x) must equal the source image subresource width", "1.2-extensions"},
+ {"VUID-VkImageCopy-srcImage-01729", "If the calling command's srcImage is a compressed image, or a single-plane, \"_422\" image format, extent.height must be a multiple of the compressed texel block height or (extent.height + srcOffset.y) must equal the source image subresource height", "1.2-extensions"},
+ {"VUID-VkImageCopy-srcImage-01730", "If the calling command's srcImage is a compressed image, or a single-plane, \"_422\" image format, extent.depth must be a multiple of the compressed texel block depth or (extent.depth + srcOffset.z) must equal the source image subresource depth", "1.2-extensions"},
+ {"VUID-VkImageCopy-srcImage-01785", "If the calling command's srcImage is of type VK_IMAGE_TYPE_1D, then srcOffset.z must be 0 and extent.depth must be 1", "1.2-extensions"},
+ {"VUID-VkImageCopy-srcImage-01787", "If the calling command's srcImage is of type VK_IMAGE_TYPE_2D, then srcOffset.z must be 0", "1.2-extensions"},
+ {"VUID-VkImageCopy-srcImage-01789", "If the calling command's srcImage or dstImage is of type VK_IMAGE_TYPE_2D, then extent.depth must be 1", "1.0"},
+ {"VUID-VkImageCopy-srcImage-01790", "If both srcImage and dstImage are of type VK_IMAGE_TYPE_2D then extent.depth must be 1", "1.2-extensions"},
+ {"VUID-VkImageCopy-srcImage-01791", "If the calling command's srcImage is of type VK_IMAGE_TYPE_2D, and the dstImage is of type VK_IMAGE_TYPE_3D, then extent.depth must equal to the layerCount member of srcSubresource", "1.2-extensions"},
+ {"VUID-VkImageCopy-srcOffset-00144", "srcOffset.x and (extent.width + srcOffset.x) must both be greater than or equal to 0 and less than or equal to the source image subresource width", "1.2-extensions"},
+ {"VUID-VkImageCopy-srcOffset-00145", "srcOffset.y and (extent.height + srcOffset.y) must both be greater than or equal to 0 and less than or equal to the source image subresource height", "1.2-extensions"},
+ {"VUID-VkImageCopy-srcOffset-00147", "srcOffset.z and (extent.depth + srcOffset.z) must both be greater than or equal to 0 and less than or equal to the source image subresource depth", "1.2-extensions"},
+ {"VUID-VkImageCopy-srcOffset-00157", "If the calling command's srcImage is a compressed image, all members of srcOffset must be a multiple of the corresponding dimensions of the compressed texel block", "1.0"},
+ {"VUID-VkImageCopy-srcSubresource-parameter", "srcSubresource must be a valid VkImageSubresourceLayers structure", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-Format-02536", "If Format is a depth-stencil format and the pNext chain includes a VkImageStencilUsageCreateInfo structure with its stencilUsage member including VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, extent.width must be less than or equal to VkPhysicalDeviceLimits::maxFramebufferWidth", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-None-01891", "If any of the bits VK_IMAGE_CREATE_SPARSE_BINDING_BIT, VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT, or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT are set, VK_IMAGE_CREATE_PROTECTED_BIT must not also be set", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-None-01925", "If any of the bits VK_IMAGE_CREATE_SPARSE_BINDING_BIT, VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT, or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT are set, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT must not also be set", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-arrayLayers-00948", "arrayLayers must be greater than 0", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-arrayLayers-02256", "arrayLayers must be less than or equal to imageCreateMaxArrayLayers (as defined in Image Creation Limits)", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-extent-00944", "extent.width must be greater than 0", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-extent-00945", "extent.height must be greater than 0", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-extent-00946", "extent.depth must be greater than 0", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-extent-02252", "extent.width must be less than or equal to imageCreateMaxExtent.width (as defined in Image Creation Limits)", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-extent-02253", "extent.height must be less than or equal to imageCreateMaxExtent.height (as defined in Image Creation Limits)", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-extent-02254", "extent.depth must be less than or equal to imageCreateMaxExtent.depth (as defined in Image Creation Limits)", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-flags-00949", "If flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, imageType must be VK_IMAGE_TYPE_2D", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-flags-00950", "If flags contains VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT, imageType must be VK_IMAGE_TYPE_3D", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-flags-00969", "If the sparse bindings feature is not enabled, flags must not contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-flags-00987", "If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain VK_IMAGE_CREATE_SPARSE_BINDING_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-flags-01533", "If flags contains VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT format must be a depth or depth/stencil format", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-flags-01572", "If flags contains VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT, then format must be a block-compressed image format, an ETC compressed image format, or an ASTC compressed image format", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-flags-01573", "If flags contains VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT, then flags must also contain VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-flags-01890", "If the protected memory feature is not enabled, flags must not contain VK_IMAGE_CREATE_PROTECTED_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-flags-01924", "If the sparse aliased residency feature is not enabled, flags must not contain VK_IMAGE_CREATE_SPARSE_ALIASED_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-flags-02050", "If flags contains VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV, imageType must be VK_IMAGE_TYPE_2D or VK_IMAGE_TYPE_3D", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-flags-02051", "If flags contains VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV, it must not contain VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT and the format must not be a depth/stencil format", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-flags-02052", "If flags contains VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV and imageType is VK_IMAGE_TYPE_2D, extent.width and extent.height must be greater than 1", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-flags-02053", "If flags contains VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV and imageType is VK_IMAGE_TYPE_3D, extent.width, extent.height, and extent.depth must be greater than 1", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-flags-02259", "If flags contains VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT, then mipLevels must be one, arrayLayers must be one, imageType must be VK_IMAGE_TYPE_2D. and imageCreateMaybeLinear (as defined in Image Creation Limits) must be false", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-flags-02557", "If flags contains VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT, imageType must be VK_IMAGE_TYPE_2D", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-flags-02565", "If flags contains VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT, tiling must be VK_IMAGE_TILING_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-flags-02566", "If flags contains VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT, imageType must be VK_IMAGE_TYPE_2D", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-flags-02567", "If flags contains VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT, flags must not contain VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-flags-02568", "If flags contains VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT, mipLevels must be 1", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-flags-parameter", "flags must be a valid combination of VkImageCreateFlagBits values", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-format-00943", "format must not be VK_FORMAT_UNDEFINED", "1.2-khr-extensions"},
+ {"VUID-VkImageCreateInfo-format-01577", "If format is not a multi-planar format, and flags does not include VK_IMAGE_CREATE_ALIAS_BIT, flags must not contain VK_IMAGE_CREATE_DISJOINT_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-format-02537", "If format is a depth-stencil format and the pNext chain includes a VkImageStencilUsageCreateInfo structure with its stencilUsage member including VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, extent.height must be less than or equal to VkPhysicalDeviceLimits::maxFramebufferHeight", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-format-02538", "If the multisampled storage images feature is not enabled, format is a depth-stencil format and the pNext chain includes a VkImageStencilUsageCreateInfo structure with its stencilUsage including VK_IMAGE_USAGE_STORAGE_BIT, samples must be VK_SAMPLE_COUNT_1_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-format-02561", "If the image format is one of those listed in Formats requiring sampler Y'CBCR conversion for VK_IMAGE_ASPECT_COLOR_BIT image views, then mipLevels must be 1", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-format-02562", "If the image format is one of those listed in Formats requiring sampler Y'CBCR conversion for VK_IMAGE_ASPECT_COLOR_BIT image views, samples must be VK_SAMPLE_COUNT_1_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-format-02563", "If the image format is one of those listed in Formats requiring sampler Y'CBCR conversion for VK_IMAGE_ASPECT_COLOR_BIT image views, imageType must be VK_IMAGE_TYPE_2D", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-format-02564", "If the image format is one of those listed in Formats requiring sampler Y'CBCR conversion for VK_IMAGE_ASPECT_COLOR_BIT image views, arrayLayers must be 1", "1.2-khr-extensions"},
+ {"VUID-VkImageCreateInfo-format-02653", "If the image format is one of those listed in Formats requiring sampler Y'CBCR conversion for VK_IMAGE_ASPECT_COLOR_BIT image views, and the ycbcrImageArrays feature is not enabled, arrayLayers must be 1", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-format-02795", "If format is a depth-stencil format, usage includes VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, and the pNext chain includes a VkImageStencilUsageCreateInfo structure, then its VkImageStencilUsageCreateInfo::stencilUsage member must also include VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-format-02796", "If format is a depth-stencil format, usage does not include VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, and the pNext chain includes a VkImageStencilUsageCreateInfo structure, then its VkImageStencilUsageCreateInfo::stencilUsage member must also not include VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-format-02797", "If format is a depth-stencil format, usage includes VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, and the pNext chain includes a VkImageStencilUsageCreateInfo structure, then its VkImageStencilUsageCreateInfo::stencilUsage member must also include VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-format-02798", "If format is a depth-stencil format, usage does not include VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, and the pNext chain includes a VkImageStencilUsageCreateInfo structure, then its VkImageStencilUsageCreateInfo::stencilUsage member must also not include VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-format-parameter", "format must be a valid VkFormat value", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-imageCreateFormatFeatures-02260", "If format is a multi-planar format, and if imageCreateFormatFeatures (as defined in Image Creation Limits) does not contain VK_FORMAT_FEATURE_DISJOINT_BIT, then flags must not contain VK_IMAGE_CREATE_DISJOINT_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-imageCreateMaxMipLevels-02251", "Each of the following values (as described in Image Creation Limits) must not be undefined imageCreateMaxMipLevels, imageCreateMaxArrayLayers, imageCreateMaxExtent, and imageCreateSampleCounts", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-imageType-00954", "If imageType is VK_IMAGE_TYPE_2D and flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, extent.width and extent.height must be equal and arrayLayers must be greater than or equal to 6", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-imageType-00956", "If imageType is VK_IMAGE_TYPE_1D, both extent.height and extent.depth must be 1", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-imageType-00957", "If imageType is VK_IMAGE_TYPE_2D, extent.depth must be 1", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-imageType-00961", "If imageType is VK_IMAGE_TYPE_3D, arrayLayers must be 1", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-imageType-00970", "If imageType is VK_IMAGE_TYPE_1D, flags must not contain VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-imageType-00971", "If the sparse residency for 2D images feature is not enabled, and imageType is VK_IMAGE_TYPE_2D, flags must not contain VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-imageType-00972", "If the sparse residency for 3D images feature is not enabled, and imageType is VK_IMAGE_TYPE_3D, flags must not contain VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-imageType-00973", "If the sparse residency for images with 2 samples feature is not enabled, imageType is VK_IMAGE_TYPE_2D, and samples is VK_SAMPLE_COUNT_2_BIT, flags must not contain VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-imageType-00974", "If the sparse residency for images with 4 samples feature is not enabled, imageType is VK_IMAGE_TYPE_2D, and samples is VK_SAMPLE_COUNT_4_BIT, flags must not contain VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-imageType-00975", "If the sparse residency for images with 8 samples feature is not enabled, imageType is VK_IMAGE_TYPE_2D, and samples is VK_SAMPLE_COUNT_8_BIT, flags must not contain VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-imageType-00976", "If the sparse residency for images with 16 samples feature is not enabled, imageType is VK_IMAGE_TYPE_2D, and samples is VK_SAMPLE_COUNT_16_BIT, flags must not contain VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-imageType-02082", "If usage includes VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV, imageType must be VK_IMAGE_TYPE_2D", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-imageType-parameter", "imageType must be a valid VkImageType value", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-initialLayout-00993", "initialLayout must be VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-initialLayout-parameter", "initialLayout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-mipLevels-00947", "mipLevels must be greater than 0", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-mipLevels-00958", "mipLevels must be less than or equal to the number of levels in the complete mipmap chain based on extent.width, extent.height, and extent.depth", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-mipLevels-02255", "mipLevels must be less than or equal to imageCreateMaxMipLevels (as defined in Image Creation Limits)", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-pNext-00988", "If the pNext chain includes a VkExternalMemoryImageCreateInfoNV structure, it must not contain a VkExternalMemoryImageCreateInfo structure", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-pNext-00990", "If the pNext chain includes a VkExternalMemoryImageCreateInfo structure, its handleTypes member must only contain bits that are also in VkExternalImageFormatProperties::externalMemoryProperties.compatibleHandleTypes, as returned by vkGetPhysicalDeviceImageFormatProperties2 with format, imageType, tiling, usage, and flags equal to those in this structure, and with a VkPhysicalDeviceExternalImageFormatInfo structure included in the pNext chain, with a handleType equal to any one of the handle types specified in VkExternalMemoryImageCreateInfo::handleTypes", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-pNext-00991", "If the pNext chain includes a VkExternalMemoryImageCreateInfoNV structure, its handleTypes member must only contain bits that are also in VkExternalImageFormatPropertiesNV::externalMemoryProperties.compatibleHandleTypes, as returned by vkGetPhysicalDeviceExternalImageFormatPropertiesNV with format, imageType, tiling, usage, and flags equal to those in this structure, and with externalHandleType equal to any one of the handle types specified in VkExternalMemoryImageCreateInfoNV::handleTypes", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-pNext-01443", "If the pNext chain includes a ifdef::VK_VERSION_1_1,VK_KHR_external_memory[VkExternalMemoryImageCreateInfo]", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-pNext-01974", "If the pNext chain includes a VkExternalFormatANDROID structure, and its externalFormat member is non-zero the format must be VK_FORMAT_UNDEFINED", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-pNext-01975", "If the pNext chain does not include a VkExternalFormatANDROID structure, or does and its externalFormat member is 0, the format must not be VK_FORMAT_UNDEFINED", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-pNext-02262", "If the pNext chain includes a VkImageDrmFormatModifierListCreateInfoEXT or VkImageDrmFormatModifierExplicitCreateInfoEXT structure, then tiling must be VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-pNext-02393", "If the pNext chain includes a VkExternalMemoryImageCreateInfo structure whose handleTypes member includes VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, imageType must be VK_IMAGE_TYPE_2D", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-pNext-02394", "If the pNext chain includes a VkExternalMemoryImageCreateInfo structure whose handleTypes member includes VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, mipLevels must either be 1 or equal to the number of levels in the complete mipmap chain based on extent.width, extent.height, and extent.depth", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-pNext-02396", "If the pNext chain includes a VkExternalFormatANDROID structure whose externalFormat member is not 0, flags must not include VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-pNext-02397", "If the pNext chain includes a VkExternalFormatANDROID structure whose externalFormat member is not 0, usage must not include any usages except VK_IMAGE_USAGE_SAMPLED_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-pNext-02398", "If the pNext chain includes a VkExternalFormatANDROID structure whose externalFormat member is not 0, tiling must be VK_IMAGE_TILING_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkDedicatedAllocationImageCreateInfoNV, VkExternalFormatANDROID, VkExternalMemoryImageCreateInfo, VkExternalMemoryImageCreateInfoNV, VkImageDrmFormatModifierExplicitCreateInfoEXT, VkImageDrmFormatModifierListCreateInfoEXT, VkImageFormatListCreateInfo, VkImageStencilUsageCreateInfo, or VkImageSwapchainCreateInfoKHR", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-physicalDeviceCount-01421", "If the logical device was created with VkDeviceGroupDeviceCreateInfo::physicalDeviceCount equal to 1, flags must not contain VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-samples-02083", "If usage includes VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV, samples must be VK_SAMPLE_COUNT_1_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-samples-02257", "If samples is not VK_SAMPLE_COUNT_1_BIT, then imageType must be VK_IMAGE_TYPE_2D, flags must not contain VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, mipLevels must be equal to 1, and imageCreateMaybeLinear (as defined in Image Creation Limits) must be false,", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-samples-02258", "samples must be a bit value that is set in imageCreateSampleCounts (as defined in Image Creation Limits)", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-samples-02558", "If samples is not VK_SAMPLE_COUNT_1_BIT, usage must not contain VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-samples-parameter", "samples must be a valid VkSampleCountFlagBits value", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-sharingMode-00941", "If sharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a valid pointer to an array of queueFamilyIndexCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-sharingMode-00942", "If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-sharingMode-01392", "If sharingMode is VK_SHARING_MODE_CONCURRENT, each element of pQueueFamilyIndices must be unique and must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the physicalDevice that was used to create device", "1.0"},
+ {"VUID-VkImageCreateInfo-sharingMode-01420", "If sharingMode is VK_SHARING_MODE_CONCURRENT, each element of pQueueFamilyIndices must be unique and must be less than pQueueFamilyPropertyCount returned by either vkGetPhysicalDeviceQueueFamilyProperties or vkGetPhysicalDeviceQueueFamilyProperties2 for the physicalDevice that was used to create device", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-sharingMode-parameter", "sharingMode must be a valid VkSharingMode value", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-tiling-02084", "If usage includes VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV, tiling must be VK_IMAGE_TILING_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-tiling-02261", "If tiling is VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then the pNext chain must include exactly one of VkImageDrmFormatModifierListCreateInfoEXT or VkImageDrmFormatModifierExplicitCreateInfoEXT structures", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-tiling-02353", "If tiling is VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT and flags contains VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT, then the pNext chain must include a VkImageFormatListCreateInfo structure with non-zero viewFormatCount", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-tiling-04121", "If tiling is VK_IMAGE_TILING_LINEAR, flags must not contain VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-tiling-parameter", "tiling must be a valid VkImageTiling value", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-usage-00963", "If usage includes VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, then bits other than VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, and VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT must not be set", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-usage-00964", "If usage includes VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, extent.width must be less than or equal to VkPhysicalDeviceLimits::maxFramebufferWidth", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-usage-00965", "If usage includes VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, extent.height must be less than or equal to VkPhysicalDeviceLimits::maxFramebufferHeight", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-usage-00966", "If usage includes VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, usage must also contain at least one of VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-usage-00968", "If the multisampled storage images feature is not enabled, and usage contains VK_IMAGE_USAGE_STORAGE_BIT, samples must be VK_SAMPLE_COUNT_1_BIT", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-usage-02559", "If usage includes VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT, extent.width must be less than or equal to the ceiling of maxFramebufferWidth/minFragmentDensityTexelSize.width", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-usage-02560", "If usage includes VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT, extent.height must be less than or equal to the ceiling of maxFramebufferHeight/minFragmentDensityTexelSize.height", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-usage-parameter", "usage must be a valid combination of VkImageUsageFlagBits values", "1.2-extensions"},
+ {"VUID-VkImageCreateInfo-usage-requiredbitmask", "usage must not be 0", "1.2-extensions"},
+ {"VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-arrayPitch-02268", "For each element of pPlaneLayouts, arrayPitch must be 0 if VkImageCreateInfo::arrayLayers is 1", "1.2-extensions"},
+ {"VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-depthPitch-02269", "For each element of pPlaneLayouts, depthPitch must be 0 if VkImageCreateInfo::extent.depth is 1", "1.2-extensions"},
+ {"VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-drmFormatModifier-02264", "drmFormatModifier must be compatible with the parameters in VkImageCreateInfo and its pNext chain, as determined by querying VkPhysicalDeviceImageFormatInfo2 extended with VkPhysicalDeviceImageDrmFormatModifierInfoEXT", "1.2-extensions"},
+ {"VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-drmFormatModifierPlaneCount-02265", "drmFormatModifierPlaneCount must be equal to the VkDrmFormatModifierPropertiesEXT::drmFormatModifierPlaneCount associated with VkImageCreateInfo::format and drmFormatModifier, as found by querying VkDrmFormatModifierPropertiesListEXT", "1.2-extensions"},
+ {"VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-pPlaneLayouts-parameter", "If drmFormatModifierPlaneCount is not 0, pPlaneLayouts must be a valid pointer to an array of drmFormatModifierPlaneCount VkSubresourceLayout structures", "1.2-extensions"},
+ {"VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkImageDrmFormatModifierExplicitCreateInfoEXT-size-02267", "For each element of pPlaneLayouts, size must be 0", "1.2-extensions"},
+ {"VUID-VkImageDrmFormatModifierListCreateInfoEXT-drmFormatModifierCount-arraylength", "drmFormatModifierCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkImageDrmFormatModifierListCreateInfoEXT-pDrmFormatModifiers-02263", "Each modifier in pDrmFormatModifiers must be compatible with the parameters in VkImageCreateInfo and its pNext chain, as determined by querying VkPhysicalDeviceImageFormatInfo2 extended with VkPhysicalDeviceImageDrmFormatModifierInfoEXT", "1.2-extensions"},
+ {"VUID-VkImageDrmFormatModifierListCreateInfoEXT-pDrmFormatModifiers-parameter", "pDrmFormatModifiers must be a valid pointer to an array of drmFormatModifierCount uint64_t values", "1.2-extensions"},
+ {"VUID-VkImageDrmFormatModifierListCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkImageDrmFormatModifierPropertiesEXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkImageDrmFormatModifierPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT", "1.2-extensions"},
+ {"VUID-VkImageFormatListCreateInfo-pViewFormats-parameter", "If viewFormatCount is not 0, pViewFormats must be a valid pointer to an array of viewFormatCount valid VkFormat values", "1.2-extensions"},
+ {"VUID-VkImageFormatListCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkImageFormatProperties2-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkAndroidHardwareBufferUsageANDROID, VkExternalImageFormatProperties, VkFilterCubicImageViewImageFormatPropertiesEXT, VkSamplerYcbcrConversionImageFormatProperties, or VkTextureLODGatherFormatPropertiesAMD", "1.2-extensions"},
+ {"VUID-VkImageFormatProperties2-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2", "1.2-extensions"},
+ {"VUID-VkImageFormatProperties2-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-image-01199", "If image was created with a sharing mode of VK_SHARING_MODE_CONCURRENT, srcQueueFamilyIndex and dstQueueFamilyIndex must both be VK_QUEUE_FAMILY_IGNORED", "1.0"},
+ {"VUID-VkImageMemoryBarrier-image-01207", "If image has a depth/stencil format with both depth and stencil components, then the aspectMask member of subresourceRange must include both VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT", "1.1"},
+ {"VUID-VkImageMemoryBarrier-image-01381", "If image was created with a sharing mode of VK_SHARING_MODE_CONCURRENT, at least one of srcQueueFamilyIndex and dstQueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-image-01671", "If image has a single-plane color format or is not disjoint, then the aspectMask member of subresourceRange must be VK_IMAGE_ASPECT_COLOR_BIT", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-image-01672", "If image has a multi-planar format and the image is disjoint, then the aspectMask member of subresourceRange must include either at least one of VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT, and VK_IMAGE_ASPECT_PLANE_2_BIT; or must include VK_IMAGE_ASPECT_COLOR_BIT", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-image-01673", "If image has a multi-planar format with only two planes, then the aspectMask member of subresourceRange must not include VK_IMAGE_ASPECT_PLANE_2_BIT", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-image-01932", "If image is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-image-02902", "If image has a color format, then the aspectMask member of subresourceRange must be VK_IMAGE_ASPECT_COLOR_BIT", "1.0"},
+ {"VUID-VkImageMemoryBarrier-image-03319", "If image has a depth/stencil format with both depth and stencil and the separateDepthStencilLayouts feature is enabled, then the aspectMask member of subresourceRange must include either or both VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-image-03320", "If image has a depth/stencil format with both depth and stencil and the separateDepthStencilLayouts feature is not enabled, then the aspectMask member of subresourceRange must include both VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-image-04069", "If image was created with a sharing mode of VK_SHARING_MODE_EXCLUSIVE, and srcQueueFamilyIndex and dstQueueFamilyIndex are not equal, srcQueueFamilyIndex and dstQueueFamilyIndex must be valid queue families", "1.0"},
+ {"VUID-VkImageMemoryBarrier-image-04071", "If image was created with a sharing mode of VK_SHARING_MODE_CONCURRENT, srcQueueFamilyIndex and dstQueueFamilyIndex are not equal, and one of srcQueueFamilyIndex and dstQueueFamilyIndex is a special queue family values reserved for external memory transfers, the other must be VK_QUEUE_FAMILY_IGNORED", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-image-04072", "If image was created with a sharing mode of VK_SHARING_MODE_EXCLUSIVE, and srcQueueFamilyIndex and dstQueueFamilyIndex are not equal, srcQueueFamilyIndex and dstQueueFamilyIndex must both be valid queue families, or one of the special queue family values reserved for external memory transfers, as described in Queue Family Ownership Transfer", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-image-parameter", "image must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-newLayout-01198", "If srcQueueFamilyIndex and dstQueueFamilyIndex define a queue family ownership transfer or oldLayout and newLayout define a image layout transition, newLayout must not be VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-newLayout-parameter", "newLayout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-oldLayout-01197", "If srcQueueFamilyIndex and dstQueueFamilyIndex define a queue family ownership transfer or oldLayout and newLayout define a image layout transition, oldLayout must be VK_IMAGE_LAYOUT_UNDEFINED or the current layout of the image subresources affected by the barrier", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-oldLayout-01208", "If srcQueueFamilyIndex and dstQueueFamilyIndex define a queue family ownership transfer or oldLayout and newLayout define a image layout transition, and oldLayout or newLayout is VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL then image must have been created with VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT set", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-oldLayout-01209", "If srcQueueFamilyIndex and dstQueueFamilyIndex define a queue family ownership transfer or oldLayout and newLayout define a image layout transition, and oldLayout or newLayout is VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL then image must have been created with VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT set", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-oldLayout-01210", "If srcQueueFamilyIndex and dstQueueFamilyIndex define a queue family ownership transfer or oldLayout and newLayout define a image layout transition, and oldLayout or newLayout is VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL then image must have been created with VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT set", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-oldLayout-01211", "If srcQueueFamilyIndex and dstQueueFamilyIndex define a queue family ownership transfer or oldLayout and newLayout define a image layout transition, and oldLayout or newLayout is VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL then image must have been created with VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-oldLayout-01212", "If srcQueueFamilyIndex and dstQueueFamilyIndex define a queue family ownership transfer or oldLayout and newLayout define a image layout transition, and oldLayout or newLayout is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL then image must have been created with VK_IMAGE_USAGE_TRANSFER_SRC_BIT set", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-oldLayout-01213", "If srcQueueFamilyIndex and dstQueueFamilyIndex define a queue family ownership transfer or oldLayout and newLayout define a image layout transition, and oldLayout or newLayout is VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL then image must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT set", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-oldLayout-01658", "If srcQueueFamilyIndex and dstQueueFamilyIndex define a queue family ownership transfer or oldLayout and newLayout define a image layout transition, and oldLayout or newLayout is VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL then image must have been created with VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT set", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-oldLayout-01659", "If srcQueueFamilyIndex and dstQueueFamilyIndex define a queue family ownership transfer or oldLayout and newLayout define a image layout transition, and oldLayout or newLayout is VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL then image must have been created with VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT set", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-oldLayout-02088", "If srcQueueFamilyIndex and dstQueueFamilyIndex define a queue family ownership transfer or oldLayout and newLayout define a image layout transition, and oldLayout or newLayout is VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV then image must have been created with VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV set", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-oldLayout-parameter", "oldLayout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkSampleLocationsInfoEXT", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-srcQueueFamilyIndex-04065", "If srcQueueFamilyIndex and dstQueueFamilyIndex define a queue family ownership transfer or oldLayout and newLayout define a image layout transition, and oldLayout or newLayout is VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR then image must have been created with at least one of VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_USAGE_SAMPLED_BIT, or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-srcQueueFamilyIndex-04066", "If srcQueueFamilyIndex and dstQueueFamilyIndex define a queue family ownership transfer or oldLayout and newLayout define a image layout transition, and oldLayout or newLayout is VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR then image must have been created with VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT set", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-srcQueueFamilyIndex-04067", "If srcQueueFamilyIndex and dstQueueFamilyIndex define a queue family ownership transfer or oldLayout and newLayout define a image layout transition, and oldLayout or newLayout is VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR then image must have been created with at least one of VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_USAGE_SAMPLED_BIT, or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-srcQueueFamilyIndex-04068", "If srcQueueFamilyIndex and dstQueueFamilyIndex define a queue family ownership transfer or oldLayout and newLayout define a image layout transition, and oldLayout or newLayout is VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR then image must have been created with VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT set", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-srcQueueFamilyIndex-04070", "If srcQueueFamilyIndex is not equal to dstQueueFamilyIndex, at least one must not be a special queue family reserved for external memory ownership transfers, as described in Queue Family Ownership Transfer", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-subresourceRange-01486", "subresourceRange.baseMipLevel must be less than the mipLevels specified in VkImageCreateInfo when image was created", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-subresourceRange-01488", "subresourceRange.baseArrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when image was created", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-subresourceRange-01724", "If subresourceRange.levelCount is not VK_REMAINING_MIP_LEVELS, subresourceRange.baseMipLevel + subresourceRange.levelCount must be less than or equal to the mipLevels specified in VkImageCreateInfo when image was created", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-subresourceRange-01725", "If subresourceRange.layerCount is not VK_REMAINING_ARRAY_LAYERS, subresourceRange.baseArrayLayer + subresourceRange.layerCount must be less than or equal to the arrayLayers specified in VkImageCreateInfo when image was created", "1.2-extensions"},
+ {"VUID-VkImageMemoryBarrier-subresourceRange-parameter", "subresourceRange must be a valid VkImageSubresourceRange structure", "1.2-extensions"},
+ {"VUID-VkImageMemoryRequirementsInfo2-image-01589", "If image was created with a multi-planar format and the VK_IMAGE_CREATE_DISJOINT_BIT flag, there must be a VkImagePlaneMemoryRequirementsInfo included in the pNext chain of the VkImageMemoryRequirementsInfo2 structure", "1.2-extensions"},
+ {"VUID-VkImageMemoryRequirementsInfo2-image-01590", "If image was not created with the VK_IMAGE_CREATE_DISJOINT_BIT flag, there must not be a VkImagePlaneMemoryRequirementsInfo included in the pNext chain of the VkImageMemoryRequirementsInfo2 structure", "1.2-extensions"},
+ {"VUID-VkImageMemoryRequirementsInfo2-image-01591", "If image was created with a single-plane format, there must not be a VkImagePlaneMemoryRequirementsInfo included in the pNext chain of the VkImageMemoryRequirementsInfo2 structure", "1.2-khr-extensions"},
+ {"VUID-VkImageMemoryRequirementsInfo2-image-01897", "If image was created with the VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID external memory handle type, then image must be bound to memory", "1.2-extensions"},
+ {"VUID-VkImageMemoryRequirementsInfo2-image-02279", "If image was created with VK_IMAGE_CREATE_DISJOINT_BIT and with VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then there must be a VkImagePlaneMemoryRequirementsInfo included in the pNext chain of the VkImageMemoryRequirementsInfo2 structure", "1.2-extensions"},
+ {"VUID-VkImageMemoryRequirementsInfo2-image-02280", "If image was created with a single-plane format and with any tiling other than VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then there must not be a VkImagePlaneMemoryRequirementsInfo included in the pNext chain of the VkImageMemoryRequirementsInfo2 structure", "1.2-extensions"},
+ {"VUID-VkImageMemoryRequirementsInfo2-image-parameter", "image must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-VkImageMemoryRequirementsInfo2-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkImagePlaneMemoryRequirementsInfo", "1.2-extensions"},
+ {"VUID-VkImageMemoryRequirementsInfo2-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2", "1.2-extensions"},
+ {"VUID-VkImageMemoryRequirementsInfo2-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkImagePipeSurfaceCreateInfoFUCHSIA-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkImagePipeSurfaceCreateInfoFUCHSIA-imagePipeHandle-00000", "imagePipeHandle must be a valid zx_handle_t", "1.2-extensions"},
+ {"VUID-VkImagePipeSurfaceCreateInfoFUCHSIA-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkImagePipeSurfaceCreateInfoFUCHSIA-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGEPIPE_SURFACE_CREATE_INFO_FUCHSIA", "1.2-extensions"},
+ {"VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-02281", "If the image's tiling is VK_IMAGE_TILING_LINEAR or VK_IMAGE_TILING_OPTIMAL, then planeAspect must be a single valid format plane for the image (that is, for a two-plane image planeAspect must be VK_IMAGE_ASPECT_PLANE_0_BIT or VK_IMAGE_ASPECT_PLANE_1_BIT, and for a three-plane image planeAspect must be VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT or VK_IMAGE_ASPECT_PLANE_2_BIT)", "1.2-extensions"},
+ {"VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-02282", "If the image's tiling is VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then planeAspect must be a single valid memory plane for the image (that is, aspectMask must specify a plane index that is less than the VkDrmFormatModifierPropertiesEXT::drmFormatModifierPlaneCount associated with the image's format and VkImageDrmFormatModifierPropertiesEXT::drmFormatModifier)", "1.2-extensions"},
+ {"VUID-VkImagePlaneMemoryRequirementsInfo-planeAspect-parameter", "planeAspect must be a valid VkImageAspectFlagBits value", "1.2-extensions"},
+ {"VUID-VkImagePlaneMemoryRequirementsInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO", "1.2-extensions"},
+ {"VUID-VkImageResolve-aspectMask-00266", "The aspectMask member of srcSubresource and dstSubresource must only contain VK_IMAGE_ASPECT_COLOR_BIT", "1.2-extensions"},
+ {"VUID-VkImageResolve-dstImage-00276", "If the calling command's dstImage is of type VK_IMAGE_TYPE_1D, then dstOffset.y must be 0 and extent.height must be 1", "1.2-extensions"},
+ {"VUID-VkImageResolve-dstImage-00278", "If the calling command's dstImage is of type VK_IMAGE_TYPE_1D or VK_IMAGE_TYPE_2D, then dstOffset.z must be 0 and extent.depth must be 1", "1.2-extensions"},
+ {"VUID-VkImageResolve-dstOffset-00274", "dstOffset.x and (extent.width + dstOffset.x) must both be greater than or equal to 0 and less than or equal to the destination image subresource width", "1.2-extensions"},
+ {"VUID-VkImageResolve-dstOffset-00275", "dstOffset.y and (extent.height + dstOffset.y) must both be greater than or equal to 0 and less than or equal to the destination image subresource height", "1.2-extensions"},
+ {"VUID-VkImageResolve-dstOffset-00277", "dstOffset.z and (extent.depth + dstOffset.z) must both be greater than or equal to 0 and less than or equal to the destination image subresource depth", "1.2-extensions"},
+ {"VUID-VkImageResolve-dstSubresource-parameter", "dstSubresource must be a valid VkImageSubresourceLayers structure", "1.2-extensions"},
+ {"VUID-VkImageResolve-layerCount-00267", "The layerCount member of srcSubresource and dstSubresource must match", "1.2-extensions"},
+ {"VUID-VkImageResolve-srcImage-00268", "If either of the calling command's srcImage or dstImage parameters are of VkImageType VK_IMAGE_TYPE_3D, the baseArrayLayer and layerCount members of both srcSubresource and dstSubresource must be 0 and 1, respectively", "1.2-extensions"},
+ {"VUID-VkImageResolve-srcImage-00271", "If the calling command's srcImage is of type VK_IMAGE_TYPE_1D, then srcOffset.y must be 0 and extent.height must be 1", "1.2-extensions"},
+ {"VUID-VkImageResolve-srcImage-00273", "If the calling command's srcImage is of type VK_IMAGE_TYPE_1D or VK_IMAGE_TYPE_2D, then srcOffset.z must be 0 and extent.depth must be 1", "1.2-extensions"},
+ {"VUID-VkImageResolve-srcOffset-00269", "srcOffset.x and (extent.width + srcOffset.x) must both be greater than or equal to 0 and less than or equal to the source image subresource width", "1.2-extensions"},
+ {"VUID-VkImageResolve-srcOffset-00270", "srcOffset.y and (extent.height + srcOffset.y) must both be greater than or equal to 0 and less than or equal to the source image subresource height", "1.2-extensions"},
+ {"VUID-VkImageResolve-srcOffset-00272", "srcOffset.z and (extent.depth + srcOffset.z) must both be greater than or equal to 0 and less than or equal to the source image subresource depth", "1.2-extensions"},
+ {"VUID-VkImageResolve-srcSubresource-parameter", "srcSubresource must be a valid VkImageSubresourceLayers structure", "1.2-extensions"},
+ {"VUID-VkImageSparseMemoryRequirementsInfo2-image-parameter", "image must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-VkImageSparseMemoryRequirementsInfo2-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkImageSparseMemoryRequirementsInfo2-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2", "1.2-extensions"},
+ {"VUID-VkImageStencilUsageCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkImageStencilUsageCreateInfo-stencilUsage-02539", "If stencilUsage includes VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, it must not include bits other than VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkImageStencilUsageCreateInfo-stencilUsage-parameter", "stencilUsage must be a valid combination of VkImageUsageFlagBits values", "1.2-extensions"},
+ {"VUID-VkImageStencilUsageCreateInfo-stencilUsage-requiredbitmask", "stencilUsage must not be 0", "1.2-extensions"},
+ {"VUID-VkImageSubresource-aspectMask-parameter", "aspectMask must be a valid combination of VkImageAspectFlagBits values", "1.2-extensions"},
+ {"VUID-VkImageSubresource-aspectMask-requiredbitmask", "aspectMask must not be 0", "1.2-extensions"},
+ {"VUID-VkImageSubresourceLayers-aspectMask-00167", "If aspectMask contains VK_IMAGE_ASPECT_COLOR_BIT, it must not contain either of VK_IMAGE_ASPECT_DEPTH_BIT or VK_IMAGE_ASPECT_STENCIL_BIT", "1.2-extensions"},
+ {"VUID-VkImageSubresourceLayers-aspectMask-00168", "aspectMask must not contain VK_IMAGE_ASPECT_METADATA_BIT", "1.2-extensions"},
+ {"VUID-VkImageSubresourceLayers-aspectMask-02247", "aspectMask must not include VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT for any index i", "1.2-extensions"},
+ {"VUID-VkImageSubresourceLayers-aspectMask-parameter", "aspectMask must be a valid combination of VkImageAspectFlagBits values", "1.2-extensions"},
+ {"VUID-VkImageSubresourceLayers-aspectMask-requiredbitmask", "aspectMask must not be 0", "1.2-extensions"},
+ {"VUID-VkImageSubresourceLayers-layerCount-01700", "layerCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkImageSubresourceRange-aspectMask-01670", "If aspectMask includes VK_IMAGE_ASPECT_COLOR_BIT, then it must not include any of VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT, or VK_IMAGE_ASPECT_PLANE_2_BIT", "1.2-extensions"},
+ {"VUID-VkImageSubresourceRange-aspectMask-02278", "aspectMask must not include VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT for any index i", "1.2-extensions"},
+ {"VUID-VkImageSubresourceRange-aspectMask-parameter", "aspectMask must be a valid combination of VkImageAspectFlagBits values", "1.2-extensions"},
+ {"VUID-VkImageSubresourceRange-aspectMask-requiredbitmask", "aspectMask must not be 0", "1.2-extensions"},
+ {"VUID-VkImageSubresourceRange-layerCount-01721", "If layerCount is not VK_REMAINING_ARRAY_LAYERS, it must be greater than 0", "1.2-extensions"},
+ {"VUID-VkImageSubresourceRange-levelCount-01720", "If levelCount is not VK_REMAINING_MIP_LEVELS, it must be greater than 0", "1.2-extensions"},
+ {"VUID-VkImageSwapchainCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkImageSwapchainCreateInfoKHR-swapchain-00995", "If swapchain is not VK_NULL_HANDLE, the fields of VkImageCreateInfo must match the implied image creation parameters of the swapchain", "1.2-extensions"},
+ {"VUID-VkImageSwapchainCreateInfoKHR-swapchain-parameter", "If swapchain is not VK_NULL_HANDLE, swapchain must be a valid VkSwapchainKHR handle", "1.2-extensions"},
+ {"VUID-VkImageViewASTCDecodeModeEXT-decodeMode-02230", "decodeMode must be one of VK_FORMAT_R16G16B16A16_SFLOAT, VK_FORMAT_R8G8B8A8_UNORM, or VK_FORMAT_E5B9G9R9_UFLOAT_PACK32", "1.2-extensions"},
+ {"VUID-VkImageViewASTCDecodeModeEXT-decodeMode-02231", "If the decodeModeSharedExponent feature is not enabled, decodeMode must not be VK_FORMAT_E5B9G9R9_UFLOAT_PACK32", "1.2-extensions"},
+ {"VUID-VkImageViewASTCDecodeModeEXT-decodeMode-02232", "If decodeMode is VK_FORMAT_R8G8B8A8_UNORM the image view must not include blocks using any of the ASTC HDR modes", "1.2-extensions"},
+ {"VUID-VkImageViewASTCDecodeModeEXT-decodeMode-parameter", "decodeMode must be a valid VkFormat value", "1.2-extensions"},
+ {"VUID-VkImageViewASTCDecodeModeEXT-format-04084", "format of the image view must be one of the ASTC Compressed Image Formats", "1.2-extensions"},
+ {"VUID-VkImageViewASTCDecodeModeEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT", "1.2-extensions"},
+ {"VUID-VkImageViewAddressPropertiesNVX-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkImageViewAddressPropertiesNVX-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-None-02273", "The format features of the resultant image view must contain at least one bit", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-components-parameter", "components must be a valid VkComponentMapping structure", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-flags-02572", "If dynamic fragment density map feature is not enabled, flags must not contain VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-flags-03567", "If deferred fragment density map feature is not enabled, flags must not contain VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-flags-03568", "If flags contains VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT, flags must not contain VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-flags-04083", "If flags dose not contain VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT and the pNext chain include a VkImageFormatListCreateInfo structure then VkImageFormatListCreateInfo::viewFormatCount must be 0 or 1", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-flags-04116", "If flags does not contain VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT and image was created with usage containing VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT, its flags must not contain any of VK_IMAGE_CREATE_PROTECTED_BIT, VK_IMAGE_CREATE_SPARSE_BINDING_BIT, VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT, or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-flags-parameter", "flags must be a valid combination of VkImageViewCreateFlagBits values", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-format-parameter", "format must be a valid VkFormat value", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-image-01003", "If image was not created with VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT then viewType must not be VK_IMAGE_VIEW_TYPE_CUBE or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-image-01005", "If image was created with VK_IMAGE_TYPE_3D but without VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT set then viewType must not be VK_IMAGE_VIEW_TYPE_2D or VK_IMAGE_VIEW_TYPE_2D_ARRAY", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-image-01007", "image must have been created with a usage value containing at least one of VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_USAGE_STORAGE_BIT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT", "1.2-khr-extensions"},
+ {"VUID-VkImageViewCreateInfo-image-01018", "If image was created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag, format must be compatible with the format used to create image, as defined in Format Compatibility Classes", "1.0"},
+ {"VUID-VkImageViewCreateInfo-image-01019", "If image was not created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag, format must be identical to the format used to create image", "1.0"},
+ {"VUID-VkImageViewCreateInfo-image-01020", "If image is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-image-01482", "If image is not a 3D image created with VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT set, or viewType is not VK_IMAGE_VIEW_TYPE_2D or VK_IMAGE_VIEW_TYPE_2D_ARRAY, subresourceRange.baseArrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when image was created", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-image-01583", "If image was created with the VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT flag, format must be compatible with, or must be an uncompressed format that is size-compatible with, the format used to create image", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-image-01584", "If image was created with the VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT flag, the levelCount and layerCount members of subresourceRange must both be 1", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-image-01586", "If image was created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag, if the format of the image is a multi-planar format, and if subresourceRange.aspectMask is one of VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT, or VK_IMAGE_ASPECT_PLANE_2_BIT, then format must be compatible with the VkFormat for the plane of the image format indicated by subresourceRange.aspectMask, as defined in Compatible formats of planes of multi-planar formats", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-image-01759", "If image was created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag, but without the VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT flag, format must be compatible with the format used to create image, as defined in Format Compatibility Classes", "default"},
+ {"VUID-VkImageViewCreateInfo-image-01760", "If image was created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag, and if the format of the image is not a multi-planar format, format must be compatible with the format used to create image, as defined in Format Compatibility Classes", "default"},
+ {"VUID-VkImageViewCreateInfo-image-01761", "If image was created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag, but without the VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT flag, and if the format of the image is not a multi-planar format, format must be compatible with the format used to create image, as defined in Format Compatibility Classes", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-image-01762", "If image was not created with the VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT flag, or if the format of the image is a multi-planar format and if subresourceRange.aspectMask is VK_IMAGE_ASPECT_COLOR_BIT, format must be identical to the format used to create image", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-image-02085", "image must have been created with a usage value containing at least one of VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_USAGE_STORAGE_BIT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, or VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV", "default"},
+ {"VUID-VkImageViewCreateInfo-image-02086", "If image was created with usage containing VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV, viewType must be VK_IMAGE_VIEW_TYPE_2D or VK_IMAGE_VIEW_TYPE_2D_ARRAY", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-image-02087", "If image was created with usage containing VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV, format must be VK_FORMAT_R8_UINT", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-image-02399", "If image has an external format, format must be VK_FORMAT_UNDEFINED", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-image-02400", "If image has an external format, the pNext chain must include a VkSamplerYcbcrConversionInfo structure with a conversion object created with the same external format as image", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-image-02401", "If image has an external format, all members of components must be the identity swizzle", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-image-02569", "image must have been created with a usage value containing at least one of VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_USAGE_STORAGE_BIT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, or VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT", "default"},
+ {"VUID-VkImageViewCreateInfo-image-02570", "image must have been created with a usage value containing at least one of VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_USAGE_STORAGE_BIT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV, or VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-image-02571", "If image was created with usage containing VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT, subresourceRange.levelCount must be 1", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-image-02724", "If image is a 3D image created with VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT set, and viewType is VK_IMAGE_VIEW_TYPE_2D or VK_IMAGE_VIEW_TYPE_2D_ARRAY, subresourceRange.baseArrayLayer must be less than the depth computed from baseMipLevel and extent.depth specified in VkImageCreateInfo when image was created, according to the formula defined in Image Miplevel Sizing", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-image-03569", "If image was created with flags containing VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT and usage containing VK_IMAGE_USAGE_SAMPLED_BIT, subresourceRange.layerCount must be less than or equal to VkPhysicalDeviceFragmentDensityMap2PropertiesEXT::maxSubsampledArrayLayers", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-image-parameter", "image must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-pNext-01585", "If a VkImageFormatListCreateInfo structure was included in the pNext chain of the VkImageCreateInfo structure used when creating image and VkImageFormatListCreateInfo::viewFormatCount is not zero then format must be one of the formats in VkImageFormatListCreateInfo::pViewFormats", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-pNext-01970", "If the pNext chain includes a VkSamplerYcbcrConversionInfo structure with a conversion value other than VK_NULL_HANDLE, all members of components must have the identity swizzle", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-pNext-02661", "If the pNext chain includes a VkImageViewUsageCreateInfo structure, its usage member must not include any bits that were not set in the usage member of the VkImageCreateInfo structure used to create image", "1.2-khr-extensions"},
+ {"VUID-VkImageViewCreateInfo-pNext-02662", "If the pNext chain includes a VkImageViewUsageCreateInfo structure, and image was not created with a VkImageStencilUsageCreateInfo structure included in the pNext chain of VkImageCreateInfo, its usage member must not include any bits that were not set in the usage member of the VkImageCreateInfo structure used to create image", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-pNext-02663", "If the pNext chain includes a VkImageViewUsageCreateInfo structure, image was created with a VkImageStencilUsageCreateInfo structure included in the pNext chain of VkImageCreateInfo, and subResourceRange.aspectMask includes VK_IMAGE_ASPECT_STENCIL_BIT, the usage member of the VkImageViewUsageCreateInfo instance must not include any bits that were not set in the usage member of the VkImageStencilUsageCreateInfo structure used to create image", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-pNext-02664", "If the pNext chain includes a VkImageViewUsageCreateInfo structure, image was created with a VkImageStencilUsageCreateInfo structure included in the pNext chain of VkImageCreateInfo, and subResourceRange.aspectMask includes bits other than VK_IMAGE_ASPECT_STENCIL_BIT, the usage member of the VkImageViewUsageCreateInfo structure must not include any bits that were not set in the usage member of the VkImageCreateInfo structure used to create image", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-pNext-04082", "If a VkImageFormatListCreateInfo structure was included in the pNext chain of the VkImageCreateInfo structure used when creating image and VkImageFormatListCreateInfo::viewFormatCount is not zero then all of the formats in VkImageFormatListCreateInfo::pViewFormats must be compatible with the format as described in the compatibility table", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkImageViewASTCDecodeModeEXT, VkImageViewUsageCreateInfo, or VkSamplerYcbcrConversionInfo", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-subResourceRange-01021", "subresourceRange and viewType must be compatible with the image, as described in the compatibility table", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-subresourceRange-01478", "subresourceRange.baseMipLevel must be less than the mipLevels specified in VkImageCreateInfo when image was created", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-subresourceRange-01480", "subresourceRange.baseArrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when image was created", "1.0"},
+ {"VUID-VkImageViewCreateInfo-subresourceRange-01483", "If subresourceRange.layerCount is not VK_REMAINING_ARRAY_LAYERS, image is not a 3D image created with VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT set, or viewType is not VK_IMAGE_VIEW_TYPE_2D or VK_IMAGE_VIEW_TYPE_2D_ARRAY, subresourceRange.layerCount must be non-zero and subresourceRange.baseArrayLayer + subresourceRange.layerCount must be less than or equal to the arrayLayers specified in VkImageCreateInfo when image was created", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-subresourceRange-01718", "If subresourceRange.levelCount is not VK_REMAINING_MIP_LEVELS, subresourceRange.baseMipLevel + subresourceRange.levelCount must be less than or equal to the mipLevels specified in VkImageCreateInfo when image was created", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-subresourceRange-01719", "If subresourceRange.layerCount is not VK_REMAINING_ARRAY_LAYERS, subresourceRange.baseArrayLayer + subresourceRange.layerCount must be less than or equal to the arrayLayers specified in VkImageCreateInfo when image was created", "1.0"},
+ {"VUID-VkImageViewCreateInfo-subresourceRange-02725", "If subresourceRange.layerCount is not VK_REMAINING_ARRAY_LAYERS, image is a 3D image created with VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT set, and viewType is VK_IMAGE_VIEW_TYPE_2D or VK_IMAGE_VIEW_TYPE_2D_ARRAY, subresourceRange.layerCount must be non-zero and subresourceRange.baseArrayLayer + subresourceRange.layerCount must be less than or equal to the depth computed from baseMipLevel and extent.depth specified in VkImageCreateInfo when image was created, according to the formula defined in Image Miplevel Sizing", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-subresourceRange-parameter", "subresourceRange must be a valid VkImageSubresourceRange structure", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-usage-02274", "If usage contains VK_IMAGE_USAGE_SAMPLED_BIT, then the format features of the resultant image view must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-usage-02275", "If usage contains VK_IMAGE_USAGE_STORAGE_BIT, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-usage-02276", "If usage contains VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, then the image view's format features must contain VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-usage-02277", "If usage contains VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, then the image view's format features must contain VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-usage-02652", "If usage contains VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, then the image view's format features must contain at least one of VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT or VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-viewType-01004", "If the image cubemap arrays feature is not enabled, viewType must not be VK_IMAGE_VIEW_TYPE_CUBE_ARRAY", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-viewType-02960", "If viewType is VK_IMAGE_VIEW_TYPE_CUBE and subresourceRange.layerCount is not VK_REMAINING_ARRAY_LAYERS, subresourceRange.layerCount must be 6", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-viewType-02961", "If viewType is VK_IMAGE_VIEW_TYPE_CUBE_ARRAY and subresourceRange.layerCount is not VK_REMAINING_ARRAY_LAYERS, subresourceRange.layerCount must be a multiple of 6", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-viewType-02962", "If viewType is VK_IMAGE_VIEW_TYPE_CUBE and subresourceRange.layerCount is VK_REMAINING_ARRAY_LAYERS, the remaining number of layers must be 6", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-viewType-02963", "If viewType is VK_IMAGE_VIEW_TYPE_CUBE_ARRAY and subresourceRange.layerCount is VK_REMAINING_ARRAY_LAYERS, the remaining number of layers must be a multiple of 6", "1.2-extensions"},
+ {"VUID-VkImageViewCreateInfo-viewType-parameter", "viewType must be a valid VkImageViewType value", "1.2-extensions"},
+ {"VUID-VkImageViewHandleInfoNVX-commonparent", "Both of imageView, and sampler that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkImageViewHandleInfoNVX-descriptorType-02654", "descriptorType must be VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER", "1.2-extensions"},
+ {"VUID-VkImageViewHandleInfoNVX-descriptorType-parameter", "descriptorType must be a valid VkDescriptorType value", "1.2-extensions"},
+ {"VUID-VkImageViewHandleInfoNVX-imageView-02656", "If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, the image that imageView was created from must have been created with the VK_IMAGE_USAGE_SAMPLED_BIT usage bit set", "1.2-extensions"},
+ {"VUID-VkImageViewHandleInfoNVX-imageView-02657", "If descriptorType is VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, the image that imageView was created from must have been created with the VK_IMAGE_USAGE_STORAGE_BIT usage bit set", "1.2-extensions"},
+ {"VUID-VkImageViewHandleInfoNVX-imageView-parameter", "imageView must be a valid VkImageView handle", "1.2-extensions"},
+ {"VUID-VkImageViewHandleInfoNVX-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkImageViewHandleInfoNVX-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_VIEW_HANDLE_INFO_NVX", "1.2-extensions"},
+ {"VUID-VkImageViewHandleInfoNVX-sampler-02655", "sampler must be a valid VkSampler if descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER", "1.2-extensions"},
+ {"VUID-VkImageViewHandleInfoNVX-sampler-parameter", "If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle", "1.2-extensions"},
+ {"VUID-VkImageViewUsageCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkImageViewUsageCreateInfo-usage-parameter", "usage must be a valid combination of VkImageUsageFlagBits values", "1.2-extensions"},
+ {"VUID-VkImageViewUsageCreateInfo-usage-requiredbitmask", "usage must not be 0", "1.2-extensions"},
+ {"VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01880", "If buffer is not NULL, Android hardware buffers must be supported for import, as reported by VkExternalImageFormatProperties or VkExternalBufferProperties", "1.2-extensions"},
+ {"VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01881", "If buffer is not NULL, it must be a valid Android hardware buffer object with AHardwareBuffer_Desc::usage compatible with Vulkan as described in Android Hardware Buffers", "1.2-extensions"},
+ {"VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-parameter", "buffer must be a valid pointer to an AHardwareBuffer value", "1.2-extensions"},
+ {"VUID-VkImportAndroidHardwareBufferInfoANDROID-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID", "1.2-extensions"},
+ {"VUID-VkImportFenceFdInfoKHR-fd-01541", "fd must obey any requirements listed for handleType in external fence handle types compatibility", "1.2-extensions"},
+ {"VUID-VkImportFenceFdInfoKHR-fence-parameter", "fence must be a valid VkFence handle", "1.2-extensions"},
+ {"VUID-VkImportFenceFdInfoKHR-flags-parameter", "flags must be a valid combination of VkFenceImportFlagBits values", "1.2-extensions"},
+ {"VUID-VkImportFenceFdInfoKHR-handleType-01464", "handleType must be a value included in the Handle Types Supported by VkImportFenceFdInfoKHR table", "1.2-extensions"},
+ {"VUID-VkImportFenceFdInfoKHR-handleType-parameter", "handleType must be a valid VkExternalFenceHandleTypeFlagBits value", "1.2-extensions"},
+ {"VUID-VkImportFenceFdInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkImportFenceFdInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkImportFenceWin32HandleInfoKHR-fence-parameter", "fence must be a valid VkFence handle", "1.2-extensions"},
+ {"VUID-VkImportFenceWin32HandleInfoKHR-flags-parameter", "flags must be a valid combination of VkFenceImportFlagBits values", "1.2-extensions"},
+ {"VUID-VkImportFenceWin32HandleInfoKHR-handle-01462", "If handle is not NULL, name must be NULL", "1.2-extensions"},
+ {"VUID-VkImportFenceWin32HandleInfoKHR-handle-01539", "If handle is not NULL, it must obey any requirements listed for handleType in external fence handle types compatibility", "1.2-extensions"},
+ {"VUID-VkImportFenceWin32HandleInfoKHR-handleType-01457", "handleType must be a value included in the Handle Types Supported by VkImportFenceWin32HandleInfoKHR table", "1.2-extensions"},
+ {"VUID-VkImportFenceWin32HandleInfoKHR-handleType-01459", "If handleType is not VK_EXTERNAL_FENCE_HANDLE_TYPE_OPAQUE_WIN32_BIT, name must be NULL", "1.2-extensions"},
+ {"VUID-VkImportFenceWin32HandleInfoKHR-handleType-01460", "If handleType is not 0 and handle is NULL, name must name a valid synchronization primitive of the type specified by handleType", "1.2-extensions"},
+ {"VUID-VkImportFenceWin32HandleInfoKHR-handleType-01461", "If handleType is not 0 and name is NULL, handle must be a valid handle of the type specified by handleType", "1.2-extensions"},
+ {"VUID-VkImportFenceWin32HandleInfoKHR-handleType-parameter", "If handleType is not 0, handleType must be a valid VkExternalFenceHandleTypeFlagBits value", "1.2-extensions"},
+ {"VUID-VkImportFenceWin32HandleInfoKHR-name-01540", "If name is not NULL, it must obey any requirements listed for handleType in external fence handle types compatibility", "1.2-extensions"},
+ {"VUID-VkImportFenceWin32HandleInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkImportFenceWin32HandleInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkImportMemoryFdInfoKHR-fd-00668", "The memory from which fd was exported must have been created on the same underlying physical device as device", "1.2-extensions"},
+ {"VUID-VkImportMemoryFdInfoKHR-fd-01520", "fd must obey any requirements listed for handleType in external memory handle types compatibility", "1.2-extensions"},
+ {"VUID-VkImportMemoryFdInfoKHR-fd-01746", "The memory represented by fd must have been created from a physical device and driver that is compatible with device and handleType, as described in External memory handle types compatibility", "1.2-extensions"},
+ {"VUID-VkImportMemoryFdInfoKHR-handleType-00667", "If handleType is not 0, it must be supported for import, as reported by VkExternalImageFormatProperties or VkExternalBufferProperties", "1.2-extensions"},
+ {"VUID-VkImportMemoryFdInfoKHR-handleType-00669", "If handleType is not 0, it must be defined as a POSIX file descriptor handle", "1.2-extensions"},
+ {"VUID-VkImportMemoryFdInfoKHR-handleType-00670", "If handleType is not 0, fd must be a valid handle of the type specified by handleType", "1.2-extensions"},
+ {"VUID-VkImportMemoryFdInfoKHR-handleType-parameter", "If handleType is not 0, handleType must be a valid VkExternalMemoryHandleTypeFlagBits value", "1.2-extensions"},
+ {"VUID-VkImportMemoryFdInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkImportMemoryHostPointerInfoEXT-handleType-01747", "If handleType is not 0, it must be supported for import, as reported in VkExternalMemoryProperties", "1.2-extensions"},
+ {"VUID-VkImportMemoryHostPointerInfoEXT-handleType-01748", "If handleType is not 0, it must be VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT or VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT", "1.2-extensions"},
+ {"VUID-VkImportMemoryHostPointerInfoEXT-handleType-01750", "If handleType is VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT, pHostPointer must be a pointer to allocationSize number of bytes of host memory, where allocationSize is the member of the VkMemoryAllocateInfo structure this structure is chained to", "1.2-extensions"},
+ {"VUID-VkImportMemoryHostPointerInfoEXT-handleType-01751", "If handleType is VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT, pHostPointer must be a pointer to allocationSize number of bytes of host mapped foreign memory, where allocationSize is the member of the VkMemoryAllocateInfo structure this structure is chained to", "1.2-extensions"},
+ {"VUID-VkImportMemoryHostPointerInfoEXT-handleType-parameter", "handleType must be a valid VkExternalMemoryHandleTypeFlagBits value", "1.2-extensions"},
+ {"VUID-VkImportMemoryHostPointerInfoEXT-pHostPointer-01749", "pHostPointer must be a pointer aligned to an integer multiple of VkPhysicalDeviceExternalMemoryHostPropertiesEXT::minImportedHostPointerAlignment", "1.2-extensions"},
+ {"VUID-VkImportMemoryHostPointerInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkImportMemoryWin32HandleInfoKHR-handle-00659", "The memory from which handle was exported, or the memory named by name must have been created on the same underlying physical device as device", "1.2-extensions"},
+ {"VUID-VkImportMemoryWin32HandleInfoKHR-handle-01441", "if handle is not NULL, name must be NULL", "1.2-extensions"},
+ {"VUID-VkImportMemoryWin32HandleInfoKHR-handle-01518", "If handle is not NULL, it must obey any requirements listed for handleType in external memory handle types compatibility", "1.2-extensions"},
+ {"VUID-VkImportMemoryWin32HandleInfoKHR-handleType-00658", "If handleType is not 0, it must be supported for import, as reported by VkExternalImageFormatProperties or VkExternalBufferProperties", "1.2-extensions"},
+ {"VUID-VkImportMemoryWin32HandleInfoKHR-handleType-00660", "If handleType is not 0, it must be defined as an NT handle or a global share handle", "1.2-extensions"},
+ {"VUID-VkImportMemoryWin32HandleInfoKHR-handleType-00661", "If handleType is not 0 and name is NULL, handle must be a valid handle of the type specified by handleType", "1.2-extensions"},
+ {"VUID-VkImportMemoryWin32HandleInfoKHR-handleType-01439", "If handleType is not VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT, or VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT, name must be NULL", "1.2-extensions"},
+ {"VUID-VkImportMemoryWin32HandleInfoKHR-handleType-01440", "If handleType is not 0 and handle is NULL, name must name a valid memory resource of the type specified by handleType", "1.2-extensions"},
+ {"VUID-VkImportMemoryWin32HandleInfoKHR-handleType-parameter", "If handleType is not 0, handleType must be a valid VkExternalMemoryHandleTypeFlagBits value", "1.2-extensions"},
+ {"VUID-VkImportMemoryWin32HandleInfoKHR-name-01519", "If name is not NULL, it must obey any requirements listed for handleType in external memory handle types compatibility", "1.2-extensions"},
+ {"VUID-VkImportMemoryWin32HandleInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkImportMemoryWin32HandleInfoNV-handle-01328", "handle must be a valid handle to memory, obtained as specified by handleType", "1.2-extensions"},
+ {"VUID-VkImportMemoryWin32HandleInfoNV-handleType-01327", "handleType must not have more than one bit set", "1.2-extensions"},
+ {"VUID-VkImportMemoryWin32HandleInfoNV-handleType-parameter", "handleType must be a valid combination of VkExternalMemoryHandleTypeFlagBitsNV values", "1.2-extensions"},
+ {"VUID-VkImportMemoryWin32HandleInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreFdInfoKHR-fd-01544", "fd must obey any requirements listed for handleType in external semaphore handle types compatibility", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreFdInfoKHR-flags-03323", "If flags contains VK_SEMAPHORE_IMPORT_TEMPORARY_BIT, the VkSemaphoreTypeCreateInfo::semaphoreType field of the semaphore from which fd was exported must not be VK_SEMAPHORE_TYPE_TIMELINE", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreFdInfoKHR-flags-parameter", "flags must be a valid combination of VkSemaphoreImportFlagBits values", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreFdInfoKHR-handleType-01143", "handleType must be a value included in the Handle Types Supported by VkImportSemaphoreFdInfoKHR table", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreFdInfoKHR-handleType-03263", "If handleType is VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT, the VkSemaphoreCreateInfo::flags field must match that of the semaphore from which fd was exported", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreFdInfoKHR-handleType-03264", "If handleType is VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT, the VkSemaphoreTypeCreateInfo::semaphoreType field must match that of the semaphore from which fd was exported", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreFdInfoKHR-handleType-parameter", "handleType must be a valid VkExternalSemaphoreHandleTypeFlagBits value", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreFdInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreFdInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreFdInfoKHR-semaphore-parameter", "semaphore must be a valid VkSemaphore handle", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreWin32HandleInfoKHR-flags-03322", "If flags contains VK_SEMAPHORE_IMPORT_TEMPORARY_BIT, the VkSemaphoreTypeCreateInfo::semaphoreType field of the semaphore from which handle or name was exported must not be VK_SEMAPHORE_TYPE_TIMELINE", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreWin32HandleInfoKHR-flags-parameter", "flags must be a valid combination of VkSemaphoreImportFlagBits values", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handle-01469", "If handle is not NULL, name must be NULL", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handle-01542", "If handle is not NULL, it must obey any requirements listed for handleType in external semaphore handle types compatibility", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01140", "handleType must be a value included in the Handle Types Supported by VkImportSemaphoreWin32HandleInfoKHR table", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01466", "If handleType is not VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT or VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_D3D12_FENCE_BIT, name must be NULL", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01467", "If handleType is not 0 and handle is NULL, name must name a valid synchronization primitive of the type specified by handleType", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-01468", "If handleType is not 0 and name is NULL, handle must be a valid handle of the type specified by handleType", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-03261", "If handleType is VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT or VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT, the VkSemaphoreCreateInfo::flags field must match that of the semaphore from which handle or name was exported", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-03262", "If handleType is VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT or VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT, the VkSemaphoreTypeCreateInfo::semaphoreType field must match that of the semaphore from which handle or name was exported", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreWin32HandleInfoKHR-handleType-parameter", "If handleType is not 0, handleType must be a valid VkExternalSemaphoreHandleTypeFlagBits value", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreWin32HandleInfoKHR-name-01543", "If name is not NULL, it must obey any requirements listed for handleType in external semaphore handle types compatibility", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreWin32HandleInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreWin32HandleInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkImportSemaphoreWin32HandleInfoKHR-semaphore-parameter", "semaphore must be a valid VkSemaphore handle", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutCreateInfoNV-flags-parameter", "flags must be a valid combination of VkIndirectCommandsLayoutUsageFlagBitsNV values", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutCreateInfoNV-flags-requiredbitmask", "flags must not be 0", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutCreateInfoNV-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutCreateInfoNV-pStreamStrides-02937", "each element of pStreamStrides must be greater than `0`and less than or equal to VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectCommandsStreamStride. Furthermore the alignment of each token input must be ensured", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutCreateInfoNV-pStreamStrides-parameter", "pStreamStrides must be a valid pointer to an array of streamCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02932", "If pTokens contains an entry of VK_INDIRECT_COMMANDS_TOKEN_TYPE_SHADER_GROUP_NV it must be the first element of the array and there must be only a single element of such token type", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02933", "If pTokens contains an entry of VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV there must be only a single element of such token type", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02934", "All state tokens in pTokens must occur prior work provoking tokens (VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NV, VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV, VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV)", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-02935", "The content of pTokens must include one single work provoking token that is compatible with the pipelineBindPoint", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutCreateInfoNV-pTokens-parameter", "pTokens must be a valid pointer to an array of tokenCount valid VkIndirectCommandsLayoutTokenNV structures", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutCreateInfoNV-pipelineBindPoint-02930", "The pipelineBindPoint must be VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutCreateInfoNV-pipelineBindPoint-parameter", "pipelineBindPoint must be a valid VkPipelineBindPoint value", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutCreateInfoNV-streamCount-02936", "streamCount must be greater than 0 and less or equal to VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectCommandsStreamCount", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutCreateInfoNV-streamCount-arraylength", "streamCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutCreateInfoNV-tokenCount-02931", "tokenCount must be greater than 0 and less than or equal to VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectCommandsTokenCount", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutCreateInfoNV-tokenCount-arraylength", "tokenCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutTokenNV-indirectStateFlags-parameter", "indirectStateFlags must be a valid combination of VkIndirectStateFlagBitsNV values", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutTokenNV-offset-02952", "offset must be less than or equal to VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::maxIndirectCommandsTokenOffset", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutTokenNV-pIndexTypeValues-parameter", "If indexTypeCount is not 0, pIndexTypeValues must be a valid pointer to an array of indexTypeCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutTokenNV-pIndexTypes-parameter", "If indexTypeCount is not 0, pIndexTypes must be a valid pointer to an array of indexTypeCount valid VkIndexType values", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutTokenNV-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutTokenNV-pushconstantPipelineLayout-parameter", "If pushconstantPipelineLayout is not VK_NULL_HANDLE, pushconstantPipelineLayout must be a valid VkPipelineLayout handle", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutTokenNV-pushconstantShaderStageFlags-parameter", "pushconstantShaderStageFlags must be a valid combination of VkShaderStageFlagBits values", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutTokenNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_TOKEN_NV", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutTokenNV-stream-02951", "stream must be smaller than VkIndirectCommandsLayoutCreateInfoNV::streamCount", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02976", "If tokenType is VK_INDIRECT_COMMANDS_TOKEN_TYPE_VERTEX_BUFFER_NV, vertexBindingUnit must stay within device supported limits for the appropriate commands", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02977", "If tokenType is VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, pushconstantPipelineLayout must be valid", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02978", "If tokenType is VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, pushconstantOffset must be a multiple of 4", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02979", "If tokenType is VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, pushconstantSize must be a multiple of 4", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02980", "If tokenType is VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, pushconstantOffset must be less than VkPhysicalDeviceLimits::maxPushConstantsSize", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02981", "If tokenType is VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, pushconstantSize must be less than or equal to VkPhysicalDeviceLimits::maxPushConstantsSize minus pushconstantOffset", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02982", "If tokenType is VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, for each byte in the range specified by pushconstantOffset and pushconstantSize and for each shader stage in pushconstantShaderStageFlags, there must be a push constant range in pushconstantPipelineLayout that includes that byte and that stage", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02983", "If tokenType is VK_INDIRECT_COMMANDS_TOKEN_TYPE_PUSH_CONSTANT_NV, for each byte in the range specified by pushconstantOffset and pushconstantSize and for each push constant range that overlaps that byte, pushconstantShaderStageFlags must include all stages in that push constant range's VkPushConstantRange::pushconstantShaderStageFlags", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutTokenNV-tokenType-02984", "If tokenType is VK_INDIRECT_COMMANDS_TOKEN_TYPE_STATE_FLAGS_NV, indirectStateFlags must not be '0'", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsLayoutTokenNV-tokenType-parameter", "tokenType must be a valid VkIndirectCommandsTokenTypeNV value", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsStreamNV-buffer-02942", "The buffer's usage flag must have the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsStreamNV-buffer-02975", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsStreamNV-buffer-parameter", "buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-VkIndirectCommandsStreamNV-offset-02943", "The offset must be aligned to VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV::minIndirectCommandsBufferOffsetAlignment", "1.2-extensions"},
+ {"VUID-VkInitializePerformanceApiInfoINTEL-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkInitializePerformanceApiInfoINTEL-sType-sType", "sType must be VK_STRUCTURE_TYPE_INITIALIZE_PERFORMANCE_API_INFO_INTEL", "1.2-extensions"},
+ {"VUID-VkInputAttachmentAspectReference-aspectMask-01964", "aspectMask must not include VK_IMAGE_ASPECT_METADATA_BIT", "1.2-extensions"},
+ {"VUID-VkInputAttachmentAspectReference-aspectMask-02250", "aspectMask must not include VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT for any index i", "1.2-extensions"},
+ {"VUID-VkInputAttachmentAspectReference-aspectMask-parameter", "aspectMask must be a valid combination of VkImageAspectFlagBits values", "1.2-extensions"},
+ {"VUID-VkInputAttachmentAspectReference-aspectMask-requiredbitmask", "aspectMask must not be 0", "1.2-extensions"},
+ {"VUID-VkInstanceCreateInfo-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkInstanceCreateInfo-pApplicationInfo-parameter", "If pApplicationInfo is not NULL, pApplicationInfo must be a valid pointer to a valid VkApplicationInfo structure", "1.2-extensions"},
+ {"VUID-VkInstanceCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkDebugReportCallbackCreateInfoEXT, VkDebugUtilsMessengerCreateInfoEXT, VkValidationFeaturesEXT, or VkValidationFlagsEXT", "1.2-extensions"},
+ {"VUID-VkInstanceCreateInfo-ppEnabledExtensionNames-parameter", "If enabledExtensionCount is not 0, ppEnabledExtensionNames must be a valid pointer to an array of enabledExtensionCount null-terminated UTF-8 strings", "1.2-extensions"},
+ {"VUID-VkInstanceCreateInfo-ppEnabledLayerNames-parameter", "If enabledLayerCount is not 0, ppEnabledLayerNames must be a valid pointer to an array of enabledLayerCount null-terminated UTF-8 strings", "1.2-extensions"},
+ {"VUID-VkInstanceCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkInstanceCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkMacOSSurfaceCreateInfoMVK-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkMacOSSurfaceCreateInfoMVK-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkMacOSSurfaceCreateInfoMVK-pView-01317", "pView must be a valid NSView and must be backed by a CALayer instance of type CAMetalLayer", "1.2-extensions"},
+ {"VUID-VkMacOSSurfaceCreateInfoMVK-sType-sType", "sType must be VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK", "1.2-extensions"},
+ {"VUID-VkMappedMemoryRange-memory-00684", "memory must be currently host mapped", "1.2-extensions"},
+ {"VUID-VkMappedMemoryRange-memory-parameter", "memory must be a valid VkDeviceMemory handle", "1.2-extensions"},
+ {"VUID-VkMappedMemoryRange-offset-00687", "offset must be a multiple of VkPhysicalDeviceLimits::nonCoherentAtomSize", "1.2-extensions"},
+ {"VUID-VkMappedMemoryRange-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkMappedMemoryRange-sType-sType", "sType must be VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE", "1.2-extensions"},
+ {"VUID-VkMappedMemoryRange-size-00685", "If size is not equal to VK_WHOLE_SIZE, offset and size must specify a range contained within the currently mapped range of memory", "1.2-extensions"},
+ {"VUID-VkMappedMemoryRange-size-00686", "If size is equal to VK_WHOLE_SIZE, offset must be within the currently mapped range of memory", "1.2-extensions"},
+ {"VUID-VkMappedMemoryRange-size-01389", "If size is equal to VK_WHOLE_SIZE, the end of the current mapping of memory must be a multiple of VkPhysicalDeviceLimits::nonCoherentAtomSize bytes from the beginning of the memory object", "1.2-extensions"},
+ {"VUID-VkMappedMemoryRange-size-01390", "If size is not equal to VK_WHOLE_SIZE, size must either be a multiple of VkPhysicalDeviceLimits::nonCoherentAtomSize, or offset plus size must equal the size of memory", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateFlagsInfo-deviceMask-00675", "If VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT is set, deviceMask must be a valid device mask", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateFlagsInfo-deviceMask-00676", "If VK_MEMORY_ALLOCATE_DEVICE_MASK_BIT is set, deviceMask must not be zero", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateFlagsInfo-flags-parameter", "flags must be a valid combination of VkMemoryAllocateFlagBits values", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateFlagsInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-None-00643", "If the parameters define an import operation and the external handle specified was created by the Vulkan API, the device mask specified by VkMemoryAllocateFlagsInfo must match that specified when the memory object being imported was allocated", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-None-00644", "If the parameters define an import operation and the external handle specified was created by the Vulkan API, the list of physical devices that comprise the logical device passed to vkAllocateMemory must match the list of physical devices that comprise the logical device on which the memory was originally allocated", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-allocationSize-00638", "allocationSize must be greater than 0", "1.2-khr-extensions"},
+ {"VUID-VkMemoryAllocateInfo-allocationSize-00647", "If the parameters define an import operation and the external handle type is VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT, allocationSize must match the size specified when creating the Direct3D 12 heap from which the external handle was extracted", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-allocationSize-01742", "If the parameters define an import operation, the external handle specified was created by the Vulkan API, and the external handle type is VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR, then the values of allocationSize and memoryTypeIndex must match those specified when the memory object being imported was created", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-allocationSize-01743", "If the parameters define an import operation, the external handle was created by the Vulkan API, and the external handle type is VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR or VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT_KHR, then the values of allocationSize and memoryTypeIndex must match those specified when the memory object being imported was created", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-allocationSize-01745", "If the parameters define an import operation and the external handle is a host pointer, allocationSize must be an integer multiple of VkPhysicalDeviceExternalMemoryHostPropertiesEXT::minImportedHostPointerAlignment", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-allocationSize-02383", "If the parameters define an import operation and the external handle type is VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, allocationSize must be the size returned by vkGetAndroidHardwareBufferPropertiesANDROID for the Android hardware buffer", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-flags-03330", "If VkMemoryAllocateFlagsInfo::flags includes VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT, the bufferDeviceAddressCaptureReplay feature must be enabled", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-flags-03331", "If VkMemoryAllocateFlagsInfo::flags includes VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT, the bufferDeviceAddress feature must be enabled", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-memoryTypeIndex-00645", "If the parameters define an import operation and the external handle is an NT handle or a global share handle created outside of the Vulkan API, the value of memoryTypeIndex must be one of those returned by vkGetMemoryWin32HandlePropertiesKHR", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-memoryTypeIndex-00648", "If the parameters define an import operation and the external handle is a POSIX file descriptor created outside of the Vulkan API, the value of memoryTypeIndex must be one of those returned by vkGetMemoryFdPropertiesKHR", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-memoryTypeIndex-01744", "If the parameters define an import operation and the external handle is a host pointer, the value of memoryTypeIndex must be one of those returned by vkGetMemoryHostPointerPropertiesEXT", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-memoryTypeIndex-01872", "If the protected memory feature is not enabled, the VkMemoryAllocateInfo::memoryTypeIndex must not indicate a memory type that reports VK_MEMORY_PROPERTY_PROTECTED_BIT", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-memoryTypeIndex-02385", "If the parameters define an import operation and the external handle type is VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, memoryTypeIndex must be one of those returned by vkGetAndroidHardwareBufferPropertiesANDROID for the Android hardware buffer", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-opaqueCaptureAddress-03329", "If VkMemoryOpaqueCaptureAddressAllocateInfo::opaqueCaptureAddress is not zero, VkMemoryAllocateFlagsInfo::flags must include VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-opaqueCaptureAddress-03333", "If the parameters define an import operation, VkMemoryOpaqueCaptureAddressAllocateInfo::opaqueCaptureAddress must be zero", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-pNext-00639", "If the pNext chain includes a VkExportMemoryAllocateInfo structure, and any of the handle types specified in VkExportMemoryAllocateInfo::handleTypes require a dedicated allocation, as reported by vkGetPhysicalDeviceImageFormatProperties2 in VkExternalImageFormatProperties::externalMemoryProperties.externalMemoryFeatures or VkExternalBufferProperties::externalMemoryProperties.externalMemoryFeatures, the pNext chain must include a ifdef::VK_KHR_dedicated_allocation[VkMemoryDedicatedAllocateInfo]", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-pNext-00640", "If the pNext chain includes a VkExportMemoryAllocateInfo structure, it must not include a VkExportMemoryAllocateInfoNV or VkExportMemoryWin32HandleInfoNV structure", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-pNext-00641", "If the pNext chain includes a VkImportMemoryWin32HandleInfoKHR structure, it must not include a VkImportMemoryWin32HandleInfoNV structure", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-pNext-01874", "If the parameters do not define an import operation, and the pNext chain includes a VkExportMemoryAllocateInfo structure with VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID included in its handleTypes member, and the pNext chain includes a VkMemoryDedicatedAllocateInfo structure with image not equal to VK_NULL_HANDLE, then allocationSize must be 0, otherwise allocationSize must be greater than 0", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-pNext-02384", "If the parameters define an import operation and the external handle type is VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID, and the pNext chain does not include a VkMemoryDedicatedAllocateInfo structure or VkMemoryDedicatedAllocateInfo::image is VK_NULL_HANDLE, the Android hardware buffer must have a AHardwareBuffer_Desc::format of AHARDWAREBUFFER_FORMAT_BLOB and a AHardwareBuffer_Desc::usage that includes AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-pNext-02386", "If the parameters define an import operation, the external handle is an Android hardware buffer, and the pNext chain includes a VkMemoryDedicatedAllocateInfo with image that is not VK_NULL_HANDLE, the Android hardware buffer's AHardwareBuffer::usage must include at least one of AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER or AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-pNext-02387", "If the parameters define an import operation, the external handle is an Android hardware buffer, and the pNext chain includes a VkMemoryDedicatedAllocateInfo with image that is not VK_NULL_HANDLE, the format of image must be VK_FORMAT_UNDEFINED or the format returned by vkGetAndroidHardwareBufferPropertiesANDROID in VkAndroidHardwareBufferFormatPropertiesANDROID::format for the Android hardware buffer", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-pNext-02388", "If the parameters define an import operation, the external handle is an Android hardware buffer, and the pNext chain includes a VkMemoryDedicatedAllocateInfo structure with image that is not VK_NULL_HANDLE, the width, height, and array layer dimensions of image and the Android hardware buffer's AHardwareBuffer_Desc must be identical", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-pNext-02389", "If the parameters define an import operation, the external handle is an Android hardware buffer, and the pNext chain includes a VkMemoryDedicatedAllocateInfo structure with image that is not VK_NULL_HANDLE, and the Android hardware buffer's AHardwareBuffer::usage includes AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE, the image must have a complete mipmap chain", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-pNext-02390", "If the parameters define an import operation, the external handle is an Android hardware buffer, and the pNext chain includes a VkMemoryDedicatedAllocateInfo structure with image that is not VK_NULL_HANDLE, each bit set in the usage of image must be listed in AHardwareBuffer Usage Equivalence, and if there is a corresponding AHARDWAREBUFFER_USAGE bit listed that bit must be included in the Android hardware buffer's AHardwareBuffer_Desc::usage", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-pNext-02586", "If the parameters define an import operation, the external handle is an Android hardware buffer, and the pNext chain includes a VkMemoryDedicatedAllocateInfo structure with image that is not VK_NULL_HANDLE, and the Android hardware buffer's AHardwareBuffer::usage does not include AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE, the image must have exactly one mipmap level", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-pNext-02805", "If the parameters define an import operation and the external handle is a host pointer, the pNext chain must not include a VkDedicatedAllocationMemoryAllocateInfoNV structure with either its image or buffer field set to a value other than VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-pNext-02806", "If the parameters define an import operation and the external handle is a host pointer, the pNext chain must not include a VkMemoryDedicatedAllocateInfo structure with either its image or buffer field set to a value other than VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-pNext-03332", "If the pNext chain includes a VkImportMemoryHostPointerInfoEXT structure, VkMemoryOpaqueCaptureAddressAllocateInfo::opaqueCaptureAddress must be zero", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkDedicatedAllocationMemoryAllocateInfoNV, VkExportMemoryAllocateInfo, VkExportMemoryAllocateInfoNV, VkExportMemoryWin32HandleInfoKHR, VkExportMemoryWin32HandleInfoNV, VkImportAndroidHardwareBufferInfoANDROID, VkImportMemoryFdInfoKHR, VkImportMemoryHostPointerInfoEXT, VkImportMemoryWin32HandleInfoKHR, VkImportMemoryWin32HandleInfoNV, VkMemoryAllocateFlagsInfo, VkMemoryDedicatedAllocateInfo, VkMemoryOpaqueCaptureAddressAllocateInfo, or VkMemoryPriorityAllocateInfoEXT", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO", "1.2-extensions"},
+ {"VUID-VkMemoryAllocateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkMemoryBarrier-dstAccessMask-parameter", "dstAccessMask must be a valid combination of VkAccessFlagBits values", "1.2-extensions"},
+ {"VUID-VkMemoryBarrier-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkMemoryBarrier-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_BARRIER", "1.2-extensions"},
+ {"VUID-VkMemoryBarrier-srcAccessMask-parameter", "srcAccessMask must be a valid combination of VkAccessFlagBits values", "1.2-extensions"},
+ {"VUID-VkMemoryDedicatedAllocateInfo-buffer-01435", "If buffer is not VK_NULL_HANDLE, VkMemoryAllocateInfo::allocationSize must equal the VkMemoryRequirements::size of the buffer", "1.2-khr-extensions"},
+ {"VUID-VkMemoryDedicatedAllocateInfo-buffer-01436", "If buffer is not VK_NULL_HANDLE, buffer must have been created without VK_BUFFER_CREATE_SPARSE_BINDING_BIT set in VkBufferCreateInfo::flags", "1.2-extensions"},
+ {"VUID-VkMemoryDedicatedAllocateInfo-buffer-01877", "If buffer is not VK_NULL_HANDLE and VkMemoryAllocateInfo defines a memory import operation with handle type VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT, or VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT, and the external handle was created by the Vulkan API, then the memory being imported must also be a dedicated buffer allocation and buffer must be identical to the buffer associated with the imported memory", "1.2-extensions"},
+ {"VUID-VkMemoryDedicatedAllocateInfo-buffer-01879", "If buffer is not VK_NULL_HANDLE and VkMemoryAllocateInfo defines a memory import operation with handle type VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT, the memory being imported must also be a dedicated buffer allocation and buffer must be identical to the buffer associated with the imported memory", "1.2-extensions"},
+ {"VUID-VkMemoryDedicatedAllocateInfo-buffer-02965", "If buffer is not VK_NULL_HANDLE and the memory is not an imported Android Hardware Buffer, VkMemoryAllocateInfo::allocationSize must equal the VkMemoryRequirements::size of the buffer", "1.2-extensions"},
+ {"VUID-VkMemoryDedicatedAllocateInfo-buffer-parameter", "If buffer is not VK_NULL_HANDLE, buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-VkMemoryDedicatedAllocateInfo-commonparent", "Both of buffer, and image that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkMemoryDedicatedAllocateInfo-image-01432", "At least one of image and buffer must be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-VkMemoryDedicatedAllocateInfo-image-01433", "If image is not VK_NULL_HANDLE, VkMemoryAllocateInfo::allocationSize must equal the VkMemoryRequirements::size of the image", "1.2-khr-extensions"},
+ {"VUID-VkMemoryDedicatedAllocateInfo-image-01434", "If image is not VK_NULL_HANDLE, image must have been created without VK_IMAGE_CREATE_SPARSE_BINDING_BIT set in VkImageCreateInfo::flags", "1.2-extensions"},
+ {"VUID-VkMemoryDedicatedAllocateInfo-image-01797", "If image is not VK_NULL_HANDLE, image must not have been created with VK_IMAGE_CREATE_DISJOINT_BIT set in VkImageCreateInfo::flags", "1.2-extensions"},
+ {"VUID-VkMemoryDedicatedAllocateInfo-image-01876", "If image is not VK_NULL_HANDLE and VkMemoryAllocateInfo defines a memory import operation with handle type VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT, VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT, or VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT, and the external handle was created by the Vulkan API, then the memory being imported must also be a dedicated image allocation and image must be identical to the image associated with the imported memory", "1.2-extensions"},
+ {"VUID-VkMemoryDedicatedAllocateInfo-image-01878", "If image is not VK_NULL_HANDLE and VkMemoryAllocateInfo defines a memory import operation with handle type VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT, the memory being imported must also be a dedicated image allocation and image must be identical to the image associated with the imported memory", "1.2-extensions"},
+ {"VUID-VkMemoryDedicatedAllocateInfo-image-02964", "If image is not VK_NULL_HANDLE and the memory is not an imported Android Hardware Buffer, VkMemoryAllocateInfo::allocationSize must equal the VkMemoryRequirements::size of the image", "1.2-extensions"},
+ {"VUID-VkMemoryDedicatedAllocateInfo-image-parameter", "If image is not VK_NULL_HANDLE, image must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-VkMemoryDedicatedAllocateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO", "1.2-extensions"},
+ {"VUID-VkMemoryDedicatedRequirements-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS", "1.2-extensions"},
+ {"VUID-VkMemoryFdPropertiesKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkMemoryFdPropertiesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR", "1.2-extensions"},
+ {"VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-handleTypes-01882", "VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID must have been included in VkExportMemoryAllocateInfo::handleTypes when memory was created", "1.2-extensions"},
+ {"VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-memory-parameter", "memory must be a valid VkDeviceMemory handle", "1.2-extensions"},
+ {"VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-pNext-01883", "If the pNext chain of the VkMemoryAllocateInfo used to allocate memory included a VkMemoryDedicatedAllocateInfo with non-NULL image member, then that image must already be bound to memory", "1.2-extensions"},
+ {"VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkMemoryGetAndroidHardwareBufferInfoANDROID-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID", "1.2-extensions"},
+ {"VUID-VkMemoryGetFdInfoKHR-handleType-00671", "handleType must have been included in VkExportMemoryAllocateInfo::handleTypes when memory was created", "1.2-extensions"},
+ {"VUID-VkMemoryGetFdInfoKHR-handleType-00672", "handleType must be defined as a POSIX file descriptor handle", "1.2-extensions"},
+ {"VUID-VkMemoryGetFdInfoKHR-handleType-parameter", "handleType must be a valid VkExternalMemoryHandleTypeFlagBits value", "1.2-extensions"},
+ {"VUID-VkMemoryGetFdInfoKHR-memory-parameter", "memory must be a valid VkDeviceMemory handle", "1.2-extensions"},
+ {"VUID-VkMemoryGetFdInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkMemoryGetFdInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkMemoryGetWin32HandleInfoKHR-handleType-00662", "handleType must have been included in VkExportMemoryAllocateInfo::handleTypes when memory was created", "1.2-extensions"},
+ {"VUID-VkMemoryGetWin32HandleInfoKHR-handleType-00663", "If handleType is defined as an NT handle, vkGetMemoryWin32HandleKHR must be called no more than once for each valid unique combination of memory and handleType", "1.2-extensions"},
+ {"VUID-VkMemoryGetWin32HandleInfoKHR-handleType-00664", "handleType must be defined as an NT handle or a global share handle", "1.2-extensions"},
+ {"VUID-VkMemoryGetWin32HandleInfoKHR-handleType-parameter", "handleType must be a valid VkExternalMemoryHandleTypeFlagBits value", "1.2-extensions"},
+ {"VUID-VkMemoryGetWin32HandleInfoKHR-memory-parameter", "memory must be a valid VkDeviceMemory handle", "1.2-extensions"},
+ {"VUID-VkMemoryGetWin32HandleInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkMemoryGetWin32HandleInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkMemoryHostPointerPropertiesEXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkMemoryHostPointerPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT", "1.2-extensions"},
+ {"VUID-VkMemoryOpaqueCaptureAddressAllocateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO", "1.2-extensions"},
+ {"VUID-VkMemoryPriorityAllocateInfoEXT-priority-02602", "priority must be between 0 and 1, inclusive", "1.2-extensions"},
+ {"VUID-VkMemoryPriorityAllocateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkMemoryRequirements2-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkMemoryDedicatedRequirements", "1.2-extensions"},
+ {"VUID-VkMemoryRequirements2-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2", "1.2-extensions"},
+ {"VUID-VkMemoryRequirements2-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkMemoryWin32HandlePropertiesKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkMemoryWin32HandlePropertiesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR", "1.2-extensions"},
+ {"VUID-VkMetalSurfaceCreateInfoEXT-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkMetalSurfaceCreateInfoEXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkMetalSurfaceCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkMultisamplePropertiesEXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkMultisamplePropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT", "1.2-extensions"},
+ {"VUID-VkPerformanceConfigurationAcquireInfoINTEL-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPerformanceConfigurationAcquireInfoINTEL-sType-sType", "sType must be VK_STRUCTURE_TYPE_PERFORMANCE_CONFIGURATION_ACQUIRE_INFO_INTEL", "1.2-extensions"},
+ {"VUID-VkPerformanceConfigurationAcquireInfoINTEL-type-parameter", "type must be a valid VkPerformanceConfigurationTypeINTEL value", "1.2-extensions"},
+ {"VUID-VkPerformanceCounterDescriptionKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPerformanceCounterDescriptionKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_DESCRIPTION_KHR", "1.2-extensions"},
+ {"VUID-VkPerformanceCounterKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPerformanceCounterKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_KHR", "1.2-extensions"},
+ {"VUID-VkPerformanceMarkerInfoINTEL-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPerformanceMarkerInfoINTEL-sType-sType", "sType must be VK_STRUCTURE_TYPE_PERFORMANCE_MARKER_INFO_INTEL", "1.2-extensions"},
+ {"VUID-VkPerformanceOverrideInfoINTEL-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPerformanceOverrideInfoINTEL-sType-sType", "sType must be VK_STRUCTURE_TYPE_PERFORMANCE_OVERRIDE_INFO_INTEL", "1.2-extensions"},
+ {"VUID-VkPerformanceOverrideInfoINTEL-type-parameter", "type must be a valid VkPerformanceOverrideTypeINTEL value", "1.2-extensions"},
+ {"VUID-VkPerformanceQuerySubmitInfoKHR-counterPassIndex-03221", "counterPassIndex must be less than the number of counter passes required by any queries within the batch. The required number of counter passes for a performance query is obtained by calling vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR", "1.2-extensions"},
+ {"VUID-VkPerformanceQuerySubmitInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkPerformanceStreamMarkerInfoINTEL-marker-02735", "The value written by the application into marker must only used the valid bits as reported by vkGetPerformanceParameterINTEL with the VK_PERFORMANCE_PARAMETER_TYPE_STREAM_MARKER_VALID_BITS_INTEL", "1.2-extensions"},
+ {"VUID-VkPerformanceStreamMarkerInfoINTEL-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPerformanceStreamMarkerInfoINTEL-sType-sType", "sType must be VK_STRUCTURE_TYPE_PERFORMANCE_STREAM_MARKER_INFO_INTEL", "1.2-extensions"},
+ {"VUID-VkPerformanceValueINTEL-type-parameter", "type must be a valid VkPerformanceValueTypeINTEL value", "1.2-extensions"},
+ {"VUID-VkPerformanceValueINTEL-valueString-parameter", "If type is VK_PERFORMANCE_VALUE_TYPE_STRING_INTEL, the valueString member of data must be a null-terminated UTF-8 string", "1.2-extensions"},
+ {"VUID-VkPhysicalDevice16BitStorageFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES", "1.2-extensions"},
+ {"VUID-VkPhysicalDevice8BitStorageFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceASTCDecodeFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceBufferDeviceAddressFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceBufferDeviceAddressFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceCoherentMemoryFeaturesAMD-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceComputeShaderDerivativesFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceConditionalRenderingFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceConservativeRasterizationPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceCooperativeMatrixFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceCooperativeMatrixPropertiesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceCornerSampledImageFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceCoverageReductionModeFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceCustomBorderColorFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceCustomBorderColorPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_PROPERTIES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceDepthClipEnableFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceDepthStencilResolveProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceDescriptorIndexingFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceDescriptorIndexingProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceDiagnosticsConfigFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceDiscardRectanglePropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceDriverProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceExclusiveScissorFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceExtendedDynamicStateFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceExternalBufferInfo-flags-parameter", "flags must be a valid combination of VkBufferCreateFlagBits values", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceExternalBufferInfo-handleType-parameter", "handleType must be a valid VkExternalMemoryHandleTypeFlagBits value", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceExternalBufferInfo-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceExternalBufferInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceExternalBufferInfo-usage-parameter", "usage must be a valid combination of VkBufferUsageFlagBits values", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceExternalBufferInfo-usage-requiredbitmask", "usage must not be 0", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceExternalFenceInfo-handleType-parameter", "handleType must be a valid VkExternalFenceHandleTypeFlagBits value", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceExternalFenceInfo-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceExternalFenceInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceExternalImageFormatInfo-handleType-parameter", "If handleType is not 0, handleType must be a valid VkExternalMemoryHandleTypeFlagBits value", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceExternalImageFormatInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceExternalMemoryHostPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceExternalSemaphoreInfo-handleType-parameter", "handleType must be a valid VkExternalSemaphoreHandleTypeFlagBits value", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceExternalSemaphoreInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkSemaphoreTypeCreateInfo", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceExternalSemaphoreInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceExternalSemaphoreInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceFeatures2-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceFloatControlsProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceFragmentDensityMap2FeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceFragmentDensityMap2PropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceFragmentDensityMapFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceFragmentDensityMapPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceGroupProperties-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceGroupProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceHostQueryResetFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceIDProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sharingMode-02314", "If sharingMode is VK_SHARING_MODE_CONCURRENT, then pQueueFamilyIndices must be a valid pointer to an array of queueFamilyIndexCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sharingMode-02315", "If sharingMode is VK_SHARING_MODE_CONCURRENT, then queueFamilyIndexCount must be greater than 1", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sharingMode-02316", "If sharingMode is VK_SHARING_MODE_CONCURRENT, each element of pQueueFamilyIndices must be unique and must be less than the pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties2 for the physicalDevice that was used to create device", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceImageDrmFormatModifierInfoEXT-sharingMode-parameter", "sharingMode must be a valid VkSharingMode value", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceImageFormatInfo2-flags-parameter", "flags must be a valid combination of VkImageCreateFlagBits values", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceImageFormatInfo2-format-parameter", "format must be a valid VkFormat value", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceImageFormatInfo2-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkImageFormatListCreateInfo, VkImageStencilUsageCreateInfo, VkPhysicalDeviceExternalImageFormatInfo, VkPhysicalDeviceImageDrmFormatModifierInfoEXT, or VkPhysicalDeviceImageViewImageFormatInfoEXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceImageFormatInfo2-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceImageFormatInfo2-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceImageFormatInfo2-tiling-02249", "tiling must be VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT if and only if the pNext chain includes VkPhysicalDeviceImageDrmFormatModifierInfoEXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceImageFormatInfo2-tiling-02313", "If tiling is VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT and flags contains VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT, then the pNext chain must include a VkImageFormatListCreateInfo structure with non-zero viewFormatCount", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceImageFormatInfo2-tiling-parameter", "tiling must be a valid VkImageTiling value", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceImageFormatInfo2-type-parameter", "type must be a valid VkImageType value", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceImageFormatInfo2-usage-parameter", "usage must be a valid combination of VkImageUsageFlagBits values", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceImageFormatInfo2-usage-requiredbitmask", "usage must not be 0", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceImageRobustnessFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_ROBUSTNESS_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceImageViewImageFormatInfoEXT-imageViewType-parameter", "imageViewType must be a valid VkImageViewType value", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceImageViewImageFormatInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceImagelessFramebufferFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceIndexTypeUint8FeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceInlineUniformBlockFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceInlineUniformBlockPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceLineRasterizationFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceLineRasterizationPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceMaintenance3Properties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceMemoryBudgetPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceMemoryPriorityFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceMemoryProperties2-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkPhysicalDeviceMemoryBudgetPropertiesEXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceMemoryProperties2-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceMemoryProperties2-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceMeshShaderFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceMeshShaderPropertiesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceMultiviewFeatures-multiviewGeometryShader-00580", "If multiviewGeometryShader is enabled then multiview must also be enabled", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceMultiviewFeatures-multiviewTessellationShader-00581", "If multiviewTessellationShader is enabled then multiview must also be enabled", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceMultiviewFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceMultiviewProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES", "1.2-extensions"},
+ {"VUID-VkPhysicalDevicePCIBusInfoPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDevicePerformanceQueryFeaturesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR", "1.2-extensions"},
+ {"VUID-VkPhysicalDevicePerformanceQueryPropertiesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR", "1.2-extensions"},
+ {"VUID-VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR", "1.2-extensions"},
+ {"VUID-VkPhysicalDevicePointClippingProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES", "1.2-extensions"},
+ {"VUID-VkPhysicalDevicePrivateDataFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIVATE_DATA_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceProperties2-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT, VkPhysicalDeviceConservativeRasterizationPropertiesEXT, VkPhysicalDeviceCooperativeMatrixPropertiesNV, VkPhysicalDeviceCustomBorderColorPropertiesEXT, VkPhysicalDeviceDepthStencilResolveProperties, VkPhysicalDeviceDescriptorIndexingProperties, VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV, VkPhysicalDeviceDiscardRectanglePropertiesEXT, VkPhysicalDeviceDriverProperties, VkPhysicalDeviceExternalMemoryHostPropertiesEXT, VkPhysicalDeviceFloatControlsProperties, VkPhysicalDeviceFragmentDensityMap2PropertiesEXT, VkPhysicalDeviceFragmentDensityMapPropertiesEXT, VkPhysicalDeviceIDProperties, VkPhysicalDeviceInlineUniformBlockPropertiesEXT, VkPhysicalDeviceLineRasterizationPropertiesEXT, VkPhysicalDeviceMaintenance3Properties, VkPhysicalDeviceMeshShaderPropertiesNV, VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX, VkPhysicalDeviceMultiviewProperties, VkPhysicalDevicePCIBusInfoPropertiesEXT, VkPhysicalDevicePerformanceQueryPropertiesKHR, VkPhysicalDevicePointClippingProperties, VkPhysicalDeviceProtectedMemoryProperties, VkPhysicalDevicePushDescriptorPropertiesKHR, VkPhysicalDeviceRayTracingPropertiesKHR, VkPhysicalDeviceRayTracingPropertiesNV, VkPhysicalDeviceRobustness2PropertiesEXT, VkPhysicalDeviceSampleLocationsPropertiesEXT, VkPhysicalDeviceSamplerFilterMinmaxProperties, VkPhysicalDeviceShaderCoreProperties2AMD, VkPhysicalDeviceShaderCorePropertiesAMD, VkPhysicalDeviceShaderSMBuiltinsPropertiesNV, VkPhysicalDeviceShadingRateImagePropertiesNV, VkPhysicalDeviceSubgroupProperties, VkPhysicalDeviceSubgroupSizeControlPropertiesEXT, VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT, VkPhysicalDeviceTimelineSemaphoreProperties, VkPhysicalDeviceTransformFeedbackPropertiesEXT, VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT, VkPhysicalDeviceVulkan11Properties, or VkPhysicalDeviceVulkan12Properties", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceProperties2-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceProperties2-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceProtectedMemoryFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceProtectedMemoryProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES", "1.2-extensions"},
+ {"VUID-VkPhysicalDevicePushDescriptorPropertiesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceRayTracingFeaturesKHR-rayTracingShaderGroupHandleCaptureReplayMixed-03348", "If rayTracingShaderGroupHandleCaptureReplayMixed is VK_TRUE, rayTracingShaderGroupHandleCaptureReplay must also be VK_TRUE", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceRayTracingFeaturesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_FEATURES_KHR", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceRayTracingPropertiesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_KHR", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceRayTracingPropertiesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceRobustness2FeaturesEXT-robustBufferAccess2-04000", "If robustBufferAccess2 is enabled then robustBufferAccess must also be enabled", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceRobustness2FeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceRobustness2PropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceSampleLocationsPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceSamplerFilterMinmaxProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceSamplerYcbcrConversionFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceScalarBlockLayoutFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceShaderAtomicFloatFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceShaderAtomicInt64Features-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceShaderClockFeaturesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceShaderCoreProperties2AMD-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceShaderCorePropertiesAMD-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceShaderDrawParametersFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceShaderFloat16Int8Features-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceShaderImageFootprintFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceShaderSMBuiltinsFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceShaderSMBuiltinsPropertiesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceShadingRateImageFeaturesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceShadingRateImagePropertiesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-format-parameter", "format must be a valid VkFormat value", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-samples-01095", "samples must be a bit value that is set in VkImageFormatProperties::sampleCounts returned by vkGetPhysicalDeviceImageFormatProperties with format, type, tiling, and usage equal to those in this command and flags equal to the value that is set in VkImageCreateInfo::flags when the image is created", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-samples-parameter", "samples must be a valid VkSampleCountFlagBits value", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-tiling-parameter", "tiling must be a valid VkImageTiling value", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-type-parameter", "type must be a valid VkImageType value", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-usage-parameter", "usage must be a valid combination of VkImageUsageFlagBits values", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceSparseImageFormatInfo2-usage-requiredbitmask", "usage must not be 0", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceSubgroupProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceSubgroupSizeControlFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceSubgroupSizeControlPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceSurfaceInfo2KHR-pNext-02672", "If the pNext chain includes a VkSurfaceFullScreenExclusiveInfoEXT structure with its fullScreenExclusive member set to VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT, and surface was created using vkCreateWin32SurfaceKHR, a VkSurfaceFullScreenExclusiveWin32InfoEXT structure must be included in the pNext chain", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceSurfaceInfo2KHR-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkSurfaceFullScreenExclusiveInfoEXT or VkSurfaceFullScreenExclusiveWin32InfoEXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceSurfaceInfo2KHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceSurfaceInfo2KHR-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceSurfaceInfo2KHR-surface-parameter", "surface must be a valid VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceTimelineSemaphoreFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceTimelineSemaphoreProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceToolPropertiesEXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceToolPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceTransformFeedbackFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceTransformFeedbackPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceUniformBufferStandardLayoutFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceVariablePointersFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceVariablePointersFeatures-variablePointers-01431", "If variablePointers is enabled then variablePointersStorageBuffer must also be enabled", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceVulkan11Features-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceVulkan11Properties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceVulkan12Features-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceVulkan12Properties-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceVulkanMemoryModelFeatures-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES", "1.2-extensions"},
+ {"VUID-VkPhysicalDeviceYcbcrImageArraysFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkPipelineCacheCreateInfo-flags-parameter", "flags must be a valid combination of VkPipelineCacheCreateFlagBits values", "1.2-extensions"},
+ {"VUID-VkPipelineCacheCreateInfo-initialDataSize-00768", "If initialDataSize is not 0, it must be equal to the size of pInitialData, as returned by vkGetPipelineCacheData when pInitialData was originally retrieved", "1.2-extensions"},
+ {"VUID-VkPipelineCacheCreateInfo-initialDataSize-00769", "If initialDataSize is not 0, pInitialData must have been retrieved from a previous call to vkGetPipelineCacheData", "1.2-extensions"},
+ {"VUID-VkPipelineCacheCreateInfo-pInitialData-parameter", "If initialDataSize is not 0, pInitialData must be a valid pointer to an array of initialDataSize bytes", "1.2-extensions"},
+ {"VUID-VkPipelineCacheCreateInfo-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPipelineCacheCreateInfo-pipelineCreationCacheControl-02892", "If the pipelineCreationCacheControl feature is not enabled, flags must not include VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT", "1.2-extensions"},
+ {"VUID-VkPipelineCacheCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-blendOverlap-01426", "If the correlated overlap property is not supported, blendOverlap must be VK_BLEND_OVERLAP_UNCORRELATED_EXT", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-blendOverlap-parameter", "blendOverlap must be a valid VkBlendOverlapEXT value", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-dstPremultiplied-01425", "If the non-premultiplied destination color property is not supported, dstPremultiplied must be VK_TRUE", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendAdvancedStateCreateInfoEXT-srcPremultiplied-01424", "If the non-premultiplied source color property is not supported, srcPremultiplied must be VK_TRUE", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendAttachmentState-advancedBlendAllOperations-01409", "If VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT::advancedBlendAllOperations is VK_FALSE, then colorBlendOp must not be VK_BLEND_OP_ZERO_EXT, VK_BLEND_OP_SRC_EXT, VK_BLEND_OP_DST_EXT, VK_BLEND_OP_SRC_OVER_EXT, VK_BLEND_OP_DST_OVER_EXT, VK_BLEND_OP_SRC_IN_EXT, VK_BLEND_OP_DST_IN_EXT, VK_BLEND_OP_SRC_OUT_EXT, VK_BLEND_OP_DST_OUT_EXT, VK_BLEND_OP_SRC_ATOP_EXT, VK_BLEND_OP_DST_ATOP_EXT, VK_BLEND_OP_XOR_EXT, VK_BLEND_OP_INVERT_EXT, VK_BLEND_OP_INVERT_RGB_EXT, VK_BLEND_OP_LINEARDODGE_EXT, VK_BLEND_OP_LINEARBURN_EXT, VK_BLEND_OP_VIVIDLIGHT_EXT, VK_BLEND_OP_LINEARLIGHT_EXT, VK_BLEND_OP_PINLIGHT_EXT, VK_BLEND_OP_HARDMIX_EXT, VK_BLEND_OP_PLUS_EXT, VK_BLEND_OP_PLUS_CLAMPED_EXT, VK_BLEND_OP_PLUS_CLAMPED_ALPHA_EXT, VK_BLEND_OP_PLUS_DARKER_EXT, VK_BLEND_OP_MINUS_EXT, VK_BLEND_OP_MINUS_CLAMPED_EXT, VK_BLEND_OP_CONTRAST_EXT, VK_BLEND_OP_INVERT_OVG_EXT, VK_BLEND_OP_RED_EXT, VK_BLEND_OP_GREEN_EXT, or VK_BLEND_OP_BLUE_EXT", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendAttachmentState-advancedBlendIndependentBlend-01407", "If VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT::advancedBlendIndependentBlend is VK_FALSE and colorBlendOp is an advanced blend operation, then colorBlendOp must be the same for all attachments", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendAttachmentState-advancedBlendIndependentBlend-01408", "If VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT::advancedBlendIndependentBlend is VK_FALSE and alphaBlendOp is an advanced blend operation, then alphaBlendOp must be the same for all attachments", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendAttachmentState-alphaBlendOp-parameter", "alphaBlendOp must be a valid VkBlendOp value", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendAttachmentState-colorBlendOp-01406", "If either of colorBlendOp or alphaBlendOp is an advanced blend operation, then colorBlendOp must equal alphaBlendOp", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendAttachmentState-colorBlendOp-01410", "If colorBlendOp or alphaBlendOp is an advanced blend operation, then VkSubpassDescription::colorAttachmentCount of the subpass this pipeline is compiled against must be less than or equal to VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT::advancedBlendMaxColorAttachments", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendAttachmentState-colorBlendOp-parameter", "colorBlendOp must be a valid VkBlendOp value", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendAttachmentState-colorWriteMask-parameter", "colorWriteMask must be a valid combination of VkColorComponentFlagBits values", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendAttachmentState-dstAlphaBlendFactor-00611", "If the dual source blending feature is not enabled, dstAlphaBlendFactor must not be VK_BLEND_FACTOR_SRC1_COLOR, VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR, VK_BLEND_FACTOR_SRC1_ALPHA, or VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendAttachmentState-dstAlphaBlendFactor-parameter", "dstAlphaBlendFactor must be a valid VkBlendFactor value", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendAttachmentState-dstColorBlendFactor-00609", "If the dual source blending feature is not enabled, dstColorBlendFactor must not be VK_BLEND_FACTOR_SRC1_COLOR, VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR, VK_BLEND_FACTOR_SRC1_ALPHA, or VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendAttachmentState-dstColorBlendFactor-parameter", "dstColorBlendFactor must be a valid VkBlendFactor value", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendAttachmentState-srcAlphaBlendFactor-00610", "If the dual source blending feature is not enabled, srcAlphaBlendFactor must not be VK_BLEND_FACTOR_SRC1_COLOR, VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR, VK_BLEND_FACTOR_SRC1_ALPHA, or VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendAttachmentState-srcAlphaBlendFactor-parameter", "srcAlphaBlendFactor must be a valid VkBlendFactor value", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendAttachmentState-srcColorBlendFactor-00608", "If the dual source blending feature is not enabled, srcColorBlendFactor must not be VK_BLEND_FACTOR_SRC1_COLOR, VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR, VK_BLEND_FACTOR_SRC1_ALPHA, or VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendAttachmentState-srcColorBlendFactor-parameter", "srcColorBlendFactor must be a valid VkBlendFactor value", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendStateCreateInfo-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendStateCreateInfo-logicOpEnable-00606", "If the logic operations feature is not enabled, logicOpEnable must be VK_FALSE", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendStateCreateInfo-logicOpEnable-00607", "If logicOpEnable is VK_TRUE, logicOp must be a valid VkLogicOp value", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605", "If the independent blending feature is not enabled, all elements of pAttachments must be identical", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-parameter", "If attachmentCount is not 0, pAttachments must be a valid pointer to an array of attachmentCount valid VkPipelineColorBlendAttachmentState structures", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendStateCreateInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkPipelineColorBlendAdvancedStateCreateInfoEXT", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendStateCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkPipelineColorBlendStateCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkPipelineCompilerControlCreateInfoAMD-compilerControlFlags-zerobitmask", "compilerControlFlags must be 0", "1.2-extensions"},
+ {"VUID-VkPipelineCompilerControlCreateInfoAMD-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD", "1.2-extensions"},
+ {"VUID-VkPipelineCoverageModulationStateCreateInfoNV-coverageModulationMode-parameter", "coverageModulationMode must be a valid VkCoverageModulationModeNV value", "1.2-extensions"},
+ {"VUID-VkPipelineCoverageModulationStateCreateInfoNV-coverageModulationTableEnable-01405", "If coverageModulationTableEnable is VK_TRUE, coverageModulationTableCount must be equal to the number of rasterization samples divided by the number of color samples in the subpass", "1.2-extensions"},
+ {"VUID-VkPipelineCoverageModulationStateCreateInfoNV-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkPipelineCoverageModulationStateCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkPipelineCoverageReductionStateCreateInfoNV-coverageReductionMode-parameter", "coverageReductionMode must be a valid VkCoverageReductionModeNV value", "1.2-extensions"},
+ {"VUID-VkPipelineCoverageReductionStateCreateInfoNV-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkPipelineCoverageReductionStateCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkPipelineCoverageToColorStateCreateInfoNV-coverageToColorEnable-01404", "If coverageToColorEnable is VK_TRUE, then the render pass subpass indicated by VkGraphicsPipelineCreateInfo::renderPass and VkGraphicsPipelineCreateInfo::subpass must have a color attachment at the location selected by coverageToColorLocation, with a VkFormat of VK_FORMAT_R8_UINT, VK_FORMAT_R8_SINT, VK_FORMAT_R16_UINT, VK_FORMAT_R16_SINT, VK_FORMAT_R32_UINT, or VK_FORMAT_R32_SINT", "1.2-extensions"},
+ {"VUID-VkPipelineCoverageToColorStateCreateInfoNV-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkPipelineCoverageToColorStateCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkPipelineCreationFeedbackCreateInfoEXT-pPipelineCreationFeedback-parameter", "pPipelineCreationFeedback must be a valid pointer to a VkPipelineCreationFeedbackEXT structure", "1.2-extensions"},
+ {"VUID-VkPipelineCreationFeedbackCreateInfoEXT-pPipelineStageCreationFeedbacks-parameter", "pPipelineStageCreationFeedbacks must be a valid pointer to an array of pipelineStageCreationFeedbackCount VkPipelineCreationFeedbackEXT structures", "1.2-extensions"},
+ {"VUID-VkPipelineCreationFeedbackCreateInfoEXT-pipelineStageCreationFeedbackCount-02668", "When chained to VkGraphicsPipelineCreateInfo, VkPipelineCreationFeedbackEXT::pipelineStageCreationFeedbackCount must equal VkGraphicsPipelineCreateInfo::stageCount", "1.2-extensions"},
+ {"VUID-VkPipelineCreationFeedbackCreateInfoEXT-pipelineStageCreationFeedbackCount-02669", "When chained to VkComputePipelineCreateInfo, VkPipelineCreationFeedbackEXT::pipelineStageCreationFeedbackCount must equal 1", "1.2-extensions"},
+ {"VUID-VkPipelineCreationFeedbackCreateInfoEXT-pipelineStageCreationFeedbackCount-02670", "When chained to VkRayTracingPipelineCreateInfoKHR, VkPipelineCreationFeedbackEXT::pipelineStageCreationFeedbackCount must equal VkRayTracingPipelineCreateInfoKHR::stageCount", "1.2-extensions"},
+ {"VUID-VkPipelineCreationFeedbackCreateInfoEXT-pipelineStageCreationFeedbackCount-02969", "When chained to VkRayTracingPipelineCreateInfoNV, VkPipelineCreationFeedbackEXT::pipelineStageCreationFeedbackCount must equal VkRayTracingPipelineCreateInfoNV::stageCount", "1.2-extensions"},
+ {"VUID-VkPipelineCreationFeedbackCreateInfoEXT-pipelineStageCreationFeedbackCount-arraylength", "pipelineStageCreationFeedbackCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkPipelineCreationFeedbackCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkPipelineDepthStencilStateCreateInfo-back-parameter", "back must be a valid VkStencilOpState structure", "1.2-extensions"},
+ {"VUID-VkPipelineDepthStencilStateCreateInfo-depthBoundsTestEnable-00598", "If the depth bounds testing feature is not enabled, depthBoundsTestEnable must be VK_FALSE", "1.2-extensions"},
+ {"VUID-VkPipelineDepthStencilStateCreateInfo-depthCompareOp-parameter", "depthCompareOp must be a valid VkCompareOp value", "1.2-extensions"},
+ {"VUID-VkPipelineDepthStencilStateCreateInfo-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkPipelineDepthStencilStateCreateInfo-front-parameter", "front must be a valid VkStencilOpState structure", "1.2-extensions"},
+ {"VUID-VkPipelineDepthStencilStateCreateInfo-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPipelineDepthStencilStateCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-discardRectangleCount-00582", "discardRectangleCount must be less than or equal to VkPhysicalDeviceDiscardRectanglePropertiesEXT::maxDiscardRectangles", "1.2-extensions"},
+ {"VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-discardRectangleMode-parameter", "discardRectangleMode must be a valid VkDiscardRectangleModeEXT value", "1.2-extensions"},
+ {"VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkPipelineDiscardRectangleStateCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkPipelineDynamicStateCreateInfo-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442", "Each element of pDynamicStates must be unique", "1.2-extensions"},
+ {"VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-parameter", "If dynamicStateCount is not 0, pDynamicStates must be a valid pointer to an array of dynamicStateCount valid VkDynamicState values", "1.2-extensions"},
+ {"VUID-VkPipelineDynamicStateCreateInfo-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPipelineDynamicStateCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkPipelineExecutableInfoKHR-executableIndex-03275", "executableIndex must be less than the number of executables associated with pipeline as returned in the pExecutableCount parameter of vkGetPipelineExecutablePropertiesKHR", "1.2-extensions"},
+ {"VUID-VkPipelineExecutableInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPipelineExecutableInfoKHR-pipeline-parameter", "pipeline must be a valid VkPipeline handle", "1.2-extensions"},
+ {"VUID-VkPipelineExecutableInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkPipelineExecutableInternalRepresentationKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPipelineExecutableInternalRepresentationKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR", "1.2-extensions"},
+ {"VUID-VkPipelineExecutablePropertiesKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPipelineExecutablePropertiesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_PROPERTIES_KHR", "1.2-extensions"},
+ {"VUID-VkPipelineExecutableStatisticKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPipelineExecutableStatisticKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR", "1.2-extensions"},
+ {"VUID-VkPipelineInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPipelineInfoKHR-pipeline-parameter", "pipeline must be a valid VkPipeline handle", "1.2-extensions"},
+ {"VUID-VkPipelineInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkPipelineInputAssemblyStateCreateInfo-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkPipelineInputAssemblyStateCreateInfo-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPipelineInputAssemblyStateCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00428", "If topology is VK_PRIMITIVE_TOPOLOGY_POINT_LIST, VK_PRIMITIVE_TOPOLOGY_LINE_LIST, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY or VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, primitiveRestartEnable must be VK_FALSE", "1.2-extensions"},
+ {"VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00429", "If the geometry shaders feature is not enabled, topology must not be any of VK_PRIMITIVE_TOPOLOGY_LINE_LIST_WITH_ADJACENCY, VK_PRIMITIVE_TOPOLOGY_LINE_STRIP_WITH_ADJACENCY, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST_WITH_ADJACENCY or VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP_WITH_ADJACENCY", "1.2-extensions"},
+ {"VUID-VkPipelineInputAssemblyStateCreateInfo-topology-00430", "If the tessellation shaders feature is not enabled, topology must not be VK_PRIMITIVE_TOPOLOGY_PATCH_LIST", "1.2-extensions"},
+ {"VUID-VkPipelineInputAssemblyStateCreateInfo-topology-parameter", "topology must be a valid VkPrimitiveTopology value", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-02212", "The total number of bindings with a descriptorType of VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxPerStageDescriptorInlineUniformBlocks", "default"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-02213", "The total number of bindings with a descriptorType of VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxDescriptorSetInlineUniformBlocks", "default"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-02214", "The total number of bindings in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxPerStageDescriptorInlineUniformBlocks", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-02215", "The total number of bindings with a descriptorType of VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxPerStageDescriptorUpdateAfterBindInlineUniformBlocks", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-02216", "The total number of bindings in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxDescriptorSetInlineUniformBlocks", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-02217", "The total number of bindings with a descriptorType of VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceInlineUniformBlockPropertiesEXT::maxDescriptorSetUpdateAfterBindInlineUniformBlocks", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-02381", "The total number of bindings with a descriptorType of VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxDescriptorSetAccelerationStructures", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03016", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_SAMPLER and VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorSamplers", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03017", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER and VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorUniformBuffers", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03018", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_STORAGE_BUFFER and VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorStorageBuffers", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03019", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorSampledImages", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03020", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, and VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorStorageImages", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03021", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorInputAttachments", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03022", "The total number of descriptors with a descriptorType of VK_DESCRIPTOR_TYPE_SAMPLER and VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxPerStageDescriptorUpdateAfterBindSamplers", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03023", "The total number of descriptors with a descriptorType of VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER and VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxPerStageDescriptorUpdateAfterBindUniformBuffers", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03024", "The total number of descriptors with a descriptorType of VK_DESCRIPTOR_TYPE_STORAGE_BUFFER and VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxPerStageDescriptorUpdateAfterBindStorageBuffers", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03025", "The total number of descriptors with a descriptorType of VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxPerStageDescriptorUpdateAfterBindSampledImages", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03026", "The total number of descriptors with a descriptorType of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, and VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxPerStageDescriptorUpdateAfterBindStorageImages", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03027", "The total number of descriptors with a descriptorType of VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxPerStageDescriptorUpdateAfterBindInputAttachments", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03028", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_SAMPLER and VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetSamplers", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03029", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetUniformBuffers", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03030", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetUniformBuffersDynamic", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03031", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_STORAGE_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetStorageBuffers", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03032", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetStorageBuffersDynamic", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03033", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetSampledImages", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03034", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, and VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetStorageImages", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-descriptorType-03035", "The total number of descriptors in descriptor set layouts created without the VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT bit set with a descriptorType of VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetInputAttachments", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pImmutableSamplers-03566", "The total number of pImmutableSamplers created with flags containing VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT or VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceFragmentDensityMap2PropertiesEXT::maxDescriptorSetSubsampledSamplers", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pPushConstantRanges-00292", "Any two elements of pPushConstantRanges must not include the same stage in stageFlags", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pPushConstantRanges-parameter", "If pushConstantRangeCount is not 0, pPushConstantRanges must be a valid pointer to an array of pushConstantRangeCount valid VkPushConstantRange structures", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00287", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_SAMPLER and VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible to any shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorSamplers", "1.1-khr-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00288", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER and VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible to any shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorUniformBuffers", "1.1-khr-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00289", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_STORAGE_BUFFER and VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible to any shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorStorageBuffers", "1.1-khr-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00290", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible to any shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorSampledImages", "1.1-khr-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00291", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, and VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible to any shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorStorageImages", "1.1-khr-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-00293", "pSetLayouts must not contain more than one descriptor set layout that was created with VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR set", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01676", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT accessible to any given shader stage across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxPerStageDescriptorInputAttachments", "1.1-khr-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01677", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_SAMPLER and VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetSamplers", "1.1-khr-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01678", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetUniformBuffers", "1.1-khr-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01679", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetUniformBuffersDynamic", "1.1-khr-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01680", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_STORAGE_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetStorageBuffers", "1.1-khr-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01681", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetStorageBuffersDynamic", "1.1-khr-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01682", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetSampledImages", "1.1-khr-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01683", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, and VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetStorageImages", "1.1-khr-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-01684", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceLimits::maxDescriptorSetInputAttachments", "1.1-khr-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03036", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_SAMPLER and VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxDescriptorSetUpdateAfterBindSamplers", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03037", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxDescriptorSetUpdateAfterBindUniformBuffers", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03038", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxDescriptorSetUpdateAfterBindUniformBuffersDynamic", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03039", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_STORAGE_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxDescriptorSetUpdateAfterBindStorageBuffers", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03040", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxDescriptorSetUpdateAfterBindStorageBuffersDynamic", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03041", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, and VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxDescriptorSetUpdateAfterBindSampledImages", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03042", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, and VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxDescriptorSetUpdateAfterBindStorageImages", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-03043", "The total number of descriptors of the type VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT accessible across all shader stages and across all elements of pSetLayouts must be less than or equal to VkPhysicalDeviceDescriptorIndexingProperties::maxDescriptorSetUpdateAfterBindInputAttachments", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-pSetLayouts-parameter", "If setLayoutCount is not 0, pSetLayouts must be a valid pointer to an array of setLayoutCount valid VkDescriptorSetLayout handles", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkPipelineLayoutCreateInfo-setLayoutCount-00286", "setLayoutCount must be less than or equal to VkPhysicalDeviceLimits::maxBoundDescriptorSets", "1.2-extensions"},
+ {"VUID-VkPipelineLibraryCreateInfoKHR-pLibraries-03381", "Each element of pLibraries must have been created with VK_PIPELINE_CREATE_LIBRARY_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkPipelineLibraryCreateInfoKHR-pLibraries-parameter", "If libraryCount is not 0, pLibraries must be a valid pointer to an array of libraryCount valid VkPipeline handles", "1.2-extensions"},
+ {"VUID-VkPipelineLibraryCreateInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPipelineLibraryCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkPipelineMultisampleStateCreateInfo-alphaToOneEnable-00785", "If the alpha to one feature is not enabled, alphaToOneEnable must be VK_FALSE", "1.2-extensions"},
+ {"VUID-VkPipelineMultisampleStateCreateInfo-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkPipelineMultisampleStateCreateInfo-minSampleShading-00786", "minSampleShading must be in the range [0,1]", "1.2-extensions"},
+ {"VUID-VkPipelineMultisampleStateCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkPipelineCoverageModulationStateCreateInfoNV, VkPipelineCoverageReductionStateCreateInfoNV, VkPipelineCoverageToColorStateCreateInfoNV, or VkPipelineSampleLocationsStateCreateInfoEXT", "1.2-extensions"},
+ {"VUID-VkPipelineMultisampleStateCreateInfo-pSampleMask-parameter", "If pSampleMask is not NULL, pSampleMask must be a valid pointer to an array of (rasterizationSamples/32) VkSampleMask values", "1.2-extensions"},
+ {"VUID-VkPipelineMultisampleStateCreateInfo-rasterizationSamples-01415", "If the VK_NV_framebuffer_mixed_samples extension is enabled, and if the subpass has any color attachments and rasterizationSamples is greater than the number of color samples, then sampleShadingEnable must be VK_FALSE", "1.2-extensions"},
+ {"VUID-VkPipelineMultisampleStateCreateInfo-rasterizationSamples-parameter", "rasterizationSamples must be a valid VkSampleCountFlagBits value", "1.2-extensions"},
+ {"VUID-VkPipelineMultisampleStateCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkPipelineMultisampleStateCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkPipelineMultisampleStateCreateInfo-sampleShadingEnable-00784", "If the sample rate shading feature is not enabled, sampleShadingEnable must be VK_FALSE", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-conservativeRasterizationMode-parameter", "conservativeRasterizationMode must be a valid VkConservativeRasterizationModeEXT value", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-extraPrimitiveOverestimationSize-01769", "extraPrimitiveOverestimationSize must be in the range of 0.0 to VkPhysicalDeviceConservativeRasterizationPropertiesEXT::maxExtraPrimitiveOverestimationSize inclusive", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationConservativeStateCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationDepthClipStateCreateInfoEXT-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationDepthClipStateCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationLineStateCreateInfoEXT-lineRasterizationMode-02768", "If lineRasterizationMode is VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT, then the rectangularLines feature must be enabled", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationLineStateCreateInfoEXT-lineRasterizationMode-02769", "If lineRasterizationMode is VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT, then the bresenhamLines feature must be enabled", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationLineStateCreateInfoEXT-lineRasterizationMode-02770", "If lineRasterizationMode is VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT, then the smoothLines feature must be enabled", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationLineStateCreateInfoEXT-lineRasterizationMode-parameter", "lineRasterizationMode must be a valid VkLineRasterizationModeEXT value", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationLineStateCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationLineStateCreateInfoEXT-stippledLineEnable-02771", "If stippledLineEnable is VK_TRUE and lineRasterizationMode is VK_LINE_RASTERIZATION_MODE_RECTANGULAR_EXT, then the stippledRectangularLines feature must be enabled", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationLineStateCreateInfoEXT-stippledLineEnable-02772", "If stippledLineEnable is VK_TRUE and lineRasterizationMode is VK_LINE_RASTERIZATION_MODE_BRESENHAM_EXT, then the stippledBresenhamLines feature must be enabled", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationLineStateCreateInfoEXT-stippledLineEnable-02773", "If stippledLineEnable is VK_TRUE and lineRasterizationMode is VK_LINE_RASTERIZATION_MODE_RECTANGULAR_SMOOTH_EXT, then the stippledSmoothLines feature must be enabled", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationLineStateCreateInfoEXT-stippledLineEnable-02774", "If stippledLineEnable is VK_TRUE and lineRasterizationMode is VK_LINE_RASTERIZATION_MODE_DEFAULT_EXT, then the stippledRectangularLines feature must be enabled and VkPhysicalDeviceLimits::strictLines must be VK_TRUE", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationStateCreateInfo-cullMode-parameter", "cullMode must be a valid combination of VkCullModeFlagBits values", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationStateCreateInfo-depthClampEnable-00782", "If the depth clamping feature is not enabled, depthClampEnable must be VK_FALSE", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationStateCreateInfo-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationStateCreateInfo-frontFace-parameter", "frontFace must be a valid VkFrontFace value", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationStateCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkPipelineRasterizationConservativeStateCreateInfoEXT, VkPipelineRasterizationDepthClipStateCreateInfoEXT, VkPipelineRasterizationLineStateCreateInfoEXT, VkPipelineRasterizationStateRasterizationOrderAMD, or VkPipelineRasterizationStateStreamCreateInfoEXT", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-01413", "If the non-solid fill modes feature is not enabled, polygonMode must be VK_POLYGON_MODE_FILL", "1.2-khr-extensions"},
+ {"VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-01414", "If the VK_NV_fill_rectangle extension is not enabled, polygonMode must not be VK_POLYGON_MODE_FILL_RECTANGLE_NV", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-01507", "If the non-solid fill modes feature is not enabled, polygonMode must be VK_POLYGON_MODE_FILL or VK_POLYGON_MODE_FILL_RECTANGLE_NV", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-parameter", "polygonMode must be a valid VkPolygonMode value", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationStateCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationStateCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationStateRasterizationOrderAMD-rasterizationOrder-parameter", "rasterizationOrder must be a valid VkRasterizationOrderAMD value", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationStateRasterizationOrderAMD-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationStateStreamCreateInfoEXT-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationStateStreamCreateInfoEXT-geometryStreams-02324", "VkPhysicalDeviceTransformFeedbackFeaturesEXT::geometryStreams must be enabled", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationStateStreamCreateInfoEXT-rasterizationStream-02325", "rasterizationStream must be less than VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackStreams", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationStateStreamCreateInfoEXT-rasterizationStream-02326", "rasterizationStream must be zero if VkPhysicalDeviceTransformFeedbackPropertiesEXT::transformFeedbackRasterizationStreamSelect is VK_FALSE", "1.2-extensions"},
+ {"VUID-VkPipelineRasterizationStateStreamCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkPipelineRepresentativeFragmentTestStateCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkPipelineSampleLocationsStateCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkPipelineSampleLocationsStateCreateInfoEXT-sampleLocationsInfo-parameter", "sampleLocationsInfo must be a valid VkSampleLocationsInfoEXT structure", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-flags-02758", "If flags has both the VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT and VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT flags set, the local workgroup size in the X dimension of the pipeline must be a multiple of maxSubgroupSize", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-flags-02759", "If flags has the VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT flag set and flags does not have the VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT flag set and no VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT structure is included in the pNext chain, the local workgroup size in the X dimension of the pipeline must be a multiple of subgroupSize", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-flags-02784", "If flags has the VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT flag set, the subgroupSizeControl feature must be enabled", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-flags-02785", "If flags has the VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT flag set, the computeFullSubgroups feature must be enabled", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-flags-parameter", "flags must be a valid combination of VkPipelineShaderStageCreateFlagBits values", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-maxClipDistances-00708", "If the identified entry point includes any variable in its interface that is declared with the ClipDistance BuiltIn decoration, that variable must not have an array size greater than VkPhysicalDeviceLimits::maxClipDistances", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-maxCombinedClipAndCullDistances-00710", "If the identified entry point includes any variables in its interface that are declared with the ClipDistance or CullDistance BuiltIn decoration, those variables must not have array sizes which sum to more than VkPhysicalDeviceLimits::maxCombinedClipAndCullDistances", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-maxCullDistances-00709", "If the identified entry point includes any variable in its interface that is declared with the CullDistance BuiltIn decoration, that variable must not have an array size greater than VkPhysicalDeviceLimits::maxCullDistances", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-maxSampleMaskWords-00711", "If the identified entry point includes any variable in its interface that is declared with the SampleMask BuiltIn decoration, that variable must not have an array size greater than VkPhysicalDeviceLimits::maxSampleMaskWords", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-module-parameter", "module must be a valid VkShaderModule handle", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-pName-00707", "pName must be the name of an OpEntryPoint in module with an execution model that matches stage", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-pName-parameter", "pName must be a null-terminated UTF-8 string", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-pNext-02754", "If a VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT structure is included in the pNext chain, flags must not have the VK_PIPELINE_SHADER_STAGE_CREATE_ALLOW_VARYING_SUBGROUP_SIZE_BIT_EXT flag set", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-pNext-02755", "If a VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT structure is included in the pNext chain, the subgroupSizeControl feature must be enabled, and stage must be a valid bit specified in requiredSubgroupSizeStages", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-pNext-02756", "If a VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT structure is included in the pNext chain and stage is VK_SHADER_STAGE_COMPUTE_BIT, the local workgroup size of the shader must be less than or equal to the product of VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT::requiredSubgroupSize and maxComputeWorkgroupSubgroups", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-pNext-02757", "If a VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT structure is included in the pNext chain, and flags has the VK_PIPELINE_SHADER_STAGE_CREATE_REQUIRE_FULL_SUBGROUPS_BIT_EXT flag set, the local workgroup size in the X dimension of the pipeline must be a multiple of VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT::requiredSubgroupSize", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-pSpecializationInfo-parameter", "If pSpecializationInfo is not NULL, pSpecializationInfo must be a valid pointer to a valid VkSpecializationInfo structure", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-stage-00704", "If the geometry shaders feature is not enabled, stage must not be VK_SHADER_STAGE_GEOMETRY_BIT", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-stage-00705", "If the tessellation shaders feature is not enabled, stage must not be VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT or VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-stage-00706", "stage must not be VK_SHADER_STAGE_ALL_GRAPHICS, or VK_SHADER_STAGE_ALL", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-stage-00712", "If stage is VK_SHADER_STAGE_VERTEX_BIT, the identified entry point must not include any input variable in its interface that is decorated with CullDistance", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-stage-00713", "If stage is VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT or VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, and the identified entry point has an OpExecutionMode instruction that specifies a patch size with OutputVertices, the patch size must be greater than 0 and less than or equal to VkPhysicalDeviceLimits::maxTessellationPatchSize", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-stage-00714", "If stage is VK_SHADER_STAGE_GEOMETRY_BIT, the identified entry point must have an OpExecutionMode instruction that specifies a maximum output vertex count that is greater than 0 and less than or equal to VkPhysicalDeviceLimits::maxGeometryOutputVertices", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-stage-00715", "If stage is VK_SHADER_STAGE_GEOMETRY_BIT, the identified entry point must have an OpExecutionMode instruction that specifies an invocation count that is greater than 0 and less than or equal to VkPhysicalDeviceLimits::maxGeometryShaderInvocations", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-stage-00718", "If stage is VK_SHADER_STAGE_FRAGMENT_BIT, the identified entry point must not include any output variables in its interface decorated with CullDistance", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-stage-00719", "If stage is VK_SHADER_STAGE_FRAGMENT_BIT, and the identified entry point writes to FragDepth in any execution path, it must write to FragDepth in all execution paths", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-stage-01511", "If stage is VK_SHADER_STAGE_FRAGMENT_BIT, and the identified entry point writes to FragStencilRefEXT in any execution path, it must write to FragStencilRefEXT in all execution paths", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-stage-02091", "If the mesh shader feature is not enabled, stage must not be VK_SHADER_STAGE_MESH_BIT_NV", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-stage-02092", "If the task shader feature is not enabled, stage must not be VK_SHADER_STAGE_TASK_BIT_NV", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-stage-02093", "If stage is VK_SHADER_STAGE_MESH_BIT_NV, the identified entry point must have an OpExecutionMode instruction that specifies a maximum output vertex count, OutputVertices, that is greater than 0 and less than or equal to VkPhysicalDeviceMeshShaderPropertiesNV::maxMeshOutputVertices", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-stage-02094", "If stage is VK_SHADER_STAGE_MESH_BIT_NV, the identified entry point must have an OpExecutionMode instruction that specifies a maximum output primitive count, OutputPrimitivesNV, that is greater than 0 and less than or equal to VkPhysicalDeviceMeshShaderPropertiesNV::maxMeshOutputPrimitives", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-stage-02596", "If stage is a vertex processing stage, and the identified entry point writes to Layer for any primitive, it must write the same value to Layer for all vertices of a given primitive", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-stage-02597", "If stage is a vertex processing stage, and the identified entry point writes to ViewportIndex for any primitive, it must write the same value to ViewportIndex for all vertices of a given primitive", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageCreateInfo-stage-parameter", "stage must be a valid VkShaderStageFlagBits value", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT-requiredSubgroupSize-02760", "requiredSubgroupSize must be a power-of-two integer", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT-requiredSubgroupSize-02761", "requiredSubgroupSize must be greater or equal to minSubgroupSize", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT-requiredSubgroupSize-02762", "requiredSubgroupSize must be less than or equal to maxSubgroupSize", "1.2-extensions"},
+ {"VUID-VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkPipelineTessellationDomainOriginStateCreateInfo-domainOrigin-parameter", "domainOrigin must be a valid VkTessellationDomainOrigin value", "1.2-extensions"},
+ {"VUID-VkPipelineTessellationDomainOriginStateCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkPipelineTessellationStateCreateInfo-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkPipelineTessellationStateCreateInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkPipelineTessellationDomainOriginStateCreateInfo", "1.2-extensions"},
+ {"VUID-VkPipelineTessellationStateCreateInfo-patchControlPoints-01214", "patchControlPoints must be greater than zero and less than or equal to VkPhysicalDeviceLimits::maxTessellationPatchSize", "1.2-extensions"},
+ {"VUID-VkPipelineTessellationStateCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkPipelineTessellationStateCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-pVertexBindingDivisors-parameter", "pVertexBindingDivisors must be a valid pointer to an array of vertexBindingDivisorCount VkVertexInputBindingDivisorDescriptionEXT structures", "1.2-extensions"},
+ {"VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkPipelineVertexInputDivisorStateCreateInfoEXT-vertexBindingDivisorCount-arraylength", "vertexBindingDivisorCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkPipelineVertexInputStateCreateInfo-binding-00615", "For every binding specified by each element of pVertexAttributeDescriptions, a VkVertexInputBindingDescription must exist in pVertexBindingDescriptions with the same value of binding", "1.2-extensions"},
+ {"VUID-VkPipelineVertexInputStateCreateInfo-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkPipelineVertexInputStateCreateInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkPipelineVertexInputDivisorStateCreateInfoEXT", "1.2-extensions"},
+ {"VUID-VkPipelineVertexInputStateCreateInfo-pVertexAttributeDescriptions-00617", "All elements of pVertexAttributeDescriptions must describe distinct attribute locations", "1.2-extensions"},
+ {"VUID-VkPipelineVertexInputStateCreateInfo-pVertexAttributeDescriptions-parameter", "If vertexAttributeDescriptionCount is not 0, pVertexAttributeDescriptions must be a valid pointer to an array of vertexAttributeDescriptionCount valid VkVertexInputAttributeDescription structures", "1.2-extensions"},
+ {"VUID-VkPipelineVertexInputStateCreateInfo-pVertexBindingDescriptions-00616", "All elements of pVertexBindingDescriptions must describe distinct binding numbers", "1.2-extensions"},
+ {"VUID-VkPipelineVertexInputStateCreateInfo-pVertexBindingDescriptions-parameter", "If vertexBindingDescriptionCount is not 0, pVertexBindingDescriptions must be a valid pointer to an array of vertexBindingDescriptionCount valid VkVertexInputBindingDescription structures", "1.2-extensions"},
+ {"VUID-VkPipelineVertexInputStateCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkPipelineVertexInputStateCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkPipelineVertexInputStateCreateInfo-vertexAttributeDescriptionCount-00614", "vertexAttributeDescriptionCount must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputAttributes", "1.2-extensions"},
+ {"VUID-VkPipelineVertexInputStateCreateInfo-vertexBindingDescriptionCount-00613", "vertexBindingDescriptionCount must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings", "1.2-extensions"},
+ {"VUID-VkPipelineViewportCoarseSampleOrderStateCreateInfoNV-pCustomSampleOrders-02234", "The array pCustomSampleOrders must not contain two structures with matching values for both the shadingRate and sampleCount members", "1.2-extensions"},
+ {"VUID-VkPipelineViewportCoarseSampleOrderStateCreateInfoNV-pCustomSampleOrders-parameter", "If customSampleOrderCount is not 0, pCustomSampleOrders must be a valid pointer to an array of customSampleOrderCount valid VkCoarseSampleOrderCustomNV structures", "1.2-extensions"},
+ {"VUID-VkPipelineViewportCoarseSampleOrderStateCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkPipelineViewportCoarseSampleOrderStateCreateInfoNV-sampleOrderType-02072", "If sampleOrderType is not VK_COARSE_SAMPLE_ORDER_TYPE_CUSTOM_NV, customSamplerOrderCount must be 0", "1.2-extensions"},
+ {"VUID-VkPipelineViewportCoarseSampleOrderStateCreateInfoNV-sampleOrderType-parameter", "sampleOrderType must be a valid VkCoarseSampleOrderTypeNV value", "1.2-extensions"},
+ {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027", "If the multiple viewports feature is not enabled, exclusiveScissorCount must be 0 or 1", "1.2-extensions"},
+ {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02028", "exclusiveScissorCount must be less than or equal to VkPhysicalDeviceLimits::maxViewports", "1.2-extensions"},
+ {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029", "exclusiveScissorCount must be 0 or identical to the viewportCount member of VkPipelineViewportStateCreateInfo", "1.2-extensions"},
+ {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-shadingRateImageEnable-02056", "If shadingRateImageEnable is VK_TRUE, viewportCount must be equal to the viewportCount member of VkPipelineViewportStateCreateInfo", "1.2-extensions"},
+ {"VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-viewportCount-02054", "If the multiple viewports feature is not enabled, viewportCount must be 0 or 1", "1.2-extensions"},
+ {"VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-viewportCount-02055", "viewportCount must be less than or equal to VkPhysicalDeviceLimits::maxViewports", "1.2-extensions"},
+ {"VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-viewportCount-arraylength", "viewportCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkPipelineViewportStateCreateInfo-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkPipelineViewportStateCreateInfo-offset-02822", "Evaluation of (offset.x + extent.width) must not cause a signed integer addition overflow for any element of pScissors", "1.2-extensions"},
+ {"VUID-VkPipelineViewportStateCreateInfo-offset-02823", "Evaluation of (offset.y + extent.height) must not cause a signed integer addition overflow for any element of pScissors", "1.2-extensions"},
+ {"VUID-VkPipelineViewportStateCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkPipelineViewportCoarseSampleOrderStateCreateInfoNV, VkPipelineViewportExclusiveScissorStateCreateInfoNV, VkPipelineViewportShadingRateImageStateCreateInfoNV, VkPipelineViewportSwizzleStateCreateInfoNV, or VkPipelineViewportWScalingStateCreateInfoNV", "1.2-extensions"},
+ {"VUID-VkPipelineViewportStateCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkPipelineViewportStateCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkPipelineViewportStateCreateInfo-scissorCount-01217", "If the multiple viewports feature is not enabled, scissorCount must be 1", "1.2-extensions"},
+ {"VUID-VkPipelineViewportStateCreateInfo-scissorCount-01219", "scissorCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive", "1.2-extensions"},
+ {"VUID-VkPipelineViewportStateCreateInfo-scissorCount-01220", "scissorCount and viewportCount must be identical", "1.2-extensions"},
+ {"VUID-VkPipelineViewportStateCreateInfo-scissorCount-arraylength", "scissorCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkPipelineViewportStateCreateInfo-viewportCount-01216", "If the multiple viewports feature is not enabled, viewportCount must be 1", "1.2-extensions"},
+ {"VUID-VkPipelineViewportStateCreateInfo-viewportCount-01218", "viewportCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive", "1.2-extensions"},
+ {"VUID-VkPipelineViewportStateCreateInfo-viewportCount-arraylength", "viewportCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726", "If the viewportWScalingEnable member of a VkPipelineViewportWScalingStateCreateInfoNV structure included in the pNext chain is VK_TRUE, the viewportCount member of the VkPipelineViewportWScalingStateCreateInfoNV structure must be equal to viewportCount", "1.2-extensions"},
+ {"VUID-VkPipelineViewportStateCreateInfo-x-02821", "The x and y members of offset member of any element of pScissors must be greater than or equal to 0", "1.2-extensions"},
+ {"VUID-VkPipelineViewportSwizzleStateCreateInfoNV-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkPipelineViewportSwizzleStateCreateInfoNV-pViewportSwizzles-parameter", "pViewportSwizzles must be a valid pointer to an array of viewportCount valid VkViewportSwizzleNV structures", "1.2-extensions"},
+ {"VUID-VkPipelineViewportSwizzleStateCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkPipelineViewportSwizzleStateCreateInfoNV-viewportCount-01215", "viewportCount must match the viewportCount set in VkPipelineViewportStateCreateInfo", "1.2-extensions"},
+ {"VUID-VkPipelineViewportSwizzleStateCreateInfoNV-viewportCount-arraylength", "viewportCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkPipelineViewportWScalingStateCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkPipelineViewportWScalingStateCreateInfoNV-viewportCount-arraylength", "viewportCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkPresentFrameTokenGGP-frameToken-02680", "frameToken must be a valid GgpFrameToken", "1.2-extensions"},
+ {"VUID-VkPresentFrameTokenGGP-sType-sType", "sType must be VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP", "1.2-extensions"},
+ {"VUID-VkPresentInfoKHR-commonparent", "Both of the elements of pSwapchains, and the elements of pWaitSemaphores that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkInstance", "1.2-extensions"},
+ {"VUID-VkPresentInfoKHR-pImageIndices-01296", "Each element of pImageIndices must be the index of a presentable image acquired from the swapchain specified by the corresponding element of the pSwapchains array, and the presented image subresource must be in the VK_IMAGE_LAYOUT_PRESENT_SRC_KHR layout at the time the operation is executed on a VkDevice", "default"},
+ {"VUID-VkPresentInfoKHR-pImageIndices-01430", "Each element of pImageIndices must be the index of a presentable image acquired from the swapchain specified by the corresponding element of the pSwapchains array, and the presented image subresource must be in the VK_IMAGE_LAYOUT_PRESENT_SRC_KHR or VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR layout at the time the operation is executed on a VkDevice", "1.2-extensions"},
+ {"VUID-VkPresentInfoKHR-pImageIndices-parameter", "pImageIndices must be a valid pointer to an array of swapchainCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkPresentInfoKHR-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkDeviceGroupPresentInfoKHR, VkDisplayPresentInfoKHR, VkPresentFrameTokenGGP, VkPresentRegionsKHR, or VkPresentTimesInfoGOOGLE", "1.2-extensions"},
+ {"VUID-VkPresentInfoKHR-pResults-parameter", "If pResults is not NULL, pResults must be a valid pointer to an array of swapchainCount VkResult values", "1.2-extensions"},
+ {"VUID-VkPresentInfoKHR-pSwapchains-parameter", "pSwapchains must be a valid pointer to an array of swapchainCount valid VkSwapchainKHR handles", "1.2-extensions"},
+ {"VUID-VkPresentInfoKHR-pWaitSemaphores-03269", "All elements of the pWaitSemaphores must have a VkSemaphoreType of VK_SEMAPHORE_TYPE_BINARY", "1.2-extensions"},
+ {"VUID-VkPresentInfoKHR-pWaitSemaphores-parameter", "If waitSemaphoreCount is not 0, pWaitSemaphores must be a valid pointer to an array of waitSemaphoreCount valid VkSemaphore handles", "1.2-extensions"},
+ {"VUID-VkPresentInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PRESENT_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkPresentInfoKHR-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkPresentInfoKHR-swapchainCount-arraylength", "swapchainCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkPresentRegionKHR-pRectangles-parameter", "If rectangleCount is not 0, and pRectangles is not NULL, pRectangles must be a valid pointer to an array of rectangleCount valid VkRectLayerKHR structures", "1.2-extensions"},
+ {"VUID-VkPresentRegionsKHR-pRegions-parameter", "If pRegions is not NULL, pRegions must be a valid pointer to an array of swapchainCount valid VkPresentRegionKHR structures", "1.2-extensions"},
+ {"VUID-VkPresentRegionsKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR", "1.2-extensions"},
+ {"VUID-VkPresentRegionsKHR-swapchainCount-01260", "swapchainCount must be the same value as VkPresentInfoKHR::swapchainCount, where VkPresentInfoKHR is included in the pNext chain of this VkPresentRegionsKHR structure", "1.2-extensions"},
+ {"VUID-VkPresentRegionsKHR-swapchainCount-arraylength", "swapchainCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkPresentTimesInfoGOOGLE-pTimes-parameter", "If pTimes is not NULL, pTimes must be a valid pointer to an array of swapchainCount VkPresentTimeGOOGLE structures", "1.2-extensions"},
+ {"VUID-VkPresentTimesInfoGOOGLE-sType-sType", "sType must be VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE", "1.2-extensions"},
+ {"VUID-VkPresentTimesInfoGOOGLE-swapchainCount-01247", "swapchainCount must be the same value as VkPresentInfoKHR::swapchainCount, where VkPresentInfoKHR is included in the pNext chain of this VkPresentTimesInfoGOOGLE structure", "1.2-extensions"},
+ {"VUID-VkPresentTimesInfoGOOGLE-swapchainCount-arraylength", "swapchainCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkPrivateDataSlotCreateInfoEXT-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkPrivateDataSlotCreateInfoEXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkPrivateDataSlotCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_PRIVATE_DATA_SLOT_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkProtectedSubmitInfo-protectedSubmit-01816", "If the protected memory feature is not enabled, protectedSubmit must not be VK_TRUE", "1.2-extensions"},
+ {"VUID-VkProtectedSubmitInfo-protectedSubmit-01817", "If protectedSubmit is VK_TRUE, then each element of the pCommandBuffers array must be a protected command buffer", "1.2-extensions"},
+ {"VUID-VkProtectedSubmitInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO", "1.2-extensions"},
+ {"VUID-VkPushConstantRange-offset-00294", "offset must be less than VkPhysicalDeviceLimits::maxPushConstantsSize", "1.2-extensions"},
+ {"VUID-VkPushConstantRange-offset-00295", "offset must be a multiple of 4", "1.2-extensions"},
+ {"VUID-VkPushConstantRange-size-00296", "size must be greater than 0", "1.2-extensions"},
+ {"VUID-VkPushConstantRange-size-00297", "size must be a multiple of 4", "1.2-extensions"},
+ {"VUID-VkPushConstantRange-size-00298", "size must be less than or equal to VkPhysicalDeviceLimits::maxPushConstantsSize minus offset", "1.2-extensions"},
+ {"VUID-VkPushConstantRange-stageFlags-parameter", "stageFlags must be a valid combination of VkShaderStageFlagBits values", "1.2-extensions"},
+ {"VUID-VkPushConstantRange-stageFlags-requiredbitmask", "stageFlags must not be 0", "1.2-extensions"},
+ {"VUID-VkQueryPoolCreateInfo-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkQueryPoolCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkQueryPoolPerformanceCreateInfoKHR or VkQueryPoolPerformanceQueryCreateInfoINTEL", "1.2-extensions"},
+ {"VUID-VkQueryPoolCreateInfo-queryCount-02763", "queryCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkQueryPoolCreateInfo-queryType-00791", "If the pipeline statistics queries feature is not enabled, queryType must not be VK_QUERY_TYPE_PIPELINE_STATISTICS", "1.2-extensions"},
+ {"VUID-VkQueryPoolCreateInfo-queryType-00792", "If queryType is VK_QUERY_TYPE_PIPELINE_STATISTICS, pipelineStatistics must be a valid combination of VkQueryPipelineStatisticFlagBits values", "1.2-extensions"},
+ {"VUID-VkQueryPoolCreateInfo-queryType-03222", "If queryType is VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, the pNext chain must include a structure of type VkQueryPoolPerformanceCreateInfoKHR", "1.2-extensions"},
+ {"VUID-VkQueryPoolCreateInfo-queryType-parameter", "queryType must be a valid VkQueryType value", "1.2-extensions"},
+ {"VUID-VkQueryPoolCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkQueryPoolCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkQueryPoolPerformanceCreateInfoKHR-counterIndexCount-arraylength", "counterIndexCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkQueryPoolPerformanceCreateInfoKHR-pCounterIndices-03321", "Each element of pCounterIndices must be in the range of counters reported by vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR for the queue family specified in queueFamilyIndex", "1.2-extensions"},
+ {"VUID-VkQueryPoolPerformanceCreateInfoKHR-pCounterIndices-parameter", "pCounterIndices must be a valid pointer to an array of counterIndexCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkQueryPoolPerformanceCreateInfoKHR-performanceCounterQueryPools-03237", "The performanceCounterQueryPools feature must be enabled", "1.2-extensions"},
+ {"VUID-VkQueryPoolPerformanceCreateInfoKHR-queueFamilyIndex-03236", "queueFamilyIndex must be a valid queue family index of the device", "1.2-extensions"},
+ {"VUID-VkQueryPoolPerformanceCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkQueryPoolPerformanceQueryCreateInfoINTEL-performanceCountersSampling-parameter", "performanceCountersSampling must be a valid VkQueryPoolSamplingModeINTEL value", "1.2-extensions"},
+ {"VUID-VkQueryPoolPerformanceQueryCreateInfoINTEL-sType-sType", "sType must be VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL", "1.2-extensions"},
+ {"VUID-VkQueueFamilyCheckpointPropertiesNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV", "1.2-extensions"},
+ {"VUID-VkQueueFamilyProperties2-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkQueueFamilyCheckpointPropertiesNV", "1.2-extensions"},
+ {"VUID-VkQueueFamilyProperties2-sType-sType", "sType must be VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2", "1.2-extensions"},
+ {"VUID-VkQueueFamilyProperties2-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-commonparent", "Both of basePipelineHandle, and layout that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-flags-02904", "flags must not include VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-flags-03421", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineIndex is -1, basePipelineHandle must be a valid handle to a ray tracing VkPipeline", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-flags-03422", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineHandle is VK_NULL_HANDLE, basePipelineIndex must be a valid index into the calling command's pCreateInfos parameter", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-flags-03423", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineIndex is not -1, basePipelineHandle must be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-flags-03424", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineHandle is not VK_NULL_HANDLE, basePipelineIndex must be -1", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-flags-03465", "If flags includes VK_PIPELINE_CREATE_LIBRARY_BIT_KHR, pLibraryInterface must not be NULL", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-flags-03470", "If flags includes VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR, for any element of pGroups with a type of VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR or VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR, the anyHitShader of that element must not be VK_SHADER_UNUSED_KHR", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-flags-03471", "If flags includes VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, for any element of pGroups with a type of VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR or VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR, the closestHitShader of that element must not be VK_SHADER_UNUSED_KHR", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-flags-parameter", "flags must be a valid combination of VkPipelineCreateFlagBits values", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-layout-03427", "layout must be consistent with all shaders specified in pStages", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-layout-03428", "The number of resources in layout accessible to each shader stage that is used by the pipeline must be less than or equal to VkPhysicalDeviceLimits::maxPerStageResources", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-layout-parameter", "layout must be a valid VkPipelineLayout handle", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-libraries-02958", "If libraries.libraryCount is zero, then stageCount must not be zero", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-libraries-02959", "If libraries.libraryCount is zero, then groupCount must not be zero", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-libraries-parameter", "libraries must be a valid VkPipelineLibraryCreateInfoKHR structure", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-libraryCount-03466", "If the libraryCount member of libraries is greater than 0, pLibraryInterface must not be NULL", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-maxRecursionDepth-03464", "maxRecursionDepth must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxRecursionDepth", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-pGroups-parameter", "If groupCount is not 0, pGroups must be a valid pointer to an array of groupCount valid VkRayTracingShaderGroupCreateInfoKHR structures", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-pLibraries-03467", "Each element of the pLibraries member of libraries must have been created with the value of maxRecursionDepth equal to that in this pipeline", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-pLibraries-03468", "Each element of the pLibraries member of libraries must have been created with a layout that is compatible with the layout in this pipeline", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-pLibraries-03469", "Each element of the pLibraries member of libraries must have been created with values of the maxPayloadSize, maxAttributeSize, and maxCallableSize members of pLibraryInterface equal to those in this pipeline", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-pLibraryInterface-parameter", "If pLibraryInterface is not NULL, pLibraryInterface must be a valid pointer to a valid VkRayTracingPipelineInterfaceCreateInfoKHR structure", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkDeferredOperationInfoKHR or VkPipelineCreationFeedbackCreateInfoEXT", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-pStages-03426", "The shader code for the entry points identified by pStages, and the rest of the state identified by this structure must adhere to the pipeline linking rules described in the Shader Interfaces chapter", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-pStages-parameter", "If stageCount is not 0, pStages must be a valid pointer to an array of stageCount valid VkPipelineShaderStageCreateInfo structures", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-pipelineCreationCacheControl-02905", "If the pipelineCreationCacheControl feature is not enabled, flags must not include VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT or VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-rayTracingPrimitiveCulling-03472", "If the rayTracingPrimitiveCulling feature is not enabled, flags must not include VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-rayTracingPrimitiveCulling-03473", "If the rayTracingPrimitiveCulling feature is not enabled, flags must not include VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoKHR-stage-03425", "The stage member of at least one element of pStages must be VK_SHADER_STAGE_RAYGEN_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-commonparent", "Both of basePipelineHandle, and layout that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-flags-02904", "flags must not include VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-flags-02957", "flags must not include both VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV and VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT at the same time", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-flags-03421", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineIndex is -1, basePipelineHandle must be a valid handle to a ray tracing VkPipeline", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-flags-03422", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineHandle is VK_NULL_HANDLE, basePipelineIndex must be a valid index into the calling command's pCreateInfos parameter", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-flags-03423", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineIndex is not -1, basePipelineHandle must be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-flags-03424", "If flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and basePipelineHandle is not VK_NULL_HANDLE, basePipelineIndex must be -1", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-flags-03456", "flags must not include VK_PIPELINE_CREATE_LIBRARY_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-flags-03458", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-flags-03459", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-flags-03460", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-flags-03461", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-flags-03462", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-flags-03463", "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-flags-parameter", "flags must be a valid combination of VkPipelineCreateFlagBits values", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-groupCount-arraylength", "groupCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-layout-03427", "layout must be consistent with all shaders specified in pStages", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-layout-03428", "The number of resources in layout accessible to each shader stage that is used by the pipeline must be less than or equal to VkPhysicalDeviceLimits::maxPerStageResources", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-layout-parameter", "layout must be a valid VkPipelineLayout handle", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-maxRecursionDepth-03457", "maxRecursionDepth must be less than or equal to VkPhysicalDeviceRayTracingPropertiesNV::maxRecursionDepth", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-pGroups-parameter", "pGroups must be a valid pointer to an array of groupCount valid VkRayTracingShaderGroupCreateInfoNV structures", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkPipelineCreationFeedbackCreateInfoEXT", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-pStages-03426", "The shader code for the entry points identified by pStages, and the rest of the state identified by this structure must adhere to the pipeline linking rules described in the Shader Interfaces chapter", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-pStages-parameter", "pStages must be a valid pointer to an array of stageCount valid VkPipelineShaderStageCreateInfo structures", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-pipelineCreationCacheControl-02905", "If the pipelineCreationCacheControl feature is not enabled, flags must not include VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT or VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-stage-03425", "The stage member of at least one element of pStages must be VK_SHADER_STAGE_RAYGEN_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineCreateInfoNV-stageCount-arraylength", "stageCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineInterfaceCreateInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkRayTracingPipelineInterfaceCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_INTERFACE_CREATE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkRayTracingShaderGroupCreateInfoKHR-anyHitShader-03479", "anyHitShader must be either VK_SHADER_UNUSED_KHR or a valid index into VkRayTracingPipelineCreateInfoKHR::pStages referring to a shader of VK_SHADER_STAGE_ANY_HIT_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkRayTracingShaderGroupCreateInfoKHR-closestHitShader-03478", "closestHitShader must be either VK_SHADER_UNUSED_KHR or a valid index into VkRayTracingPipelineCreateInfoKHR::pStages referring to a shader of VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkRayTracingShaderGroupCreateInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkRayTracingShaderGroupCreateInfoKHR-rayTracingShaderGroupHandleCaptureReplayMixed-03480", "If VkPhysicalDeviceRayTracingFeaturesKHR::rayTracingShaderGroupHandleCaptureReplayMixed is VK_FALSE then pShaderGroupCaptureReplayHandle must not be provided if it has not been provided on a previous call to ray tracing pipeline creation", "1.2-extensions"},
+ {"VUID-VkRayTracingShaderGroupCreateInfoKHR-rayTracingShaderGroupHandleCaptureReplayMixed-03481", "If VkPhysicalDeviceRayTracingFeaturesKHR::rayTracingShaderGroupHandleCaptureReplayMixed is VK_FALSE then the caller must guarantee that no ray tracing pipeline creation commands with pShaderGroupCaptureReplayHandle provided execute simultaneously with ray tracing pipeline creation commands without pShaderGroupCaptureReplayHandle provided", "1.2-extensions"},
+ {"VUID-VkRayTracingShaderGroupCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03474", "If type is VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR then generalShader must be a valid index into VkRayTracingPipelineCreateInfoKHR::pStages referring to a shader of VK_SHADER_STAGE_RAYGEN_BIT_KHR, VK_SHADER_STAGE_MISS_BIT_KHR, or VK_SHADER_STAGE_CALLABLE_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03475", "If type is VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR then closestHitShader, anyHitShader, and intersectionShader must be VK_SHADER_UNUSED_KHR", "1.2-extensions"},
+ {"VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03476", "If type is VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR then intersectionShader must be a valid index into VkRayTracingPipelineCreateInfoKHR::pStages referring to a shader of VK_SHADER_STAGE_INTERSECTION_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkRayTracingShaderGroupCreateInfoKHR-type-03477", "If type is VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR then intersectionShader must be VK_SHADER_UNUSED_KHR", "1.2-extensions"},
+ {"VUID-VkRayTracingShaderGroupCreateInfoKHR-type-parameter", "type must be a valid VkRayTracingShaderGroupTypeKHR value", "1.2-extensions"},
+ {"VUID-VkRayTracingShaderGroupCreateInfoNV-anyHitShader-02418", "anyHitShader must be either VK_SHADER_UNUSED_NV or a valid index into VkRayTracingPipelineCreateInfoNV::pStages referring to a shader of VK_SHADER_STAGE_ANY_HIT_BIT_NV", "1.2-extensions"},
+ {"VUID-VkRayTracingShaderGroupCreateInfoNV-closestHitShader-02417", "closestHitShader must be either VK_SHADER_UNUSED_NV or a valid index into VkRayTracingPipelineCreateInfoNV::pStages referring to a shader of VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV", "1.2-extensions"},
+ {"VUID-VkRayTracingShaderGroupCreateInfoNV-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkRayTracingShaderGroupCreateInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkRayTracingShaderGroupCreateInfoNV-type-02413", "If type is VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV then generalShader must be a valid index into VkRayTracingPipelineCreateInfoNV::pStages referring to a shader of VK_SHADER_STAGE_RAYGEN_BIT_NV, VK_SHADER_STAGE_MISS_BIT_NV, or VK_SHADER_STAGE_CALLABLE_BIT_NV", "1.2-extensions"},
+ {"VUID-VkRayTracingShaderGroupCreateInfoNV-type-02414", "If type is VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV then closestHitShader, anyHitShader, and intersectionShader must be VK_SHADER_UNUSED_NV", "1.2-extensions"},
+ {"VUID-VkRayTracingShaderGroupCreateInfoNV-type-02415", "If type is VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_NV then intersectionShader must be a valid index into VkRayTracingPipelineCreateInfoNV::pStages referring to a shader of VK_SHADER_STAGE_INTERSECTION_BIT_NV", "1.2-extensions"},
+ {"VUID-VkRayTracingShaderGroupCreateInfoNV-type-02416", "If type is VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_NV then intersectionShader must be VK_SHADER_UNUSED_NV", "1.2-extensions"},
+ {"VUID-VkRayTracingShaderGroupCreateInfoNV-type-parameter", "type must be a valid VkRayTracingShaderGroupTypeKHR value", "1.2-extensions"},
+ {"VUID-VkRectLayerKHR-layer-01262", "layer must be less than the imageArrayLayers member of the VkSwapchainCreateInfoKHR structure passed to vkCreateSwapchainKHR", "1.2-extensions"},
+ {"VUID-VkRectLayerKHR-offset-01261", "The sum of offset and extent must be no greater than the imageExtent member of the VkSwapchainCreateInfoKHR structure passed to vkCreateSwapchainKHR", "1.2-extensions"},
+ {"VUID-VkRenderPassAttachmentBeginInfo-pAttachments-03218", "Each element of pAttachments must only specify a single mip level", "1.2-extensions"},
+ {"VUID-VkRenderPassAttachmentBeginInfo-pAttachments-03219", "Each element of pAttachments must have been created with the identity swizzle", "1.2-extensions"},
+ {"VUID-VkRenderPassAttachmentBeginInfo-pAttachments-04114", "Each element of pAttachments must have been created with VkImageViewCreateInfo::viewType not equal to VK_IMAGE_VIEW_TYPE_3D", "1.2-extensions"},
+ {"VUID-VkRenderPassAttachmentBeginInfo-pAttachments-parameter", "If attachmentCount is not 0, pAttachments must be a valid pointer to an array of attachmentCount valid VkImageView handles", "1.2-extensions"},
+ {"VUID-VkRenderPassAttachmentBeginInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-clearValueCount-00902", "clearValueCount must be greater than the largest attachment index in renderPass that specifies a loadOp (or stencilLoadOp, if the attachment has a depth/stencil format) of VK_ATTACHMENT_LOAD_OP_CLEAR", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-commonparent", "Both of framebuffer, and renderPass must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-framebuffer-02780", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that included VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR, each element of the pAttachments member of a VkRenderPassAttachmentBeginInfo structure included in the pNext chain must have been created on the same VkDevice as framebuffer and renderPass", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-framebuffer-03207", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that did not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, and the pNext chain includes a VkRenderPassAttachmentBeginInfo structure, its attachmentCount must be zero", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-framebuffer-03208", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that included VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, the attachmentCount of a VkRenderPassAttachmentBeginInfo structure included in the pNext chain must be equal to the value of VkFramebufferAttachmentsCreateInfo::attachmentImageInfoCount used to create framebuffer", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-framebuffer-03209", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that included VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the pAttachments member of a VkRenderPassAttachmentBeginInfo structure included in the pNext chain must be a VkImageView of an image created with a value of VkImageCreateInfo::flags equal to the flags member of the corresponding element of VkFramebufferAttachmentsCreateInfoKHR::pAttachments used to create framebuffer", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-framebuffer-03210", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that included VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the pAttachments member of a VkRenderPassAttachmentBeginInfo structure included in the pNext chain must be a VkImageView of an image created with a value of VkImageCreateInfo::usage equal to the usage member of the corresponding element of VkFramebufferAttachmentsCreateInfo::pAttachments used to create framebuffer", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-framebuffer-03211", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that included VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the pAttachments member of a VkRenderPassAttachmentBeginInfo structure included in the pNext chain must be a VkImageView with a width equal to the width member of the corresponding element of VkFramebufferAttachmentsCreateInfo::pAttachments used to create framebuffer", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-framebuffer-03212", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that included VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the pAttachments member of a VkRenderPassAttachmentBeginInfo structure included in the pNext chain must be a VkImageView with a height equal to the height member of the corresponding element of VkFramebufferAttachmentsCreateInfo::pAttachments used to create framebuffer", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-framebuffer-03213", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that included VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the pAttachments member of a VkRenderPassAttachmentBeginInfo structure included in the pNext chain must be a VkImageView of an image created with a value of VkImageViewCreateInfo::subresourceRange.layerCount equal to the layerCount member of the corresponding element of VkFramebufferAttachmentsCreateInfo::pAttachments used to create framebuffer", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-framebuffer-03214", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that included VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the pAttachments member of a VkRenderPassAttachmentBeginInfo structure included in the pNext chain must be a VkImageView of an image created with a value of VkImageFormatListCreateInfo::viewFormatCount equal to the viewFormatCount member of the corresponding element of VkFramebufferAttachmentsCreateInfo::pAttachments used to create framebuffer", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-framebuffer-03215", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that included VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the pAttachments member of a VkRenderPassAttachmentBeginInfo structure included in the pNext chain must be a VkImageView of an image created with a set of elements in VkImageFormatListCreateInfo::pViewFormats equal to the set of elements in the pViewFormats member of the corresponding element of VkFramebufferAttachmentsCreateInfo::pAttachments used to create framebuffer", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-framebuffer-03216", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that included VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the pAttachments member of a VkRenderPassAttachmentBeginInfo structure included in the pNext chain must be a VkImageView of an image created with a value of VkImageViewCreateInfo::format equal to the corresponding value of VkAttachmentDescription::format in renderPass", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-framebuffer-03217", "If framebuffer was created with a VkFramebufferCreateInfo::flags value that included VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, each element of the pAttachments member of a VkRenderPassAttachmentBeginInfo structure included in the pNext chain must be a VkImageView of an image created with a value of VkImageCreateInfo::samples equal to the corresponding value of VkAttachmentDescription::samples in renderPass", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-framebuffer-parameter", "framebuffer must be a valid VkFramebuffer handle", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-pClearValues-parameter", "If clearValueCount is not 0, pClearValues must be a valid pointer to an array of clearValueCount VkClearValue unions", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-pNext-02850", "If the pNext chain does not contain VkDeviceGroupRenderPassBeginInfo or its deviceRenderAreaCount member is equal to 0, renderArea.offset.x must be greater than or equal to 0", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-pNext-02851", "If the pNext chain does not contain VkDeviceGroupRenderPassBeginInfo or its deviceRenderAreaCount member is equal to 0, renderArea.offset.y must be greater than or equal to 0", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-pNext-02852", "If the pNext chain does not contain VkDeviceGroupRenderPassBeginInfo or its deviceRenderAreaCount member is equal to 0, renderArea.offset.x + renderArea.offset.width must be less than or equal to VkFramebufferCreateInfo::width the framebuffer was created with", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-pNext-02853", "If the pNext chain does not contain VkDeviceGroupRenderPassBeginInfo or its deviceRenderAreaCount member is equal to 0, renderArea.offset.y + renderArea.offset.height must be less than or equal to VkFramebufferCreateInfo::height the framebuffer was created with", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-pNext-02854", "If the pNext chain contains VkDeviceGroupRenderPassBeginInfo, the offset.x member of each element of pDeviceRenderAreas must be greater than or equal to 0", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-pNext-02855", "If the pNext chain contains VkDeviceGroupRenderPassBeginInfo, the offset.y member of each element of pDeviceRenderAreas must be greater than or equal to 0", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-pNext-02856", "If the pNext chain contains VkDeviceGroupRenderPassBeginInfo, offset.x + offset.width of each element of pDeviceRenderAreas must be less than or equal to VkFramebufferCreateInfo::width the framebuffer was created with", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-pNext-02857", "If the pNext chain contains VkDeviceGroupRenderPassBeginInfo, offset.y + offset.height of each element of pDeviceRenderAreas must be less than or equal to VkFramebufferCreateInfo::height the framebuffer was created with", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-pNext-02869", "If the pNext chain includes VkRenderPassTransformBeginInfoQCOM, renderArea.offset must equal (0,0)", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-pNext-02870", "If the pNext chain includes VkRenderPassTransformBeginInfoQCOM, renderArea.extent transformed by VkRenderPassTransformBeginInfoQCOM::transform must equal the framebuffer dimensions", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkDeviceGroupRenderPassBeginInfo, VkRenderPassAttachmentBeginInfo, VkRenderPassSampleLocationsBeginInfoEXT, or VkRenderPassTransformBeginInfoQCOM", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-renderArea-02846", "renderArea.offset.x must be greater than or equal to 0", "1.0"},
+ {"VUID-VkRenderPassBeginInfo-renderArea-02847", "renderArea.offset.y must be greater than or equal to 0", "1.0"},
+ {"VUID-VkRenderPassBeginInfo-renderArea-02848", "renderArea.offset.x + renderArea.offset.width must be less than or equal to VkFramebufferCreateInfo::width the framebuffer was created with", "1.0"},
+ {"VUID-VkRenderPassBeginInfo-renderArea-02849", "renderArea.offset.y + renderArea.offset.height must be less than or equal to VkFramebufferCreateInfo::height the framebuffer was created with", "1.0"},
+ {"VUID-VkRenderPassBeginInfo-renderPass-00904", "renderPass must be compatible with the renderPass member of the VkFramebufferCreateInfo structure specified when creating framebuffer", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-renderPass-parameter", "renderPass must be a valid VkRenderPass handle", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO", "1.2-extensions"},
+ {"VUID-VkRenderPassBeginInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-attachment-00834", "If the attachment member of any element of pInputAttachments, pColorAttachments, pResolveAttachments or pDepthStencilAttachment, or any element of pPreserveAttachments in any element of pSubpasses is not VK_ATTACHMENT_UNUSED, it must be less than attachmentCount", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-dstSubpass-02518", "The dstSubpass member of each element of pDependencies must be less than subpassCount", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-flags-parameter", "flags must be a valid combination of VkRenderPassCreateFlagBits values", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-pAttachments-00836", "For any member of pAttachments with a loadOp equal to VK_ATTACHMENT_LOAD_OP_CLEAR, the first use of that attachment must not specify a layout equal to VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL or VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-pAttachments-01566", "For any member of pAttachments with a loadOp equal to VK_ATTACHMENT_LOAD_OP_CLEAR, the first use of that attachment must not specify a layout equal to VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-pAttachments-01567", "For any member of pAttachments with a stencilLoadOp equal to VK_ATTACHMENT_LOAD_OP_CLEAR, the first use of that attachment must not specify a layout equal to VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-pAttachments-02511", "For any member of pAttachments with a stencilLoadOp equal to VK_ATTACHMENT_LOAD_OP_CLEAR, the first use of that attachment must not specify a layout equal to VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL or VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-pAttachments-parameter", "If attachmentCount is not 0, pAttachments must be a valid pointer to an array of attachmentCount valid VkAttachmentDescription structures", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-pDependencies-00837", "For any element of pDependencies, if the srcSubpass is not VK_SUBPASS_EXTERNAL, all stage flags included in the srcStageMask member of that dependency must be a pipeline stage supported by the pipeline identified by the pipelineBindPoint member of the source subpass", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-pDependencies-00838", "For any element of pDependencies, if the dstSubpass is not VK_SUBPASS_EXTERNAL, all stage flags included in the dstStageMask member of that dependency must be a pipeline stage supported by the pipeline identified by the pipelineBindPoint member of the destination subpass", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-pDependencies-parameter", "If dependencyCount is not 0, pDependencies must be a valid pointer to an array of dependencyCount valid VkSubpassDependency structures", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-pNext-01926", "If the pNext chain includes a VkRenderPassInputAttachmentAspectCreateInfo structure, the subpass member of each element of its pAspectReferences member must be less than subpassCount", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-pNext-01927", "If the pNext chain includes a VkRenderPassInputAttachmentAspectCreateInfo structure, the inputAttachmentIndex member of each element of its pAspectReferences member must be less than the value of inputAttachmentCount in the member of pSubpasses identified by its subpass member", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-pNext-01928", "If the pNext chain includes a VkRenderPassMultiviewCreateInfo structure, and its subpassCount member is not zero, that member must be equal to the value of subpassCount", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-pNext-01929", "If the pNext chain includes a VkRenderPassMultiviewCreateInfo structure, if its dependencyCount member is not zero, it must be equal to dependencyCount", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-pNext-01930", "If the pNext chain includes a VkRenderPassMultiviewCreateInfo structure, for each non-zero element of pViewOffsets, the srcSubpass and dstSubpass members of pDependencies at the same index must not be equal", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-pNext-01963", "If the pNext chain includes a VkRenderPassInputAttachmentAspectCreateInfo structure, for any element of the pInputAttachments member of any element of pSubpasses where the attachment member is not VK_ATTACHMENT_UNUSED, the aspectMask member of the corresponding element of VkRenderPassInputAttachmentAspectCreateInfo::pAspectReferences must only include aspects that are present in images of the format specified by the element of pAttachments at attachment", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-pNext-02512", "If the pNext chain includes a VkRenderPassMultiviewCreateInfo structure, for any element of pDependencies with a dependencyFlags member that does not include VK_DEPENDENCY_VIEW_LOCAL_BIT, the corresponding element of the pViewOffsets member of that VkRenderPassMultiviewCreateInfo instance must be 0", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-pNext-02513", "If the pNext chain includes a VkRenderPassMultiviewCreateInfo structure, elements of its pViewMasks member must either all be 0, or all not be 0", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-pNext-02514", "If the pNext chain includes a VkRenderPassMultiviewCreateInfo structure, and each element of its pViewMasks member is 0, the dependencyFlags member of each element of pDependencies must not include VK_DEPENDENCY_VIEW_LOCAL_BIT", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-pNext-02515", "If the pNext chain includes a VkRenderPassMultiviewCreateInfo structure, and each element of its pViewMasks member is 0, correlatedViewMaskCount must be 0", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-pNext-02516", "If the pNext chain includes a VkRenderPassMultiviewCreateInfo structure, each element of its pViewMask member must not have a bit set at an index greater than or equal to VkPhysicalDeviceLimits::maxFramebufferLayers", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkRenderPassFragmentDensityMapCreateInfoEXT, VkRenderPassInputAttachmentAspectCreateInfo, or VkRenderPassMultiviewCreateInfo", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-pSubpasses-parameter", "pSubpasses must be a valid pointer to an array of subpassCount valid VkSubpassDescription structures", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-srcSubpass-02517", "The srcSubpass member of each element of pDependencies must be less than subpassCount", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo-subpassCount-arraylength", "subpassCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-None-03049", "If any two subpasses operate on attachments with overlapping ranges of the same VkDeviceMemory object, and at least one subpass writes to that area of VkDeviceMemory, a subpass dependency must be included (either directly or via some intermediate subpasses) between them", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-attachment-02525", "If the attachment member of any element of the pInputAttachments member of any element of pSubpasses is not VK_ATTACHMENT_UNUSED, the aspectMask member of that element of pInputAttachments must only include aspects that are present in images of the format specified by the element of pAttachments specified by attachment", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-attachment-03050", "If the attachment member of any element of pInputAttachments, pColorAttachments, pResolveAttachments or pDepthStencilAttachment, or the attachment indexed by any element of pPreserveAttachments in any given element of pSubpasses is bound to a range of a VkDeviceMemory object that overlaps with any other attachment in any subpass (including the same subpass), the VkAttachmentDescription2 structures describing them must include VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT in flags", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-attachment-03051", "If the attachment member of any element of pInputAttachments, pColorAttachments, pResolveAttachments or pDepthStencilAttachment, or any element of pPreserveAttachments in any given element of pSubpasses is not VK_ATTACHMENT_UNUSED, it must be less than attachmentCount", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-dstSubpass-02527", "The dstSubpass member of each element of pDependencies must be less than subpassCount", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-flags-parameter", "flags must be a valid combination of VkRenderPassCreateFlagBits values", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-pAttachments-02522", "For any member of pAttachments with a loadOp equal to VK_ATTACHMENT_LOAD_OP_CLEAR, the first use of that attachment must not specify a layout equal to VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-pAttachments-02523", "For any member of pAttachments with a stencilLoadOp equal to VK_ATTACHMENT_LOAD_OP_CLEAR, the first use of that attachment must not specify a layout equal to VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-pAttachments-parameter", "If attachmentCount is not 0, pAttachments must be a valid pointer to an array of attachmentCount valid VkAttachmentDescription2 structures", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-pCorrelatedViewMasks-03056", "The set of bits included in any element of pCorrelatedViewMasks must not overlap with the set of bits included in any other element of pCorrelatedViewMasks", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-pCorrelatedViewMasks-parameter", "If correlatedViewMaskCount is not 0, pCorrelatedViewMasks must be a valid pointer to an array of correlatedViewMaskCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-pDependencies-03054", "For any element of pDependencies, if the srcSubpass is not VK_SUBPASS_EXTERNAL, all stage flags included in the srcStageMask member of that dependency must be a pipeline stage supported by the pipeline identified by the pipelineBindPoint member of the source subpass", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-pDependencies-03055", "For any element of pDependencies, if the dstSubpass is not VK_SUBPASS_EXTERNAL, all stage flags included in the dstStageMask member of that dependency must be a pipeline stage supported by the pipeline identified by the pipelineBindPoint member of the destination subpass", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-pDependencies-03060", "For any element of pDependencies where its srcSubpass member equals its dstSubpass member, if the viewMask member of the corresponding element of pSubpasses includes more than one bit, its dependencyFlags member must include VK_DEPENDENCY_VIEW_LOCAL_BIT", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-pDependencies-parameter", "If dependencyCount is not 0, pDependencies must be a valid pointer to an array of dependencyCount valid VkSubpassDependency2 structures", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkRenderPassFragmentDensityMapCreateInfoEXT", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-pSubpasses-parameter", "pSubpasses must be a valid pointer to an array of subpassCount valid VkSubpassDescription2 structures", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-sType-sType", "sType must be VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-srcSubpass-02526", "The srcSubpass member of each element of pDependencies must be less than subpassCount", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-subpassCount-arraylength", "subpassCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-viewMask-02524", "The viewMask member must not have a bit set at an index greater than or equal to VkPhysicalDeviceLimits::maxFramebufferLayers", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-viewMask-03057", "If the VkSubpassDescription2::viewMask member of all elements of pSubpasses is 0, correlatedViewMaskCount must be 0", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-viewMask-03058", "The VkSubpassDescription2::viewMask member of all elements of pSubpasses must either all be 0, or all not be 0", "1.2-extensions"},
+ {"VUID-VkRenderPassCreateInfo2-viewMask-03059", "If the VkSubpassDescription2::viewMask member of all elements of pSubpasses is 0, the dependencyFlags member of any element of pDependencies must not include VK_DEPENDENCY_VIEW_LOCAL_BIT", "1.2-extensions"},
+ {"VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02547", "If fragmentDensityMapAttachment is not VK_ATTACHMENT_UNUSED, fragmentDensityMapAttachment must be less than VkRenderPassCreateInfo::attachmentCount", "1.2-extensions"},
+ {"VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02548", "If fragmentDensityMapAttachment is not VK_ATTACHMENT_UNUSED, fragmentDensityMapAttachment must not be an element of VkSubpassDescription::pInputAttachments, VkSubpassDescription::pColorAttachments, VkSubpassDescription::pResolveAttachments, VkSubpassDescription::pDepthStencilAttachment, or VkSubpassDescription::pPreserveAttachments for any subpass", "1.2-extensions"},
+ {"VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02549", "If fragmentDensityMapAttachment is not VK_ATTACHMENT_UNUSED, layout must be equal to VK_IMAGE_LAYOUT_FRAGMENT_DENSITY_MAP_OPTIMAL_EXT, or VK_IMAGE_LAYOUT_GENERAL", "1.2-extensions"},
+ {"VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02550", "If fragmentDensityMapAttachment is not VK_ATTACHMENT_UNUSED, fragmentDensityMapAttachment must reference an attachment with a loadOp equal to VK_ATTACHMENT_LOAD_OP_LOAD or VK_ATTACHMENT_LOAD_OP_DONT_CARE", "1.2-extensions"},
+ {"VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-02551", "If fragmentDensityMapAttachment is not VK_ATTACHMENT_UNUSED, fragmentDensityMapAttachment must reference an attachment with a storeOp equal to VK_ATTACHMENT_STORE_OP_DONT_CARE", "1.2-extensions"},
+ {"VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-fragmentDensityMapAttachment-parameter", "fragmentDensityMapAttachment must be a valid VkAttachmentReference structure", "1.2-extensions"},
+ {"VUID-VkRenderPassFragmentDensityMapCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkRenderPassInputAttachmentAspectCreateInfo-aspectReferenceCount-arraylength", "aspectReferenceCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkRenderPassInputAttachmentAspectCreateInfo-pAspectReferences-parameter", "pAspectReferences must be a valid pointer to an array of aspectReferenceCount valid VkInputAttachmentAspectReference structures", "1.2-extensions"},
+ {"VUID-VkRenderPassInputAttachmentAspectCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-00841", "Each view index must not be set in more than one element of pCorrelationMasks", "1.2-extensions"},
+ {"VUID-VkRenderPassMultiviewCreateInfo-pCorrelationMasks-parameter", "If correlationMaskCount is not 0, pCorrelationMasks must be a valid pointer to an array of correlationMaskCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkRenderPassMultiviewCreateInfo-pViewMasks-parameter", "If subpassCount is not 0, pViewMasks must be a valid pointer to an array of subpassCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkRenderPassMultiviewCreateInfo-pViewOffsets-parameter", "If dependencyCount is not 0, pViewOffsets must be a valid pointer to an array of dependencyCount int32_t values", "1.2-extensions"},
+ {"VUID-VkRenderPassMultiviewCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkRenderPassSampleLocationsBeginInfoEXT-pAttachmentInitialSampleLocations-parameter", "If attachmentInitialSampleLocationsCount is not 0, pAttachmentInitialSampleLocations must be a valid pointer to an array of attachmentInitialSampleLocationsCount valid VkAttachmentSampleLocationsEXT structures", "1.2-extensions"},
+ {"VUID-VkRenderPassSampleLocationsBeginInfoEXT-pPostSubpassSampleLocations-parameter", "If postSubpassSampleLocationsCount is not 0, pPostSubpassSampleLocations must be a valid pointer to an array of postSubpassSampleLocationsCount valid VkSubpassSampleLocationsEXT structures", "1.2-extensions"},
+ {"VUID-VkRenderPassSampleLocationsBeginInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkRenderPassTransformBeginInfoQCOM-flags-02872", "The renderpass must have been created with VkRenderPassCreateInfo::flags containing VK_RENDER_PASS_CREATE_TRANSFORM_BIT_QCOM", "1.2-extensions"},
+ {"VUID-VkRenderPassTransformBeginInfoQCOM-sType-sType", "sType must be VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM", "1.2-extensions"},
+ {"VUID-VkRenderPassTransformBeginInfoQCOM-transform-02871", "transform must be VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR, VK_SURFACE_TRANSFORM_ROTATE_90_BIT_KHR, VK_SURFACE_TRANSFORM_ROTATE_180_BIT_KHR, or VK_SURFACE_TRANSFORM_ROTATE_270_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkSampleLocationsInfoEXT-pSampleLocations-parameter", "If sampleLocationsCount is not 0, pSampleLocations must be a valid pointer to an array of sampleLocationsCount VkSampleLocationEXT structures", "1.2-extensions"},
+ {"VUID-VkSampleLocationsInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkSampleLocationsInfoEXT-sampleLocationsCount-01527", "sampleLocationsCount must equal sampleLocationsPerPixel {times} sampleLocationGridSize.width {times} sampleLocationGridSize.height", "1.2-extensions"},
+ {"VUID-VkSampleLocationsInfoEXT-sampleLocationsPerPixel-01526", "sampleLocationsPerPixel must be a bit value that is set in VkPhysicalDeviceSampleLocationsPropertiesEXT::sampleLocationSampleCounts", "1.2-extensions"},
+ {"VUID-VkSampleLocationsInfoEXT-sampleLocationsPerPixel-parameter", "If sampleLocationsPerPixel is not 0, sampleLocationsPerPixel must be a valid VkSampleCountFlagBits value", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-None-01647", "The sampler reduction mode must be set to VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE if sampler {YCbCr} conversion is enabled", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-None-04012", "The maximum number of samplers with custom border colors which can be simultaneously created on a device is implementation-dependent and specified by the maxCustomBorderColorSamplers member of the VkPhysicalDeviceCustomBorderColorPropertiesEXT structure", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-addressModeU-01078", "If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a valid VkBorderColor value", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-addressModeU-01079", "If ifdef::VK_VERSION_1_2[samplerMirrorClampToEdge is not enabled, and if] the VK_KHR_sampler_mirror_clamp_to_edge extension is not enabled, addressModeU, addressModeV and addressModeW must not be VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-addressModeU-01646", "If sampler {YCbCr} conversion is enabled, addressModeU, addressModeV, and addressModeW must be VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, anisotropyEnable must be VK_FALSE, and unnormalizedCoordinates must be VK_FALSE", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-addressModeU-parameter", "addressModeU must be a valid VkSamplerAddressMode value", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-addressModeV-parameter", "addressModeV must be a valid VkSamplerAddressMode value", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-addressModeW-parameter", "addressModeW must be a valid VkSamplerAddressMode value", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-anisotropyEnable-01070", "If the anisotropic sampling feature is not enabled, anisotropyEnable must be VK_FALSE", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-anisotropyEnable-01071", "If anisotropyEnable is VK_TRUE, maxAnisotropy must be between 1.0 and VkPhysicalDeviceLimits::maxSamplerAnisotropy, inclusive", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-borderColor-04011", "If borderColor is set to one of VK_BORDER_COLOR_FLOAT_CUSTOM_EXT or VK_BORDER_COLOR_INT_CUSTOM_EXT, then a VkSamplerCustomBorderColorCreateInfoEXT must be present in the pNext chain", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-compareEnable-01080", "If compareEnable is VK_TRUE, compareOp must be a valid VkCompareOp value", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-compareEnable-01423", "If compareEnable is VK_TRUE, the reductionMode member of VkSamplerReductionModeCreateInfo must be VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-customBorderColors-04085", "If the customBorderColors feature is not enabled, borderColor must not be set to VK_BORDER_COLOR_FLOAT_CUSTOM_EXT or VK_BORDER_COLOR_INT_CUSTOM_EXT", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-flags-02574", "If flags includes VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, then minFilter and magFilter must be equal", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-flags-02575", "If flags includes VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, then mipmapMode must be VK_SAMPLER_MIPMAP_MODE_NEAREST", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-flags-02576", "If flags includes VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, then minLod and maxLod must be zero", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-flags-02577", "If flags includes VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, then addressModeU and addressModeV must each be either VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE or VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-flags-02578", "If flags includes VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, then anisotropyEnable must be VK_FALSE", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-flags-02579", "If flags includes VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, then compareEnable must be VK_FALSE", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-flags-02580", "If flags includes VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, then unnormalizedCoordinates must be VK_FALSE", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-flags-parameter", "flags must be a valid combination of VkSamplerCreateFlagBits values", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-magFilter-01081", "If either magFilter or minFilter is VK_FILTER_CUBIC_EXT, anisotropyEnable must be VK_FALSE", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-magFilter-01422", "If either magFilter or minFilter is VK_FILTER_CUBIC_EXT, the reductionMode member of VkSamplerReductionModeCreateInfo must be VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE", "default"},
+ {"VUID-VkSamplerCreateInfo-magFilter-parameter", "magFilter must be a valid VkFilter value", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-maxLod-01973", "maxLod must be greater than or equal to minLod", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-minFilter-01645", "If sampler {YCbCr} conversion is enabled and the potential format features of the sampler {YCbCr} conversion do not support VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT, minFilter and magFilter must be equal to the sampler {YCbCr} conversion's chromaFilter", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-minFilter-parameter", "minFilter must be a valid VkFilter value", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-mipLodBias-01069", "The absolute value of mipLodBias must be less than or equal to VkPhysicalDeviceLimits::maxSamplerLodBias", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-mipmapMode-parameter", "mipmapMode must be a valid VkSamplerMipmapMode value", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkSamplerCustomBorderColorCreateInfoEXT, VkSamplerReductionModeCreateInfo, or VkSamplerYcbcrConversionInfo", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01072", "If unnormalizedCoordinates is VK_TRUE, minFilter and magFilter must be equal", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01073", "If unnormalizedCoordinates is VK_TRUE, mipmapMode must be VK_SAMPLER_MIPMAP_MODE_NEAREST", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01074", "If unnormalizedCoordinates is VK_TRUE, minLod and maxLod must be zero", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01075", "If unnormalizedCoordinates is VK_TRUE, addressModeU and addressModeV must each be either VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE or VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01076", "If unnormalizedCoordinates is VK_TRUE, anisotropyEnable must be VK_FALSE", "1.2-extensions"},
+ {"VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01077", "If unnormalizedCoordinates is VK_TRUE, compareEnable must be VK_FALSE", "1.2-extensions"},
+ {"VUID-VkSamplerCustomBorderColorCreateInfoEXT-format-04013", "If provided format is not VK_FORMAT_UNDEFINED then the VkSamplerCreateInfo::borderColor type must match the sampled type of the provided format, as shown in the SPIR-V Sampled Type column of the Interpretation of Numeric Format table", "1.2-extensions"},
+ {"VUID-VkSamplerCustomBorderColorCreateInfoEXT-format-04014", "If the customBorderColorWithoutFormat feature is not enabled then format must not be VK_FORMAT_UNDEFINED", "1.2-extensions"},
+ {"VUID-VkSamplerCustomBorderColorCreateInfoEXT-format-04015", "If the sampler is used to sample an image view of VK_FORMAT_B4G4R4A4_UNORM_PACK16, VK_FORMAT_B5G6R5_UNORM_PACK16, or VK_FORMAT_B5G5R5A1_UNORM_PACK16 format then format must not be VK_FORMAT_UNDEFINED", "1.2-extensions"},
+ {"VUID-VkSamplerCustomBorderColorCreateInfoEXT-format-parameter", "format must be a valid VkFormat value", "1.2-extensions"},
+ {"VUID-VkSamplerCustomBorderColorCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkSamplerReductionModeCreateInfo-reductionMode-parameter", "reductionMode must be a valid VkSamplerReductionMode value", "1.2-extensions"},
+ {"VUID-VkSamplerReductionModeCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-01657", "If the potential format features of the sampler {YCbCr} conversion do not support VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT, chromaFilter must not be VK_FILTER_LINEAR", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-parameter", "chromaFilter must be a valid VkFilter value", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-components-02581", "If the format has a _422 or _420 suffix, then components.g must be the identity swizzle", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-components-02582", "If the format has a _422 or _420 suffix, then components.a must be the identity swizzle, VK_COMPONENT_SWIZZLE_ONE, or VK_COMPONENT_SWIZZLE_ZERO", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-components-02583", "If the format has a _422 or _420 suffix, then components.r must be the identity swizzle or VK_COMPONENT_SWIZZLE_B", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-components-02584", "If the format has a _422 or _420 suffix, then components.b must be the identity swizzle or VK_COMPONENT_SWIZZLE_R", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-components-02585", "If the format has a _422 or _420 suffix, and if either components.r or components.b is the identity swizzle, both values must be the identity swizzle", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-components-parameter", "components must be a valid VkComponentMapping structure", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-forceExplicitReconstruction-01656", "If the potential format features of the sampler {YCbCr} conversion do not support VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT forceExplicitReconstruction must be VK_FALSE", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-format-01650", "The potential format features of the sampler {YCbCr} conversion must support VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT or VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-format-01904", "If an external format conversion is being created, format must be VK_FORMAT_UNDEFINED", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-format-04060", "format must represent unsigned normalized values (i.e. the format must be a UNORM format)", "1.2-khr-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-format-04061", "If an external format conversion is not being created, format must represent unsigned normalized values (i.e. the format must be a UNORM format)", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-format-parameter", "format must be a valid VkFormat value", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkExternalFormatANDROID", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01651", "If the potential format features of the sampler {YCbCr} conversion do not support VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT, xChromaOffset and yChromaOffset must not be VK_CHROMA_LOCATION_COSITED_EVEN if the corresponding channels are downsampled", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01652", "If the potential format features of the sampler {YCbCr} conversion do not support VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT, xChromaOffset and yChromaOffset must not be VK_CHROMA_LOCATION_MIDPOINT if the corresponding channels are downsampled", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-parameter", "xChromaOffset must be a valid VkChromaLocation value", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-yChromaOffset-parameter", "yChromaOffset must be a valid VkChromaLocation value", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-01655", "If ycbcrModel is not VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY, then components.r, components.g, and components.b must correspond to channels of the format; that is, components.r, components.g, and components.b must not be VK_COMPONENT_SWIZZLE_ZERO or VK_COMPONENT_SWIZZLE_ONE, and must not correspond to a channel which contains zero or one as a consequence of conversion to RGBA", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-parameter", "ycbcrModel must be a valid VkSamplerYcbcrModelConversion value", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrRange-02748", "If ycbcrRange is VK_SAMPLER_YCBCR_RANGE_ITU_NARROW then the R, G and B channels obtained by applying the component swizzle to format must each have a bit-depth greater than or equal to 8", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrRange-parameter", "ycbcrRange must be a valid VkSamplerYcbcrRange value", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionImageFormatProperties-sType-sType", "sType must be VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionInfo-conversion-parameter", "conversion must be a valid VkSamplerYcbcrConversion handle", "1.2-extensions"},
+ {"VUID-VkSamplerYcbcrConversionInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO", "1.2-extensions"},
+ {"VUID-VkSemaphoreCreateInfo-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkSemaphoreCreateInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkExportSemaphoreCreateInfo, VkExportSemaphoreWin32HandleInfoKHR, or VkSemaphoreTypeCreateInfo", "1.2-extensions"},
+ {"VUID-VkSemaphoreCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkSemaphoreCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkSemaphoreGetFdInfoKHR-handleType-01132", "handleType must have been included in VkExportSemaphoreCreateInfo::handleTypes when semaphore's current payload was created", "1.2-extensions"},
+ {"VUID-VkSemaphoreGetFdInfoKHR-handleType-01134", "If handleType refers to a handle type with copy payload transference semantics, as defined below in Importing Semaphore Payloads, there must be no queue waiting on semaphore", "1.2-extensions"},
+ {"VUID-VkSemaphoreGetFdInfoKHR-handleType-01135", "If handleType refers to a handle type with copy payload transference semantics, semaphore must be signaled, or have an associated semaphore signal operation pending execution", "1.2-extensions"},
+ {"VUID-VkSemaphoreGetFdInfoKHR-handleType-01136", "handleType must be defined as a POSIX file descriptor handle", "1.2-extensions"},
+ {"VUID-VkSemaphoreGetFdInfoKHR-handleType-03253", "If handleType refers to a handle type with copy payload transference semantics, semaphore must have been created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_BINARY", "1.2-extensions"},
+ {"VUID-VkSemaphoreGetFdInfoKHR-handleType-03254", "If handleType refers to a handle type with copy payload transference semantics, semaphore must have an associated semaphore signal operation that has been submitted for execution and any semaphore signal operations on which it depends (if any) must have also been submitted for execution", "1.2-extensions"},
+ {"VUID-VkSemaphoreGetFdInfoKHR-handleType-parameter", "handleType must be a valid VkExternalSemaphoreHandleTypeFlagBits value", "1.2-extensions"},
+ {"VUID-VkSemaphoreGetFdInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkSemaphoreGetFdInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkSemaphoreGetFdInfoKHR-semaphore-01133", "semaphore must not currently have its payload replaced by an imported payload as described below in Importing Semaphore Payloads unless that imported payload's handle type was included in VkExternalSemaphoreProperties::exportFromImportedHandleTypes for handleType", "1.2-extensions"},
+ {"VUID-VkSemaphoreGetFdInfoKHR-semaphore-parameter", "semaphore must be a valid VkSemaphore handle", "1.2-extensions"},
+ {"VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01126", "handleType must have been included in VkExportSemaphoreCreateInfo::handleTypes when the semaphore's current payload was created", "1.2-extensions"},
+ {"VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01127", "If handleType is defined as an NT handle, vkGetSemaphoreWin32HandleKHR must be called no more than once for each valid unique combination of semaphore and handleType", "1.2-extensions"},
+ {"VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01129", "If handleType refers to a handle type with copy payload transference semantics, as defined below in Importing Semaphore Payloads, there must be no queue waiting on semaphore", "1.2-extensions"},
+ {"VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01130", "If handleType refers to a handle type with copy payload transference semantics, semaphore must be signaled, or have an associated semaphore signal operation pending execution", "1.2-extensions"},
+ {"VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-01131", "handleType must be defined as an NT handle or a global share handle", "1.2-extensions"},
+ {"VUID-VkSemaphoreGetWin32HandleInfoKHR-handleType-parameter", "handleType must be a valid VkExternalSemaphoreHandleTypeFlagBits value", "1.2-extensions"},
+ {"VUID-VkSemaphoreGetWin32HandleInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkSemaphoreGetWin32HandleInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkSemaphoreGetWin32HandleInfoKHR-semaphore-01128", "semaphore must not currently have its payload replaced by an imported payload as described below in Importing Semaphore Payloads unless that imported payload's handle type was included in VkExternalSemaphoreProperties::exportFromImportedHandleTypes for handleType", "1.2-extensions"},
+ {"VUID-VkSemaphoreGetWin32HandleInfoKHR-semaphore-parameter", "semaphore must be a valid VkSemaphore handle", "1.2-extensions"},
+ {"VUID-VkSemaphoreSignalInfo-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkSemaphoreSignalInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO", "1.2-extensions"},
+ {"VUID-VkSemaphoreSignalInfo-semaphore-03257", "semaphore must have been created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE", "1.2-extensions"},
+ {"VUID-VkSemaphoreSignalInfo-semaphore-parameter", "semaphore must be a valid VkSemaphore handle", "1.2-extensions"},
+ {"VUID-VkSemaphoreSignalInfo-value-03258", "value must have a value greater than the current value of the semaphore", "1.2-extensions"},
+ {"VUID-VkSemaphoreSignalInfo-value-03259", "value must be less than the value of any pending semaphore signal operations", "1.2-extensions"},
+ {"VUID-VkSemaphoreSignalInfo-value-03260", "value must have a value which does not differ from the current value of the semaphore or the value of any outstanding semaphore wait or signal operation on semaphore by more than maxTimelineSemaphoreValueDifference", "1.2-extensions"},
+ {"VUID-VkSemaphoreTypeCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkSemaphoreTypeCreateInfo-semaphoreType-03279", "If semaphoreType is VK_SEMAPHORE_TYPE_BINARY, initialValue must be zero", "1.2-extensions"},
+ {"VUID-VkSemaphoreTypeCreateInfo-semaphoreType-parameter", "semaphoreType must be a valid VkSemaphoreType value", "1.2-extensions"},
+ {"VUID-VkSemaphoreTypeCreateInfo-timelineSemaphore-03252", "If the timelineSemaphore feature is not enabled, semaphoreType must not equal VK_SEMAPHORE_TYPE_TIMELINE", "1.2-extensions"},
+ {"VUID-VkSemaphoreWaitInfo-flags-parameter", "flags must be a valid combination of VkSemaphoreWaitFlagBits values", "1.2-extensions"},
+ {"VUID-VkSemaphoreWaitInfo-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkSemaphoreWaitInfo-pSemaphores-03256", "All of the elements of pSemaphores must reference a semaphore that was created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE", "1.2-extensions"},
+ {"VUID-VkSemaphoreWaitInfo-pSemaphores-parameter", "pSemaphores must be a valid pointer to an array of semaphoreCount valid VkSemaphore handles", "1.2-extensions"},
+ {"VUID-VkSemaphoreWaitInfo-pValues-parameter", "pValues must be a valid pointer to an array of semaphoreCount uint64_t values", "1.2-extensions"},
+ {"VUID-VkSemaphoreWaitInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO", "1.2-extensions"},
+ {"VUID-VkSemaphoreWaitInfo-semaphoreCount-arraylength", "semaphoreCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkShaderModuleCreateInfo-codeSize-01085", "codeSize must be greater than 0", "1.2-extensions"},
+ {"VUID-VkShaderModuleCreateInfo-codeSize-01086", "codeSize must be a multiple of 4", "1.2-khr-extensions"},
+ {"VUID-VkShaderModuleCreateInfo-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkShaderModuleCreateInfo-pCode-01087", "pCode must point to valid SPIR-V code, formatted and packed as described by the Khronos SPIR-V Specification", "1.2-khr-extensions"},
+ {"VUID-VkShaderModuleCreateInfo-pCode-01088", "pCode must adhere to the validation rules described by the Validation Rules within a Module section of the SPIR-V Environment appendix", "1.2-khr-extensions"},
+ {"VUID-VkShaderModuleCreateInfo-pCode-01089", "pCode must declare the Shader capability for SPIR-V code", "1.2-extensions"},
+ {"VUID-VkShaderModuleCreateInfo-pCode-01090", "pCode must not declare any capability that is not supported by the API, as described by the Capabilities section of the SPIR-V Environment appendix", "1.2-extensions"},
+ {"VUID-VkShaderModuleCreateInfo-pCode-01091", "If pCode declares any of the capabilities listed in the SPIR-V Environment appendix, one of the corresponding requirements must be satisfied", "1.2-extensions"},
+ {"VUID-VkShaderModuleCreateInfo-pCode-01376", "If pCode is a pointer to SPIR-V code, codeSize must be a multiple of 4", "1.2-extensions"},
+ {"VUID-VkShaderModuleCreateInfo-pCode-01377", "pCode must point to either valid SPIR-V code, formatted and packed as described by the Khronos SPIR-V Specification or valid GLSL code which must be written to the GL_KHR_vulkan_glsl extension specification", "1.2-extensions"},
+ {"VUID-VkShaderModuleCreateInfo-pCode-01378", "If pCode is a pointer to SPIR-V code, that code must adhere to the validation rules described by the Validation Rules within a Module section of the SPIR-V Environment appendix", "1.2-extensions"},
+ {"VUID-VkShaderModuleCreateInfo-pCode-01379", "If pCode is a pointer to GLSL code, it must be valid GLSL code written to the GL_KHR_vulkan_glsl GLSL extension specification", "1.2-extensions"},
+ {"VUID-VkShaderModuleCreateInfo-pCode-parameter", "pCode must be a valid pointer to an array of (codeSize/4) uint32_t values", "1.2-extensions"},
+ {"VUID-VkShaderModuleCreateInfo-pNext-pNext", "pNext must be NULL or a pointer to a valid instance of VkShaderModuleValidationCacheCreateInfoEXT", "1.2-extensions"},
+ {"VUID-VkShaderModuleCreateInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO", "1.2-extensions"},
+ {"VUID-VkShaderModuleCreateInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkShaderModuleValidationCacheCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkShaderModuleValidationCacheCreateInfoEXT-validationCache-parameter", "validationCache must be a valid VkValidationCacheEXT handle", "1.2-extensions"},
+ {"VUID-VkShadingRatePaletteNV-pShadingRatePaletteEntries-parameter", "pShadingRatePaletteEntries must be a valid pointer to an array of shadingRatePaletteEntryCount valid VkShadingRatePaletteEntryNV values", "1.2-extensions"},
+ {"VUID-VkShadingRatePaletteNV-shadingRatePaletteEntryCount-02071", "shadingRatePaletteEntryCount must be between 1 and VkPhysicalDeviceShadingRateImagePropertiesNV::shadingRatePaletteSize, inclusive", "1.2-extensions"},
+ {"VUID-VkShadingRatePaletteNV-shadingRatePaletteEntryCount-arraylength", "shadingRatePaletteEntryCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkSharedPresentSurfaceCapabilitiesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR", "1.2-extensions"},
+ {"VUID-VkSparseBufferMemoryBindInfo-bindCount-arraylength", "bindCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkSparseBufferMemoryBindInfo-buffer-parameter", "buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-VkSparseBufferMemoryBindInfo-pBinds-parameter", "pBinds must be a valid pointer to an array of bindCount valid VkSparseMemoryBind structures", "1.2-extensions"},
+ {"VUID-VkSparseImageFormatProperties2-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkSparseImageFormatProperties2-sType-sType", "sType must be VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2", "1.2-extensions"},
+ {"VUID-VkSparseImageMemoryBind-extent-01108", "extent.width must either be a multiple of the sparse image block width of the image, or else (extent.width + offset.x) must equal the width of the image subresource", "1.2-extensions"},
+ {"VUID-VkSparseImageMemoryBind-extent-01110", "extent.height must either be a multiple of the sparse image block height of the image, or else (extent.height + offset.y) must equal the height of the image subresource", "1.2-extensions"},
+ {"VUID-VkSparseImageMemoryBind-extent-01112", "extent.depth must either be a multiple of the sparse image block depth of the image, or else (extent.depth + offset.z) must equal the depth of the image subresource", "1.2-extensions"},
+ {"VUID-VkSparseImageMemoryBind-flags-parameter", "flags must be a valid combination of VkSparseMemoryBindFlagBits values", "1.2-extensions"},
+ {"VUID-VkSparseImageMemoryBind-memory-01104", "If the sparse aliased residency feature is not enabled, and if any other resources are bound to ranges of memory, the range of memory being bound must not overlap with those bound ranges", "1.2-extensions"},
+ {"VUID-VkSparseImageMemoryBind-memory-01105", "memory and memoryOffset must match the memory requirements of the calling command's image, as described in section Resource Memory Association", "1.2-extensions"},
+ {"VUID-VkSparseImageMemoryBind-memory-02732", "If memory was created with VkExportMemoryAllocateInfo::handleTypes not equal to 0, at least one handle type it contained must also have been set in VkExternalMemoryImageCreateInfo::handleTypes when the image was created", "1.2-extensions"},
+ {"VUID-VkSparseImageMemoryBind-memory-02733", "If memory was created by a memory import operation, the external handle type of the imported memory must also have been set in VkExternalMemoryImageCreateInfo::handleTypes when image was created", "1.2-extensions"},
+ {"VUID-VkSparseImageMemoryBind-memory-parameter", "If memory is not VK_NULL_HANDLE, memory must be a valid VkDeviceMemory handle", "1.2-extensions"},
+ {"VUID-VkSparseImageMemoryBind-offset-01107", "offset.x must be a multiple of the sparse image block width (VkSparseImageFormatProperties::imageGranularity.width) of the image", "1.2-extensions"},
+ {"VUID-VkSparseImageMemoryBind-offset-01109", "offset.y must be a multiple of the sparse image block height (VkSparseImageFormatProperties::imageGranularity.height) of the image", "1.2-extensions"},
+ {"VUID-VkSparseImageMemoryBind-offset-01111", "offset.z must be a multiple of the sparse image block depth (VkSparseImageFormatProperties::imageGranularity.depth) of the image", "1.2-extensions"},
+ {"VUID-VkSparseImageMemoryBind-subresource-01106", "subresource must be a valid image subresource for image (see Image Views)", "1.2-extensions"},
+ {"VUID-VkSparseImageMemoryBind-subresource-parameter", "subresource must be a valid VkImageSubresource structure", "1.2-extensions"},
+ {"VUID-VkSparseImageMemoryBindInfo-bindCount-arraylength", "bindCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkSparseImageMemoryBindInfo-image-02901", "image must have been created with VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT set", "1.2-extensions"},
+ {"VUID-VkSparseImageMemoryBindInfo-image-parameter", "image must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-VkSparseImageMemoryBindInfo-pBinds-parameter", "pBinds must be a valid pointer to an array of bindCount valid VkSparseImageMemoryBind structures", "1.2-extensions"},
+ {"VUID-VkSparseImageMemoryBindInfo-subresource-01722", "The subresource.mipLevel member of each element of pBinds must be less than the mipLevels specified in VkImageCreateInfo when image was created", "1.2-extensions"},
+ {"VUID-VkSparseImageMemoryBindInfo-subresource-01723", "The subresource.arrayLayer member of each element of pBinds must be less than the arrayLayers specified in VkImageCreateInfo when image was created", "1.2-extensions"},
+ {"VUID-VkSparseImageMemoryRequirements2-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkSparseImageMemoryRequirements2-sType-sType", "sType must be VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2", "1.2-extensions"},
+ {"VUID-VkSparseImageOpaqueMemoryBindInfo-bindCount-arraylength", "bindCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkSparseImageOpaqueMemoryBindInfo-image-parameter", "image must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-VkSparseImageOpaqueMemoryBindInfo-pBinds-01103", "If the flags member of any element of pBinds contains VK_SPARSE_MEMORY_BIND_METADATA_BIT, the binding range defined must be within the mip tail region of the metadata aspect of image", "1.2-extensions"},
+ {"VUID-VkSparseImageOpaqueMemoryBindInfo-pBinds-parameter", "pBinds must be a valid pointer to an array of bindCount valid VkSparseMemoryBind structures", "1.2-extensions"},
+ {"VUID-VkSparseMemoryBind-flags-parameter", "flags must be a valid combination of VkSparseMemoryBindFlagBits values", "1.2-extensions"},
+ {"VUID-VkSparseMemoryBind-memory-01096", "If memory is not VK_NULL_HANDLE, memory and memoryOffset must match the memory requirements of the resource, as described in section Resource Memory Association", "1.2-extensions"},
+ {"VUID-VkSparseMemoryBind-memory-01097", "If memory is not VK_NULL_HANDLE, memory must not have been created with a memory type that reports VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT bit set", "1.2-extensions"},
+ {"VUID-VkSparseMemoryBind-memory-02730", "If memory was created with VkExportMemoryAllocateInfo::handleTypes not equal to 0, at least one handle type it contained must also have been set in VkExternalMemoryBufferCreateInfo::handleTypes or VkExternalMemoryImageCreateInfo::handleTypes when the resource was created", "1.2-extensions"},
+ {"VUID-VkSparseMemoryBind-memory-02731", "If memory was created by a memory import operation, the external handle type of the imported memory must also have been set in VkExternalMemoryBufferCreateInfo::handleTypes or VkExternalMemoryImageCreateInfo::handleTypes when the resource was created", "1.2-extensions"},
+ {"VUID-VkSparseMemoryBind-memory-parameter", "If memory is not VK_NULL_HANDLE, memory must be a valid VkDeviceMemory handle", "1.2-extensions"},
+ {"VUID-VkSparseMemoryBind-memoryOffset-01101", "memoryOffset must be less than the size of memory", "1.2-extensions"},
+ {"VUID-VkSparseMemoryBind-resourceOffset-01099", "resourceOffset must be less than the size of the resource", "1.2-extensions"},
+ {"VUID-VkSparseMemoryBind-size-01098", "size must be greater than 0", "1.2-extensions"},
+ {"VUID-VkSparseMemoryBind-size-01100", "size must be less than or equal to the size of the resource minus resourceOffset", "1.2-extensions"},
+ {"VUID-VkSparseMemoryBind-size-01102", "size must be less than or equal to the size of memory minus memoryOffset", "1.2-extensions"},
+ {"VUID-VkSpecializationInfo-offset-00773", "The offset member of each element of pMapEntries must be less than dataSize", "1.2-extensions"},
+ {"VUID-VkSpecializationInfo-pData-parameter", "If dataSize is not 0, pData must be a valid pointer to an array of dataSize bytes", "1.2-extensions"},
+ {"VUID-VkSpecializationInfo-pMapEntries-00774", "The size member of each element of pMapEntries must be less than or equal to dataSize minus offset", "1.2-extensions"},
+ {"VUID-VkSpecializationInfo-pMapEntries-parameter", "If mapEntryCount is not 0, pMapEntries must be a valid pointer to an array of mapEntryCount valid VkSpecializationMapEntry structures", "1.2-extensions"},
+ {"VUID-VkSpecializationMapEntry-constantID-00776", "For a constantID specialization constant declared in a shader, size must match the byte size of the constantID. If the specialization constant is of type boolean, size must be the byte size of VkBool32", "1.2-extensions"},
+ {"VUID-VkStencilOpState-compareOp-parameter", "compareOp must be a valid VkCompareOp value", "1.2-extensions"},
+ {"VUID-VkStencilOpState-depthFailOp-parameter", "depthFailOp must be a valid VkStencilOp value", "1.2-extensions"},
+ {"VUID-VkStencilOpState-failOp-parameter", "failOp must be a valid VkStencilOp value", "1.2-extensions"},
+ {"VUID-VkStencilOpState-passOp-parameter", "passOp must be a valid VkStencilOp value", "1.2-extensions"},
+ {"VUID-VkStreamDescriptorSurfaceCreateInfoGGP-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkStreamDescriptorSurfaceCreateInfoGGP-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkStreamDescriptorSurfaceCreateInfoGGP-sType-sType", "sType must be VK_STRUCTURE_TYPE_STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP", "1.2-extensions"},
+ {"VUID-VkStreamDescriptorSurfaceCreateInfoGGP-streamDescriptor-02681", "streamDescriptor must be a valid GgpStreamDescriptor", "1.2-extensions"},
+ {"VUID-VkStridedBufferRegionKHR-buffer-03515", "If buffer is not VK_NULL_HANDLE, size plus offset must be less than or equal to the size of buffer", "1.2-extensions"},
+ {"VUID-VkStridedBufferRegionKHR-buffer-03516", "If buffer is not VK_NULL_HANDLE, stride must be less than the size of buffer", "1.2-extensions"},
+ {"VUID-VkStridedBufferRegionKHR-buffer-parameter", "If buffer is not VK_NULL_HANDLE, buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-VkSubmitInfo-commonparent", "Each of the elements of pCommandBuffers, the elements of pSignalSemaphores, and the elements of pWaitSemaphores that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkSubmitInfo-pCommandBuffers-00075", "Each element of pCommandBuffers must not have been allocated with VK_COMMAND_BUFFER_LEVEL_SECONDARY", "1.2-extensions"},
+ {"VUID-VkSubmitInfo-pCommandBuffers-parameter", "If commandBufferCount is not 0, pCommandBuffers must be a valid pointer to an array of commandBufferCount valid VkCommandBuffer handles", "1.2-extensions"},
+ {"VUID-VkSubmitInfo-pNext-03240", "If the pNext chain of this structure includes a VkTimelineSemaphoreSubmitInfo structure and any element of pWaitSemaphores was created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE, then its waitSemaphoreValueCount member must equal waitSemaphoreCount", "1.2-extensions"},
+ {"VUID-VkSubmitInfo-pNext-03241", "If the pNext chain of this structure includes a VkTimelineSemaphoreSubmitInfo structure and any element of pSignalSemaphores was created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE, then its signalSemaphoreValueCount member must equal signalSemaphoreCount", "1.2-extensions"},
+ {"VUID-VkSubmitInfo-pNext-04120", "If the pNext chain of this structure does not include a VkProtectedSubmitInfo structure with protectedSubmit set to VK_TRUE, then each element of the command buffer of the pCommandBuffers array must be an unprotected command buffer", "1.2-extensions"},
+ {"VUID-VkSubmitInfo-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkD3D12FenceSubmitInfoKHR, VkDeviceGroupSubmitInfo, VkPerformanceQuerySubmitInfoKHR, VkProtectedSubmitInfo, VkTimelineSemaphoreSubmitInfo, VkWin32KeyedMutexAcquireReleaseInfoKHR, or VkWin32KeyedMutexAcquireReleaseInfoNV", "1.2-extensions"},
+ {"VUID-VkSubmitInfo-pSignalSemaphores-03242", "For each element of pSignalSemaphores created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE the corresponding element of VkTimelineSemaphoreSubmitInfo::pSignalSemaphoreValues must have a value greater than the current value of the semaphore when the semaphore signal operation is executed", "1.2-extensions"},
+ {"VUID-VkSubmitInfo-pSignalSemaphores-03244", "For each element of pSignalSemaphores created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE the corresponding element of VkTimelineSemaphoreSubmitInfo::pSignalSemaphoreValues must have a value which does not differ from the current value of the semaphore or the value of any outstanding semaphore wait or signal operation on that semaphore by more than maxTimelineSemaphoreValueDifference", "1.2-extensions"},
+ {"VUID-VkSubmitInfo-pSignalSemaphores-parameter", "If signalSemaphoreCount is not 0, pSignalSemaphores must be a valid pointer to an array of signalSemaphoreCount valid VkSemaphore handles", "1.2-extensions"},
+ {"VUID-VkSubmitInfo-pWaitDstStageMask-00076", "If the geometry shaders feature is not enabled, each element of pWaitDstStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT", "1.2-extensions"},
+ {"VUID-VkSubmitInfo-pWaitDstStageMask-00077", "If the tessellation shaders feature is not enabled, each element of pWaitDstStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT", "1.2-extensions"},
+ {"VUID-VkSubmitInfo-pWaitDstStageMask-00078", "Each element of pWaitDstStageMask must not include VK_PIPELINE_STAGE_HOST_BIT", "1.2-extensions"},
+ {"VUID-VkSubmitInfo-pWaitDstStageMask-02089", "If the mesh shaders feature is not enabled, each element of pWaitDstStageMask must not contain VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-VkSubmitInfo-pWaitDstStageMask-02090", "If the task shaders feature is not enabled, each element of pWaitDstStageMask must not contain VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-VkSubmitInfo-pWaitDstStageMask-parameter", "If waitSemaphoreCount is not 0, pWaitDstStageMask must be a valid pointer to an array of waitSemaphoreCount valid combinations of VkPipelineStageFlagBits values", "1.2-extensions"},
+ {"VUID-VkSubmitInfo-pWaitDstStageMask-requiredbitmask", "Each element of pWaitDstStageMask must not be 0", "1.2-extensions"},
+ {"VUID-VkSubmitInfo-pWaitSemaphores-03239", "If any element of pWaitSemaphores or pSignalSemaphores was created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE, then the pNext chain must include a VkTimelineSemaphoreSubmitInfo structure", "1.2-extensions"},
+ {"VUID-VkSubmitInfo-pWaitSemaphores-03243", "For each element of pWaitSemaphores created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE the corresponding element of VkTimelineSemaphoreSubmitInfo::pWaitSemaphoreValues must have a value which does not differ from the current value of the semaphore or the value of any outstanding semaphore wait or signal operation on that semaphore by more than maxTimelineSemaphoreValueDifference", "1.2-extensions"},
+ {"VUID-VkSubmitInfo-pWaitSemaphores-parameter", "If waitSemaphoreCount is not 0, pWaitSemaphores must be a valid pointer to an array of waitSemaphoreCount valid VkSemaphore handles", "1.2-extensions"},
+ {"VUID-VkSubmitInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SUBMIT_INFO", "1.2-extensions"},
+ {"VUID-VkSubmitInfo-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkSubpassBeginInfo-contents-parameter", "contents must be a valid VkSubpassContents value", "1.2-extensions"},
+ {"VUID-VkSubpassBeginInfo-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkSubpassBeginInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-dependencyFlags-02520", "If dependencyFlags includes VK_DEPENDENCY_VIEW_LOCAL_BIT, srcSubpass must not be equal to VK_SUBPASS_EXTERNAL", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-dependencyFlags-02521", "If dependencyFlags includes VK_DEPENDENCY_VIEW_LOCAL_BIT, dstSubpass must not be equal to VK_SUBPASS_EXTERNAL", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-dependencyFlags-parameter", "dependencyFlags must be a valid combination of VkDependencyFlagBits values", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-dstAccessMask-00869", "Any access flag included in dstAccessMask must be supported by one of the pipeline stages in dstStageMask, as specified in the table of supported access types", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-dstAccessMask-parameter", "dstAccessMask must be a valid combination of VkAccessFlagBits values", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-dstStageMask-00861", "If the geometry shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-dstStageMask-00863", "If the tessellation shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-dstStageMask-02101", "If the mesh shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-dstStageMask-02102", "If the task shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-dstStageMask-parameter", "dstStageMask must be a valid combination of VkPipelineStageFlagBits values", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-dstStageMask-requiredbitmask", "dstStageMask must not be 0", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-srcAccessMask-00868", "Any access flag included in srcAccessMask must be supported by one of the pipeline stages in srcStageMask, as specified in the table of supported access types", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-srcAccessMask-parameter", "srcAccessMask must be a valid combination of VkAccessFlagBits values", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-srcStageMask-00860", "If the geometry shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-srcStageMask-00862", "If the tessellation shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-srcStageMask-02099", "If the mesh shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-srcStageMask-02100", "If the task shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-srcStageMask-parameter", "srcStageMask must be a valid combination of VkPipelineStageFlagBits values", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-srcStageMask-requiredbitmask", "srcStageMask must not be 0", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-srcSubpass-00864", "srcSubpass must be less than or equal to dstSubpass, unless one of them is VK_SUBPASS_EXTERNAL, to avoid cyclic dependencies and ensure a valid execution order", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-srcSubpass-00865", "srcSubpass and dstSubpass must not both be equal to VK_SUBPASS_EXTERNAL", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-srcSubpass-00867", "If srcSubpass is equal to dstSubpass and not all of the stages in srcStageMask and dstStageMask are framebuffer-space stages, the logically latest pipeline stage in srcStageMask must be logically earlier than or equal to the logically earliest pipeline stage in dstStageMask", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-srcSubpass-00872", "If srcSubpass equals dstSubpass and that subpass has more than one bit set in the view mask, then dependencyFlags must include VK_DEPENDENCY_VIEW_LOCAL_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDependency-srcSubpass-02243", "If srcSubpass equals dstSubpass, and srcStageMask and dstStageMask both include a framebuffer-space stage, then dependencyFlags must include VK_DEPENDENCY_BY_REGION_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-dependencyFlags-03090", "If dependencyFlags includes VK_DEPENDENCY_VIEW_LOCAL_BIT, srcSubpass must not be equal to VK_SUBPASS_EXTERNAL", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-dependencyFlags-03091", "If dependencyFlags includes VK_DEPENDENCY_VIEW_LOCAL_BIT, dstSubpass must not be equal to VK_SUBPASS_EXTERNAL", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-dependencyFlags-03092", "If dependencyFlags does not include VK_DEPENDENCY_VIEW_LOCAL_BIT, viewOffset must be 0", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-dependencyFlags-parameter", "dependencyFlags must be a valid combination of VkDependencyFlagBits values", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-dstAccessMask-03089", "Any access flag included in dstAccessMask must be supported by one of the pipeline stages in dstStageMask, as specified in the table of supported access types", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-dstAccessMask-parameter", "dstAccessMask must be a valid combination of VkAccessFlagBits values", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-dstStageMask-02105", "If the mesh shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-dstStageMask-02106", "If the task shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-dstStageMask-03081", "If the geometry shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-dstStageMask-03083", "If the tessellation shaders feature is not enabled, dstStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-dstStageMask-parameter", "dstStageMask must be a valid combination of VkPipelineStageFlagBits values", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-dstStageMask-requiredbitmask", "dstStageMask must not be 0", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-sType-sType", "sType must be VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-srcAccessMask-03088", "Any access flag included in srcAccessMask must be supported by one of the pipeline stages in srcStageMask, as specified in the table of supported access types", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-srcAccessMask-parameter", "srcAccessMask must be a valid combination of VkAccessFlagBits values", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-srcStageMask-02103", "If the mesh shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-srcStageMask-02104", "If the task shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-srcStageMask-03080", "If the geometry shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-srcStageMask-03082", "If the tessellation shaders feature is not enabled, srcStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-srcStageMask-parameter", "srcStageMask must be a valid combination of VkPipelineStageFlagBits values", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-srcStageMask-requiredbitmask", "srcStageMask must not be 0", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-srcSubpass-02245", "If srcSubpass equals dstSubpass, and srcStageMask and dstStageMask both include a framebuffer-space stage, then dependencyFlags must include VK_DEPENDENCY_BY_REGION_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-srcSubpass-03084", "srcSubpass must be less than or equal to dstSubpass, unless one of them is VK_SUBPASS_EXTERNAL, to avoid cyclic dependencies and ensure a valid execution order", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-srcSubpass-03085", "srcSubpass and dstSubpass must not both be equal to VK_SUBPASS_EXTERNAL", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-srcSubpass-03087", "If srcSubpass is equal to dstSubpass and not all of the stages in srcStageMask and dstStageMask are framebuffer-space stages, the logically latest pipeline stage in srcStageMask must be logically earlier than or equal to the logically earliest pipeline stage in dstStageMask", "1.2-extensions"},
+ {"VUID-VkSubpassDependency2-viewOffset-02530", "If viewOffset is not equal to 0, srcSubpass must not be equal to dstSubpass", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-attachment-00853", "The attachment member of each element of pPreserveAttachments must not be VK_ATTACHMENT_UNUSED", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-colorAttachmentCount-00845", "colorAttachmentCount must be less than or equal to VkPhysicalDeviceLimits::maxColorAttachments", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-flags-00856", "If flags includes VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX, it must also include VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-flags-03341", "If flags includes VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM, and if pResolveAttachments is not NULL, then each resolve attachment must be VK_ATTACHMENT_UNUSED", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-flags-03342", "If flags includes VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM, and if pDepthStencilResolveAttachmentKHR is not NULL, then the depth/stencil resolve attachment must be VK_ATTACHMENT_UNUSED", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-flags-03343", "If flags includes VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM, then the subpass must be the last subpass in a subpass dependency chain", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-flags-03344", "If flags includes VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM, then the sample count of the input attachments must equal rasterizationSamples", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-flags-03345", "If flags includes VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM, and if sampleShadingEnable is enabled (explicitly or implicitly) then minSampleShading must equal 0.0", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-flags-parameter", "flags must be a valid combination of VkSubpassDescriptionFlagBits values", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-layout-02519", "If any attachment is used by more than one VkAttachmentReference member, then each use must use the same layout", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-loadOp-00846", "If the first use of an attachment in this render pass is as an input attachment, and the attachment is not also used as a color or depth/stencil attachment in the same subpass, then loadOp must not be VK_ATTACHMENT_LOAD_OP_CLEAR", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-pColorAttachments-01417", "All attachments in pColorAttachments that are not VK_ATTACHMENT_UNUSED must have the same sample count", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-pColorAttachments-01506", "If the VK_AMD_mixed_attachment_samples extension is enabled, and all attachments in pColorAttachments that are not VK_ATTACHMENT_UNUSED must have a sample count that is smaller than or equal to the sample count of pDepthStencilAttachment if it is not VK_ATTACHMENT_UNUSED", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-pColorAttachments-02648", "All attachments in pColorAttachments that are not VK_ATTACHMENT_UNUSED must have image formats whose potential format features contain VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-pColorAttachments-parameter", "If colorAttachmentCount is not 0, pColorAttachments must be a valid pointer to an array of colorAttachmentCount valid VkAttachmentReference structures", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-pDepthStencilAttachment-01418", "If neither the VK_AMD_mixed_attachment_samples nor the VK_NV_framebuffer_mixed_samples extensions are enabled, and if pDepthStencilAttachment is not VK_ATTACHMENT_UNUSED and any attachments in pColorAttachments are not VK_ATTACHMENT_UNUSED, they must have the same sample count", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-pDepthStencilAttachment-02650", "If pDepthStencilAttachment is not NULL and the attachment is not VK_ATTACHMENT_UNUSED then it must have a image format whose potential format features contain VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-pDepthStencilAttachment-parameter", "If pDepthStencilAttachment is not NULL, pDepthStencilAttachment must be a valid pointer to a valid VkAttachmentReference structure", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-pInputAttachments-02647", "All attachments in pInputAttachments that are not VK_ATTACHMENT_UNUSED must have image formats whose potential format features contain at least VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT or VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-pInputAttachments-02868", "If the render pass is created with VK_RENDER_PASS_CREATE_TRANSFORM_BIT_QCOM each of the elements of pInputAttachments must be VK_ATTACHMENT_UNUSED", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-pInputAttachments-parameter", "If inputAttachmentCount is not 0, pInputAttachments must be a valid pointer to an array of inputAttachmentCount valid VkAttachmentReference structures", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-pPreserveAttachments-00854", "Each element of pPreserveAttachments must not also be an element of any other member of the subpass description", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-pPreserveAttachments-parameter", "If preserveAttachmentCount is not 0, pPreserveAttachments must be a valid pointer to an array of preserveAttachmentCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-pResolveAttachments-00847", "If pResolveAttachments is not NULL, for each resolve attachment that is not VK_ATTACHMENT_UNUSED, the corresponding color attachment must not be VK_ATTACHMENT_UNUSED", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-pResolveAttachments-00848", "If pResolveAttachments is not NULL, for each resolve attachment that is not VK_ATTACHMENT_UNUSED, the corresponding color attachment must not have a sample count of VK_SAMPLE_COUNT_1_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-pResolveAttachments-00849", "If pResolveAttachments is not NULL, each resolve attachment that is not VK_ATTACHMENT_UNUSED must have a sample count of VK_SAMPLE_COUNT_1_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-pResolveAttachments-00850", "If pResolveAttachments is not NULL, each resolve attachment that is not VK_ATTACHMENT_UNUSED must have the same VkFormat as its corresponding color attachment", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-pResolveAttachments-02649", "All attachments in pResolveAttachments that are not VK_ATTACHMENT_UNUSED must have image formats whose potential format features contain VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-pResolveAttachments-parameter", "If colorAttachmentCount is not 0, and pResolveAttachments is not NULL, pResolveAttachments must be a valid pointer to an array of colorAttachmentCount valid VkAttachmentReference structures", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-pipelineBindPoint-00844", "pipelineBindPoint must be VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-VkSubpassDescription-pipelineBindPoint-parameter", "pipelineBindPoint must be a valid VkPipelineBindPoint value", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-attachment-02799", "If the attachment member of any element of pInputAttachments is not VK_ATTACHMENT_UNUSED, then the aspectMask member must be a valid combination of VkImageAspectFlagBits", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-attachment-02800", "If the attachment member of any element of pInputAttachments is not VK_ATTACHMENT_UNUSED, then the aspectMask member must not be 0", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-attachment-02801", "If the attachment member of any element of pInputAttachments is not VK_ATTACHMENT_UNUSED, then the aspectMask member must not include VK_IMAGE_ASPECT_METADATA_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-attachment-03073", "The attachment member of any element of pPreserveAttachments must not be VK_ATTACHMENT_UNUSED", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-colorAttachmentCount-03063", "colorAttachmentCount must be less than or equal to VkPhysicalDeviceLimits::maxColorAttachments", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-flags-03076", "If flags includes VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX, it must also include VK_SUBPASS_DESCRIPTION_PER_VIEW_ATTRIBUTES_BIT_NVX", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-flags-parameter", "flags must be a valid combination of VkSubpassDescriptionFlagBits values", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-layout-02528", "If any attachment is used by more than one VkAttachmentReference member, then each use must use the same layout", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-loadOp-03064", "If the first use of an attachment in this render pass is as an input attachment, and the attachment is not also used as a color or depth/stencil attachment in the same subpass, then loadOp must not be VK_ATTACHMENT_LOAD_OP_CLEAR", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-pColorAttachments-02898", "All attachments in pColorAttachments that are not VK_ATTACHMENT_UNUSED must have image formats whose potential format features contain VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-pColorAttachments-03069", "All attachments in pColorAttachments that are not VK_ATTACHMENT_UNUSED must have the same sample count", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-pColorAttachments-03070", "If the VK_AMD_mixed_attachment_samples extension is enabled, all attachments in pColorAttachments that are not VK_ATTACHMENT_UNUSED must have a sample count that is smaller than or equal to the sample count of pDepthStencilAttachment if it is not VK_ATTACHMENT_UNUSED", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-pColorAttachments-parameter", "If colorAttachmentCount is not 0, pColorAttachments must be a valid pointer to an array of colorAttachmentCount valid VkAttachmentReference2 structures", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-pDepthStencilAttachment-02900", "If pDepthStencilAttachment is not NULL and the attachment is not VK_ATTACHMENT_UNUSED then it must have a image format whose potential format features contain VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-pDepthStencilAttachment-03071", "If neither the VK_AMD_mixed_attachment_samples nor the VK_NV_framebuffer_mixed_samples extensions are enabled, and if pDepthStencilAttachment is not VK_ATTACHMENT_UNUSED and any attachments in pColorAttachments are not VK_ATTACHMENT_UNUSED, they must have the same sample count", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-pDepthStencilAttachment-parameter", "If pDepthStencilAttachment is not NULL, pDepthStencilAttachment must be a valid pointer to a valid VkAttachmentReference2 structure", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-pInputAttachments-02897", "All attachments in pInputAttachments that are not VK_ATTACHMENT_UNUSED must have image formats whose potential format features contain at least VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT or VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-pInputAttachments-parameter", "If inputAttachmentCount is not 0, pInputAttachments must be a valid pointer to an array of inputAttachmentCount valid VkAttachmentReference2 structures", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-pPreserveAttachments-03074", "Any given element of pPreserveAttachments must not also be an element of any other member of the subpass description", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-pPreserveAttachments-parameter", "If preserveAttachmentCount is not 0, pPreserveAttachments must be a valid pointer to an array of preserveAttachmentCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-pResolveAttachments-02899", "All attachments in pResolveAttachments that are not VK_ATTACHMENT_UNUSED must have image formats whose potential format features contain VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-pResolveAttachments-03065", "If pResolveAttachments is not NULL, for each resolve attachment that does not have the value VK_ATTACHMENT_UNUSED, the corresponding color attachment must not have the value VK_ATTACHMENT_UNUSED", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-pResolveAttachments-03066", "If pResolveAttachments is not NULL, for each resolve attachment that is not VK_ATTACHMENT_UNUSED, the corresponding color attachment must not have a sample count of VK_SAMPLE_COUNT_1_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-pResolveAttachments-03067", "If pResolveAttachments is not NULL, each resolve attachment that is not VK_ATTACHMENT_UNUSED must have a sample count of VK_SAMPLE_COUNT_1_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-pResolveAttachments-03068", "Any given element of pResolveAttachments must have the same VkFormat as its corresponding color attachment", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-pResolveAttachments-parameter", "If colorAttachmentCount is not 0, and pResolveAttachments is not NULL, pResolveAttachments must be a valid pointer to an array of colorAttachmentCount valid VkAttachmentReference2 structures", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-pipelineBindPoint-03062", "pipelineBindPoint must be VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-pipelineBindPoint-parameter", "pipelineBindPoint must be a valid VkPipelineBindPoint value", "1.2-extensions"},
+ {"VUID-VkSubpassDescription2-sType-sType", "sType must be VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2", "1.2-extensions"},
+ {"VUID-VkSubpassDescriptionDepthStencilResolve-depthResolveMode-03183", "The value of depthResolveMode must be one of the bits set in VkPhysicalDeviceDepthStencilResolveProperties::supportedDepthResolveModes or VK_RESOLVE_MODE_NONE", "1.2-extensions"},
+ {"VUID-VkSubpassDescriptionDepthStencilResolve-depthResolveMode-parameter", "depthResolveMode must be a valid VkResolveModeFlagBits value", "1.2-extensions"},
+ {"VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-02651", "If pDepthStencilResolveAttachment is not NULL and does not have the value VK_ATTACHMENT_UNUSED then it must have a format whose features contain VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03177", "If pDepthStencilResolveAttachment is not NULL and does not have the value VK_ATTACHMENT_UNUSED, pDepthStencilAttachment must not have the value VK_ATTACHMENT_UNUSED", "1.2-extensions"},
+ {"VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03178", "If pDepthStencilResolveAttachment is not NULL and does not have the value VK_ATTACHMENT_UNUSED, depthResolveMode and stencilResolveMode must not both be VK_RESOLVE_MODE_NONE", "1.2-extensions"},
+ {"VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03179", "If pDepthStencilResolveAttachment is not NULL and does not have the value VK_ATTACHMENT_UNUSED, pDepthStencilAttachment must not have a sample count of VK_SAMPLE_COUNT_1_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03180", "If pDepthStencilResolveAttachment is not NULL and does not have the value VK_ATTACHMENT_UNUSED, pDepthStencilResolveAttachment must have a sample count of VK_SAMPLE_COUNT_1_BIT", "1.2-extensions"},
+ {"VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03181", "If the VkFormat of pDepthStencilResolveAttachment has a depth component, then the VkFormat of pDepthStencilAttachment must have a depth component with the same number of bits and numerical type", "1.2-extensions"},
+ {"VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03182", "If the VkFormat of pDepthStencilResolveAttachment has a stencil component, then the VkFormat of pDepthStencilAttachment must have a stencil component with the same number of bits and numerical type", "1.2-extensions"},
+ {"VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03185", "If the VkFormat of pDepthStencilResolveAttachment has both depth and stencil components, VkPhysicalDeviceDepthStencilResolveProperties::independentResolve is VK_FALSE, and VkPhysicalDeviceDepthStencilResolveProperties::independentResolveNone is VK_FALSE, then the values of depthResolveMode and stencilResolveMode must be identical", "1.2-extensions"},
+ {"VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-03186", "If the VkFormat of pDepthStencilResolveAttachment has both depth and stencil components, VkPhysicalDeviceDepthStencilResolveProperties::independentResolve is VK_FALSE and VkPhysicalDeviceDepthStencilResolveProperties::independentResolveNone is VK_TRUE, then the values of depthResolveMode and stencilResolveMode must be identical or one of them must be VK_RESOLVE_MODE_NONE", "1.2-extensions"},
+ {"VUID-VkSubpassDescriptionDepthStencilResolve-pDepthStencilResolveAttachment-parameter", "If pDepthStencilResolveAttachment is not NULL, pDepthStencilResolveAttachment must be a valid pointer to a valid VkAttachmentReference2 structure", "1.2-extensions"},
+ {"VUID-VkSubpassDescriptionDepthStencilResolve-sType-sType", "sType must be VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE", "1.2-extensions"},
+ {"VUID-VkSubpassDescriptionDepthStencilResolve-stencilResolveMode-03184", "The value of stencilResolveMode must be one of the bits set in VkPhysicalDeviceDepthStencilResolveProperties::supportedStencilResolveModes or VK_RESOLVE_MODE_NONE", "1.2-extensions"},
+ {"VUID-VkSubpassDescriptionDepthStencilResolve-stencilResolveMode-parameter", "stencilResolveMode must be a valid VkResolveModeFlagBits value", "1.2-extensions"},
+ {"VUID-VkSubpassEndInfo-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkSubpassEndInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_SUBPASS_END_INFO", "1.2-extensions"},
+ {"VUID-VkSubpassSampleLocationsEXT-sampleLocationsInfo-parameter", "sampleLocationsInfo must be a valid VkSampleLocationsInfoEXT structure", "1.2-extensions"},
+ {"VUID-VkSubpassSampleLocationsEXT-subpassIndex-01532", "subpassIndex must be less than the subpassCount specified in VkRenderPassCreateInfo the render pass specified by VkRenderPassBeginInfo::renderPass was created with", "1.2-extensions"},
+ {"VUID-VkSurfaceCapabilities2EXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkSurfaceCapabilities2EXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT", "1.2-extensions"},
+ {"VUID-VkSurfaceCapabilities2EXT-supportedSurfaceCounters-01246", "supportedSurfaceCounters must not include VK_SURFACE_COUNTER_VBLANK_EXT unless the surface queried is a display surface", "1.2-extensions"},
+ {"VUID-VkSurfaceCapabilities2KHR-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkDisplayNativeHdrSurfaceCapabilitiesAMD, VkSharedPresentSurfaceCapabilitiesKHR, VkSurfaceCapabilitiesFullScreenExclusiveEXT, or VkSurfaceProtectedCapabilitiesKHR", "1.2-extensions"},
+ {"VUID-VkSurfaceCapabilities2KHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR", "1.2-extensions"},
+ {"VUID-VkSurfaceCapabilities2KHR-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkSurfaceCapabilitiesFullScreenExclusiveEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT", "1.2-extensions"},
+ {"VUID-VkSurfaceFormat2KHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkSurfaceFormat2KHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR", "1.2-extensions"},
+ {"VUID-VkSurfaceFullScreenExclusiveInfoEXT-fullScreenExclusive-parameter", "fullScreenExclusive must be a valid VkFullScreenExclusiveEXT value", "1.2-extensions"},
+ {"VUID-VkSurfaceFullScreenExclusiveInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkSurfaceFullScreenExclusiveWin32InfoEXT-hmonitor-02673", "hmonitor must be a valid HMONITOR", "1.2-extensions"},
+ {"VUID-VkSurfaceFullScreenExclusiveWin32InfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkSurfaceProtectedCapabilitiesKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR", "1.2-extensions"},
+ {"VUID-VkSwapchainCounterCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkSwapchainCounterCreateInfoEXT-surfaceCounters-01244", "The bits in surfaceCounters must be supported by VkSwapchainCreateInfoKHR::surface, as reported by vkGetPhysicalDeviceSurfaceCapabilities2EXT", "1.2-extensions"},
+ {"VUID-VkSwapchainCounterCreateInfoEXT-surfaceCounters-parameter", "surfaceCounters must be a valid combination of VkSurfaceCounterFlagBitsEXT values", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-commonparent", "Both of oldSwapchain, and surface that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkInstance", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-compositeAlpha-01280", "compositeAlpha must be one of the bits present in the supportedCompositeAlpha member of the VkSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-compositeAlpha-parameter", "compositeAlpha must be a valid VkCompositeAlphaFlagBitsKHR value", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-flags-03168", "If flags contains VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR then the pNext chain must include a VkImageFormatListCreateInfo structure with a viewFormatCount greater than zero and pViewFormats must have an element equal to imageFormat", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-flags-03187", "If flags contains VK_SWAPCHAIN_CREATE_PROTECTED_BIT_KHR, then VkSurfaceProtectedCapabilitiesKHR::supportsProtected must be VK_TRUE in the VkSurfaceProtectedCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilities2KHR for surface", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-flags-04100", "If flags dose not contain VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR and the pNext chain include a VkImageFormatListCreateInfo structure then VkImageFormatListCreateInfo::viewFormatCount must be 0 or 1", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-flags-parameter", "flags must be a valid combination of VkSwapchainCreateFlagBitsKHR values", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-imageArrayLayers-01275", "imageArrayLayers must be greater than 0 and less than or equal to the maxImageArrayLayers member of the VkSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-imageColorSpace-parameter", "imageColorSpace must be a valid VkColorSpaceKHR value", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-imageExtent-01274", "imageExtent must be between minImageExtent and maxImageExtent, inclusive, where minImageExtent and maxImageExtent are members of the VkSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-imageExtent-01689", "imageExtent members width and height must both be non-zero", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-imageFormat-01273", "imageFormat and imageColorSpace must match the format and colorSpace members, respectively, of one of the VkSurfaceFormatKHR structures returned by vkGetPhysicalDeviceSurfaceFormatsKHR for the surface", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-imageFormat-01778", "The implied image creation parameters of the swapchain must be supported as reported by vkGetPhysicalDeviceImageFormatProperties", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-imageFormat-parameter", "imageFormat must be a valid VkFormat value", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01277", "If imageSharingMode is VK_SHARING_MODE_CONCURRENT, pQueueFamilyIndices must be a valid pointer to an array of queueFamilyIndexCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01278", "If imageSharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01393", "If imageSharingMode is VK_SHARING_MODE_CONCURRENT, each element of pQueueFamilyIndices must be unique and must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the physicalDevice that was used to create device", "default"},
+ {"VUID-VkSwapchainCreateInfoKHR-imageSharingMode-01428", "If imageSharingMode is VK_SHARING_MODE_CONCURRENT, each element of pQueueFamilyIndices must be unique and must be less than pQueueFamilyPropertyCount returned by either vkGetPhysicalDeviceQueueFamilyProperties or vkGetPhysicalDeviceQueueFamilyProperties2 for the physicalDevice that was used to create device", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-imageSharingMode-parameter", "imageSharingMode must be a valid VkSharingMode value", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-imageUsage-01276", "imageUsage must be a subset of the supported usage flags present in the supportedUsageFlags member of the VkSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface", "default"},
+ {"VUID-VkSwapchainCreateInfoKHR-imageUsage-01384", "If presentMode is VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR or VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR, imageUsage must be a subset of the supported usage flags present in the sharedPresentSupportedUsageFlags member of the VkSharedPresentSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilities2KHR for surface", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-imageUsage-parameter", "imageUsage must be a valid combination of VkImageUsageFlagBits values", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-imageUsage-requiredbitmask", "imageUsage must not be 0", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-minImageCount-01271", "minImageCount must be greater than or equal to the value returned in the minImageCount member of the VkSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface", "default"},
+ {"VUID-VkSwapchainCreateInfoKHR-minImageCount-01272", "minImageCount must be less than or equal to the value returned in the maxImageCount member of the VkSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface if the returned maxImageCount is not zero", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-minImageCount-01383", "minImageCount must be 1 if presentMode is either VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR or VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-oldSwapchain-01933", "If oldSwapchain is not VK_NULL_HANDLE, oldSwapchain must be a non-retired swapchain associated with native window referred to by surface", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-oldSwapchain-parameter", "If oldSwapchain is not VK_NULL_HANDLE, oldSwapchain must be a valid VkSwapchainKHR handle", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-oldSwapchain-parent", "If oldSwapchain is a valid handle, it must have been created, allocated, or retrieved from surface", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-pNext-02679", "If the pNext chain includes a VkSurfaceFullScreenExclusiveInfoEXT structure with its fullScreenExclusive member set to VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT, and surface was created using vkCreateWin32SurfaceKHR, a VkSurfaceFullScreenExclusiveWin32InfoEXT structure must be included in the pNext chain", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-pNext-04099", "If a VkImageFormatListCreateInfo structure was included in the pNext chain and VkImageFormatListCreateInfo::viewFormatCount is not zero then all of the formats in VkImageFormatListCreateInfo::pViewFormats must be compatible with the format as described in the compatibility table", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkDeviceGroupSwapchainCreateInfoKHR, VkImageFormatListCreateInfo, VkSurfaceFullScreenExclusiveInfoEXT, VkSurfaceFullScreenExclusiveWin32InfoEXT, VkSwapchainCounterCreateInfoEXT, or VkSwapchainDisplayNativeHdrCreateInfoAMD", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-physicalDeviceCount-01429", "If the logical device was created with VkDeviceGroupDeviceCreateInfo::physicalDeviceCount equal to 1, flags must not contain VK_SWAPCHAIN_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-preTransform-01279", "preTransform must be one of the bits present in the supportedTransforms member of the VkSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-preTransform-parameter", "preTransform must be a valid VkSurfaceTransformFlagBitsKHR value", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-presentMode-01281", "presentMode must be one of the VkPresentModeKHR values returned by vkGetPhysicalDeviceSurfacePresentModesKHR for the surface", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-presentMode-01427", "If presentMode is VK_PRESENT_MODE_IMMEDIATE_KHR, VK_PRESENT_MODE_MAILBOX_KHR, VK_PRESENT_MODE_FIFO_KHR or VK_PRESENT_MODE_FIFO_RELAXED_KHR, imageUsage must be a subset of the supported usage flags present in the supportedUsageFlags member of the VkSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilitiesKHR for surface", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-presentMode-02839", "If presentMode is not VK_PRESENT_MODE_SHARED_DEMAND_REFRESH_KHR nor VK_PRESENT_MODE_SHARED_CONTINUOUS_REFRESH_KHR, then minImageCount must be greater than or equal to the value returned in the minImageCount member of the VkSurfaceCapabilitiesKHR structure returned by vkGetPhysicalDeviceSurfaceCapabilitiesKHR for the surface", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-presentMode-parameter", "presentMode must be a valid VkPresentModeKHR value", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-surface-01270", "surface must be a surface that is supported by the device as determined using vkGetPhysicalDeviceSurfaceSupportKHR", "1.2-extensions"},
+ {"VUID-VkSwapchainCreateInfoKHR-surface-parameter", "surface must be a valid VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-VkSwapchainDisplayNativeHdrCreateInfoAMD-localDimmingEnable-XXXXX", "It is only valid to set localDimmingEnable to VK_TRUE if VkDisplayNativeHdrSurfaceCapabilitiesAMD::localDimmingSupport is supported", "1.2-extensions"},
+ {"VUID-VkSwapchainDisplayNativeHdrCreateInfoAMD-sType-sType", "sType must be VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD", "1.2-extensions"},
+ {"VUID-VkTextureLODGatherFormatPropertiesAMD-sType-sType", "sType must be VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD", "1.2-extensions"},
+ {"VUID-VkTimelineSemaphoreSubmitInfo-pSignalSemaphoreValues-parameter", "If signalSemaphoreValueCount is not 0, and pSignalSemaphoreValues is not NULL, pSignalSemaphoreValues must be a valid pointer to an array of signalSemaphoreValueCount uint64_t values", "1.2-extensions"},
+ {"VUID-VkTimelineSemaphoreSubmitInfo-pWaitSemaphoreValues-parameter", "If waitSemaphoreValueCount is not 0, and pWaitSemaphoreValues is not NULL, pWaitSemaphoreValues must be a valid pointer to an array of waitSemaphoreValueCount uint64_t values", "1.2-extensions"},
+ {"VUID-VkTimelineSemaphoreSubmitInfo-sType-sType", "sType must be VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO", "1.2-extensions"},
+ {"VUID-VkTraceRaysIndirectCommandKHR-depth-03521", "depth must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]", "1.2-extensions"},
+ {"VUID-VkTraceRaysIndirectCommandKHR-height-03520", "height must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1]", "1.2-extensions"},
+ {"VUID-VkTraceRaysIndirectCommandKHR-width-03519", "width must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]", "1.2-extensions"},
+ {"VUID-VkValidationCacheCreateInfoEXT-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkValidationCacheCreateInfoEXT-initialDataSize-01534", "If initialDataSize is not 0, it must be equal to the size of pInitialData, as returned by vkGetValidationCacheDataEXT when pInitialData was originally retrieved", "1.2-extensions"},
+ {"VUID-VkValidationCacheCreateInfoEXT-initialDataSize-01535", "If initialDataSize is not 0, pInitialData must have been retrieved from a previous call to vkGetValidationCacheDataEXT", "1.2-extensions"},
+ {"VUID-VkValidationCacheCreateInfoEXT-pInitialData-parameter", "If initialDataSize is not 0, pInitialData must be a valid pointer to an array of initialDataSize bytes", "1.2-extensions"},
+ {"VUID-VkValidationCacheCreateInfoEXT-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkValidationCacheCreateInfoEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT", "1.2-extensions"},
+ {"VUID-VkValidationFeaturesEXT-pDisabledValidationFeatures-parameter", "If disabledValidationFeatureCount is not 0, pDisabledValidationFeatures must be a valid pointer to an array of disabledValidationFeatureCount valid VkValidationFeatureDisableEXT values", "1.2-extensions"},
+ {"VUID-VkValidationFeaturesEXT-pEnabledValidationFeatures-02967", "If the pEnabledValidationFeatures array contains VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT, then it must also contain VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT", "1.2-extensions"},
+ {"VUID-VkValidationFeaturesEXT-pEnabledValidationFeatures-02968", "If the pEnabledValidationFeatures array contains VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT, then it must not contain VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT", "1.2-extensions"},
+ {"VUID-VkValidationFeaturesEXT-pEnabledValidationFeatures-parameter", "If enabledValidationFeatureCount is not 0, pEnabledValidationFeatures must be a valid pointer to an array of enabledValidationFeatureCount valid VkValidationFeatureEnableEXT values", "1.2-extensions"},
+ {"VUID-VkValidationFeaturesEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT", "1.2-extensions"},
+ {"VUID-VkValidationFlagsEXT-disabledValidationCheckCount-arraylength", "disabledValidationCheckCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkValidationFlagsEXT-pDisabledValidationChecks-parameter", "pDisabledValidationChecks must be a valid pointer to an array of disabledValidationCheckCount valid VkValidationCheckEXT values", "1.2-extensions"},
+ {"VUID-VkValidationFlagsEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT", "1.2-extensions"},
+ {"VUID-VkVertexInputAttributeDescription-binding-00621", "binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings", "1.2-extensions"},
+ {"VUID-VkVertexInputAttributeDescription-format-00623", "format must be allowed as a vertex buffer format, as specified by the VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT flag in VkFormatProperties::bufferFeatures returned by vkGetPhysicalDeviceFormatProperties", "1.2-extensions"},
+ {"VUID-VkVertexInputAttributeDescription-format-parameter", "format must be a valid VkFormat value", "1.2-extensions"},
+ {"VUID-VkVertexInputAttributeDescription-location-00620", "location must be less than VkPhysicalDeviceLimits::maxVertexInputAttributes", "1.2-extensions"},
+ {"VUID-VkVertexInputAttributeDescription-offset-00622", "offset must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputAttributeOffset", "1.2-extensions"},
+ {"VUID-VkVertexInputBindingDescription-binding-00618", "binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings", "1.2-extensions"},
+ {"VUID-VkVertexInputBindingDescription-inputRate-parameter", "inputRate must be a valid VkVertexInputRate value", "1.2-extensions"},
+ {"VUID-VkVertexInputBindingDescription-stride-00619", "stride must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputBindingStride", "1.2-extensions"},
+ {"VUID-VkVertexInputBindingDivisorDescriptionEXT-binding-01869", "binding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings", "1.2-extensions"},
+ {"VUID-VkVertexInputBindingDivisorDescriptionEXT-divisor-01870", "divisor must be a value between 0 and VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT::maxVertexAttribDivisor, inclusive", "1.2-extensions"},
+ {"VUID-VkVertexInputBindingDivisorDescriptionEXT-inputRate-01871", "VkVertexInputBindingDescription::inputRate must be of type VK_VERTEX_INPUT_RATE_INSTANCE for this binding", "1.2-extensions"},
+ {"VUID-VkVertexInputBindingDivisorDescriptionEXT-vertexAttributeInstanceRateDivisor-02229", "If the vertexAttributeInstanceRateDivisor feature is not enabled, divisor must be 1", "1.2-extensions"},
+ {"VUID-VkVertexInputBindingDivisorDescriptionEXT-vertexAttributeInstanceRateZeroDivisor-02228", "If the vertexAttributeInstanceRateZeroDivisor feature is not enabled, divisor must not be 0", "1.2-extensions"},
+ {"VUID-VkViSurfaceCreateInfoNN-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkViSurfaceCreateInfoNN-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkViSurfaceCreateInfoNN-sType-sType", "sType must be VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN", "1.2-extensions"},
+ {"VUID-VkViSurfaceCreateInfoNN-window-01318", "window must be a valid nn::vi::NativeWindowHandle", "1.2-extensions"},
+ {"VUID-VkViewport-height-01772", "height must be greater than 0.0", "1.0"},
+ {"VUID-VkViewport-height-01773", "The absolute value of height must be less than or equal to VkPhysicalDeviceLimits::maxViewportDimensions[1]", "1.2-extensions"},
+ {"VUID-VkViewport-maxDepth-01235", "Unless VK_EXT_depth_range_unrestricted extension is enabled maxDepth must be between 0.0 and 1.0, inclusive", "1.2-extensions"},
+ {"VUID-VkViewport-maxDepth-02541", "maxDepth must be between 0.0 and 1.0, inclusive", "1.2-khr-extensions"},
+ {"VUID-VkViewport-minDepth-01234", "Unless VK_EXT_depth_range_unrestricted extension is enabled minDepth must be between 0.0 and 1.0, inclusive", "1.2-extensions"},
+ {"VUID-VkViewport-minDepth-02540", "minDepth must be between 0.0 and 1.0, inclusive", "1.2-khr-extensions"},
+ {"VUID-VkViewport-width-01770", "width must be greater than 0.0", "1.2-extensions"},
+ {"VUID-VkViewport-width-01771", "width must be less than or equal to VkPhysicalDeviceLimits::maxViewportDimensions[0]", "1.2-extensions"},
+ {"VUID-VkViewport-x-01232", "(x + width) must be less than or equal to viewportBoundsRange[1]", "1.2-extensions"},
+ {"VUID-VkViewport-x-01774", "x must be greater than or equal to viewportBoundsRange[0]", "1.2-extensions"},
+ {"VUID-VkViewport-y-01233", "(y + height) must be less than or equal to viewportBoundsRange[1]", "1.2-extensions"},
+ {"VUID-VkViewport-y-01775", "y must be greater than or equal to viewportBoundsRange[0]", "1.2-extensions"},
+ {"VUID-VkViewport-y-01776", "y must be less than or equal to viewportBoundsRange[1]", "1.2-extensions"},
+ {"VUID-VkViewport-y-01777", "(y + height) must be greater than or equal to viewportBoundsRange[0]", "1.2-extensions"},
+ {"VUID-VkViewportSwizzleNV-w-parameter", "w must be a valid VkViewportCoordinateSwizzleNV value", "1.2-extensions"},
+ {"VUID-VkViewportSwizzleNV-x-parameter", "x must be a valid VkViewportCoordinateSwizzleNV value", "1.2-extensions"},
+ {"VUID-VkViewportSwizzleNV-y-parameter", "y must be a valid VkViewportCoordinateSwizzleNV value", "1.2-extensions"},
+ {"VUID-VkViewportSwizzleNV-z-parameter", "z must be a valid VkViewportCoordinateSwizzleNV value", "1.2-extensions"},
+ {"VUID-VkWaylandSurfaceCreateInfoKHR-display-01304", "display must point to a valid Wayland wl_display", "1.2-extensions"},
+ {"VUID-VkWaylandSurfaceCreateInfoKHR-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkWaylandSurfaceCreateInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkWaylandSurfaceCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkWaylandSurfaceCreateInfoKHR-surface-01305", "surface must point to a valid Wayland wl_surface", "1.2-extensions"},
+ {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-commonparent", "Both of the elements of pAcquireSyncs, and the elements of pReleaseSyncs that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pAcquireKeys-parameter", "If acquireCount is not 0, pAcquireKeys must be a valid pointer to an array of acquireCount uint64_t values", "1.2-extensions"},
+ {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pAcquireSyncs-00081", "Each member of pAcquireSyncs and pReleaseSyncs must be a device memory object imported by setting VkImportMemoryWin32HandleInfoKHR::handleType to VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT or VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT", "1.2-extensions"},
+ {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pAcquireSyncs-parameter", "If acquireCount is not 0, pAcquireSyncs must be a valid pointer to an array of acquireCount valid VkDeviceMemory handles", "1.2-extensions"},
+ {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pAcquireTimeouts-parameter", "If acquireCount is not 0, pAcquireTimeouts must be a valid pointer to an array of acquireCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pReleaseKeys-parameter", "If releaseCount is not 0, pReleaseKeys must be a valid pointer to an array of releaseCount uint64_t values", "1.2-extensions"},
+ {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-pReleaseSyncs-parameter", "If releaseCount is not 0, pReleaseSyncs must be a valid pointer to an array of releaseCount valid VkDeviceMemory handles", "1.2-extensions"},
+ {"VUID-VkWin32KeyedMutexAcquireReleaseInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-commonparent", "Both of the elements of pAcquireSyncs, and the elements of pReleaseSyncs that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pAcquireKeys-parameter", "If acquireCount is not 0, pAcquireKeys must be a valid pointer to an array of acquireCount uint64_t values", "1.2-extensions"},
+ {"VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pAcquireSyncs-parameter", "If acquireCount is not 0, pAcquireSyncs must be a valid pointer to an array of acquireCount valid VkDeviceMemory handles", "1.2-extensions"},
+ {"VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pAcquireTimeoutMilliseconds-parameter", "If acquireCount is not 0, pAcquireTimeoutMilliseconds must be a valid pointer to an array of acquireCount uint32_t values", "1.2-extensions"},
+ {"VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pReleaseKeys-parameter", "If releaseCount is not 0, pReleaseKeys must be a valid pointer to an array of releaseCount uint64_t values", "1.2-extensions"},
+ {"VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-pReleaseSyncs-parameter", "If releaseCount is not 0, pReleaseSyncs must be a valid pointer to an array of releaseCount valid VkDeviceMemory handles", "1.2-extensions"},
+ {"VUID-VkWin32KeyedMutexAcquireReleaseInfoNV-sType-sType", "sType must be VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV", "1.2-extensions"},
+ {"VUID-VkWin32SurfaceCreateInfoKHR-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkWin32SurfaceCreateInfoKHR-hinstance-01307", "hinstance must be a valid Win32 HINSTANCE", "1.2-extensions"},
+ {"VUID-VkWin32SurfaceCreateInfoKHR-hwnd-01308", "hwnd must be a valid Win32 HWND", "1.2-extensions"},
+ {"VUID-VkWin32SurfaceCreateInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkWin32SurfaceCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-commonparent", "Both of dstSet, and the elements of pTexelBufferView that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorCount-00317", "All consecutive bindings updated via a single VkWriteDescriptorSet structure, except those with a descriptorCount of zero, must have identical descriptorType and stageFlags", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorCount-00318", "All consecutive bindings updated via a single VkWriteDescriptorSet structure, except those with a descriptorCount of zero, must all either use immutable samplers or must all not use immutable samplers", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorCount-03048", "All consecutive bindings updated via a single VkWriteDescriptorSet structure, except those with a descriptorCount of zero, must have identical VkDescriptorBindingFlagBits", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorCount-arraylength", "descriptorCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-00319", "descriptorType must match the type of dstBinding within dstSet", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-00322", "If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, pImageInfo must be a valid pointer to an array of descriptorCount valid VkDescriptorImageInfo structures", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-00324", "If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a valid pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-00325", "If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and dstSet was not allocated with a layout that included immutable samplers for dstBinding with descriptorType, the sampler member of each element of pImageInfo must be a valid VkSampler object", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-00327", "If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, the offset member of each element of pBufferInfo must be a multiple of VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-00328", "If descriptorType is VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, the offset member of each element of pBufferInfo must be a multiple of VkPhysicalDeviceLimits::minStorageBufferOffsetAlignment", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-00329", "If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, and the buffer member of any element of pBufferInfo is the handle of a non-sparse buffer, then that buffer must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-00330", "If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, the buffer member of each element of pBufferInfo must have been created with VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT set", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-00331", "If descriptorType is VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, the buffer member of each element of pBufferInfo must have been created with VK_BUFFER_USAGE_STORAGE_BUFFER_BIT set", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-00332", "If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, the range member of each element of pBufferInfo, or the effective range if range is VK_WHOLE_SIZE, must be less than or equal to VkPhysicalDeviceLimits::maxUniformBufferRange", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-00333", "If descriptorType is VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, the range member of each element of pBufferInfo, or the effective range if range is VK_WHOLE_SIZE, must be less than or equal to VkPhysicalDeviceLimits::maxStorageBufferRange", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-00334", "If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, the VkBuffer that each element of pTexelBufferView was created from must have been created with VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT set", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-00335", "If descriptorType is VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, the VkBuffer that each element of pTexelBufferView was created from must have been created with VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT set", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-00336", "If descriptorType is VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView member of each element of pImageInfo must have been created with the identity swizzle", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-00337", "If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, the imageView member of each element of pImageInfo must have been created with VK_IMAGE_USAGE_SAMPLED_BIT set", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-00338", "If descriptorType is VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView member of each element of pImageInfo must have been created with VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT set", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-00339", "If descriptorType is VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, the imageView member of each element of pImageInfo must have been created with VK_IMAGE_USAGE_STORAGE_BIT set", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-01402", "If descriptorType is VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, for each descriptor that will be accessed via load or store operations the imageLayout member for corresponding elements of pImageInfo must be VK_IMAGE_LAYOUT_GENERAL", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-01403", "If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE or VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, the imageLayout member of each element of pImageInfo must be a member of the list given in Sampled Image or Combined Image Sampler, corresponding to its type", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-01946", "If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, then the imageView member of each pImageInfo element must have been created without a VkSamplerYcbcrConversionInfo structure in its pNext chain", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-01948", "If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and dstSet was allocated with a layout that included immutable samplers for dstBinding, then the imageView member of each element of pImageInfo which corresponds to an immutable sampler that enables sampler {YCbCr} conversion must have been created with a VkSamplerYcbcrConversionInfo structure in its pNext chain with an identically defined VkSamplerYcbcrConversionInfo to the corresponding immutable sampler", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-02219", "If descriptorType is VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, dstArrayElement must be an integer multiple of 4", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-02220", "If descriptorType is VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, descriptorCount must be an integer multiple of 4", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-02221", "If descriptorType is VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, the pNext chain must include a VkWriteDescriptorSetInlineUniformBlockEXT structure whose dataSize member equals descriptorCount", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-02382", "If descriptorType is VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, the pNext chain must include a VkWriteDescriptorSetAccelerationStructureKHR structure whose accelerationStructureCount member equals descriptorCount", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-02738", "If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, and if any element of pImageInfo has a imageView member that was created with a VkSamplerYcbcrConversionInfo structure in its pNext chain, then dstSet must have been allocated with a layout that included immutable samplers for dstBinding, and the corresponding immutable sampler must have been created with an identically defined VkSamplerYcbcrConversionInfo object", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-02752", "If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, then dstSet must not have been allocated with a layout that included immutable samplers for dstBinding", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-02994", "If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, each element of pTexelBufferView must be either a valid VkBufferView handle or VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-02995", "If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER and the nullDescriptor feature is not enabled, each element of pTexelBufferView must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-02996", "If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView member of each element of pImageInfo must be either a valid VkImageView handle or VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-02997", "If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT and the nullDescriptor feature is not enabled, the imageView member of each element of pImageInfo must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-descriptorType-parameter", "descriptorType must be a valid VkDescriptorType value", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-dstArrayElement-00321", "The sum of dstArrayElement and descriptorCount must be less than or equal to the number of array elements in the descriptor set binding specified by dstBinding, and all applicable consecutive bindings, as described by consecutive binding updates", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-dstBinding-00315", "dstBinding must be less than or equal to the maximum value of binding of all VkDescriptorSetLayoutBinding structures specified when dstSet's descriptor set layout was created", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-dstBinding-00316", "dstBinding must be a binding with a non-zero descriptorCount", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-dstSet-00320", "dstSet must be a valid VkDescriptorSet handle", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-pNext-pNext", "Each pNext member of any structure (including this one) in the pNext chain must be either NULL or a pointer to a valid instance of VkWriteDescriptorSetAccelerationStructureKHR or VkWriteDescriptorSetInlineUniformBlockEXT", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-sType-sType", "sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSet-sType-unique", "The sType value of each struct in the pNext chain must be unique", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSetAccelerationStructureKHR-accelerationStructureCount-02236", "accelerationStructureCount must be equal to descriptorCount in the extended structure", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSetAccelerationStructureKHR-accelerationStructureCount-arraylength", "accelerationStructureCount must be greater than 0", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSetAccelerationStructureKHR-pAccelerationStructures-02764", "Each acceleration structure in pAccelerationStructures must have been created with VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSetAccelerationStructureKHR-pAccelerationStructures-parameter", "pAccelerationStructures must be a valid pointer to an array of accelerationStructureCount valid VkAccelerationStructureKHR handles", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSetAccelerationStructureKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSetInlineUniformBlockEXT-dataSize-02222", "dataSize must be an integer multiple of 4", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSetInlineUniformBlockEXT-dataSize-arraylength", "dataSize must be greater than 0", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSetInlineUniformBlockEXT-pData-parameter", "pData must be a valid pointer to an array of dataSize bytes", "1.2-extensions"},
+ {"VUID-VkWriteDescriptorSetInlineUniformBlockEXT-sType-sType", "sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT", "1.2-extensions"},
+ {"VUID-VkXcbSurfaceCreateInfoKHR-connection-01310", "connection must point to a valid X11 xcb_connection_t", "1.2-extensions"},
+ {"VUID-VkXcbSurfaceCreateInfoKHR-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkXcbSurfaceCreateInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkXcbSurfaceCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkXcbSurfaceCreateInfoKHR-window-01311", "window must be a valid X11 xcb_window_t", "1.2-extensions"},
+ {"VUID-VkXlibSurfaceCreateInfoKHR-dpy-01313", "dpy must point to a valid Xlib Display", "1.2-extensions"},
+ {"VUID-VkXlibSurfaceCreateInfoKHR-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-VkXlibSurfaceCreateInfoKHR-pNext-pNext", "pNext must be NULL", "1.2-extensions"},
+ {"VUID-VkXlibSurfaceCreateInfoKHR-sType-sType", "sType must be VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR", "1.2-extensions"},
+ {"VUID-VkXlibSurfaceCreateInfoKHR-window-01314", "window must be a valid Xlib Window", "1.2-extensions"},
+ {"VUID-vkAcquireFullScreenExclusiveModeEXT-commonparent", "Both of device, and swapchain must have been created, allocated, or retrieved from the same VkInstance", "1.2-extensions"},
+ {"VUID-vkAcquireFullScreenExclusiveModeEXT-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkAcquireFullScreenExclusiveModeEXT-swapchain-02674", "swapchain must not be in the retired state", "1.2-extensions"},
+ {"VUID-vkAcquireFullScreenExclusiveModeEXT-swapchain-02675", "swapchain must be a swapchain created with a VkSurfaceFullScreenExclusiveInfoEXT structure, with fullScreenExclusive set to VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT", "1.2-extensions"},
+ {"VUID-vkAcquireFullScreenExclusiveModeEXT-swapchain-02676", "swapchain must not currently have exclusive full-screen access", "1.2-extensions"},
+ {"VUID-vkAcquireFullScreenExclusiveModeEXT-swapchain-parameter", "swapchain must be a valid VkSwapchainKHR handle", "1.2-extensions"},
+ {"VUID-vkAcquireNextImage2KHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkAcquireNextImage2KHR-pAcquireInfo-parameter", "pAcquireInfo must be a valid pointer to a valid VkAcquireNextImageInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkAcquireNextImage2KHR-pImageIndex-parameter", "pImageIndex must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkAcquireNextImage2KHR-swapchain-01803", "If the number of currently acquired images is greater than the difference between the number of images in the swapchain member of pAcquireInfo and the value of VkSurfaceCapabilitiesKHR::minImageCount as returned by a call to vkGetPhysicalDeviceSurfaceCapabilities2KHR with the surface used to create swapchain, the timeout member of pAcquireInfo must not be UINT64_MAX", "1.2-extensions"},
+ {"VUID-vkAcquireNextImageKHR-commonparent", "Both of device, and swapchain that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkInstance", "1.2-extensions"},
+ {"VUID-vkAcquireNextImageKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkAcquireNextImageKHR-fence-01287", "If fence is not VK_NULL_HANDLE it must be unsignaled and must not be associated with any other queue command that has not yet completed execution on that queue", "1.2-extensions"},
+ {"VUID-vkAcquireNextImageKHR-fence-parameter", "If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle", "1.2-extensions"},
+ {"VUID-vkAcquireNextImageKHR-fence-parent", "If fence is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkAcquireNextImageKHR-pImageIndex-parameter", "pImageIndex must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkAcquireNextImageKHR-semaphore-01286", "If semaphore is not VK_NULL_HANDLE it must be unsignaled", "1.2-extensions"},
+ {"VUID-vkAcquireNextImageKHR-semaphore-01779", "If semaphore is not VK_NULL_HANDLE it must not have any uncompleted signal or wait operations pending", "1.2-extensions"},
+ {"VUID-vkAcquireNextImageKHR-semaphore-01780", "semaphore and fence must not both be equal to VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkAcquireNextImageKHR-semaphore-03265", "semaphore must have a VkSemaphoreType of VK_SEMAPHORE_TYPE_BINARY", "1.2-extensions"},
+ {"VUID-vkAcquireNextImageKHR-semaphore-parameter", "If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle", "1.2-extensions"},
+ {"VUID-vkAcquireNextImageKHR-semaphore-parent", "If semaphore is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkAcquireNextImageKHR-swapchain-01285", "swapchain must not be in the retired state", "1.2-extensions"},
+ {"VUID-vkAcquireNextImageKHR-swapchain-01802", "If the number of currently acquired images is greater than the difference between the number of images in swapchain and the value of VkSurfaceCapabilitiesKHR::minImageCount as returned by a call to vkGetPhysicalDeviceSurfaceCapabilities2KHR with the surface used to create swapchain, timeout must not be UINT64_MAX", "1.2-extensions"},
+ {"VUID-vkAcquireNextImageKHR-swapchain-parameter", "swapchain must be a valid VkSwapchainKHR handle", "1.2-extensions"},
+ {"VUID-vkAcquirePerformanceConfigurationINTEL-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkAcquirePerformanceConfigurationINTEL-pAcquireInfo-parameter", "pAcquireInfo must be a valid pointer to a valid VkPerformanceConfigurationAcquireInfoINTEL structure", "1.2-extensions"},
+ {"VUID-vkAcquirePerformanceConfigurationINTEL-pConfiguration-parameter", "pConfiguration must be a valid pointer to a VkPerformanceConfigurationINTEL handle", "1.2-extensions"},
+ {"VUID-vkAcquireProfilingLockKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkAcquireProfilingLockKHR-pInfo-parameter", "pInfo must be a valid pointer to a valid VkAcquireProfilingLockInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkAcquireXlibDisplayEXT-display-parameter", "display must be a valid VkDisplayKHR handle", "1.2-extensions"},
+ {"VUID-vkAcquireXlibDisplayEXT-display-parent", "display must have been created, allocated, or retrieved from physicalDevice", "1.2-extensions"},
+ {"VUID-vkAcquireXlibDisplayEXT-dpy-parameter", "dpy must be a valid pointer to a Display value", "1.2-extensions"},
+ {"VUID-vkAcquireXlibDisplayEXT-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkAllocateCommandBuffers-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkAllocateCommandBuffers-pAllocateInfo-parameter", "pAllocateInfo must be a valid pointer to a valid VkCommandBufferAllocateInfo structure", "1.2-extensions"},
+ {"VUID-vkAllocateCommandBuffers-pAllocateInfo::commandBufferCount-arraylength", "pAllocateInfo->commandBufferCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkAllocateCommandBuffers-pCommandBuffers-parameter", "pCommandBuffers must be a valid pointer to an array of pAllocateInfo->commandBufferCount VkCommandBuffer handles", "1.2-extensions"},
+ {"VUID-vkAllocateDescriptorSets-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkAllocateDescriptorSets-pAllocateInfo-parameter", "pAllocateInfo must be a valid pointer to a valid VkDescriptorSetAllocateInfo structure", "1.2-extensions"},
+ {"VUID-vkAllocateDescriptorSets-pAllocateInfo::descriptorSetCount-arraylength", "pAllocateInfo->descriptorSetCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkAllocateDescriptorSets-pDescriptorSets-parameter", "pDescriptorSets must be a valid pointer to an array of pAllocateInfo->descriptorSetCount VkDescriptorSet handles", "1.2-extensions"},
+ {"VUID-vkAllocateMemory-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkAllocateMemory-deviceCoherentMemory-02790", "If the deviceCoherentMemory feature is not enabled, pAllocateInfo->memoryTypeIndex must not identify a memory type supporting VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD", "1.2-extensions"},
+ {"VUID-vkAllocateMemory-maxMemoryAllocationCount-04101", "There must be less than VkPhysicalDeviceLimits::maxMemoryAllocationCount device memory allocations currently allocated on the device.", "1.2-extensions"},
+ {"VUID-vkAllocateMemory-pAllocateInfo-01713", "pAllocateInfo->allocationSize must be less than or equal to VkPhysicalDeviceMemoryProperties::memoryHeaps[memindex].size where memindex = VkPhysicalDeviceMemoryProperties::memoryTypes[pAllocateInfo->memoryTypeIndex].heapIndex as returned by vkGetPhysicalDeviceMemoryProperties for the VkPhysicalDevice that device was created from", "1.2-extensions"},
+ {"VUID-vkAllocateMemory-pAllocateInfo-01714", "pAllocateInfo->memoryTypeIndex must be less than VkPhysicalDeviceMemoryProperties::memoryTypeCount as returned by vkGetPhysicalDeviceMemoryProperties for the VkPhysicalDevice that device was created from", "1.2-extensions"},
+ {"VUID-vkAllocateMemory-pAllocateInfo-parameter", "pAllocateInfo must be a valid pointer to a valid VkMemoryAllocateInfo structure", "1.2-extensions"},
+ {"VUID-vkAllocateMemory-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkAllocateMemory-pMemory-parameter", "pMemory must be a valid pointer to a VkDeviceMemory handle", "1.2-extensions"},
+ {"VUID-vkBeginCommandBuffer-commandBuffer-00049", "commandBuffer must not be in the recording or pending state", "1.2-extensions"},
+ {"VUID-vkBeginCommandBuffer-commandBuffer-00050", "If commandBuffer was allocated from a VkCommandPool which did not have the VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state", "1.2-extensions"},
+ {"VUID-vkBeginCommandBuffer-commandBuffer-00051", "If commandBuffer is a secondary command buffer, the pInheritanceInfo member of pBeginInfo must be a valid VkCommandBufferInheritanceInfo structure", "1.2-extensions"},
+ {"VUID-vkBeginCommandBuffer-commandBuffer-00052", "If commandBuffer is a secondary command buffer and either the occlusionQueryEnable member of the pInheritanceInfo member of pBeginInfo is VK_FALSE, or the precise occlusion queries feature is not enabled, the queryFlags member of the pInheritanceInfo member pBeginInfo must not contain VK_QUERY_CONTROL_PRECISE_BIT", "1.2-extensions"},
+ {"VUID-vkBeginCommandBuffer-commandBuffer-02840", "If commandBuffer is a primary command buffer, then pBeginInfo->flags must not set both the VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT and the VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT flags", "1.2-extensions"},
+ {"VUID-vkBeginCommandBuffer-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkBeginCommandBuffer-pBeginInfo-parameter", "pBeginInfo must be a valid pointer to a valid VkCommandBufferBeginInfo structure", "1.2-extensions"},
+ {"VUID-vkBindAccelerationStructureMemoryKHR-bindInfoCount-arraylength", "bindInfoCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkBindAccelerationStructureMemoryKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkBindAccelerationStructureMemoryKHR-pBindInfos-parameter", "pBindInfos must be a valid pointer to an array of bindInfoCount valid VkBindAccelerationStructureMemoryInfoKHR structures", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory-None-01898", "If buffer was created with the VK_BUFFER_CREATE_PROTECTED_BIT bit set, the buffer must be bound to a memory object allocated with a memory type that reports VK_MEMORY_PROPERTY_PROTECTED_BIT", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory-None-01899", "If buffer was created with the VK_BUFFER_CREATE_PROTECTED_BIT bit not set, the buffer must not be bound to a memory object created with a memory type that reports VK_MEMORY_PROPERTY_PROTECTED_BIT", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory-buffer-01029", "buffer must not already be backed by a memory object", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory-buffer-01030", "buffer must not have been created with any sparse memory binding flags", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory-buffer-01038", "If buffer was created with VkDedicatedAllocationBufferCreateInfoNV::dedicatedAllocation equal to VK_TRUE, memory must have been created with VkDedicatedAllocationMemoryAllocateInfoNV::buffer equal to a buffer handle created with identical creation parameters to buffer and memoryOffset must be zero", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory-buffer-01039", "If buffer was not created with VkDedicatedAllocationBufferCreateInfoNV::dedicatedAllocation equal to VK_TRUE, memory must not have been allocated dedicated for a specific buffer or image", "default"},
+ {"VUID-vkBindBufferMemory-buffer-01444", "If buffer requires a dedicated allocation(as reported by vkGetBufferMemoryRequirements2 in VkMemoryDedicatedRequirements::requiresDedicatedAllocation for buffer), memory must have been created with VkMemoryDedicatedAllocateInfo::buffer equal to buffer", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory-buffer-parameter", "buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory-buffer-parent", "buffer must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory-bufferDeviceAddress-03339", "If the VkPhysicalDeviceBufferDeviceAddressFeatures::bufferDeviceAddress feature is enabled and buffer was created with the VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT bit set, memory must have been allocated with the VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT bit set", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory-memory-01035", "memory must have been allocated using one of the memory types allowed in the memoryTypeBits member of the VkMemoryRequirements structure returned from a call to vkGetBufferMemoryRequirements with buffer", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory-memory-01508", "If the VkMemoryAllocateInfo provided when memory was allocated included a VkMemoryDedicatedAllocateInfo structure in its pNext chain, and VkMemoryDedicatedAllocateInfo::buffer was not VK_NULL_HANDLE, then buffer must equal VkMemoryDedicatedAllocateInfo::buffer, and memoryOffset must be zero", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory-memory-02726", "If the value of VkExportMemoryAllocateInfo::handleTypes used to allocate memory is not 0, it must include at least one of the handles set in VkExternalMemoryBufferCreateInfo::handleTypes when buffer was created", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory-memory-02727", "If memory was created by a memory import operation, the external handle type of the imported memory must also have been set in VkExternalMemoryBufferCreateInfo::handleTypes when buffer was created", "1.2-khr-extensions"},
+ {"VUID-vkBindBufferMemory-memory-02985", "If memory was created by a memory import operation, that is not VkImportAndroidHardwareBufferInfoANDROID with a non-NULL buffer value, the external handle type of the imported memory must also have been set in VkExternalMemoryBufferCreateInfo::handleTypes when buffer was created", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory-memory-02986", "If memory was created with the VkImportAndroidHardwareBufferInfoANDROID memory import operation with a non-NULL buffer value, VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID must also have been set in VkExternalMemoryBufferCreateInfo::handleTypes when buffer was created", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory-memory-parameter", "memory must be a valid VkDeviceMemory handle", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory-memory-parent", "memory must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory-memoryOffset-01031", "memoryOffset must be less than the size of memory", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory-memoryOffset-01036", "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from a call to vkGetBufferMemoryRequirements with buffer", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory-size-01037", "The size member of the VkMemoryRequirements structure returned from a call to vkGetBufferMemoryRequirements with buffer must be less than or equal to the size of memory minus memoryOffset", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory2-bindInfoCount-arraylength", "bindInfoCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory2-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkBindBufferMemory2-pBindInfos-parameter", "pBindInfos must be a valid pointer to an array of bindInfoCount valid VkBindBufferMemoryInfo structures", "1.2-extensions"},
+ {"VUID-vkBindImageMemory-None-01901", "If image was created with the VK_IMAGE_CREATE_PROTECTED_BIT bit set, the image must be bound to a memory object allocated with a memory type that reports VK_MEMORY_PROPERTY_PROTECTED_BIT", "1.2-extensions"},
+ {"VUID-vkBindImageMemory-None-01902", "If image was created with the VK_IMAGE_CREATE_PROTECTED_BIT bit not set, the image must not be bound to a memory object created with a memory type that reports VK_MEMORY_PROPERTY_PROTECTED_BIT", "1.2-extensions"},
+ {"VUID-vkBindImageMemory-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkBindImageMemory-image-01044", "image must not already be backed by a memory object", "1.2-extensions"},
+ {"VUID-vkBindImageMemory-image-01045", "image must not have been created with any sparse memory binding flags", "1.2-extensions"},
+ {"VUID-vkBindImageMemory-image-01050", "If image was created with VkDedicatedAllocationImageCreateInfoNV::dedicatedAllocation equal to VK_TRUE, memory must have been created with VkDedicatedAllocationMemoryAllocateInfoNV::image equal to an image handle created with identical creation parameters to image and memoryOffset must be zero", "1.2-extensions"},
+ {"VUID-vkBindImageMemory-image-01051", "If image was not created with VkDedicatedAllocationImageCreateInfoNV::dedicatedAllocation equal to VK_TRUE, memory must not have been allocated dedicated for a specific buffer or image", "default"},
+ {"VUID-vkBindImageMemory-image-01445", "If image requires a dedicated allocation (as reported by vkGetImageMemoryRequirements2 in VkMemoryDedicatedRequirements::requiresDedicatedAllocation for image), memory must have been created with VkMemoryDedicatedAllocateInfo::image equal to image", "1.2-extensions"},
+ {"VUID-vkBindImageMemory-image-01608", "image must not have been created with the VK_IMAGE_CREATE_DISJOINT_BIT set", "1.2-extensions"},
+ {"VUID-vkBindImageMemory-image-parameter", "image must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-vkBindImageMemory-image-parent", "image must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkBindImageMemory-memory-01047", "memory must have been allocated using one of the memory types allowed in the memoryTypeBits member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements with image", "1.2-extensions"},
+ {"VUID-vkBindImageMemory-memory-01509", "If the VkMemoryAllocateInfo provided when memory was allocated included a VkMemoryDedicatedAllocateInfo structure in its pNext chain, and VkMemoryDedicatedAllocateInfo::image was not VK_NULL_HANDLE, then image must equal VkMemoryDedicatedAllocateInfo::image and memoryOffset must be zero", "1.2-khr-extensions"},
+ {"VUID-vkBindImageMemory-memory-02628", "If the dedicated allocation image aliasing feature is not enabled, and the VkMemoryAllocateInfo provided when memory was allocated included a VkMemoryDedicatedAllocateInfo structure in its pNext chain, and VkMemoryDedicatedAllocateInfo::image was not VK_NULL_HANDLE, then image must equal VkMemoryDedicatedAllocateInfo::image and memoryOffset must be zero", "1.2-extensions"},
+ {"VUID-vkBindImageMemory-memory-02629", "If the dedicated allocation image aliasing feature is enabled, and the VkMemoryAllocateInfo provided when memory was allocated included a VkMemoryDedicatedAllocateInfo structure in its pNext chain, and VkMemoryDedicatedAllocateInfo::image was not VK_NULL_HANDLE, then memoryOffset must be zero, and image must be either equal to VkMemoryDedicatedAllocateInfo::image or an image that was created using the same parameters in VkImageCreateInfo, with the exception that extent and arrayLayers may differ subject to the following restrictions: every dimension in the extent parameter of the image being bound must be equal to or smaller than the original image for which the allocation was created; and the arrayLayers parameter of the image being bound must be equal to or smaller than the original image for which the allocation was created", "1.2-extensions"},
+ {"VUID-vkBindImageMemory-memory-02728", "If the value of VkExportMemoryAllocateInfo::handleTypes used to allocate memory is not 0, it must include at least one of the handles set in VkExternalMemoryImageCreateInfo::handleTypes when image was created", "1.2-extensions"},
+ {"VUID-vkBindImageMemory-memory-02729", "If memory was created by a memory import operation, the external handle type of the imported memory must also have been set in VkExternalMemoryImageCreateInfo::handleTypes when image was created", "1.2-khr-extensions"},
+ {"VUID-vkBindImageMemory-memory-02989", "If memory was created by a memory import operation, that is not VkImportAndroidHardwareBufferInfoANDROID with a non-NULL buffer value, the external handle type of the imported memory must also have been set in VkExternalMemoryImageCreateInfo::handleTypes when image was created", "1.2-extensions"},
+ {"VUID-vkBindImageMemory-memory-02990", "If memory was created with the VkImportAndroidHardwareBufferInfoANDROID memory import operation with a non-NULL buffer value, VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID must also have been set in VkExternalMemoryImageCreateInfo::handleTypes when image was created", "1.2-extensions"},
+ {"VUID-vkBindImageMemory-memory-parameter", "memory must be a valid VkDeviceMemory handle", "1.2-extensions"},
+ {"VUID-vkBindImageMemory-memory-parent", "memory must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkBindImageMemory-memoryOffset-01046", "memoryOffset must be less than the size of memory", "1.2-extensions"},
+ {"VUID-vkBindImageMemory-memoryOffset-01048", "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements with image", "1.2-extensions"},
+ {"VUID-vkBindImageMemory-size-01049", "The difference of the size of memory and memoryOffset must be greater than or equal to the size member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements with the same image", "1.2-extensions"},
+ {"VUID-vkBindImageMemory2-bindInfoCount-arraylength", "bindInfoCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkBindImageMemory2-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkBindImageMemory2-pBindInfos-02858", "If any VkBindImageMemoryInfo::image was created with VK_IMAGE_CREATE_DISJOINT_BIT then all planes of VkBindImageMemoryInfo::image must be bound individually in separate pBindInfos", "1.2-extensions"},
+ {"VUID-vkBindImageMemory2-pBindInfos-04006", "pBindInfos must not refer to the same image subresource more than once", "1.2-extensions"},
+ {"VUID-vkBindImageMemory2-pBindInfos-parameter", "pBindInfos must be a valid pointer to an array of bindInfoCount valid VkBindImageMemoryInfo structures", "1.2-extensions"},
+ {"VUID-vkBuildAccelerationStructureKHR-None-03407", "Any acceleration structure instance in any top level build in this command must not reference any bottom level acceleration structure built by this command", "1.2-extensions"},
+ {"VUID-vkBuildAccelerationStructureKHR-None-03409", "There must not be any memory aliasing between memory bound to any top level, bottom level, or instance acceleration structure accessed by this command", "1.2-extensions"},
+ {"VUID-vkBuildAccelerationStructureKHR-None-03437", "All VkDeviceOrHostAddressKHR or VkDeviceOrHostAddressConstKHR referenced by this command must contain valid host addresses", "1.2-extensions"},
+ {"VUID-vkBuildAccelerationStructureKHR-None-03438", "All VkAccelerationStructureKHR objects referenced by this command must be bound to host-visible memory", "1.2-extensions"},
+ {"VUID-vkBuildAccelerationStructureKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkBuildAccelerationStructureKHR-infoCount-arraylength", "infoCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkBuildAccelerationStructureKHR-pInfos-03403", "Each pInfos[i].srcAccelerationStructure must not refer to the same acceleration structure as any pInfos[i].dstAccelerationStructure that is provided to the same build command unless it is identical for an update", "1.2-extensions"},
+ {"VUID-vkBuildAccelerationStructureKHR-pInfos-03404", "For each pInfos[i], dstAccelerationStructure must have been created with compatible VkAccelerationStructureCreateInfoKHR where VkAccelerationStructureCreateInfoKHR::type and VkAccelerationStructureCreateInfoKHR::flags are identical to VkAccelerationStructureBuildGeometryInfoKHR::type and VkAccelerationStructureBuildGeometryInfoKHR::flags respectively, VkAccelerationStructureBuildGeometryInfoKHR::geometryCount for dstAccelerationStructure are greater than or equal to the build size, and each geometry in VkAccelerationStructureBuildGeometryInfoKHR::ppGeometries for dstAccelerationStructure has greater than or equal to the number of vertices, indices, and AABBs, VkAccelerationStructureGeometryTrianglesDataKHR::transformData is both 0 or both non-zero, and all other parameters are the same", "1.2-extensions"},
+ {"VUID-vkBuildAccelerationStructureKHR-pInfos-03405", "For each pInfos[i], if update is VK_TRUE, then objects that were previously active for that acceleration structure must not be made inactive as per Inactive Primitives and Instances", "1.2-extensions"},
+ {"VUID-vkBuildAccelerationStructureKHR-pInfos-03406", "For each pInfos[i], if update is VK_TRUE, then objects that were previously inactive for that acceleration structure must not be made active as per Inactive Primitives and Instances", "1.2-extensions"},
+ {"VUID-vkBuildAccelerationStructureKHR-pInfos-03408", "There must not be any memory aliasing between the scratch memories that are provided in all the pInfos[i].scratchData memories for the acceleration structure builds", "1.2-extensions"},
+ {"VUID-vkBuildAccelerationStructureKHR-pInfos-parameter", "pInfos must be a valid pointer to an array of infoCount valid VkAccelerationStructureBuildGeometryInfoKHR structures", "1.2-extensions"},
+ {"VUID-vkBuildAccelerationStructureKHR-pOffsetInfos-03402", "Each element of ppOffsetInfos[i] must be a valid pointer to an array of pInfos[i].geometryCount VkAccelerationStructureBuildOffsetInfoKHR structures", "1.2-extensions"},
+ {"VUID-vkBuildAccelerationStructureKHR-ppOffsetInfos-parameter", "ppOffsetInfos must be a valid pointer to an array of infoCount VkAccelerationStructureBuildOffsetInfoKHR structures", "1.2-extensions"},
+ {"VUID-vkBuildAccelerationStructureKHR-rayTracingHostAccelerationStructureCommands-03439", "The VkPhysicalDeviceRayTracingFeaturesKHR::rayTracingHostAccelerationStructureCommands feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdBeginConditionalRenderingEXT-None-01980", "Conditional rendering must not already be active", "1.2-extensions"},
+ {"VUID-vkCmdBeginConditionalRenderingEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdBeginConditionalRenderingEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBeginConditionalRenderingEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdBeginConditionalRenderingEXT-pConditionalRenderingBegin-parameter", "pConditionalRenderingBegin must be a valid pointer to a valid VkConditionalRenderingBeginInfoEXT structure", "1.2-extensions"},
+ {"VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdBeginDebugUtilsLabelEXT-pLabelInfo-parameter", "pLabelInfo must be a valid pointer to a valid VkDebugUtilsLabelEXT structure", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-None-00807", "All queries used by the command must be unavailable", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-None-02863", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, this command must not be recorded in a command buffer that, either directly or through secondary command buffers, also contains a vkCmdResetQueryPool command affecting the same query", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-commandBuffer-01885", "commandBuffer must not be a protected command buffer", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-commonparent", "Both of commandBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-flags-parameter", "flags must be a valid combination of VkQueryControlFlagBits values", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-query-00802", "query must be less than the number of queries in queryPool", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-query-00808", "If called within a render pass instance, the sum of query and the number of bits set in the current subpass's view mask must be less than or equal to the number of queries in queryPool", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-queryPool-01922", "queryPool must have been created with a queryType that differs from that of any queries that are active within commandBuffer", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-queryPool-03223", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, the profiling lock must have been held before vkBeginCommandBuffer was called on commandBuffer", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-queryPool-03224", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR and one of the counters used to create queryPool was VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR, the query begin must be the first recorded command in commandBuffer", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-queryPool-03225", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR and one of the counters used to create queryPool was VK_PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR, the begin command must not be recorded within a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-queryPool-03226", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR and another query pool with a queryType VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR has been used within commandBuffer, its parent primary command buffer or secondary command buffer recorded within the same parent primary command buffer as commandBuffer, the performanceCounterMultipleQueryPools feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-queryPool-parameter", "queryPool must be a valid VkQueryPool handle", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-queryType-00800", "If the precise occlusion queries feature is not enabled, or the queryType used to create queryPool was not VK_QUERY_TYPE_OCCLUSION, flags must not contain VK_QUERY_CONTROL_PRECISE_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-queryType-00803", "If the queryType used to create queryPool was VK_QUERY_TYPE_OCCLUSION, the VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-queryType-00804", "If the queryType used to create queryPool was VK_QUERY_TYPE_PIPELINE_STATISTICS and any of the pipelineStatistics indicate graphics operations, the VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-queryType-00805", "If the queryType used to create queryPool was VK_QUERY_TYPE_PIPELINE_STATISTICS and any of the pipelineStatistics indicate compute operations, the VkCommandPool that commandBuffer was allocated from must support compute operations", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-queryType-02327", "If the queryType used to create queryPool was VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT the VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-queryType-02328", "If the queryType used to create queryPool was VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT then VkPhysicalDeviceTransformFeedbackPropertiesEXT::transformFeedbackQueries must be supported", "1.2-extensions"},
+ {"VUID-vkCmdBeginQuery-queryType-02804", "The queryType used to create queryPool must not be VK_QUERY_TYPE_TIMESTAMP", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-None-00807", "All queries used by the command must be unavailable", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-None-02863", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, this command must not be recorded in a command buffer that, either directly or through secondary command buffers, also contains a vkCmdResetQueryPool command affecting the same query", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-commandBuffer-01885", "commandBuffer must not be a protected command buffer", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-commonparent", "Both of commandBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-flags-parameter", "flags must be a valid combination of VkQueryControlFlagBits values", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-query-00802", "query must be less than the number of queries in queryPool", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-query-00808", "If called within a render pass instance, the sum of query and the number of bits set in the current subpass's view mask must be less than or equal to the number of queries in queryPool", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-queryPool-01922", "queryPool must have been created with a queryType that differs from that of any queries that are active within commandBuffer", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-queryPool-03223", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, the profiling lock must have been held before vkBeginCommandBuffer was called on commandBuffer", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-queryPool-03224", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR and one of the counters used to create queryPool was VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR, the query begin must be the first recorded command in commandBuffer", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-queryPool-03225", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR and one of the counters used to create queryPool was VK_PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR, the begin command must not be recorded within a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-queryPool-03226", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR and another query pool with a queryType VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR has been used within commandBuffer, its parent primary command buffer or secondary command buffer recorded within the same parent primary command buffer as commandBuffer, the performanceCounterMultipleQueryPools feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-queryPool-parameter", "queryPool must be a valid VkQueryPool handle", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-queryType-00800", "If the precise occlusion queries feature is not enabled, or the queryType used to create queryPool was not VK_QUERY_TYPE_OCCLUSION, flags must not contain VK_QUERY_CONTROL_PRECISE_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-queryType-00803", "If the queryType used to create queryPool was VK_QUERY_TYPE_OCCLUSION, the VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-queryType-00804", "If the queryType used to create queryPool was VK_QUERY_TYPE_PIPELINE_STATISTICS and any of the pipelineStatistics indicate graphics operations, the VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-queryType-00805", "If the queryType used to create queryPool was VK_QUERY_TYPE_PIPELINE_STATISTICS and any of the pipelineStatistics indicate compute operations, the VkCommandPool that commandBuffer was allocated from must support compute operations", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-queryType-02338", "If the queryType used to create queryPool was VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT the VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-queryType-02339", "If the queryType used to create queryPool was VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT the index parameter must be less than VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackStreams", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-queryType-02340", "If the queryType used to create queryPool was not VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT the index must be zero", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-queryType-02341", "If the queryType used to create queryPool was VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT then VkPhysicalDeviceTransformFeedbackPropertiesEXT::transformFeedbackQueries must be supported", "1.2-extensions"},
+ {"VUID-vkCmdBeginQueryIndexedEXT-queryType-02804", "The queryType used to create queryPool must not be VK_QUERY_TYPE_TIMESTAMP", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass-bufferlevel", "commandBuffer must be a primary VkCommandBuffer", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass-contents-parameter", "contents must be a valid VkSubpassContents value", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass-framebuffer-02532", "For any attachment in framebuffer that is used by renderPass and is bound to memory locations that are also bound to another attachment used by renderPass, and if at least one of those uses causes either attachment to be written to, both attachments must have had the VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT set", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass-initialLayout-00895", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass-initialLayout-00896", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.0"},
+ {"VUID-vkCmdBeginRenderPass-initialLayout-00897", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass-initialLayout-00898", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_TRANSFER_SRC_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass-initialLayout-00899", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_TRANSFER_DST_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass-initialLayout-00900", "If any of the initialLayout members of the VkAttachmentDescription structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is not VK_IMAGE_LAYOUT_UNDEFINED, then each such initialLayout must be equal to the current layout of the corresponding attachment image subresource of the framebuffer specified in the framebuffer member of pRenderPassBegin", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass-initialLayout-01758", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass-initialLayout-02842", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass-pAttachments-04102", "Each element of the pAttachments of framebuffer that is referenced by any element of the pInputAttachments of any element of pSubpasses of renderPass must have image view format features containing at least VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT or VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass-pAttachments-04103", "Each element of the pAttachments of framebuffer that is referenced by any element of the pColorAttachments of any element of pSubpasses of renderPass must have image view format features containing VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass-pAttachments-04104", "Each element of the pAttachments of framebuffer that is referenced by any element of the pResolveAttachments of any element of pSubpasses of renderPass must have image view format features containing VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass-pAttachments-04105", "Each element of the pAttachments of framebuffer that is referenced by any element of the pDepthStencilAttachment of any element of pSubpasses of renderPass must have image view format features containing VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass-pRenderPassBegin-parameter", "pRenderPassBegin must be a valid pointer to a valid VkRenderPassBeginInfo structure", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass-srcStageMask-00901", "The srcStageMask and dstStageMask members of any element of the pDependencies member of VkRenderPassCreateInfo used to create renderPass must be supported by the capabilities of the queue family identified by the queueFamilyIndex member of the VkCommandPoolCreateInfo used to create the command pool which commandBuffer was allocated from", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass-stencilInitialLayout-02843", "If any of the stencilInitialLayout or stencilFinalLayout member of the VkAttachmentDescriptionStencilLayout structures or the stencilLayout member of the VkAttachmentReferenceStencilLayout structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass2-bufferlevel", "commandBuffer must be a primary VkCommandBuffer", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass2-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass2-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass2-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass2-framebuffer-02533", "For any attachment in framebuffer that is used by renderPass and is bound to memory locations that are also bound to another attachment used by renderPass, and if at least one of those uses causes either attachment to be written to, both attachments must have had the VK_ATTACHMENT_DESCRIPTION_MAY_ALIAS_BIT set", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass2-framebuffer-02779", "Both the framebuffer and renderPass members of pRenderPassBegin must have been created on the same VkDevice that commandBuffer was allocated on", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass2-initialLayout-02844", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass2-initialLayout-03094", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass2-initialLayout-03096", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass2-initialLayout-03097", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass2-initialLayout-03098", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_TRANSFER_SRC_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass2-initialLayout-03099", "If any of the initialLayout or finalLayout member of the VkAttachmentDescription structures or the layout member of the VkAttachmentReference structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_TRANSFER_DST_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass2-initialLayout-03100", "If any of the initialLayout members of the VkAttachmentDescription structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is not VK_IMAGE_LAYOUT_UNDEFINED, then each such initialLayout must be equal to the current layout of the corresponding attachment image subresource of the framebuffer specified in the framebuffer member of pRenderPassBegin", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass2-pAttachments-04106", "Each element of the pAttachments of framebuffer that is referenced by any element of the pInputAttachments of any element of pSubpasses of renderPass must have image view format features contain at least VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT or VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass2-pAttachments-04107", "Each element of the pAttachments of framebuffer that is referenced by any element of the pColorAttachments of any element of pSubpasses of renderPass must have image view format features contain VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass2-pAttachments-04108", "Each element of the pAttachments of framebuffer that is referenced by any element of the pResolveAttachments of any element of pSubpasses of renderPass must have image view format features contain VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass2-pAttachments-04109", "Each element of the pAttachments of framebuffer that is referenced by any element of the pDepthStencilAttachment of any element of pSubpasses of renderPass must have image view format features contain VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass2-pRenderPassBegin-parameter", "pRenderPassBegin must be a valid pointer to a valid VkRenderPassBeginInfo structure", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass2-pSubpassBeginInfo-parameter", "pSubpassBeginInfo must be a valid pointer to a valid VkSubpassBeginInfo structure", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass2-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass2-srcStageMask-03101", "The srcStageMask and dstStageMask members of any element of the pDependencies member of VkRenderPassCreateInfo used to create renderPass must be supported by the capabilities of the queue family identified by the queueFamilyIndex member of the VkCommandPoolCreateInfo used to create the command pool which commandBuffer was allocated from", "1.2-extensions"},
+ {"VUID-vkCmdBeginRenderPass2-stencilInitialLayout-02845", "If any of the stencilInitialLayout or stencilFinalLayout member of the VkAttachmentDescriptionStencilLayout structures or the stencilLayout member of the VkAttachmentReferenceStencilLayout structures specified when creating the render pass specified in the renderPass member of pRenderPassBegin is VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL, or VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL then the corresponding attachment image view of the framebuffer specified in the framebuffer member of pRenderPassBegin must have been created with a usage value including VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBeginTransformFeedbackEXT-None-02367", "Transform feedback must not be active", "1.2-extensions"},
+ {"VUID-vkCmdBeginTransformFeedbackEXT-None-02373", "Transform feedback must not be made active in a render pass instance with multiview enabled", "1.2-extensions"},
+ {"VUID-vkCmdBeginTransformFeedbackEXT-None-04128", "The last vertex processing stage of the bound graphics pipeline must have been declared with the Xfb execution mode", "1.2-extensions"},
+ {"VUID-vkCmdBeginTransformFeedbackEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdBeginTransformFeedbackEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBeginTransformFeedbackEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdBeginTransformFeedbackEXT-commonparent", "Both of commandBuffer, and the elements of pCounterBuffers that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdBeginTransformFeedbackEXT-counterBufferCount-02607", "If counterBufferCount is not 0, and pCounterBuffers is not NULL, pCounterBuffers must be a valid pointer to an array of counterBufferCount VkBuffer handles that are either valid or VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02368", "firstCounterBuffer must be less than VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackBuffers", "1.2-extensions"},
+ {"VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369", "The sum of firstCounterBuffer and counterBufferCount must be less than or equal to VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackBuffers", "1.2-extensions"},
+ {"VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffer-02371", "If pCounterBuffer is NULL, then pCounterBufferOffsets must also be NULL", "1.2-extensions"},
+ {"VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-02370", "For each buffer handle in the array, if it is not VK_NULL_HANDLE it must reference a buffer large enough to hold 4 bytes at the corresponding offset from the pCounterBufferOffsets array", "1.2-extensions"},
+ {"VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-parameter", "If counterBufferCount is not 0, and pCounterBufferOffsets is not NULL, pCounterBufferOffsets must be a valid pointer to an array of counterBufferCount VkDeviceSize values", "1.2-extensions"},
+ {"VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffers-02372", "For each buffer handle in the pCounterBuffers array that is not VK_NULL_HANDLE it must have been created with a usage value containing VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdBeginTransformFeedbackEXT-renderpass", "This command must only be called inside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdBeginTransformFeedbackEXT-transformFeedback-02366", "VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdBindDescriptorSets-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdBindDescriptorSets-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBindDescriptorSets-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdBindDescriptorSets-commonparent", "Each of commandBuffer, layout, and the elements of pDescriptorSets must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdBindDescriptorSets-descriptorSetCount-arraylength", "descriptorSetCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdBindDescriptorSets-dynamicOffsetCount-00359", "dynamicOffsetCount must be equal to the total number of dynamic descriptors in pDescriptorSets", "1.2-extensions"},
+ {"VUID-vkCmdBindDescriptorSets-firstSet-00360", "The sum of firstSet and descriptorSetCount must be less than or equal to VkPipelineLayoutCreateInfo::setLayoutCount provided when layout was created", "1.2-extensions"},
+ {"VUID-vkCmdBindDescriptorSets-layout-parameter", "layout must be a valid VkPipelineLayout handle", "1.2-extensions"},
+ {"VUID-vkCmdBindDescriptorSets-pDescriptorSets-00358", "Each element of pDescriptorSets must have been allocated with a VkDescriptorSetLayout that matches (is the same as, or identically defined as) the VkDescriptorSetLayout at set n in layout, where n is the sum of firstSet and the index into pDescriptorSets", "1.2-extensions"},
+ {"VUID-vkCmdBindDescriptorSets-pDescriptorSets-01979", "For each dynamic uniform or storage buffer binding in pDescriptorSets, the sum of the effective offset, as defined above, and the range of the binding must be less than or equal to the size of the buffer", "1.2-extensions"},
+ {"VUID-vkCmdBindDescriptorSets-pDescriptorSets-parameter", "pDescriptorSets must be a valid pointer to an array of descriptorSetCount valid VkDescriptorSet handles", "1.2-extensions"},
+ {"VUID-vkCmdBindDescriptorSets-pDynamicOffsets-01971", "Each element of pDynamicOffsets which corresponds to a descriptor binding with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC must be a multiple of VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment", "1.2-extensions"},
+ {"VUID-vkCmdBindDescriptorSets-pDynamicOffsets-01972", "Each element of pDynamicOffsets which corresponds to a descriptor binding with type VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC must be a multiple of VkPhysicalDeviceLimits::minStorageBufferOffsetAlignment", "1.2-extensions"},
+ {"VUID-vkCmdBindDescriptorSets-pDynamicOffsets-parameter", "If dynamicOffsetCount is not 0, pDynamicOffsets must be a valid pointer to an array of dynamicOffsetCount uint32_t values", "1.2-extensions"},
+ {"VUID-vkCmdBindDescriptorSets-pipelineBindPoint-00361", "pipelineBindPoint must be supported by the commandBuffer's parent VkCommandPool's queue family", "1.2-extensions"},
+ {"VUID-vkCmdBindDescriptorSets-pipelineBindPoint-parameter", "pipelineBindPoint must be a valid VkPipelineBindPoint value", "1.2-extensions"},
+ {"VUID-vkCmdBindIndexBuffer-buffer-00433", "buffer must have been created with the VK_BUFFER_USAGE_INDEX_BUFFER_BIT flag", "1.2-extensions"},
+ {"VUID-vkCmdBindIndexBuffer-buffer-00434", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdBindIndexBuffer-buffer-parameter", "buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBindIndexBuffer-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdBindIndexBuffer-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBindIndexBuffer-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdBindIndexBuffer-commonparent", "Both of buffer, and commandBuffer must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdBindIndexBuffer-indexType-02507", "indexType must not be VK_INDEX_TYPE_NONE_KHR", "1.2-extensions"},
+ {"VUID-vkCmdBindIndexBuffer-indexType-02765", "If indexType is VK_INDEX_TYPE_UINT8_EXT, the indexTypeUint8 feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdBindIndexBuffer-indexType-parameter", "indexType must be a valid VkIndexType value", "1.2-extensions"},
+ {"VUID-vkCmdBindIndexBuffer-offset-00431", "offset must be less than the size of buffer", "1.2-extensions"},
+ {"VUID-vkCmdBindIndexBuffer-offset-00432", "The sum of offset and the address of the range of VkDeviceMemory object that is backing buffer, must be a multiple of the type indicated by indexType", "1.2-extensions"},
+ {"VUID-vkCmdBindPipeline-None-02323", "This command must not be recorded when transform feedback is active", "1.2-extensions"},
+ {"VUID-vkCmdBindPipeline-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdBindPipeline-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBindPipeline-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdBindPipeline-commonparent", "Both of commandBuffer, and pipeline must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdBindPipeline-pipeline-00781", "If the variable multisample rate feature is not supported, pipeline is a graphics pipeline, the current subpass uses no attachments, and this is not the first call to this function with a graphics pipeline after transitioning to the current subpass, then the sample count specified by this pipeline must match that set in the previous pipeline", "1.2-extensions"},
+ {"VUID-vkCmdBindPipeline-pipeline-03382", "The pipeline must not have been created with VK_PIPELINE_CREATE_LIBRARY_BIT_KHR set", "1.2-extensions"},
+ {"VUID-vkCmdBindPipeline-pipeline-parameter", "pipeline must be a valid VkPipeline handle", "1.2-extensions"},
+ {"VUID-vkCmdBindPipeline-pipelineBindPoint-00777", "If pipelineBindPoint is VK_PIPELINE_BIND_POINT_COMPUTE, the VkCommandPool that commandBuffer was allocated from must support compute operations", "1.2-extensions"},
+ {"VUID-vkCmdBindPipeline-pipelineBindPoint-00778", "If pipelineBindPoint is VK_PIPELINE_BIND_POINT_GRAPHICS, the VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdBindPipeline-pipelineBindPoint-00779", "If pipelineBindPoint is VK_PIPELINE_BIND_POINT_COMPUTE, pipeline must be a compute pipeline", "1.2-extensions"},
+ {"VUID-vkCmdBindPipeline-pipelineBindPoint-00780", "If pipelineBindPoint is VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline must be a graphics pipeline", "1.2-extensions"},
+ {"VUID-vkCmdBindPipeline-pipelineBindPoint-02391", "If pipelineBindPoint is VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, the VkCommandPool that commandBuffer was allocated from must support compute operations", "1.2-extensions"},
+ {"VUID-vkCmdBindPipeline-pipelineBindPoint-02392", "If pipelineBindPoint is VK_PIPELINE_BIND_POINT_RAY_TRACING_KHR, the pipeline must be a ray tracing pipeline", "1.2-extensions"},
+ {"VUID-vkCmdBindPipeline-pipelineBindPoint-parameter", "pipelineBindPoint must be a valid VkPipelineBindPoint value", "1.2-extensions"},
+ {"VUID-vkCmdBindPipeline-variableSampleLocations-01525", "If VkPhysicalDeviceSampleLocationsPropertiesEXT::variableSampleLocations is VK_FALSE, and pipeline is a graphics pipeline created with a VkPipelineSampleLocationsStateCreateInfoEXT structure having its sampleLocationsEnable member set to VK_TRUE but without VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT enabled then the current render pass instance must have been begun by specifying a VkRenderPassSampleLocationsBeginInfoEXT structure whose pPostSubpassSampleLocations member contains an element with a subpassIndex matching the current subpass index and the sampleLocationsInfo member of that element must match the sampleLocationsInfo specified in VkPipelineSampleLocationsStateCreateInfoEXT when the pipeline was created", "1.2-extensions"},
+ {"VUID-vkCmdBindPipelineShaderGroupNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdBindPipelineShaderGroupNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBindPipelineShaderGroupNV-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdBindPipelineShaderGroupNV-commonparent", "Both of commandBuffer, and pipeline must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdBindPipelineShaderGroupNV-deviceGeneratedCommands-02896", "The VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::deviceGeneratedCommands feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdBindPipelineShaderGroupNV-groupIndex-02893", "groupIndex must be 0 or less than the effective VkGraphicsPipelineShaderGroupsCreateInfoNV::groupCount including the referenced pipelines", "1.2-extensions"},
+ {"VUID-vkCmdBindPipelineShaderGroupNV-groupIndex-02895", "The same restrictions as vkCmdBindPipeline apply as if the bound pipeline was created only with the Shader Group from the groupIndex information", "1.2-extensions"},
+ {"VUID-vkCmdBindPipelineShaderGroupNV-pipeline-parameter", "pipeline must be a valid VkPipeline handle", "1.2-extensions"},
+ {"VUID-vkCmdBindPipelineShaderGroupNV-pipelineBindPoint-02894", "The pipelineBindPoint must be VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdBindPipelineShaderGroupNV-pipelineBindPoint-parameter", "pipelineBindPoint must be a valid VkPipelineBindPoint value", "1.2-extensions"},
+ {"VUID-vkCmdBindShadingRateImageNV-None-02058", "The shading rate image feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdBindShadingRateImageNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdBindShadingRateImageNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBindShadingRateImageNV-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdBindShadingRateImageNV-commonparent", "Both of commandBuffer, and imageView that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdBindShadingRateImageNV-imageLayout-02063", "If imageView is not VK_NULL_HANDLE, imageLayout must be VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV or VK_IMAGE_LAYOUT_GENERAL", "1.2-extensions"},
+ {"VUID-vkCmdBindShadingRateImageNV-imageLayout-parameter", "imageLayout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-vkCmdBindShadingRateImageNV-imageView-02059", "If imageView is not VK_NULL_HANDLE, it must be a valid VkImageView handle of type VK_IMAGE_VIEW_TYPE_2D or VK_IMAGE_VIEW_TYPE_2D_ARRAY", "1.2-extensions"},
+ {"VUID-vkCmdBindShadingRateImageNV-imageView-02060", "If imageView is not VK_NULL_HANDLE, it must have a format of VK_FORMAT_R8_UINT", "1.2-extensions"},
+ {"VUID-vkCmdBindShadingRateImageNV-imageView-02061", "If imageView is not VK_NULL_HANDLE, it must have been created with a usage value including VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdBindShadingRateImageNV-imageView-02062", "If imageView is not VK_NULL_HANDLE, imageLayout must match the actual VkImageLayout of each subresource accessible from imageView at the time the subresource is accessed", "1.2-extensions"},
+ {"VUID-vkCmdBindShadingRateImageNV-imageView-parameter", "If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle", "1.2-extensions"},
+ {"VUID-vkCmdBindTransformFeedbackBuffersEXT-None-02365", "Transform feedback must not be active when the vkCmdBindTransformFeedbackBuffersEXT command is recorded", "1.2-extensions"},
+ {"VUID-vkCmdBindTransformFeedbackBuffersEXT-bindingCount-arraylength", "bindingCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdBindTransformFeedbackBuffersEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdBindTransformFeedbackBuffersEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBindTransformFeedbackBuffersEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdBindTransformFeedbackBuffersEXT-commonparent", "Both of commandBuffer, and the elements of pBuffers must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02356", "firstBinding must be less than VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackBuffers", "1.2-extensions"},
+ {"VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357", "The sum of firstBinding and bindingCount must be less than or equal to VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackBuffers", "1.2-extensions"},
+ {"VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02360", "All elements of pBuffers must have been created with the VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT flag", "1.2-extensions"},
+ {"VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02364", "Each element of pBuffers that is non-sparse must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-parameter", "pBuffers must be a valid pointer to an array of bindingCount valid VkBuffer handles", "1.2-extensions"},
+ {"VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02358", "All elements of pOffsets must be less than the size of the corresponding element in pBuffers", "1.2-extensions"},
+ {"VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02359", "All elements of pOffsets must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02363", "All elements of pOffsets plus pSizes, where the pSizes, element is not VK_WHOLE_SIZE, must be less than or equal to the size of the corresponding element in pBuffers", "1.2-extensions"},
+ {"VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-parameter", "pOffsets must be a valid pointer to an array of bindingCount VkDeviceSize values", "1.2-extensions"},
+ {"VUID-vkCmdBindTransformFeedbackBuffersEXT-pSize-02361", "If the optional pSize array is specified, each element of pSizes must either be VK_WHOLE_SIZE, or be less than or equal to VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackBufferSize", "1.2-extensions"},
+ {"VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-02362", "All elements of pSizes must be less than or equal to the size of the corresponding buffer in pBuffers", "1.2-extensions"},
+ {"VUID-vkCmdBindTransformFeedbackBuffersEXT-transformFeedback-02355", "VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers-bindingCount-arraylength", "bindingCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers-commonparent", "Both of commandBuffer, and the elements of pBuffers that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers-firstBinding-00624", "firstBinding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers-firstBinding-00625", "The sum of firstBinding and bindingCount must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers-pBuffers-00627", "All elements of pBuffers must have been created with the VK_BUFFER_USAGE_VERTEX_BUFFER_BIT flag", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers-pBuffers-00628", "Each element of pBuffers that is non-sparse must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers-pBuffers-04001", "If the nullDescriptor feature is not enabled, all elements of pBuffers must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers-pBuffers-04002", "If an element of pBuffers is VK_NULL_HANDLE, then the corresponding element of pOffsets must be zero", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers-pBuffers-parameter", "pBuffers must be a valid pointer to an array of bindingCount valid or VK_NULL_HANDLE VkBuffer handles", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers-pOffsets-00626", "All elements of pOffsets must be less than the size of the corresponding element in pBuffers", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers-pOffsets-parameter", "pOffsets must be a valid pointer to an array of bindingCount VkDeviceSize values", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers2EXT-bindingCount-arraylength", "If any of pSizes, or pStrides are not NULL, bindingCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers2EXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers2EXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers2EXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers2EXT-commonparent", "Both of commandBuffer, and the elements of pBuffers must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers2EXT-firstBinding-03355", "firstBinding must be less than VkPhysicalDeviceLimits::maxVertexInputBindings", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers2EXT-firstBinding-03356", "The sum of firstBinding and bindingCount must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputBindings", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers2EXT-pBuffers-03359", "All elements of pBuffers must have been created with the VK_BUFFER_USAGE_VERTEX_BUFFER_BIT flag", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers2EXT-pBuffers-03360", "Each element of pBuffers that is non-sparse must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers2EXT-pBuffers-04111", "If the nullDescriptor feature is not enabled, all elements of pBuffers must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers2EXT-pBuffers-04112", "If an element of pBuffers is VK_NULL_HANDLE, then the corresponding element of pOffsets must be zero", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers2EXT-pBuffers-parameter", "pBuffers must be a valid pointer to an array of bindingCount valid VkBuffer handles", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers2EXT-pOffsets-03357", "All elements of pOffsets must be less than the size of the corresponding element in pBuffers", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers2EXT-pOffsets-parameter", "pOffsets must be a valid pointer to an array of bindingCount VkDeviceSize values", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers2EXT-pSizes-03358", "If pSizes is not NULL, all elements of pOffsets plus pSizes must be less than or equal to the size of the corresponding element in pBuffers", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers2EXT-pSizes-parameter", "If pSizes is not NULL, pSizes must be a valid pointer to an array of bindingCount VkDeviceSize values", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers2EXT-pStrides-03361", "If the bound pipeline state object was created with the VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT dynamic state enabled then pStrides must not be NULL, otherwise pStrides must be NULL", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers2EXT-pStrides-03362", "If pStrides is not NULL each element of pStrides must be less than or equal to VkPhysicalDeviceLimits::maxVertexInputBindingStride", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers2EXT-pStrides-03363", "If pStrides is not NULL each element of pStrides must be greater than or equal to the maximum extent of of all vertex input attributes fetched from the corresponding binding, where the extent is calculated as the VkVertexInputAttributeDescription::offset plus VkVertexInputAttributeDescription::format size", "1.2-extensions"},
+ {"VUID-vkCmdBindVertexBuffers2EXT-pStrides-parameter", "If pStrides is not NULL, pStrides must be a valid pointer to an array of bindingCount VkDeviceSize values", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-commandBuffer-01834", "If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-commandBuffer-01835", "If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-commandBuffer-01836", "If commandBuffer is a protected command buffer, then dstImage must not be an unprotected image", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-commonparent", "Each of commandBuffer, dstImage, and srcImage must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-dstImage-00224", "dstImage must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-dstImage-00225", "If dstImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-dstImage-00234", "dstImage must have been created with a samples value of VK_SAMPLE_COUNT_1_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-dstImage-01562", "dstImage must not use a format listed in Formats requiring sampler Y'CBCR conversion for VK_IMAGE_ASPECT_COLOR_BIT image views", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-dstImage-02000", "The format features of dstImage must contain VK_FORMAT_FEATURE_BLIT_DST_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-dstImage-02545", "dstImage and srcImage must not have been created with flags containing VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-dstImage-parameter", "dstImage must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-dstImageLayout-00226", "dstImageLayout must specify the layout of the image subresources of dstImage specified in pRegions at the time this command is executed on a VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-dstImageLayout-00227", "dstImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL", "1.2"},
+ {"VUID-vkCmdBlitImage-dstImageLayout-01399", "dstImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-dstImageLayout-parameter", "dstImageLayout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-dstSubresource-01706", "The dstSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when dstImage was created", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-dstSubresource-01708", "The dstSubresource.baseArrayLayer + dstSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when dstImage was created", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-filter-00237", "If filter is VK_FILTER_CUBIC_EXT, srcImage must have a VkImageType of VK_IMAGE_TYPE_2D", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-filter-02001", "If filter is VK_FILTER_LINEAR, then the format features of srcImage must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-filter-02002", "If filter is VK_FILTER_CUBIC_EXT, then the format features of srcImage must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-filter-parameter", "filter must be a valid VkFilter value", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-pRegions-00215", "The source region specified by each element of pRegions must be a region that is contained within srcImage", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-pRegions-00216", "The destination region specified by each element of pRegions must be a region that is contained within dstImage", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-pRegions-00217", "The union of all destination regions, specified by the elements of pRegions, must not overlap in memory with any texel that may be sampled during the blit operation", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-pRegions-parameter", "pRegions must be a valid pointer to an array of regionCount valid VkImageBlit structures", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-regionCount-arraylength", "regionCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-srcImage-00219", "srcImage must have been created with VK_IMAGE_USAGE_TRANSFER_SRC_BIT usage flag", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-srcImage-00220", "If srcImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-srcImage-00229", "If either of srcImage or dstImage was created with a signed integer VkFormat, the other must also have been created with a signed integer VkFormat", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-srcImage-00230", "If either of srcImage or dstImage was created with an unsigned integer VkFormat, the other must also have been created with an unsigned integer VkFormat", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-srcImage-00231", "If either of srcImage or dstImage was created with a depth/stencil format, the other must have exactly the same format", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-srcImage-00232", "If srcImage was created with a depth/stencil format, filter must be VK_FILTER_NEAREST", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-srcImage-00233", "srcImage must have been created with a samples value of VK_SAMPLE_COUNT_1_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-srcImage-01561", "srcImage must not use a format listed in Formats requiring sampler Y'CBCR conversion for VK_IMAGE_ASPECT_COLOR_BIT image views", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-srcImage-01999", "The format features of srcImage must contain VK_FORMAT_FEATURE_BLIT_SRC_BIT", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-srcImage-parameter", "srcImage must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-srcImageLayout-00221", "srcImageLayout must specify the layout of the image subresources of srcImage specified in pRegions at the time this command is executed on a VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-srcImageLayout-00222", "srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL", "1.2"},
+ {"VUID-vkCmdBlitImage-srcImageLayout-01398", "srcImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-srcImageLayout-parameter", "srcImageLayout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-srcSubresource-01705", "The srcSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when srcImage was created", "1.2-extensions"},
+ {"VUID-vkCmdBlitImage-srcSubresource-01707", "The srcSubresource.baseArrayLayer + srcSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when srcImage was created", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureIndirectKHR-None-03534", "All VkAccelerationStructureKHR objects referenced by this command must be bound to device memory", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureIndirectKHR-None-04047", "All VkDeviceOrHostAddressKHR or VkDeviceOrHostAddressConstKHR referenced by this command must contain valid device addresses for a buffer bound to device memory. If the buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureIndirectKHR-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureIndirectKHR-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureIndirectKHR-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureIndirectKHR-commonparent", "Both of commandBuffer, and indirectBuffer must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureIndirectKHR-indirectBuffer-parameter", "indirectBuffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureIndirectKHR-pInfo-parameter", "pInfo must be a valid pointer to a valid VkAccelerationStructureBuildGeometryInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureIndirectKHR-pNext-03536", "The VkDeferredOperationInfoKHR structure must not be included in the pNext chain of any of the provided VkAccelerationStructureBuildGeometryInfoKHR structures", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureIndirectKHR-rayTracingIndirectAccelerationStructureBuild-03535", "The VkPhysicalDeviceRayTracingFeaturesKHR::rayTracingIndirectAccelerationStructureBuild feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureIndirectKHR-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureKHR-None-03407", "Any acceleration structure instance in any top level build in this command must not reference any bottom level acceleration structure built by this command", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureKHR-None-03409", "There must not be any memory aliasing between memory bound to any top level, bottom level, or instance acceleration structure accessed by this command", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureKHR-None-03531", "All VkAccelerationStructureKHR objects referenced by this command must be bound to device memory", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureKHR-None-04046", "All VkDeviceOrHostAddressKHR or VkDeviceOrHostAddressConstKHR referenced by this command must contain valid device addresses for a buffer bound to device memory. If the buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureKHR-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureKHR-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureKHR-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureKHR-infoCount-arraylength", "infoCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureKHR-pInfos-03403", "Each pInfos[i].srcAccelerationStructure must not refer to the same acceleration structure as any pInfos[i].dstAccelerationStructure that is provided to the same build command unless it is identical for an update", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureKHR-pInfos-03404", "For each pInfos[i], dstAccelerationStructure must have been created with compatible VkAccelerationStructureCreateInfoKHR where VkAccelerationStructureCreateInfoKHR::type and VkAccelerationStructureCreateInfoKHR::flags are identical to VkAccelerationStructureBuildGeometryInfoKHR::type and VkAccelerationStructureBuildGeometryInfoKHR::flags respectively, VkAccelerationStructureBuildGeometryInfoKHR::geometryCount for dstAccelerationStructure are greater than or equal to the build size, and each geometry in VkAccelerationStructureBuildGeometryInfoKHR::ppGeometries for dstAccelerationStructure has greater than or equal to the number of vertices, indices, and AABBs, VkAccelerationStructureGeometryTrianglesDataKHR::transformData is both 0 or both non-zero, and all other parameters are the same", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureKHR-pInfos-03405", "For each pInfos[i], if update is VK_TRUE, then objects that were previously active for that acceleration structure must not be made inactive as per Inactive Primitives and Instances", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureKHR-pInfos-03406", "For each pInfos[i], if update is VK_TRUE, then objects that were previously inactive for that acceleration structure must not be made active as per Inactive Primitives and Instances", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureKHR-pInfos-03408", "There must not be any memory aliasing between the scratch memories that are provided in all the pInfos[i].scratchData memories for the acceleration structure builds", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureKHR-pInfos-03529", "The buffer from which the buffer device address pInfos[i].scratchData is queried must have been created with VK_BUFFER_USAGE_RAY_TRACING_BIT_KHR usage flag", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureKHR-pInfos-parameter", "pInfos must be a valid pointer to an array of infoCount valid VkAccelerationStructureBuildGeometryInfoKHR structures", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureKHR-pNext-03532", "The VkDeferredOperationInfoKHR structure must not be included in the pNext chain of any of the provided VkAccelerationStructureBuildGeometryInfoKHR structures", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureKHR-pOffsetInfos-03402", "Each element of ppOffsetInfos[i] must be a valid pointer to an array of pInfos[i].geometryCount VkAccelerationStructureBuildOffsetInfoKHR structures", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureKHR-ppOffsetInfos-parameter", "ppOffsetInfos must be a valid pointer to an array of infoCount VkAccelerationStructureBuildOffsetInfoKHR structures", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureKHR-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureKHR-update-03527", "If update is VK_FALSE, all addresses between pInfos[i].scratchData and pInfos[i].scratchData + N - 1 must be in the buffer device address range of the same buffer, where N is given by the size member of the VkMemoryRequirements structure returned from a call to vkGetAccelerationStructureMemoryRequirementsKHR with VkAccelerationStructureMemoryRequirementsInfoKHR::accelerationStructure set to pInfos[i].dstAccelerationStructure and VkAccelerationStructureMemoryRequirementsInfoKHR::type set to VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_KHR", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureKHR-update-03528", "If update is VK_TRUE, all addresses between pInfos[i].scratchData and pInfos[i].scratchData + N - 1 must be in the buffer device address range of the same buffer, where N is given by the size member of the VkMemoryRequirements structure returned from a call to vkGetAccelerationStructureMemoryRequirementsKHR with VkAccelerationStructureMemoryRequirementsInfoKHR::accelerationStructure set to pInfos[i].dstAccelerationStructure and VkAccelerationStructureMemoryRequirementsInfoKHR::type set to VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_KHR", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureNV-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureNV-commonparent", "Each of commandBuffer, dst, instanceData, scratch, and src that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureNV-dst-02488", "dst must have been created with compatible VkAccelerationStructureInfoNV where VkAccelerationStructureInfoNV::type and VkAccelerationStructureInfoNV::flags are identical, VkAccelerationStructureInfoNV::instanceCount and VkAccelerationStructureInfoNV::geometryCount for dst are greater than or equal to the build size and each geometry in VkAccelerationStructureInfoNV::pGeometries for dst has greater than or equal to the number of vertices, indices, and AABBs", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureNV-dst-parameter", "dst must be a valid VkAccelerationStructureKHR handle", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureNV-geometryCount-02241", "geometryCount must be less than or equal to VkPhysicalDeviceRayTracingPropertiesNV::maxGeometryCount", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureNV-instanceData-03523", "If instanceData is not VK_NULL_HANDLE, instanceData must have been created with VK_BUFFER_USAGE_RAY_TRACING_BIT_NV usage flag", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureNV-instanceData-parameter", "If instanceData is not VK_NULL_HANDLE, instanceData must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureNV-pInfo-parameter", "pInfo must be a valid pointer to a valid VkAccelerationStructureInfoNV structure", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureNV-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureNV-scratch-03522", "scratch must have been created with VK_BUFFER_USAGE_RAY_TRACING_BIT_NV usage flag", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureNV-scratch-parameter", "scratch must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureNV-src-parameter", "If src is not VK_NULL_HANDLE, src must be a valid VkAccelerationStructureKHR handle", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureNV-update-02489", "If update is VK_TRUE, src must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureNV-update-02490", "If update is VK_TRUE, src must have been built before with VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_NV set in VkAccelerationStructureInfoNV::flags", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureNV-update-02491", "If update is VK_FALSE, the size member of the VkMemoryRequirements structure returned from a call to vkGetAccelerationStructureMemoryRequirementsNV with VkAccelerationStructureMemoryRequirementsInfoNV::accelerationStructure set to dst and VkAccelerationStructureMemoryRequirementsInfoNV::type set to VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_NV must be less than or equal to the size of scratch minus scratchOffset", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureNV-update-02492", "If update is VK_TRUE, the size member of the VkMemoryRequirements structure returned from a call to vkGetAccelerationStructureMemoryRequirementsNV with VkAccelerationStructureMemoryRequirementsInfoNV::accelerationStructure set to dst and VkAccelerationStructureMemoryRequirementsInfoNV::type set to VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_NV must be less than or equal to the size of scratch minus scratchOffset", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureNV-update-03524", "If update is VK_TRUE, then objects that were previously active must not be made inactive as per Inactive Primitives and Instances", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureNV-update-03525", "If update is VK_TRUE, then objects that were previously inactive must not be made active as per Inactive Primitives and Instances", "1.2-extensions"},
+ {"VUID-vkCmdBuildAccelerationStructureNV-update-03526", "If update is VK_TRUE, the src and dst objects must either be the same object or not have any memory aliasing", "1.2-extensions"},
+ {"VUID-vkCmdClearAttachments-aspectMask-02501", "If the aspectMask member of any element of pAttachments contains VK_IMAGE_ASPECT_COLOR_BIT, then the colorAttachment member of that element must either refer to a color attachment which is VK_ATTACHMENT_UNUSED, or must be a valid color attachment", "1.2-extensions"},
+ {"VUID-vkCmdClearAttachments-aspectMask-02502", "If the aspectMask member of any element of pAttachments contains VK_IMAGE_ASPECT_DEPTH_BIT, then the current subpass' depth/stencil attachment must either be VK_ATTACHMENT_UNUSED, or must have a depth component", "1.2-extensions"},
+ {"VUID-vkCmdClearAttachments-aspectMask-02503", "If the aspectMask member of any element of pAttachments contains VK_IMAGE_ASPECT_STENCIL_BIT, then the current subpass' depth/stencil attachment must either be VK_ATTACHMENT_UNUSED, or must have a stencil component", "1.2-extensions"},
+ {"VUID-vkCmdClearAttachments-attachmentCount-arraylength", "attachmentCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdClearAttachments-baseArrayLayer-00018", "If the render pass instance this is recorded in uses multiview, then baseArrayLayer must be zero and layerCount must be one", "1.2-extensions"},
+ {"VUID-vkCmdClearAttachments-commandBuffer-02504", "If commandBuffer is an unprotected command buffer, then each attachment to be cleared must not be a protected image", "1.2-extensions"},
+ {"VUID-vkCmdClearAttachments-commandBuffer-02505", "If commandBuffer is a protected command buffer, then each attachment to be cleared must not be an unprotected image", "1.2-extensions"},
+ {"VUID-vkCmdClearAttachments-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdClearAttachments-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdClearAttachments-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdClearAttachments-layerCount-01934", "The layerCount member of each element of pRects must not be 0", "1.2-extensions"},
+ {"VUID-vkCmdClearAttachments-pAttachments-parameter", "pAttachments must be a valid pointer to an array of attachmentCount valid VkClearAttachment structures", "1.2-extensions"},
+ {"VUID-vkCmdClearAttachments-pRects-00016", "The rectangular region specified by each element of pRects must be contained within the render area of the current render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdClearAttachments-pRects-00017", "The layers specified by each element of pRects must be contained within every attachment that pAttachments refers to", "1.2-extensions"},
+ {"VUID-vkCmdClearAttachments-pRects-parameter", "pRects must be a valid pointer to an array of rectCount VkClearRect structures", "1.2-extensions"},
+ {"VUID-vkCmdClearAttachments-rect-02682", "The rect member of each element of pRects must have an extent.width greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdClearAttachments-rect-02683", "The rect member of each element of pRects must have an extent.height greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdClearAttachments-rectCount-arraylength", "rectCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdClearAttachments-renderpass", "This command must only be called inside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-aspectMask-02498", "The VkImageSubresourceRange::aspectMask members of the elements of the pRanges array must each only include VK_IMAGE_ASPECT_COLOR_BIT", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-baseArrayLayer-01472", "The VkImageSubresourceRange::baseArrayLayer members of the elements of the pRanges array must each be less than the arrayLayers specified in VkImageCreateInfo when image was created", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-baseMipLevel-01470", "The VkImageSubresourceRange::baseMipLevel members of the elements of the pRanges array must each be less than the mipLevels specified in VkImageCreateInfo when image was created", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-commandBuffer-01805", "If commandBuffer is an unprotected command buffer, then image must not be a protected image", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-commandBuffer-01806", "If commandBuffer is a protected command buffer, then image must not be an unprotected image", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-commonparent", "Both of commandBuffer, and image must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-image-00002", "image must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-image-00003", "If image is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-image-00007", "image must not have a compressed or depth/stencil format", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-image-01545", "image must not use a format listed in Formats requiring sampler Y'CBCR conversion for VK_IMAGE_ASPECT_COLOR_BIT image views", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-image-01993", "The format features of image must contain VK_FORMAT_FEATURE_TRANSFER_DST_BIT", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-image-parameter", "image must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-imageLayout-00004", "imageLayout must specify the layout of the image subresource ranges of image specified in pRanges at the time this command is executed on a VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-imageLayout-00005", "imageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL", "1.2"},
+ {"VUID-vkCmdClearColorImage-imageLayout-01394", "imageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, or VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-imageLayout-parameter", "imageLayout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-pColor-parameter", "pColor must be a valid pointer to a valid VkClearColorValue union", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-pRanges-01692", "For each VkImageSubresourceRange element of pRanges, if the levelCount member is not VK_REMAINING_MIP_LEVELS, then baseMipLevel + levelCount must be less than the mipLevels specified in VkImageCreateInfo when image was created", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-pRanges-01693", "For each VkImageSubresourceRange element of pRanges, if the layerCount member is not VK_REMAINING_ARRAY_LAYERS, then baseArrayLayer + layerCount must be less than the arrayLayers specified in VkImageCreateInfo when image was created", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-pRanges-parameter", "pRanges must be a valid pointer to an array of rangeCount valid VkImageSubresourceRange structures", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-rangeCount-arraylength", "rangeCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdClearColorImage-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-aspectMask-02824", "The VkImageSubresourceRange::aspectMask member of each element of the pRanges array must not include bits other than VK_IMAGE_ASPECT_DEPTH_BIT or VK_IMAGE_ASPECT_STENCIL_BIT", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-baseArrayLayer-01476", "The VkImageSubresourceRange::baseArrayLayer members of the elements of the pRanges array must each be less than the arrayLayers specified in VkImageCreateInfo when image was created", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-baseMipLevel-01474", "The VkImageSubresourceRange::baseMipLevel members of the elements of the pRanges array must each be less than the mipLevels specified in VkImageCreateInfo when image was created", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-commandBuffer-01807", "If commandBuffer is an unprotected command buffer, then image must not be a protected image", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-commandBuffer-01808", "If commandBuffer is a protected command buffer, then image must not be an unprotected image", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-commonparent", "Both of commandBuffer, and image must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-image-00009", "image must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag", "1.1-khr-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-image-00010", "If image is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-image-00014", "image must have a depth/stencil format", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-image-01994", "The format features of image must contain VK_FORMAT_FEATURE_TRANSFER_DST_BIT", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-image-02825", "If the image's format does not have a stencil component, then the VkImageSubresourceRange::aspectMask member of each element of the pRanges array must not include the VK_IMAGE_ASPECT_STENCIL_BIT bit", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-image-02826", "If the image's format does not have a depth component, then the VkImageSubresourceRange::aspectMask member of each element of the pRanges array must not include the VK_IMAGE_ASPECT_DEPTH_BIT bit", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-image-parameter", "image must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-imageLayout-00011", "imageLayout must specify the layout of the image subresource ranges of image specified in pRanges at the time this command is executed on a VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-imageLayout-00012", "imageLayout must be either of VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-imageLayout-parameter", "imageLayout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-pDepthStencil-parameter", "pDepthStencil must be a valid pointer to a valid VkClearDepthStencilValue structure", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-pRanges-01694", "For each VkImageSubresourceRange element of pRanges, if the levelCount member is not VK_REMAINING_MIP_LEVELS, then baseMipLevel + levelCount must be less than the mipLevels specified in VkImageCreateInfo when image was created", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-pRanges-01695", "For each VkImageSubresourceRange element of pRanges, if the layerCount member is not VK_REMAINING_ARRAY_LAYERS, then baseArrayLayer + layerCount must be less than the arrayLayers specified in VkImageCreateInfo when image was created", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-pRanges-02658", "If the aspect member of any element of pRanges includes VK_IMAGE_ASPECT_STENCIL_BIT, and image was created with separate stencil usage, VK_IMAGE_USAGE_TRANSFER_DST_BIT must have been included in the VkImageStencilUsageCreateInfo::stencilUsage used to create image", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-pRanges-02659", "If the aspect member of any element of pRanges includes VK_IMAGE_ASPECT_STENCIL_BIT, and image was not created with separate stencil usage, VK_IMAGE_USAGE_TRANSFER_DST_BIT must have been included in the VkImageCreateInfo::usage used to create image", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-pRanges-02660", "If the aspect member of any element of pRanges includes VK_IMAGE_ASPECT_DEPTH_BIT, VK_IMAGE_USAGE_TRANSFER_DST_BIT must have been included in the VkImageCreateInfo::usage used to create image", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-pRanges-parameter", "pRanges must be a valid pointer to an array of rangeCount valid VkImageSubresourceRange structures", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-rangeCount-arraylength", "rangeCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdClearDepthStencilImage-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureKHR-None-03556", "All VkAccelerationStructureKHR objects referenced by this command must be bound to device memory", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureKHR-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureKHR-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureKHR-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureKHR-pInfo-parameter", "pInfo must be a valid pointer to a valid VkCopyAccelerationStructureInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureKHR-pNext-03557", "The VkDeferredOperationInfoKHR structure must not be included in the pNext chain of the VkCopyAccelerationStructureInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureKHR-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureNV-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureNV-commonparent", "Each of commandBuffer, dst, and src must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureNV-dst-parameter", "dst must be a valid VkAccelerationStructureKHR handle", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureNV-mode-03410", "mode must be VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR or VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureNV-mode-parameter", "mode must be a valid VkCopyAccelerationStructureModeKHR value", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureNV-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureNV-src-03411", "src must have been built with VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR if mode is VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureNV-src-parameter", "src must be a valid VkAccelerationStructureKHR handle", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureToMemoryKHR-None-03559", "All VkAccelerationStructureKHR objects referenced by this command must be bound to device memory", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureToMemoryKHR-None-04048", "All VkDeviceOrHostAddressConstKHR referenced by this command must contain valid device addresses for a buffer bound to device memory. If the buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureToMemoryKHR-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureToMemoryKHR-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureToMemoryKHR-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureToMemoryKHR-mode-03412", "mode must be VK_COPY_ACCELERATION_STRUCTURE_MODE_SERIALIZE_KHR", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureToMemoryKHR-pInfo-parameter", "pInfo must be a valid pointer to a valid VkCopyAccelerationStructureToMemoryInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureToMemoryKHR-pNext-03560", "The VkDeferredOperationInfoKHR structure must not be included in the pNext chain of the VkCopyAccelerationStructureToMemoryInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkCmdCopyAccelerationStructureToMemoryKHR-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdCopyBuffer-commandBuffer-01822", "If commandBuffer is an unprotected command buffer, then srcBuffer must not be a protected buffer", "1.2-extensions"},
+ {"VUID-vkCmdCopyBuffer-commandBuffer-01823", "If commandBuffer is an unprotected command buffer, then dstBuffer must not be a protected buffer", "1.2-extensions"},
+ {"VUID-vkCmdCopyBuffer-commandBuffer-01824", "If commandBuffer is a protected command buffer, then dstBuffer must not be an unprotected buffer", "1.2-extensions"},
+ {"VUID-vkCmdCopyBuffer-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdCopyBuffer-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdCopyBuffer-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdCopyBuffer-commonparent", "Each of commandBuffer, dstBuffer, and srcBuffer must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdCopyBuffer-dstBuffer-00120", "dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag", "1.2-extensions"},
+ {"VUID-vkCmdCopyBuffer-dstBuffer-00121", "If dstBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdCopyBuffer-dstBuffer-parameter", "dstBuffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdCopyBuffer-dstOffset-00114", "The dstOffset member of each element of pRegions must be less than the size of dstBuffer", "1.2-extensions"},
+ {"VUID-vkCmdCopyBuffer-pRegions-00117", "The union of the source regions, and the union of the destination regions, specified by the elements of pRegions, must not overlap in memory", "1.2-extensions"},
+ {"VUID-vkCmdCopyBuffer-pRegions-parameter", "pRegions must be a valid pointer to an array of regionCount valid VkBufferCopy structures", "1.2-extensions"},
+ {"VUID-vkCmdCopyBuffer-regionCount-arraylength", "regionCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdCopyBuffer-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdCopyBuffer-size-00115", "The size member of each element of pRegions must be less than or equal to the size of srcBuffer minus srcOffset", "1.2-extensions"},
+ {"VUID-vkCmdCopyBuffer-size-00116", "The size member of each element of pRegions must be less than or equal to the size of dstBuffer minus dstOffset", "1.2-extensions"},
+ {"VUID-vkCmdCopyBuffer-srcBuffer-00118", "srcBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_SRC_BIT usage flag", "1.2-extensions"},
+ {"VUID-vkCmdCopyBuffer-srcBuffer-00119", "If srcBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdCopyBuffer-srcBuffer-parameter", "srcBuffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdCopyBuffer-srcOffset-00113", "The srcOffset member of each element of pRegions must be less than the size of srcBuffer", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-commandBuffer-01828", "If commandBuffer is an unprotected command buffer, then srcBuffer must not be a protected buffer", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-commandBuffer-01829", "If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-commandBuffer-01830", "If commandBuffer is a protected command buffer, then dstImage must not be an unprotected image", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-commandBuffer-04052", "If the queue family used to create the VkCommandPool which commandBuffer was allocated from does not support VK_QUEUE_GRAPHICS_BIT or VK_QUEUE_COMPUTE_BIT, the bufferOffset member of any element of pRegions must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-commonparent", "Each of commandBuffer, dstImage, and srcBuffer must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-dstImage-00177", "dstImage must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-dstImage-00178", "If dstImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-dstImage-00179", "dstImage must have a sample count equal to VK_SAMPLE_COUNT_1_BIT", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-dstImage-01997", "The format features of dstImage must contain VK_FORMAT_FEATURE_TRANSFER_DST_BIT", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-dstImage-02543", "dstImage must not have been created with flags containing VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-dstImage-04053", "If dstImage has a depth/stencil format, the bufferOffset member of any element of pRegions must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-dstImage-parameter", "dstImage must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-dstImageLayout-00180", "dstImageLayout must specify the layout of the image subresources of dstImage specified in pRegions at the time this command is executed on a VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-dstImageLayout-00181", "dstImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL", "1.2"},
+ {"VUID-vkCmdCopyBufferToImage-dstImageLayout-01396", "dstImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, or VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-dstImageLayout-parameter", "dstImageLayout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-imageOffset-01793", "The imageOffset and imageExtent members of each element of pRegions must respect the image transfer granularity requirements of commandBuffer's command pool's queue family, as described in VkQueueFamilyProperties", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-imageSubresource-01701", "The imageSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when dstImage was created", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-imageSubresource-01702", "The imageSubresource.baseArrayLayer + imageSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when dstImage was created", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-pRegions-00171", "srcBuffer must be large enough to contain all buffer locations that are accessed according to Buffer and Image Addressing, for each element of pRegions", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-pRegions-00172", "The image region specified by each element of pRegions must be a region that is contained within dstImage", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-pRegions-00173", "The union of all source regions, and the union of all destination regions, specified by the elements of pRegions, must not overlap in memory", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-pRegions-parameter", "pRegions must be a valid pointer to an array of regionCount valid VkBufferImageCopy structures", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-regionCount-arraylength", "regionCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-srcBuffer-00174", "srcBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_SRC_BIT usage flag", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-srcBuffer-00176", "If srcBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdCopyBufferToImage-srcBuffer-parameter", "srcBuffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-None-01549", "In a copy to or from a plane of a multi-planar image, the VkFormat of the image and plane must be compatible according to the description of compatible planes for the plane being copied", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-commandBuffer-01825", "If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-commandBuffer-01826", "If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-commandBuffer-01827", "If commandBuffer is a protected command buffer, then dstImage must not be an unprotected image", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-commonparent", "Each of commandBuffer, dstImage, and srcImage must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-dstImage-00131", "dstImage must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-dstImage-00132", "If dstImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.0"},
+ {"VUID-vkCmdCopyImage-dstImage-01547", "If dstImage is non-sparse then the image or disjoint plane that is the destination of the copy must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-dstImage-01996", "The format features of dstImage must contain VK_FORMAT_FEATURE_TRANSFER_DST_BIT", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-dstImage-02542", "dstImage and srcImage must not have been created with flags containing VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-dstImage-parameter", "dstImage must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-dstImageLayout-00133", "dstImageLayout must specify the layout of the image subresources of dstImage specified in pRegions at the time this command is executed on a VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-dstImageLayout-00134", "dstImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL", "1.2"},
+ {"VUID-vkCmdCopyImage-dstImageLayout-01395", "dstImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, or VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-dstImageLayout-parameter", "dstImageLayout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-dstOffset-01784", "The dstOffset and extent members of each element of pRegions must respect the image transfer granularity requirements of commandBuffer's command pool's queue family, as described in VkQueueFamilyProperties", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-dstSubresource-01697", "The dstSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when dstImage was created", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-dstSubresource-01699", "The dstSubresource.baseArrayLayer + dstSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when dstImage was created", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-pRegions-00124", "The union of all source regions, and the union of all destination regions, specified by the elements of pRegions, must not overlap in memory", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-pRegions-parameter", "pRegions must be a valid pointer to an array of regionCount valid VkImageCopy structures", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-regionCount-arraylength", "regionCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-srcImage-00126", "srcImage must have been created with VK_IMAGE_USAGE_TRANSFER_SRC_BIT usage flag", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-srcImage-00127", "If srcImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.0"},
+ {"VUID-vkCmdCopyImage-srcImage-00135", "The VkFormat of each of srcImage and dstImage must be compatible, as defined above", "1.0"},
+ {"VUID-vkCmdCopyImage-srcImage-00136", "The sample count of srcImage and dstImage must match", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-srcImage-01546", "If srcImage is non-sparse then the image or disjoint plane to be copied must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-srcImage-01548", "If the VkFormat of each of srcImage and dstImage is not a multi-planar format, the VkFormat of each of srcImage and dstImage must be compatible, as defined above", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-srcImage-01995", "The format features of srcImage must contain VK_FORMAT_FEATURE_TRANSFER_SRC_BIT", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-srcImage-parameter", "srcImage must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-srcImageLayout-00128", "srcImageLayout must specify the layout of the image subresources of srcImage specified in pRegions at the time this command is executed on a VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-srcImageLayout-00129", "srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL", "1.2"},
+ {"VUID-vkCmdCopyImage-srcImageLayout-01917", "srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL, or VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-srcImageLayout-parameter", "srcImageLayout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-srcOffset-01783", "The srcOffset and extent members of each element of pRegions must respect the image transfer granularity requirements of commandBuffer's command pool's queue family, as described in VkQueueFamilyProperties", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-srcSubresource-01696", "The srcSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when srcImage was created", "1.2-extensions"},
+ {"VUID-vkCmdCopyImage-srcSubresource-01698", "The srcSubresource.baseArrayLayer + srcSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when srcImage was created", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-commandBuffer-01831", "If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-commandBuffer-01832", "If commandBuffer is an unprotected command buffer, then dstBuffer must not be a protected buffer", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-commandBuffer-01833", "If commandBuffer is a protected command buffer, then dstBuffer must not be an unprotected buffer", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-commandBuffer-04054", "If the queue family used to create the VkCommandPool which commandBuffer was allocated from does not support VK_QUEUE_GRAPHICS_BIT or VK_QUEUE_COMPUTE_BIT, the bufferOffset member of any element of pRegions must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-commonparent", "Each of commandBuffer, dstBuffer, and srcImage must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-dstBuffer-00191", "dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-dstBuffer-00192", "If dstBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-dstBuffer-parameter", "dstBuffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-imageOffset-01794", "The imageOffset and imageExtent members of each element of pRegions must respect the image transfer granularity requirements of commandBuffer's command pool's queue family, as described in VkQueueFamilyProperties", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-imageSubresource-01703", "The imageSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when srcImage was created", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-imageSubresource-01704", "The imageSubresource.baseArrayLayer + imageSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when srcImage was created", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-pRegions-00182", "The image region specified by each element of pRegions must be a region that is contained within srcImage", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-pRegions-00183", "dstBuffer must be large enough to contain all buffer locations that are accessed according to Buffer and Image Addressing, for each element of pRegions", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-pRegions-00184", "The union of all source regions, and the union of all destination regions, specified by the elements of pRegions, must not overlap in memory", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-pRegions-parameter", "pRegions must be a valid pointer to an array of regionCount valid VkBufferImageCopy structures", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-regionCount-arraylength", "regionCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-srcImage-00186", "srcImage must have been created with VK_IMAGE_USAGE_TRANSFER_SRC_BIT usage flag", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-srcImage-00187", "If srcImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-srcImage-00188", "srcImage must have a sample count equal to VK_SAMPLE_COUNT_1_BIT", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-srcImage-01998", "The format features of srcImage must contain VK_FORMAT_FEATURE_TRANSFER_SRC_BIT", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-srcImage-02544", "srcImage must not have been created with flags containing VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-srcImage-04055", "If srcImage has a depth/stencil format, the bufferOffset member of any element of pRegions must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-srcImage-parameter", "srcImage must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-srcImageLayout-00189", "srcImageLayout must specify the layout of the image subresources of srcImage specified in pRegions at the time this command is executed on a VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-srcImageLayout-00190", "srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL", "1.2"},
+ {"VUID-vkCmdCopyImageToBuffer-srcImageLayout-01397", "srcImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL", "1.2-extensions"},
+ {"VUID-vkCmdCopyImageToBuffer-srcImageLayout-parameter", "srcImageLayout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-vkCmdCopyMemoryToAccelerationStructureKHR-None-03563", "All VkAccelerationStructureKHR objects referenced by this command must be bound to device memory", "1.2-extensions"},
+ {"VUID-vkCmdCopyMemoryToAccelerationStructureKHR-None-04049", "All VkDeviceOrHostAddressKHR referenced by this command must contain valid device addresses for a buffer bound to device memory. If the buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdCopyMemoryToAccelerationStructureKHR-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations", "1.2-extensions"},
+ {"VUID-vkCmdCopyMemoryToAccelerationStructureKHR-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdCopyMemoryToAccelerationStructureKHR-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdCopyMemoryToAccelerationStructureKHR-mode-03413", "mode must be VK_COPY_ACCELERATION_STRUCTURE_MODE_DESERIALIZE_KHR", "1.2-extensions"},
+ {"VUID-vkCmdCopyMemoryToAccelerationStructureKHR-pInfo-03414", "The data in pInfo->src must have a format compatible with the destination physical device as returned by vkGetDeviceAccelerationStructureCompatibilityKHR", "1.2-extensions"},
+ {"VUID-vkCmdCopyMemoryToAccelerationStructureKHR-pInfo-parameter", "pInfo must be a valid pointer to a valid VkCopyMemoryToAccelerationStructureInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkCmdCopyMemoryToAccelerationStructureKHR-pNext-03564", "The VkDeferredOperationInfoKHR structure must not be included in the pNext chain of the VkCopyMemoryToAccelerationStructureInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkCmdCopyMemoryToAccelerationStructureKHR-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdCopyQueryPoolResults-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdCopyQueryPoolResults-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdCopyQueryPoolResults-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdCopyQueryPoolResults-commonparent", "Each of commandBuffer, dstBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdCopyQueryPoolResults-dstBuffer-00824", "dstBuffer must have enough storage, from dstOffset, to contain the result of each query, as described here", "1.2-extensions"},
+ {"VUID-vkCmdCopyQueryPoolResults-dstBuffer-00825", "dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag", "1.2-extensions"},
+ {"VUID-vkCmdCopyQueryPoolResults-dstBuffer-00826", "If dstBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdCopyQueryPoolResults-dstBuffer-parameter", "dstBuffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdCopyQueryPoolResults-dstOffset-00819", "dstOffset must be less than the size of dstBuffer", "1.2-extensions"},
+ {"VUID-vkCmdCopyQueryPoolResults-firstQuery-00820", "firstQuery must be less than the number of queries in queryPool", "1.2-extensions"},
+ {"VUID-vkCmdCopyQueryPoolResults-firstQuery-00821", "The sum of firstQuery and queryCount must be less than or equal to the number of queries in queryPool", "1.2-extensions"},
+ {"VUID-vkCmdCopyQueryPoolResults-flags-00822", "If VK_QUERY_RESULT_64_BIT is not set in flags then dstOffset and stride must be multiples of 4", "1.2-extensions"},
+ {"VUID-vkCmdCopyQueryPoolResults-flags-00823", "If VK_QUERY_RESULT_64_BIT is set in flags then dstOffset and stride must be multiples of 8", "1.2-extensions"},
+ {"VUID-vkCmdCopyQueryPoolResults-flags-parameter", "flags must be a valid combination of VkQueryResultFlagBits values", "1.2-extensions"},
+ {"VUID-vkCmdCopyQueryPoolResults-queryPool-parameter", "queryPool must be a valid VkQueryPool handle", "1.2-extensions"},
+ {"VUID-vkCmdCopyQueryPoolResults-queryType-00827", "If the queryType used to create queryPool was VK_QUERY_TYPE_TIMESTAMP, flags must not contain VK_QUERY_RESULT_PARTIAL_BIT", "1.2-extensions"},
+ {"VUID-vkCmdCopyQueryPoolResults-queryType-02734", "vkCmdCopyQueryPoolResults must not be called if the queryType used to create queryPool was VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL", "1.2-extensions"},
+ {"VUID-vkCmdCopyQueryPoolResults-queryType-03232", "If the queryType used to create queryPool was VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, VkPhysicalDevicePerformanceQueryPropertiesKHR::allowCommandBufferQueryCopies must be VK_TRUE", "1.2-extensions"},
+ {"VUID-vkCmdCopyQueryPoolResults-queryType-03233", "If the queryType used to create queryPool was VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, flags must not contain VK_QUERY_RESULT_WITH_AVAILABILITY_BIT, VK_QUERY_RESULT_PARTIAL_BIT or VK_QUERY_RESULT_64_BIT", "1.2-extensions"},
+ {"VUID-vkCmdCopyQueryPoolResults-queryType-03234", "If the queryType used to create queryPool was VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, the queryPool must have been submitted once for each pass as retrieved via a call to vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR", "1.2-extensions"},
+ {"VUID-vkCmdCopyQueryPoolResults-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdDebugMarkerBeginEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdDebugMarkerBeginEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDebugMarkerBeginEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdDebugMarkerBeginEXT-pMarkerInfo-parameter", "pMarkerInfo must be a valid pointer to a valid VkDebugMarkerMarkerInfoEXT structure", "1.2-extensions"},
+ {"VUID-vkCmdDebugMarkerEndEXT-commandBuffer-01239", "There must be an outstanding vkCmdDebugMarkerBeginEXT command prior to the vkCmdDebugMarkerEndEXT on the queue that commandBuffer is submitted to", "1.2-extensions"},
+ {"VUID-vkCmdDebugMarkerEndEXT-commandBuffer-01240", "If commandBuffer is a secondary command buffer, there must be an outstanding vkCmdDebugMarkerBeginEXT command recorded to commandBuffer that has not previously been ended by a call to vkCmdDebugMarkerEndEXT", "1.2-extensions"},
+ {"VUID-vkCmdDebugMarkerEndEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdDebugMarkerEndEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDebugMarkerEndEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdDebugMarkerInsertEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdDebugMarkerInsertEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDebugMarkerInsertEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdDebugMarkerInsertEXT-pMarkerInfo-parameter", "pMarkerInfo must be a valid pointer to a valid VkDebugMarkerMarkerInfoEXT structure", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY", "default"},
+ {"VUID-vkCmdDispatch-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-None-04115", "If a VkImageView is accessed using OpImageWrite as a result of this command, then the Type of the Texel operand of that instruction must have at least as many components as the image view's format.", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-commandBuffer-02712", "If commandBuffer is a protected command buffer, any resource written to by the VkPipeline object bound to the pipeline bind point used by this command must not be an unprotected resource", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-commandBuffer-02713", "If commandBuffer is a protected command buffer, pipeline stages other than the framebuffer-space and compute stages in the VkPipeline object bound to the pipeline bind point must not write to any resource", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-groupCountX-00386", "groupCountX must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-groupCountY-00387", "groupCountY must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1]", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-groupCountZ-00388", "groupCountZ must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]", "1.2-extensions"},
+ {"VUID-vkCmdDispatch-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY", "default"},
+ {"VUID-vkCmdDispatchBase-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-None-04115", "If a VkImageView is accessed using OpImageWrite as a result of this command, then the Type of the Texel operand of that instruction must have at least as many components as the image view's format.", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-baseGroupX-00421", "baseGroupX must be less than VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-baseGroupX-00422", "baseGroupX must be less than VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1]", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-baseGroupX-00427", "If any of baseGroupX, baseGroupY, or baseGroupZ are not zero, then the bound compute pipeline must have been created with the VK_PIPELINE_CREATE_DISPATCH_BASE flag", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-baseGroupZ-00423", "baseGroupZ must be less than VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-groupCountX-00424", "groupCountX must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0] minus baseGroupX", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-groupCountY-00425", "groupCountY must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1] minus baseGroupY", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-groupCountZ-00426", "groupCountZ must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2] minus baseGroupZ", "1.2-extensions"},
+ {"VUID-vkCmdDispatchBase-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY", "default"},
+ {"VUID-vkCmdDispatchIndirect-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-None-04115", "If a VkImageView is accessed using OpImageWrite as a result of this command, then the Type of the Texel operand of that instruction must have at least as many components as the image view's format.", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-buffer-02708", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-buffer-02709", "buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-buffer-parameter", "buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-commandBuffer-02711", "commandBuffer must not be a protected command buffer", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-commonparent", "Both of buffer, and commandBuffer must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-offset-00407", "The sum of offset and the size of VkDispatchIndirectCommand must be less than or equal to the size of buffer", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-offset-02710", "offset must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdDispatchIndirect-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdDraw-None-02686", "Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set", "1.2-extensions"},
+ {"VUID-vkCmdDraw-None-02687", "Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by this command", "1.2-extensions"},
+ {"VUID-vkCmdDraw-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDraw-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDraw-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdDraw-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY", "default"},
+ {"VUID-vkCmdDraw-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDraw-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDraw-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDraw-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDraw-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDraw-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDraw-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDraw-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDraw-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDraw-None-02721", "For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in Vertex Input Description", "1.2-extensions"},
+ {"VUID-vkCmdDraw-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound", "1.2-extensions"},
+ {"VUID-vkCmdDraw-None-04007", "All vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must have either valid or VK_NULL_HANDLE buffers bound", "1.2-extensions"},
+ {"VUID-vkCmdDraw-None-04008", "If the nullDescriptor feature is not enabled, all vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkCmdDraw-None-04115", "If a VkImageView is accessed using OpImageWrite as a result of this command, then the Type of the Texel operand of that instruction must have at least as many components as the image view's format.", "1.2-extensions"},
+ {"VUID-vkCmdDraw-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic", "1.2-extensions"},
+ {"VUID-vkCmdDraw-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource", "1.2-extensions"},
+ {"VUID-vkCmdDraw-commandBuffer-02712", "If commandBuffer is a protected command buffer, any resource written to by the VkPipeline object bound to the pipeline bind point used by this command must not be an unprotected resource", "1.2-extensions"},
+ {"VUID-vkCmdDraw-commandBuffer-02713", "If commandBuffer is a protected command buffer, pipeline stages other than the framebuffer-space and compute stages in the VkPipeline object bound to the pipeline bind point must not write to any resource", "1.2-extensions"},
+ {"VUID-vkCmdDraw-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdDraw-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDraw-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdDraw-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDraw-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDraw-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE", "1.2-extensions"},
+ {"VUID-vkCmdDraw-maxMultiviewInstanceIndex-02688", "If the draw is recorded in a render pass instance with multiview enabled, the maximum instance index must be less than or equal to VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex", "1.2-extensions"},
+ {"VUID-vkCmdDraw-primitiveTopology-03420", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT dynamic state enabled then vkCmdSetPrimitiveTopologyEXT must have been called in the current command buffer prior to this draw command, and the primitiveTopology parameter of vkCmdSetPrimitiveTopologyEXT must be of the same topology class as the pipeline VkPipelineInputAssemblyStateCreateInfo::topology state", "1.2-extensions"},
+ {"VUID-vkCmdDraw-renderPass-02684", "The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdDraw-renderpass", "This command must only be called inside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdDraw-sampleLocationsEnable-02689", "If the bound graphics pipeline was created with VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable set to VK_TRUE and the current subpass has a depth/stencil attachment, then that attachment must have been created with the VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set", "1.2-extensions"},
+ {"VUID-vkCmdDraw-scissorCount-03418", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, but not the VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled, then then vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the scissorCount parameter of vkCmdSetScissorWithCountEXT must match the VkPipelineViewportStateCreateInfo::viewportCount of the pipeline", "1.2-extensions"},
+ {"VUID-vkCmdDraw-subpass-02685", "The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdDraw-viewportCount-03417", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled, but not the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, then then vkCmdSetViewportWithCountEXT must have been called in the current command buffer prior to this draw command, and the viewportCount parameter of vkCmdSetViewportWithCountEXT must match the VkPipelineViewportStateCreateInfo::scissorCount of the pipeline", "1.2-extensions"},
+ {"VUID-vkCmdDraw-viewportCount-03419", "If the bound graphics pipeline state was created with both the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT and VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic states enabled then both vkCmdSetViewportWithCountEXT and vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the viewportCount parameter of vkCmdSetViewportWithCountEXT must match the scissorCount parameter of vkCmdSetScissorWithCountEXT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-None-02686", "Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-None-02687", "Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY", "default"},
+ {"VUID-vkCmdDrawIndexed-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-None-02721", "For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in Vertex Input Description", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-None-04007", "All vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must have either valid or VK_NULL_HANDLE buffers bound", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-None-04008", "If the nullDescriptor feature is not enabled, all vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-None-04115", "If a VkImageView is accessed using OpImageWrite as a result of this command, then the Type of the Texel operand of that instruction must have at least as many components as the image view's format.", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-commandBuffer-02712", "If commandBuffer is a protected command buffer, any resource written to by the VkPipeline object bound to the pipeline bind point used by this command must not be an unprotected resource", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-commandBuffer-02713", "If commandBuffer is a protected command buffer, pipeline stages other than the framebuffer-space and compute stages in the VkPipeline object bound to the pipeline bind point must not write to any resource", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-indexSize-00463", "(indexSize {times} (firstIndex + indexCount) + offset) must be less than or equal to the size of the bound index buffer, with indexSize being based on the type specified by indexType, where the index buffer, indexType, and offset are specified via vkCmdBindIndexBuffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-maxMultiviewInstanceIndex-02688", "If the draw is recorded in a render pass instance with multiview enabled, the maximum instance index must be less than or equal to VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-primitiveTopology-03420", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT dynamic state enabled then vkCmdSetPrimitiveTopologyEXT must have been called in the current command buffer prior to this draw command, and the primitiveTopology parameter of vkCmdSetPrimitiveTopologyEXT must be of the same topology class as the pipeline VkPipelineInputAssemblyStateCreateInfo::topology state", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-renderPass-02684", "The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-renderpass", "This command must only be called inside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-sampleLocationsEnable-02689", "If the bound graphics pipeline was created with VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable set to VK_TRUE and the current subpass has a depth/stencil attachment, then that attachment must have been created with the VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-scissorCount-03418", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, but not the VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled, then then vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the scissorCount parameter of vkCmdSetScissorWithCountEXT must match the VkPipelineViewportStateCreateInfo::viewportCount of the pipeline", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-subpass-02685", "The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-viewportCount-03417", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled, but not the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, then then vkCmdSetViewportWithCountEXT must have been called in the current command buffer prior to this draw command, and the viewportCount parameter of vkCmdSetViewportWithCountEXT must match the VkPipelineViewportStateCreateInfo::scissorCount of the pipeline", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexed-viewportCount-03419", "If the bound graphics pipeline state was created with both the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT and VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic states enabled then both vkCmdSetViewportWithCountEXT and vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the viewportCount parameter of vkCmdSetViewportWithCountEXT must match the scissorCount parameter of vkCmdSetScissorWithCountEXT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-None-02686", "Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-None-02687", "Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY", "default"},
+ {"VUID-vkCmdDrawIndexedIndirect-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-None-02721", "For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in Vertex Input Description", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-None-02837", "If drawIndirectCount is not enabled this function must not be used", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-None-04007", "All vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must have either valid or VK_NULL_HANDLE buffers bound", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-None-04008", "If the nullDescriptor feature is not enabled, all vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-None-04115", "If a VkImageView is accessed using OpImageWrite as a result of this command, then the Type of the Texel operand of that instruction must have at least as many components as the image view's format.", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-buffer-02708", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-buffer-02709", "buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-buffer-parameter", "buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711", "commandBuffer must not be a protected command buffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-commonparent", "Both of buffer, and commandBuffer must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-drawCount-00528", "If drawCount is greater than 1, stride must be a multiple of 4 and must be greater than or equal to sizeof(VkDrawIndexedIndirectCommand)", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-drawCount-00539", "If drawCount is equal to 1, (offset + sizeof(VkDrawIndexedIndirectCommand)) must be less than or equal to the size of buffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-drawCount-00540", "If drawCount is greater than 1, (stride {times} (drawCount - 1) + offset + sizeof(VkDrawIndexedIndirectCommand)) must be less than or equal to the size of buffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-drawCount-02718", "If the multi-draw indirect feature is not enabled, drawCount must be 0 or 1", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-drawCount-02719", "drawCount must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-firstInstance-00530", "If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the VkDrawIndexedIndirectCommand structures accessed by this command must be 0", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-maxMultiviewInstanceIndex-02688", "If the draw is recorded in a render pass instance with multiview enabled, the maximum instance index must be less than or equal to VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-offset-02710", "offset must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-primitiveTopology-03420", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT dynamic state enabled then vkCmdSetPrimitiveTopologyEXT must have been called in the current command buffer prior to this draw command, and the primitiveTopology parameter of vkCmdSetPrimitiveTopologyEXT must be of the same topology class as the pipeline VkPipelineInputAssemblyStateCreateInfo::topology state", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-renderPass-02684", "The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-renderpass", "This command must only be called inside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-sampleLocationsEnable-02689", "If the bound graphics pipeline was created with VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable set to VK_TRUE and the current subpass has a depth/stencil attachment, then that attachment must have been created with the VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-scissorCount-03418", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, but not the VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled, then then vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the scissorCount parameter of vkCmdSetScissorWithCountEXT must match the VkPipelineViewportStateCreateInfo::viewportCount of the pipeline", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-subpass-02685", "The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-viewportCount-03417", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled, but not the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, then then vkCmdSetViewportWithCountEXT must have been called in the current command buffer prior to this draw command, and the viewportCount parameter of vkCmdSetViewportWithCountEXT must match the VkPipelineViewportStateCreateInfo::scissorCount of the pipeline", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirect-viewportCount-03419", "If the bound graphics pipeline state was created with both the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT and VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic states enabled then both vkCmdSetViewportWithCountEXT and vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the viewportCount parameter of vkCmdSetViewportWithCountEXT must match the scissorCount parameter of vkCmdSetScissorWithCountEXT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-None-02686", "Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-None-02687", "Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY", "default"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-None-02721", "For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in Vertex Input Description", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-None-04007", "All vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must have either valid or VK_NULL_HANDLE buffers bound", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-None-04008", "If the nullDescriptor feature is not enabled, all vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-None-04115", "If a VkImageView is accessed using OpImageWrite as a result of this command, then the Type of the Texel operand of that instruction must have at least as many components as the image view's format.", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-buffer-02708", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-buffer-02709", "buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-buffer-parameter", "buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02711", "commandBuffer must not be a protected command buffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-commonparent", "Each of buffer, commandBuffer, and countBuffer must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714", "If countBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02715", "countBuffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02717", "The count stored in countBuffer must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-countBuffer-03153", "If count stored in countBuffer is equal to 1, (offset + sizeof(VkDrawIndexedIndirectCommand)) must be less than or equal to the size of buffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-countBuffer-03154", "If count stored in countBuffer is greater than 1, (stride {times} (drawCount - 1) + offset + sizeof(VkDrawIndexedIndirectCommand)) must be less than or equal to the size of buffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-countBuffer-parameter", "countBuffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716", "countBufferOffset must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-04129", "(countBufferOffset + sizeof(uint32_t)) must be less than or equal to the size of countBuffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-maxDrawCount-03143", "If maxDrawCount is greater than or equal to 1, (stride {times} (maxDrawCount - 1) + offset + sizeof(VkDrawIndexedIndirectCommand)) must be less than or equal to the size of buffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-maxMultiviewInstanceIndex-02688", "If the draw is recorded in a render pass instance with multiview enabled, the maximum instance index must be less than or equal to VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-offset-02710", "offset must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-primitiveTopology-03420", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT dynamic state enabled then vkCmdSetPrimitiveTopologyEXT must have been called in the current command buffer prior to this draw command, and the primitiveTopology parameter of vkCmdSetPrimitiveTopologyEXT must be of the same topology class as the pipeline VkPipelineInputAssemblyStateCreateInfo::topology state", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684", "The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-renderpass", "This command must only be called inside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-sampleLocationsEnable-02689", "If the bound graphics pipeline was created with VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable set to VK_TRUE and the current subpass has a depth/stencil attachment, then that attachment must have been created with the VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-scissorCount-03418", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, but not the VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled, then then vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the scissorCount parameter of vkCmdSetScissorWithCountEXT must match the VkPipelineViewportStateCreateInfo::viewportCount of the pipeline", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-stride-03142", "stride must be a multiple of 4 and must be greater than or equal to sizeof(VkDrawIndexedIndirectCommand)", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-subpass-02685", "The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-viewportCount-03417", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled, but not the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, then then vkCmdSetViewportWithCountEXT must have been called in the current command buffer prior to this draw command, and the viewportCount parameter of vkCmdSetViewportWithCountEXT must match the VkPipelineViewportStateCreateInfo::scissorCount of the pipeline", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndexedIndirectCount-viewportCount-03419", "If the bound graphics pipeline state was created with both the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT and VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic states enabled then both vkCmdSetViewportWithCountEXT and vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the viewportCount parameter of vkCmdSetViewportWithCountEXT must match the scissorCount parameter of vkCmdSetScissorWithCountEXT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-None-02686", "Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-None-02687", "Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY", "default"},
+ {"VUID-vkCmdDrawIndirect-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-None-02721", "For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in Vertex Input Description", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-None-04007", "All vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must have either valid or VK_NULL_HANDLE buffers bound", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-None-04008", "If the nullDescriptor feature is not enabled, all vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-None-04115", "If a VkImageView is accessed using OpImageWrite as a result of this command, then the Type of the Texel operand of that instruction must have at least as many components as the image view's format.", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-buffer-02708", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-buffer-02709", "buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-buffer-parameter", "buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-commandBuffer-02711", "commandBuffer must not be a protected command buffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-commonparent", "Both of buffer, and commandBuffer must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-drawCount-00476", "If drawCount is greater than 1, stride must be a multiple of 4 and must be greater than or equal to sizeof(VkDrawIndirectCommand)", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-drawCount-00487", "If drawCount is equal to 1, (offset + sizeof(VkDrawIndirectCommand)) must be less than or equal to the size of buffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-drawCount-00488", "If drawCount is greater than 1, (stride {times} (drawCount - 1) + offset + sizeof(VkDrawIndirectCommand)) must be less than or equal to the size of buffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-drawCount-02718", "If the multi-draw indirect feature is not enabled, drawCount must be 0 or 1", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-drawCount-02719", "drawCount must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-firstInstance-00478", "If the drawIndirectFirstInstance feature is not enabled, all the firstInstance members of the VkDrawIndirectCommand structures accessed by this command must be 0", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-maxMultiviewInstanceIndex-02688", "If the draw is recorded in a render pass instance with multiview enabled, the maximum instance index must be less than or equal to VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-offset-02710", "offset must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-primitiveTopology-03420", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT dynamic state enabled then vkCmdSetPrimitiveTopologyEXT must have been called in the current command buffer prior to this draw command, and the primitiveTopology parameter of vkCmdSetPrimitiveTopologyEXT must be of the same topology class as the pipeline VkPipelineInputAssemblyStateCreateInfo::topology state", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-renderPass-02684", "The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-renderpass", "This command must only be called inside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-sampleLocationsEnable-02689", "If the bound graphics pipeline was created with VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable set to VK_TRUE and the current subpass has a depth/stencil attachment, then that attachment must have been created with the VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-scissorCount-03418", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, but not the VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled, then then vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the scissorCount parameter of vkCmdSetScissorWithCountEXT must match the VkPipelineViewportStateCreateInfo::viewportCount of the pipeline", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-subpass-02685", "The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-viewportCount-03417", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled, but not the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, then then vkCmdSetViewportWithCountEXT must have been called in the current command buffer prior to this draw command, and the viewportCount parameter of vkCmdSetViewportWithCountEXT must match the VkPipelineViewportStateCreateInfo::scissorCount of the pipeline", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirect-viewportCount-03419", "If the bound graphics pipeline state was created with both the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT and VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic states enabled then both vkCmdSetViewportWithCountEXT and vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the viewportCount parameter of vkCmdSetViewportWithCountEXT must match the scissorCount parameter of vkCmdSetScissorWithCountEXT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-None-02686", "Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-None-02687", "Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY", "default"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-None-02721", "For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in Vertex Input Description", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-None-04007", "All vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must have either valid or VK_NULL_HANDLE buffers bound", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-None-04008", "If the nullDescriptor feature is not enabled, all vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-None-04115", "If a VkImageView is accessed using OpImageWrite as a result of this command, then the Type of the Texel operand of that instruction must have at least as many components as the image view's format.", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-02646", "commandBuffer must not be a protected command buffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-commonparent", "Both of commandBuffer, and counterBuffer must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-counterBuffer-02290", "counterBuffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-counterBuffer-parameter", "counterBuffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-maxMultiviewInstanceIndex-02688", "If the draw is recorded in a render pass instance with multiview enabled, the maximum instance index must be less than or equal to VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-primitiveTopology-03420", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT dynamic state enabled then vkCmdSetPrimitiveTopologyEXT must have been called in the current command buffer prior to this draw command, and the primitiveTopology parameter of vkCmdSetPrimitiveTopologyEXT must be of the same topology class as the pipeline VkPipelineInputAssemblyStateCreateInfo::topology state", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-renderPass-02684", "The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-renderpass", "This command must only be called inside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-sampleLocationsEnable-02689", "If the bound graphics pipeline was created with VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable set to VK_TRUE and the current subpass has a depth/stencil attachment, then that attachment must have been created with the VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-scissorCount-03418", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, but not the VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled, then then vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the scissorCount parameter of vkCmdSetScissorWithCountEXT must match the VkPipelineViewportStateCreateInfo::viewportCount of the pipeline", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-subpass-02685", "The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-transformFeedback-02287", "VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-transformFeedbackDraw-02288", "The implementation must support VkPhysicalDeviceTransformFeedbackPropertiesEXT::transformFeedbackDraw", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-vertexStride-02289", "vertexStride must be greater than 0 and less than or equal to VkPhysicalDeviceLimits::maxTransformFeedbackBufferDataStride", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-viewportCount-03417", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled, but not the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, then then vkCmdSetViewportWithCountEXT must have been called in the current command buffer prior to this draw command, and the viewportCount parameter of vkCmdSetViewportWithCountEXT must match the VkPipelineViewportStateCreateInfo::scissorCount of the pipeline", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectByteCountEXT-viewportCount-03419", "If the bound graphics pipeline state was created with both the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT and VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic states enabled then both vkCmdSetViewportWithCountEXT and vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the viewportCount parameter of vkCmdSetViewportWithCountEXT must match the scissorCount parameter of vkCmdSetScissorWithCountEXT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-None-02686", "Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-None-02687", "Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY", "default"},
+ {"VUID-vkCmdDrawIndirectCount-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-None-02721", "For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in Vertex Input Description", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-None-02836", "If drawIndirectCount is not enabled this function must not be used", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-None-04007", "All vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must have either valid or VK_NULL_HANDLE buffers bound", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-None-04008", "If the nullDescriptor feature is not enabled, all vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-None-04115", "If a VkImageView is accessed using OpImageWrite as a result of this command, then the Type of the Texel operand of that instruction must have at least as many components as the image view's format.", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-buffer-02708", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-buffer-02709", "buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-buffer-parameter", "buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-commandBuffer-02711", "commandBuffer must not be a protected command buffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-commonparent", "Each of buffer, commandBuffer, and countBuffer must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-countBuffer-02714", "If countBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-countBuffer-02715", "countBuffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-countBuffer-02717", "The count stored in countBuffer must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-countBuffer-03121", "If the count stored in countBuffer is equal to 1, (offset + sizeof(VkDrawIndirectCommand)) must be less than or equal to the size of buffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-countBuffer-03122", "If the count stored in countBuffer is greater than 1, (stride {times} (drawCount - 1) + offset + sizeof(VkDrawIndirectCommand)) must be less than or equal to the size of buffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-countBuffer-parameter", "countBuffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-countBufferOffset-02716", "countBufferOffset must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-countBufferOffset-04129", "(countBufferOffset + sizeof(uint32_t)) must be less than or equal to the size of countBuffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-maxDrawCount-03111", "If maxDrawCount is greater than or equal to 1, (stride {times} (maxDrawCount - 1) + offset + sizeof(VkDrawIndirectCommand)) must be less than or equal to the size of buffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-maxMultiviewInstanceIndex-02688", "If the draw is recorded in a render pass instance with multiview enabled, the maximum instance index must be less than or equal to VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-offset-02710", "offset must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-primitiveTopology-03420", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT dynamic state enabled then vkCmdSetPrimitiveTopologyEXT must have been called in the current command buffer prior to this draw command, and the primitiveTopology parameter of vkCmdSetPrimitiveTopologyEXT must be of the same topology class as the pipeline VkPipelineInputAssemblyStateCreateInfo::topology state", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-renderPass-02684", "The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-renderpass", "This command must only be called inside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-sampleLocationsEnable-02689", "If the bound graphics pipeline was created with VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable set to VK_TRUE and the current subpass has a depth/stencil attachment, then that attachment must have been created with the VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-scissorCount-03418", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, but not the VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled, then then vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the scissorCount parameter of vkCmdSetScissorWithCountEXT must match the VkPipelineViewportStateCreateInfo::viewportCount of the pipeline", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-stride-03110", "stride must be a multiple of 4 and must be greater than or equal to sizeof(VkDrawIndirectCommand)", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-subpass-02685", "The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-viewportCount-03417", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled, but not the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, then then vkCmdSetViewportWithCountEXT must have been called in the current command buffer prior to this draw command, and the viewportCount parameter of vkCmdSetViewportWithCountEXT must match the VkPipelineViewportStateCreateInfo::scissorCount of the pipeline", "1.2-extensions"},
+ {"VUID-vkCmdDrawIndirectCount-viewportCount-03419", "If the bound graphics pipeline state was created with both the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT and VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic states enabled then both vkCmdSetViewportWithCountEXT and vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the viewportCount parameter of vkCmdSetViewportWithCountEXT must match the scissorCount parameter of vkCmdSetScissorWithCountEXT", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02686", "Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02687", "Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY", "default"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-None-04115", "If a VkImageView is accessed using OpImageWrite as a result of this command, then the Type of the Texel operand of that instruction must have at least as many components as the image view's format.", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02708", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-02709", "buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-buffer-parameter", "buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-02711", "commandBuffer must not be a protected command buffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-commonparent", "Each of buffer, commandBuffer, and countBuffer must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02191", "If the count stored in countBuffer is equal to 1, (offset + sizeof(VkDrawMeshTasksIndirectCommandNV)) must be less than or equal to the size of buffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02192", "If the count stored in countBuffer is greater than 1, (stride {times} (drawCount - 1) + offset + sizeof(VkDrawMeshTasksIndirectCommandNV)) must be less than or equal to the size of buffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02714", "If countBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02715", "countBuffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-02717", "The count stored in countBuffer must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-countBuffer-parameter", "countBuffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-countBufferOffset-02716", "countBufferOffset must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-countBufferOffset-04129", "(countBufferOffset + sizeof(uint32_t)) must be less than or equal to the size of countBuffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-maxDrawCount-02183", "If maxDrawCount is greater than or equal to 1, (stride {times} (maxDrawCount - 1) + offset + sizeof(VkDrawMeshTasksIndirectCommandNV)) must be less than or equal to the size of buffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-maxMultiviewInstanceIndex-02688", "If the draw is recorded in a render pass instance with multiview enabled, the maximum instance index must be less than or equal to VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-offset-02710", "offset must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-primitiveTopology-03420", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT dynamic state enabled then vkCmdSetPrimitiveTopologyEXT must have been called in the current command buffer prior to this draw command, and the primitiveTopology parameter of vkCmdSetPrimitiveTopologyEXT must be of the same topology class as the pipeline VkPipelineInputAssemblyStateCreateInfo::topology state", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-renderPass-02684", "The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-renderpass", "This command must only be called inside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-sampleLocationsEnable-02689", "If the bound graphics pipeline was created with VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable set to VK_TRUE and the current subpass has a depth/stencil attachment, then that attachment must have been created with the VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-scissorCount-03418", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, but not the VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled, then then vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the scissorCount parameter of vkCmdSetScissorWithCountEXT must match the VkPipelineViewportStateCreateInfo::viewportCount of the pipeline", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-stride-02182", "stride must be a multiple of 4 and must be greater than or equal to sizeof(VkDrawMeshTasksIndirectCommandNV)", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-subpass-02685", "The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-viewportCount-03417", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled, but not the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, then then vkCmdSetViewportWithCountEXT must have been called in the current command buffer prior to this draw command, and the viewportCount parameter of vkCmdSetViewportWithCountEXT must match the VkPipelineViewportStateCreateInfo::scissorCount of the pipeline", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectCountNV-viewportCount-03419", "If the bound graphics pipeline state was created with both the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT and VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic states enabled then both vkCmdSetViewportWithCountEXT and vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the viewportCount parameter of vkCmdSetViewportWithCountEXT must match the scissorCount parameter of vkCmdSetScissorWithCountEXT", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02686", "Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02687", "Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY", "default"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-None-04115", "If a VkImageView is accessed using OpImageWrite as a result of this command, then the Type of the Texel operand of that instruction must have at least as many components as the image view's format.", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02708", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-buffer-02709", "buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-buffer-parameter", "buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-02711", "commandBuffer must not be a protected command buffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-commonparent", "Both of buffer, and commandBuffer must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02146", "If drawCount is greater than 1, stride must be a multiple of 4 and must be greater than or equal to sizeof(VkDrawMeshTasksIndirectCommandNV)", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02156", "If drawCount is equal to 1, (offset + sizeof(VkDrawMeshTasksIndirectCommandNV)) must be less than or equal to the size of buffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02157", "If drawCount is greater than 1, (stride {times} (drawCount - 1) + offset + sizeof(VkDrawMeshTasksIndirectCommandNV)) must be less than or equal to the size of buffer", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02718", "If the multi-draw indirect feature is not enabled, drawCount must be 0 or 1", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02719", "drawCount must be less than or equal to VkPhysicalDeviceLimits::maxDrawIndirectCount", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-maxMultiviewInstanceIndex-02688", "If the draw is recorded in a render pass instance with multiview enabled, the maximum instance index must be less than or equal to VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-offset-02710", "offset must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-primitiveTopology-03420", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT dynamic state enabled then vkCmdSetPrimitiveTopologyEXT must have been called in the current command buffer prior to this draw command, and the primitiveTopology parameter of vkCmdSetPrimitiveTopologyEXT must be of the same topology class as the pipeline VkPipelineInputAssemblyStateCreateInfo::topology state", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-renderPass-02684", "The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-renderpass", "This command must only be called inside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-sampleLocationsEnable-02689", "If the bound graphics pipeline was created with VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable set to VK_TRUE and the current subpass has a depth/stencil attachment, then that attachment must have been created with the VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-scissorCount-03418", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, but not the VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled, then then vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the scissorCount parameter of vkCmdSetScissorWithCountEXT must match the VkPipelineViewportStateCreateInfo::viewportCount of the pipeline", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-subpass-02685", "The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-viewportCount-03417", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled, but not the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, then then vkCmdSetViewportWithCountEXT must have been called in the current command buffer prior to this draw command, and the viewportCount parameter of vkCmdSetViewportWithCountEXT must match the VkPipelineViewportStateCreateInfo::scissorCount of the pipeline", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksIndirectNV-viewportCount-03419", "If the bound graphics pipeline state was created with both the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT and VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic states enabled then both vkCmdSetViewportWithCountEXT and vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the viewportCount parameter of vkCmdSetViewportWithCountEXT must match the scissorCount parameter of vkCmdSetScissorWithCountEXT", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-None-02686", "Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-None-02687", "Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY", "default"},
+ {"VUID-vkCmdDrawMeshTasksNV-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-None-04115", "If a VkImageView is accessed using OpImageWrite as a result of this command, then the Type of the Texel operand of that instruction must have at least as many components as the image view's format.", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-maxMultiviewInstanceIndex-02688", "If the draw is recorded in a render pass instance with multiview enabled, the maximum instance index must be less than or equal to VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-primitiveTopology-03420", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT dynamic state enabled then vkCmdSetPrimitiveTopologyEXT must have been called in the current command buffer prior to this draw command, and the primitiveTopology parameter of vkCmdSetPrimitiveTopologyEXT must be of the same topology class as the pipeline VkPipelineInputAssemblyStateCreateInfo::topology state", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-renderPass-02684", "The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-renderpass", "This command must only be called inside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-sampleLocationsEnable-02689", "If the bound graphics pipeline was created with VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable set to VK_TRUE and the current subpass has a depth/stencil attachment, then that attachment must have been created with the VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-scissorCount-03418", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, but not the VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled, then then vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the scissorCount parameter of vkCmdSetScissorWithCountEXT must match the VkPipelineViewportStateCreateInfo::viewportCount of the pipeline", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-subpass-02685", "The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-taskCount-02119", "taskCount must be less than or equal to VkPhysicalDeviceMeshShaderPropertiesNV::maxDrawMeshTasksCount", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-viewportCount-03417", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled, but not the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, then then vkCmdSetViewportWithCountEXT must have been called in the current command buffer prior to this draw command, and the viewportCount parameter of vkCmdSetViewportWithCountEXT must match the VkPipelineViewportStateCreateInfo::scissorCount of the pipeline", "1.2-extensions"},
+ {"VUID-vkCmdDrawMeshTasksNV-viewportCount-03419", "If the bound graphics pipeline state was created with both the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT and VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic states enabled then both vkCmdSetViewportWithCountEXT and vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the viewportCount parameter of vkCmdSetViewportWithCountEXT must match the scissorCount parameter of vkCmdSetScissorWithCountEXT", "1.2-extensions"},
+ {"VUID-vkCmdEndConditionalRenderingEXT-None-01985", "Conditional rendering must be active", "1.2-extensions"},
+ {"VUID-vkCmdEndConditionalRenderingEXT-None-01986", "If conditional rendering was made active outside of a render pass instance, it must not be ended inside a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdEndConditionalRenderingEXT-None-01987", "If conditional rendering was made active within a subpass it must be ended in the same subpass", "1.2-extensions"},
+ {"VUID-vkCmdEndConditionalRenderingEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdEndConditionalRenderingEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdEndConditionalRenderingEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-01912", "There must be an outstanding vkCmdBeginDebugUtilsLabelEXT command prior to the vkCmdEndDebugUtilsLabelEXT on the queue that commandBuffer is submitted to", "1.2-extensions"},
+ {"VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-01913", "If commandBuffer is a secondary command buffer, there must be an outstanding vkCmdBeginDebugUtilsLabelEXT command recorded to commandBuffer that has not previously been ended by a call to vkCmdEndDebugUtilsLabelEXT", "1.2-extensions"},
+ {"VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdEndQuery-None-01923", "All queries used by the command must be active", "1.2-extensions"},
+ {"VUID-vkCmdEndQuery-commandBuffer-01886", "commandBuffer must not be a protected command buffer", "1.2-extensions"},
+ {"VUID-vkCmdEndQuery-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdEndQuery-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdEndQuery-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdEndQuery-commonparent", "Both of commandBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdEndQuery-query-00810", "query must be less than the number of queries in queryPool", "1.2-extensions"},
+ {"VUID-vkCmdEndQuery-query-00812", "If vkCmdEndQuery is called within a render pass instance, the sum of query and the number of bits set in the current subpass's view mask must be less than or equal to the number of queries in queryPool", "1.2-extensions"},
+ {"VUID-vkCmdEndQuery-queryPool-03227", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR and one or more of the counters used to create queryPool was VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR, the vkCmdEndQuery must be the last recorded command in commandBuffer", "1.2-extensions"},
+ {"VUID-vkCmdEndQuery-queryPool-03228", "If queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR and one or more of the counters used to create queryPool was VK_PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR, the vkCmdEndQuery must not be recorded within a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdEndQuery-queryPool-parameter", "queryPool must be a valid VkQueryPool handle", "1.2-extensions"},
+ {"VUID-vkCmdEndQueryIndexedEXT-None-02342", "All queries used by the command must be active", "1.2-extensions"},
+ {"VUID-vkCmdEndQueryIndexedEXT-commandBuffer-02344", "commandBuffer must not be a protected command buffer", "1.2-extensions"},
+ {"VUID-vkCmdEndQueryIndexedEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdEndQueryIndexedEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdEndQueryIndexedEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdEndQueryIndexedEXT-commonparent", "Both of commandBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdEndQueryIndexedEXT-query-02343", "query must be less than the number of queries in queryPool", "1.2-extensions"},
+ {"VUID-vkCmdEndQueryIndexedEXT-query-02345", "If vkCmdEndQueryIndexedEXT is called within a render pass instance, the sum of query and the number of bits set in the current subpass's view mask must be less than or equal to the number of queries in queryPool", "1.2-extensions"},
+ {"VUID-vkCmdEndQueryIndexedEXT-queryPool-parameter", "queryPool must be a valid VkQueryPool handle", "1.2-extensions"},
+ {"VUID-vkCmdEndQueryIndexedEXT-queryType-02346", "If the queryType used to create queryPool was VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT the index parameter must be less than VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackStreams", "1.2-extensions"},
+ {"VUID-vkCmdEndQueryIndexedEXT-queryType-02347", "If the queryType used to create queryPool was not VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT the index must be zero", "1.2-extensions"},
+ {"VUID-vkCmdEndQueryIndexedEXT-queryType-02723", "If the queryType used to create queryPool was VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT index must equal the index used to begin the query", "1.2-extensions"},
+ {"VUID-vkCmdEndRenderPass-None-00910", "The current subpass index must be equal to the number of subpasses in the render pass minus one", "1.2-extensions"},
+ {"VUID-vkCmdEndRenderPass-None-02351", "This command must not be recorded when transform feedback is active", "1.2-extensions"},
+ {"VUID-vkCmdEndRenderPass-bufferlevel", "commandBuffer must be a primary VkCommandBuffer", "1.2-extensions"},
+ {"VUID-vkCmdEndRenderPass-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdEndRenderPass-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdEndRenderPass-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdEndRenderPass-renderpass", "This command must only be called inside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdEndRenderPass2-None-02352", "This command must not be recorded when transform feedback is active", "1.2-extensions"},
+ {"VUID-vkCmdEndRenderPass2-None-03103", "The current subpass index must be equal to the number of subpasses in the render pass minus one", "1.2-extensions"},
+ {"VUID-vkCmdEndRenderPass2-bufferlevel", "commandBuffer must be a primary VkCommandBuffer", "1.2-extensions"},
+ {"VUID-vkCmdEndRenderPass2-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdEndRenderPass2-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdEndRenderPass2-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdEndRenderPass2-pSubpassEndInfo-parameter", "pSubpassEndInfo must be a valid pointer to a valid VkSubpassEndInfo structure", "1.2-extensions"},
+ {"VUID-vkCmdEndRenderPass2-renderpass", "This command must only be called inside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdEndTransformFeedbackEXT-None-02375", "Transform feedback must be active", "1.2-extensions"},
+ {"VUID-vkCmdEndTransformFeedbackEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdEndTransformFeedbackEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdEndTransformFeedbackEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdEndTransformFeedbackEXT-commonparent", "Both of commandBuffer, and the elements of pCounterBuffers that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdEndTransformFeedbackEXT-counterBufferCount-02608", "If counterBufferCount is not 0, and pCounterBuffers is not NULL, pCounterBuffers must be a valid pointer to an array of counterBufferCount VkBuffer handles that are either valid or VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02376", "firstCounterBuffer must be less than VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackBuffers", "1.2-extensions"},
+ {"VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377", "The sum of firstCounterBuffer and counterBufferCount must be less than or equal to VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackBuffers", "1.2-extensions"},
+ {"VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffer-02379", "If pCounterBuffer is NULL, then pCounterBufferOffsets must also be NULL", "1.2-extensions"},
+ {"VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-02378", "For each buffer handle in the array, if it is not VK_NULL_HANDLE it must reference a buffer large enough to hold 4 bytes at the corresponding offset from the pCounterBufferOffsets array", "1.2-extensions"},
+ {"VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-parameter", "If counterBufferCount is not 0, and pCounterBufferOffsets is not NULL, pCounterBufferOffsets must be a valid pointer to an array of counterBufferCount VkDeviceSize values", "1.2-extensions"},
+ {"VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffers-02380", "For each buffer handle in the pCounterBuffers array that is not VK_NULL_HANDLE it must have been created with a usage value containing VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdEndTransformFeedbackEXT-renderpass", "This command must only be called inside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdEndTransformFeedbackEXT-transformFeedback-02374", "VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-None-02286", "This command must not be recorded when transform feedback is active", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-bufferlevel", "commandBuffer must be a primary VkCommandBuffer", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-commandBuffer-00101", "If the inherited queries feature is not enabled, commandBuffer must not have any queries active", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-commandBuffer-00102", "If commandBuffer has a VK_QUERY_TYPE_OCCLUSION query active, then each element of pCommandBuffers must have been recorded with VkCommandBufferInheritanceInfo::occlusionQueryEnable set to VK_TRUE", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-commandBuffer-00103", "If commandBuffer has a VK_QUERY_TYPE_OCCLUSION query active, then each element of pCommandBuffers must have been recorded with VkCommandBufferInheritanceInfo::queryFlags having all bits set that are set for the query", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-commandBuffer-00104", "If commandBuffer has a VK_QUERY_TYPE_PIPELINE_STATISTICS query active, then each element of pCommandBuffers must have been recorded with VkCommandBufferInheritanceInfo::pipelineStatistics having all bits set that are set in the VkQueryPool the query uses", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-commandBuffer-01820", "If commandBuffer is a protected command buffer, then each element of pCommandBuffers must be a protected command buffer", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-commandBuffer-01821", "If commandBuffer is an unprotected command buffer, then each element of pCommandBuffers must be an unprotected command buffer", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-commandBufferCount-arraylength", "commandBufferCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-commonparent", "Both of commandBuffer, and the elements of pCommandBuffers must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-contents-00095", "If vkCmdExecuteCommands is being called within a render pass instance, that render pass instance must have been begun with the contents parameter of vkCmdBeginRenderPass set to VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-pCommandBuffers-00088", "Each element of pCommandBuffers must have been allocated with a level of VK_COMMAND_BUFFER_LEVEL_SECONDARY", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-pCommandBuffers-00089", "Each element of pCommandBuffers must be in the pending or executable state", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-pCommandBuffers-00091", "If any element of pCommandBuffers was not recorded with the VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT flag, it must not be in the pending state", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-pCommandBuffers-00092", "If any element of pCommandBuffers was not recorded with the VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT flag, it must not have already been recorded to commandBuffer", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-pCommandBuffers-00093", "If any element of pCommandBuffers was not recorded with the VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT flag, it must not appear more than once in pCommandBuffers", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-pCommandBuffers-00094", "Each element of pCommandBuffers must have been allocated from a VkCommandPool that was created for the same queue family as the VkCommandPool from which commandBuffer was allocated", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-pCommandBuffers-00096", "If vkCmdExecuteCommands is being called within a render pass instance, each element of pCommandBuffers must have been recorded with the VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-pCommandBuffers-00097", "If vkCmdExecuteCommands is being called within a render pass instance, each element of pCommandBuffers must have been recorded with VkCommandBufferInheritanceInfo::subpass set to the index of the subpass which the given command buffer will be executed in", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-pCommandBuffers-00099", "If vkCmdExecuteCommands is being called within a render pass instance, and any element of pCommandBuffers was recorded with VkCommandBufferInheritanceInfo::framebuffer not equal to VK_NULL_HANDLE, that VkFramebuffer must match the VkFramebuffer used in the current render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-pCommandBuffers-00100", "If vkCmdExecuteCommands is not being called within a render pass instance, each element of pCommandBuffers must not have been recorded with the VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-pCommandBuffers-00105", "Each element of pCommandBuffers must not begin any query types that are active in commandBuffer", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-pCommandBuffers-parameter", "pCommandBuffers must be a valid pointer to an array of commandBufferCount valid VkCommandBuffer handles", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-pInheritanceInfo-00098", "If vkCmdExecuteCommands is being called within a render pass instance, the render passes specified in the pBeginInfo->pInheritanceInfo->renderPass members of the vkBeginCommandBuffer commands used to begin recording each element of pCommandBuffers must be compatible with the current render pass", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-pNext-02865", "If vkCmdExecuteCommands is being called within a render pass instance that included VkRenderPassTransformBeginInfoQCOM in the pNext chain of VkRenderPassBeginInfo, then each element of pCommandBuffers must have been recorded with VkCommandBufferInheritanceRenderPassTransformInfoQCOM in the pNext chain of VkCommandBufferBeginInfo", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-pNext-02866", "If vkCmdExecuteCommands is being called within a render pass instance that included VkRenderPassTransformBeginInfoQCOM in the pNext chain of VkRenderPassBeginInfo, then each element of pCommandBuffers must have been recorded with VkCommandBufferInheritanceRenderPassTransformInfoQCOM::transform identical to VkRenderPassTransformBeginInfoQCOM::transform", "1.2-extensions"},
+ {"VUID-vkCmdExecuteCommands-pNext-02867", "If vkCmdExecuteCommands is being called within a render pass instance that included VkRenderPassTransformBeginInfoQCOM in the pNext chain of VkRenderPassBeginInfo, then each element of pCommandBuffers must have been recorded with VkCommandBufferInheritanceRenderPassTransformInfoQCOM::renderArea identical to VkRenderPassBeginInfo::renderArea", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-None-02686", "Every input attachment used by the current subpass must be bound to the pipeline via a descriptor set", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-None-02687", "Image subresources used as attachments in the current render pass must not be accessed in any way other than as an attachment by this command", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY", "default"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-None-02721", "For a given vertex buffer binding, any attribute data fetched must be entirely contained within the corresponding vertex buffer binding, as described in Vertex Input Description", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-None-02910", "Transform feedback must not be active", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-None-04007", "All vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must have either valid or VK_NULL_HANDLE buffers bound", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-None-04008", "If the nullDescriptor feature is not enabled, all vertex input bindings accessed via vertex input variables declared in the vertex shader entry point's interface must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-None-04115", "If a VkImageView is accessed using OpImageWrite as a result of this command, then the Type of the Texel operand of that instruction must have at least as many components as the image view's format.", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-commandBuffer-02970", "commandBuffer must not be a protected command buffer", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-deviceGeneratedCommands-02911", "The VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::deviceGeneratedCommands feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-isPreprocessed-02908", "If isPreprocessed is VK_TRUE then vkCmdPreprocessGeneratedCommandsNV must have already been executed on the device, using the same pGeneratedCommandsInfo content as well as the content of the input buffers it references (all except VkGeneratedCommandsInfoNV::preprocessBuffer). Furthermore pGeneratedCommandsInfo`s indirectCommandsLayout must have been created with the VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_NV bit set", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-maxMultiviewInstanceIndex-02688", "If the draw is recorded in a render pass instance with multiview enabled, the maximum instance index must be less than or equal to VkPhysicalDeviceMultiviewProperties::maxMultiviewInstanceIndex", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-pGeneratedCommandsInfo-parameter", "pGeneratedCommandsInfo must be a valid pointer to a valid VkGeneratedCommandsInfoNV structure", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-pipeline-02909", "VkGeneratedCommandsInfoNV::pipeline must match the current bound pipeline at VkGeneratedCommandsInfoNV::pipelineBindPoint", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-primitiveTopology-03420", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT dynamic state enabled then vkCmdSetPrimitiveTopologyEXT must have been called in the current command buffer prior to this draw command, and the primitiveTopology parameter of vkCmdSetPrimitiveTopologyEXT must be of the same topology class as the pipeline VkPipelineInputAssemblyStateCreateInfo::topology state", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-renderPass-02684", "The current render pass must be compatible with the renderPass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-renderpass", "This command must only be called inside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-sampleLocationsEnable-02689", "If the bound graphics pipeline was created with VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable set to VK_TRUE and the current subpass has a depth/stencil attachment, then that attachment must have been created with the VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT bit set", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-scissorCount-03418", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, but not the VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled, then then vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the scissorCount parameter of vkCmdSetScissorWithCountEXT must match the VkPipelineViewportStateCreateInfo::viewportCount of the pipeline", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-subpass-02685", "The subpass index of the current render pass must be equal to the subpass member of the VkGraphicsPipelineCreateInfo structure specified when creating the VkPipeline bound to VK_PIPELINE_BIND_POINT_GRAPHICS", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-viewportCount-03417", "If the bound graphics pipeline state was created with the VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic state enabled, but not the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT dynamic state enabled, then then vkCmdSetViewportWithCountEXT must have been called in the current command buffer prior to this draw command, and the viewportCount parameter of vkCmdSetViewportWithCountEXT must match the VkPipelineViewportStateCreateInfo::scissorCount of the pipeline", "1.2-extensions"},
+ {"VUID-vkCmdExecuteGeneratedCommandsNV-viewportCount-03419", "If the bound graphics pipeline state was created with both the VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT and VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT dynamic states enabled then both vkCmdSetViewportWithCountEXT and vkCmdSetScissorWithCountEXT must have been called in the current command buffer prior to this draw command, and the viewportCount parameter of vkCmdSetViewportWithCountEXT must match the scissorCount parameter of vkCmdSetScissorWithCountEXT", "1.2-extensions"},
+ {"VUID-vkCmdFillBuffer-commandBuffer-00030", "The VkCommandPool that commandBuffer was allocated from must support graphics or compute operations", "1.0"},
+ {"VUID-vkCmdFillBuffer-commandBuffer-01811", "If commandBuffer is an unprotected command buffer, then dstBuffer must not be a protected buffer", "1.2-extensions"},
+ {"VUID-vkCmdFillBuffer-commandBuffer-01812", "If commandBuffer is a protected command buffer, then dstBuffer must not be an unprotected buffer", "1.2-extensions"},
+ {"VUID-vkCmdFillBuffer-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support transfer, graphics or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdFillBuffer-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdFillBuffer-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdFillBuffer-commonparent", "Both of commandBuffer, and dstBuffer must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdFillBuffer-dstBuffer-00029", "dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag", "1.2-extensions"},
+ {"VUID-vkCmdFillBuffer-dstBuffer-00031", "If dstBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdFillBuffer-dstBuffer-parameter", "dstBuffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdFillBuffer-dstOffset-00024", "dstOffset must be less than the size of dstBuffer", "1.2-extensions"},
+ {"VUID-vkCmdFillBuffer-dstOffset-00025", "dstOffset must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdFillBuffer-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdFillBuffer-size-00026", "If size is not equal to VK_WHOLE_SIZE, size must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdFillBuffer-size-00027", "If size is not equal to VK_WHOLE_SIZE, size must be less than or equal to the size of dstBuffer minus dstOffset", "1.2-extensions"},
+ {"VUID-vkCmdFillBuffer-size-00028", "If size is not equal to VK_WHOLE_SIZE, size must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdInsertDebugUtilsLabelEXT-pLabelInfo-parameter", "pLabelInfo must be a valid pointer to a valid VkDebugUtilsLabelEXT structure", "1.2-extensions"},
+ {"VUID-vkCmdNextSubpass-None-00909", "The current subpass index must be less than the number of subpasses in the render pass minus one", "1.2-extensions"},
+ {"VUID-vkCmdNextSubpass-None-02349", "This command must not be recorded when transform feedback is active", "1.2-extensions"},
+ {"VUID-vkCmdNextSubpass-bufferlevel", "commandBuffer must be a primary VkCommandBuffer", "1.2-extensions"},
+ {"VUID-vkCmdNextSubpass-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdNextSubpass-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdNextSubpass-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdNextSubpass-contents-parameter", "contents must be a valid VkSubpassContents value", "1.2-extensions"},
+ {"VUID-vkCmdNextSubpass-renderpass", "This command must only be called inside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdNextSubpass2-None-02350", "This command must not be recorded when transform feedback is active", "1.2-extensions"},
+ {"VUID-vkCmdNextSubpass2-None-03102", "The current subpass index must be less than the number of subpasses in the render pass minus one", "1.2-extensions"},
+ {"VUID-vkCmdNextSubpass2-bufferlevel", "commandBuffer must be a primary VkCommandBuffer", "1.2-extensions"},
+ {"VUID-vkCmdNextSubpass2-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdNextSubpass2-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdNextSubpass2-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdNextSubpass2-pSubpassBeginInfo-parameter", "pSubpassBeginInfo must be a valid pointer to a valid VkSubpassBeginInfo structure", "1.2-extensions"},
+ {"VUID-vkCmdNextSubpass2-pSubpassEndInfo-parameter", "pSubpassEndInfo must be a valid pointer to a valid VkSubpassEndInfo structure", "1.2-extensions"},
+ {"VUID-vkCmdNextSubpass2-renderpass", "This command must only be called inside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-bufferMemoryBarrierCount-01178", "If fname:vkCmdPipelineBarrier is called within a render pass instance, it must not include any buffer memory barriers", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-dependencyFlags-01186", "If fname:vkCmdPipelineBarrier is called outside of a render pass instance, VK_DEPENDENCY_VIEW_LOCAL_BIT must not be included in the dependency flags", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-dependencyFlags-parameter", "dependencyFlags must be a valid combination of VkDependencyFlagBits values", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-dstAccessMask-02816", "The dstAccessMask member of each element of pMemoryBarriers must only include access flags that are supported by one or more of the pipeline stages in dstStageMask, as specified in the table of supported access types", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-dstStageMask-04090", "If the geometry shaders feature is not enabled, pname:dstStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-dstStageMask-04091", "If the tessellation shaders feature is not enabled, pname:dstStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-dstStageMask-04092", "If the conditional rendering feature is not enabled, pname:dstStageMask must not contain VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-dstStageMask-04093", "If the fragment density map feature is not enabled, pname:dstStageMask must not contain VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-dstStageMask-04094", "If the transform feedback feature is not enabled, pname:dstStageMask must not contain VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-dstStageMask-04095", "If the mesh shaders feature is not enabled, pname:dstStageMask must not contain VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-dstStageMask-04096", "If the task shaders feature is not enabled, pname:dstStageMask must not contain VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-dstStageMask-04097", "If the shading rate image feature is not enabled, pname:dstStageMask must not contain VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-dstStageMask-4098", "Any pipeline stage included in pname:dstStageMask must be supported by the capabilities of the queue family specified by the queueFamilyIndex member of the VkCommandPoolCreateInfo structure that was used to create the VkCommandPool that commandBuffer was allocated from, as specified in the table of supported pipeline stages", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-dstStageMask-parameter", "dstStageMask must be a valid combination of VkPipelineStageFlagBits values", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-dstStageMask-requiredbitmask", "dstStageMask must not be 0", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-image-04073", "If fname:vkCmdPipelineBarrier is called within a render pass instance, the image member of any image memory barrier included in this command must be an attachment used in the current subpass both as an input attachment, and as either a color or depth/stencil attachment", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-oldLayout-01181", "If fname:vkCmdPipelineBarrier is called within a render pass instance, the oldLayout and newLayout members of any image memory barrier included in this command must be equal", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-pBufferMemoryBarriers-02817", "For any element of pBufferMemoryBarriers, if its srcQueueFamilyIndex and dstQueueFamilyIndex members are equal, or if its srcQueueFamilyIndex is the queue family index that was used to create the command pool that commandBuffer was allocated from, then its srcAccessMask member must only contain access flags that are supported by one or more of the pipeline stages in srcStageMask, as specified in the table of supported access types", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-pBufferMemoryBarriers-02818", "For any element of pBufferMemoryBarriers, if its srcQueueFamilyIndex and dstQueueFamilyIndex members are equal, or if its dstQueueFamilyIndex is the queue family index that was used to create the command pool that commandBuffer was allocated from, then its dstAccessMask member must only contain access flags that are supported by one or more of the pipeline stages in dstStageMask, as specified in the table of supported access types", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-pBufferMemoryBarriers-parameter", "If bufferMemoryBarrierCount is not 0, pBufferMemoryBarriers must be a valid pointer to an array of bufferMemoryBarrierCount valid VkBufferMemoryBarrier structures", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-pDependencies-02285", "If fname:vkCmdPipelineBarrier is called within a render pass instance, the render pass must have been created with at least one VkSubpassDependency instance in VkRenderPassCreateInfo::pDependencies that expresses a dependency from the current subpass to itself, with synchronization scopes and access scopes that are all supersets of the scopes defined in this command", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-pImageMemoryBarriers-02819", "For any element of pImageMemoryBarriers, if its srcQueueFamilyIndex and dstQueueFamilyIndex members are equal, or if its srcQueueFamilyIndex is the queue family index that was used to create the command pool that commandBuffer was allocated from, then its srcAccessMask member must only contain access flags that are supported by one or more of the pipeline stages in srcStageMask, as specified in the table of supported access types", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-pImageMemoryBarriers-02820", "For any element of pImageMemoryBarriers, if its srcQueueFamilyIndex and dstQueueFamilyIndex members are equal, or if its dstQueueFamilyIndex is the queue family index that was used to create the command pool that commandBuffer was allocated from, then its dstAccessMask member must only contain access flags that are supported by one or more of the pipeline stages in dstStageMask, as specified in the table of supported access types", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-pImageMemoryBarriers-parameter", "If imageMemoryBarrierCount is not 0, pImageMemoryBarriers must be a valid pointer to an array of imageMemoryBarrierCount valid VkImageMemoryBarrier structures", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-pMemoryBarriers-parameter", "If memoryBarrierCount is not 0, pMemoryBarriers must be a valid pointer to an array of memoryBarrierCount valid VkMemoryBarrier structures", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-srcAccessMask-02815", "The srcAccessMask member of each element of pMemoryBarriers must only include access flags that are supported by one or more of the pipeline stages in srcStageMask, as specified in the table of supported access types", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-srcQueueFamilyIndex-01182", "If fname:vkCmdPipelineBarrier is called within a render pass instance, the srcQueueFamilyIndex and dstQueueFamilyIndex members of any image memory barrier included in this command must be equal", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-srcStageMask-04090", "If the geometry shaders feature is not enabled, pname:srcStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-srcStageMask-04091", "If the tessellation shaders feature is not enabled, pname:srcStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-srcStageMask-04092", "If the conditional rendering feature is not enabled, pname:srcStageMask must not contain VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-srcStageMask-04093", "If the fragment density map feature is not enabled, pname:srcStageMask must not contain VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-srcStageMask-04094", "If the transform feedback feature is not enabled, pname:srcStageMask must not contain VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-srcStageMask-04095", "If the mesh shaders feature is not enabled, pname:srcStageMask must not contain VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-srcStageMask-04096", "If the task shaders feature is not enabled, pname:srcStageMask must not contain VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-srcStageMask-04097", "If the shading rate image feature is not enabled, pname:srcStageMask must not contain VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-srcStageMask-4098", "Any pipeline stage included in pname:srcStageMask must be supported by the capabilities of the queue family specified by the queueFamilyIndex member of the VkCommandPoolCreateInfo structure that was used to create the VkCommandPool that commandBuffer was allocated from, as specified in the table of supported pipeline stages", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-srcStageMask-parameter", "srcStageMask must be a valid combination of VkPipelineStageFlagBits values", "1.2-extensions"},
+ {"VUID-vkCmdPipelineBarrier-srcStageMask-requiredbitmask", "srcStageMask must not be 0", "1.2-extensions"},
+ {"VUID-vkCmdPreprocessGeneratedCommandsNV-commandBuffer-02974", "commandBuffer must not be a protected command buffer", "1.2-extensions"},
+ {"VUID-vkCmdPreprocessGeneratedCommandsNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdPreprocessGeneratedCommandsNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdPreprocessGeneratedCommandsNV-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdPreprocessGeneratedCommandsNV-deviceGeneratedCommands-02928", "The VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::deviceGeneratedCommands feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdPreprocessGeneratedCommandsNV-pGeneratedCommandsInfo-02927", "pGeneratedCommandsInfo`s indirectCommandsLayout must have been created with the VK_INDIRECT_COMMANDS_LAYOUT_USAGE_EXPLICIT_PREPROCESS_BIT_NV bit set", "1.2-extensions"},
+ {"VUID-vkCmdPreprocessGeneratedCommandsNV-pGeneratedCommandsInfo-parameter", "pGeneratedCommandsInfo must be a valid pointer to a valid VkGeneratedCommandsInfoNV structure", "1.2-extensions"},
+ {"VUID-vkCmdPreprocessGeneratedCommandsNV-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdPushConstants-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdPushConstants-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdPushConstants-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdPushConstants-commonparent", "Both of commandBuffer, and layout must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdPushConstants-layout-parameter", "layout must be a valid VkPipelineLayout handle", "1.2-extensions"},
+ {"VUID-vkCmdPushConstants-offset-00368", "offset must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdPushConstants-offset-00370", "offset must be less than VkPhysicalDeviceLimits::maxPushConstantsSize", "1.2-extensions"},
+ {"VUID-vkCmdPushConstants-offset-01795", "For each byte in the range specified by offset and size and for each shader stage in stageFlags, there must be a push constant range in layout that includes that byte and that stage", "1.2-extensions"},
+ {"VUID-vkCmdPushConstants-offset-01796", "For each byte in the range specified by offset and size and for each push constant range that overlaps that byte, stageFlags must include all stages in that push constant range's VkPushConstantRange::stageFlags", "1.2-extensions"},
+ {"VUID-vkCmdPushConstants-pValues-parameter", "pValues must be a valid pointer to an array of size bytes", "1.2-extensions"},
+ {"VUID-vkCmdPushConstants-size-00369", "size must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdPushConstants-size-00371", "size must be less than or equal to VkPhysicalDeviceLimits::maxPushConstantsSize minus offset", "1.2-extensions"},
+ {"VUID-vkCmdPushConstants-size-arraylength", "size must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdPushConstants-stageFlags-parameter", "stageFlags must be a valid combination of VkShaderStageFlagBits values", "1.2-extensions"},
+ {"VUID-vkCmdPushConstants-stageFlags-requiredbitmask", "stageFlags must not be 0", "1.2-extensions"},
+ {"VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdPushDescriptorSetKHR-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdPushDescriptorSetKHR-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdPushDescriptorSetKHR-commonparent", "Both of commandBuffer, and layout must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdPushDescriptorSetKHR-descriptorWriteCount-arraylength", "descriptorWriteCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdPushDescriptorSetKHR-layout-parameter", "layout must be a valid VkPipelineLayout handle", "1.2-extensions"},
+ {"VUID-vkCmdPushDescriptorSetKHR-pDescriptorWrites-parameter", "pDescriptorWrites must be a valid pointer to an array of descriptorWriteCount valid VkWriteDescriptorSet structures", "1.2-extensions"},
+ {"VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363", "pipelineBindPoint must be supported by the commandBuffer's parent VkCommandPool's queue family", "1.2-extensions"},
+ {"VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-parameter", "pipelineBindPoint must be a valid VkPipelineBindPoint value", "1.2-extensions"},
+ {"VUID-vkCmdPushDescriptorSetKHR-set-00364", "set must be less than VkPipelineLayoutCreateInfo::setLayoutCount provided when layout was created", "1.2-extensions"},
+ {"VUID-vkCmdPushDescriptorSetKHR-set-00365", "set must be the unique set number in the pipeline layout that uses a descriptor set layout that was created with VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR", "1.2-extensions"},
+ {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-00366", "The pipelineBindPoint specified during the creation of the descriptor update template must be supported by the commandBuffer's parent VkCommandPool's queue family", "1.2-extensions"},
+ {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-commonparent", "Each of commandBuffer, descriptorUpdateTemplate, and layout must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-descriptorUpdateTemplate-parameter", "descriptorUpdateTemplate must be a valid VkDescriptorUpdateTemplate handle", "1.2-extensions"},
+ {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-layout-parameter", "layout must be a valid VkPipelineLayout handle", "1.2-extensions"},
+ {"VUID-vkCmdPushDescriptorSetWithTemplateKHR-pData-01686", "pData must be a valid pointer to a memory containing one or more valid instances of VkDescriptorImageInfo, VkDescriptorBufferInfo, or VkBufferView in a layout defined by descriptorUpdateTemplate when it was created with vkCreateDescriptorUpdateTemplateKHR", "1.2-extensions"},
+ {"VUID-vkCmdResetEvent-commandBuffer-01157", "commandBuffer's current device mask must include exactly one physical device", "1.2-extensions"},
+ {"VUID-vkCmdResetEvent-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdResetEvent-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdResetEvent-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdResetEvent-commonparent", "Both of commandBuffer, and event must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdResetEvent-event-01156", "When this command executes, event must not be waited on by a vkCmdWaitEvents command that is currently executing", "1.2-extensions"},
+ {"VUID-vkCmdResetEvent-event-parameter", "event must be a valid VkEvent handle", "1.2-extensions"},
+ {"VUID-vkCmdResetEvent-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdResetEvent-stageMask-01153", "stageMask must not include VK_PIPELINE_STAGE_HOST_BIT", "1.2-extensions"},
+ {"VUID-vkCmdResetEvent-stageMask-04090", "If the geometry shaders feature is not enabled, pname:stageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT", "1.2-extensions"},
+ {"VUID-vkCmdResetEvent-stageMask-04091", "If the tessellation shaders feature is not enabled, pname:stageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT", "1.2-extensions"},
+ {"VUID-vkCmdResetEvent-stageMask-04092", "If the conditional rendering feature is not enabled, pname:stageMask must not contain VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdResetEvent-stageMask-04093", "If the fragment density map feature is not enabled, pname:stageMask must not contain VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdResetEvent-stageMask-04094", "If the transform feedback feature is not enabled, pname:stageMask must not contain VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdResetEvent-stageMask-04095", "If the mesh shaders feature is not enabled, pname:stageMask must not contain VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdResetEvent-stageMask-04096", "If the task shaders feature is not enabled, pname:stageMask must not contain VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdResetEvent-stageMask-04097", "If the shading rate image feature is not enabled, pname:stageMask must not contain VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdResetEvent-stageMask-4098", "Any pipeline stage included in pname:stageMask must be supported by the capabilities of the queue family specified by the queueFamilyIndex member of the VkCommandPoolCreateInfo structure that was used to create the VkCommandPool that commandBuffer was allocated from, as specified in the table of supported pipeline stages", "1.2-extensions"},
+ {"VUID-vkCmdResetEvent-stageMask-parameter", "stageMask must be a valid combination of VkPipelineStageFlagBits values", "1.2-extensions"},
+ {"VUID-vkCmdResetEvent-stageMask-requiredbitmask", "stageMask must not be 0", "1.2-extensions"},
+ {"VUID-vkCmdResetQueryPool-None-02841", "All queries used by the command must not be active", "1.2-extensions"},
+ {"VUID-vkCmdResetQueryPool-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdResetQueryPool-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdResetQueryPool-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdResetQueryPool-commonparent", "Both of commandBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdResetQueryPool-firstQuery-00796", "firstQuery must be less than the number of queries in queryPool", "1.2-extensions"},
+ {"VUID-vkCmdResetQueryPool-firstQuery-00797", "The sum of firstQuery and queryCount must be less than or equal to the number of queries in queryPool", "1.2-extensions"},
+ {"VUID-vkCmdResetQueryPool-firstQuery-02862", "If queryPool was created with VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, this command must not be recorded in a command buffer that, either directly or through secondary command buffers, also contains begin commands for a query from the set of queries [firstQuery, firstQuery + queryCount - 1]", "1.2-extensions"},
+ {"VUID-vkCmdResetQueryPool-queryPool-parameter", "queryPool must be a valid VkQueryPool handle", "1.2-extensions"},
+ {"VUID-vkCmdResetQueryPool-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-commandBuffer-01837", "If commandBuffer is an unprotected command buffer, then srcImage must not be a protected image", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-commandBuffer-01838", "If commandBuffer is an unprotected command buffer, then dstImage must not be a protected image", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-commandBuffer-01839", "If commandBuffer is a protected command buffer, then dstImage must not be an unprotected image", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-commonparent", "Each of commandBuffer, dstImage, and srcImage must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-dstImage-00258", "If dstImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-dstImage-00259", "dstImage must have a sample count equal to VK_SAMPLE_COUNT_1_BIT", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-dstImage-02003", "The format features of dstImage must contain VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-dstImage-02546", "dstImage and srcImage must not have been created with flags containing VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-dstImage-parameter", "dstImage must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-dstImageLayout-00262", "dstImageLayout must specify the layout of the image subresources of dstImage specified in pRegions at the time this command is executed on a VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-dstImageLayout-00263", "dstImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL", "1.2"},
+ {"VUID-vkCmdResolveImage-dstImageLayout-01401", "dstImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-dstImageLayout-parameter", "dstImageLayout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-dstSubresource-01710", "The dstSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when dstImage was created", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-dstSubresource-01712", "The dstSubresource.baseArrayLayer + dstSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when dstImage was created", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-pRegions-00255", "The union of all source regions, and the union of all destination regions, specified by the elements of pRegions, must not overlap in memory", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-pRegions-parameter", "pRegions must be a valid pointer to an array of regionCount valid VkImageResolve structures", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-regionCount-arraylength", "regionCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-srcImage-00256", "If srcImage is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-srcImage-00257", "srcImage must have a sample count equal to any valid sample count value other than VK_SAMPLE_COUNT_1_BIT", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-srcImage-01386", "srcImage and dstImage must have been created with the same image format", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-srcImage-parameter", "srcImage must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-srcImageLayout-00260", "srcImageLayout must specify the layout of the image subresources of srcImage specified in pRegions at the time this command is executed on a VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-srcImageLayout-00261", "srcImageLayout must be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL", "1.2"},
+ {"VUID-vkCmdResolveImage-srcImageLayout-01400", "srcImageLayout must be VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-srcImageLayout-parameter", "srcImageLayout must be a valid VkImageLayout value", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-srcSubresource-01709", "The srcSubresource.mipLevel member of each element of pRegions must be less than the mipLevels specified in VkImageCreateInfo when srcImage was created", "1.2-extensions"},
+ {"VUID-vkCmdResolveImage-srcSubresource-01711", "The srcSubresource.baseArrayLayer + srcSubresource.layerCount of each element of pRegions must be less than or equal to the arrayLayers specified in VkImageCreateInfo when srcImage was created", "1.2-extensions"},
+ {"VUID-vkCmdSetBlendConstants-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetBlendConstants-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetBlendConstants-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetCheckpointNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, compute, or transfer operations", "1.2-extensions"},
+ {"VUID-vkCmdSetCheckpointNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetCheckpointNV-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetCoarseSampleOrderNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetCoarseSampleOrderNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetCoarseSampleOrderNV-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetCoarseSampleOrderNV-pCustomSampleOrders-02235", "The array pCustomSampleOrders must not contain two structures with matching values for both the shadingRate and sampleCount members", "1.2-extensions"},
+ {"VUID-vkCmdSetCoarseSampleOrderNV-pCustomSampleOrders-parameter", "If customSampleOrderCount is not 0, pCustomSampleOrders must be a valid pointer to an array of customSampleOrderCount valid VkCoarseSampleOrderCustomNV structures", "1.2-extensions"},
+ {"VUID-vkCmdSetCoarseSampleOrderNV-sampleOrderType-02081", "If sampleOrderType is not VK_COARSE_SAMPLE_ORDER_TYPE_CUSTOM_NV, customSamplerOrderCount must be 0", "1.2-extensions"},
+ {"VUID-vkCmdSetCoarseSampleOrderNV-sampleOrderType-parameter", "sampleOrderType must be a valid VkCoarseSampleOrderTypeNV value", "1.2-extensions"},
+ {"VUID-vkCmdSetCullModeEXT-None-03384", "The extendedDynamicState feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdSetCullModeEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetCullModeEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetCullModeEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetCullModeEXT-cullMode-parameter", "cullMode must be a valid combination of VkCullModeFlagBits values", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthBias-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthBias-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthBias-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthBias-depthBiasClamp-00790", "If the depth bias clamping feature is not enabled, depthBiasClamp must be 0.0", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthBounds-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthBounds-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthBounds-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthBounds-maxDepthBounds-00601", "Unless the VK_EXT_depth_range_unrestricted extension is enabled maxDepthBounds must be between 0.0 and 1.0, inclusive", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthBounds-maxDepthBounds-02509", "maxDepthBounds must be between 0.0 and 1.0, inclusive", "1.2-khr-extensions"},
+ {"VUID-vkCmdSetDepthBounds-minDepthBounds-00600", "Unless the VK_EXT_depth_range_unrestricted extension is enabled minDepthBounds must be between 0.0 and 1.0, inclusive", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthBounds-minDepthBounds-02508", "minDepthBounds must be between 0.0 and 1.0, inclusive", "1.2-khr-extensions"},
+ {"VUID-vkCmdSetDepthBoundsTestEnableEXT-None-03349", "The extendedDynamicState feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthBoundsTestEnableEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthBoundsTestEnableEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthBoundsTestEnableEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthCompareOpEXT-None-03353", "The extendedDynamicState feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthCompareOpEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthCompareOpEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthCompareOpEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthCompareOpEXT-depthCompareOp-parameter", "depthCompareOp must be a valid VkCompareOp value", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthTestEnableEXT-None-03352", "The extendedDynamicState feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthTestEnableEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthTestEnableEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthTestEnableEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthWriteEnableEXT-None-03354", "The extendedDynamicState feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthWriteEnableEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthWriteEnableEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetDepthWriteEnableEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetDeviceMask-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, compute, or transfer operations", "1.2-extensions"},
+ {"VUID-vkCmdSetDeviceMask-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetDeviceMask-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetDeviceMask-deviceMask-00108", "deviceMask must be a valid device mask value", "1.2-extensions"},
+ {"VUID-vkCmdSetDeviceMask-deviceMask-00109", "deviceMask must not be zero", "1.2-extensions"},
+ {"VUID-vkCmdSetDeviceMask-deviceMask-00110", "deviceMask must not include any set bits that were not in the VkDeviceGroupCommandBufferBeginInfo::deviceMask value when the command buffer began recording", "1.2-extensions"},
+ {"VUID-vkCmdSetDeviceMask-deviceMask-00111", "If vkCmdSetDeviceMask is called inside a render pass instance, deviceMask must not include any set bits that were not in the VkDeviceGroupRenderPassBeginInfo::deviceMask value when the render pass instance began recording", "1.2-extensions"},
+ {"VUID-vkCmdSetDiscardRectangleEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetDiscardRectangleEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetDiscardRectangleEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetDiscardRectangleEXT-discardRectangleCount-arraylength", "discardRectangleCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdSetDiscardRectangleEXT-firstDiscardRectangle-00585", "The sum of firstDiscardRectangle and discardRectangleCount must be less than or equal to VkPhysicalDeviceDiscardRectanglePropertiesEXT::maxDiscardRectangles", "1.2-extensions"},
+ {"VUID-vkCmdSetDiscardRectangleEXT-offset-00588", "Evaluation of (offset.x + extent.width) in each VkRect2D element of pDiscardRectangles must not cause a signed integer addition overflow", "1.2-extensions"},
+ {"VUID-vkCmdSetDiscardRectangleEXT-offset-00589", "Evaluation of (offset.y + extent.height) in each VkRect2D element of pDiscardRectangles must not cause a signed integer addition overflow", "1.2-extensions"},
+ {"VUID-vkCmdSetDiscardRectangleEXT-pDiscardRectangles-parameter", "pDiscardRectangles must be a valid pointer to an array of discardRectangleCount VkRect2D structures", "1.2-extensions"},
+ {"VUID-vkCmdSetDiscardRectangleEXT-x-00587", "The x and y member of offset in each VkRect2D element of pDiscardRectangles must be greater than or equal to 0", "1.2-extensions"},
+ {"VUID-vkCmdSetEvent-commandBuffer-01152", "commandBuffer's current device mask must include exactly one physical device", "1.2-extensions"},
+ {"VUID-vkCmdSetEvent-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdSetEvent-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetEvent-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetEvent-commonparent", "Both of commandBuffer, and event must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdSetEvent-event-parameter", "event must be a valid VkEvent handle", "1.2-extensions"},
+ {"VUID-vkCmdSetEvent-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdSetEvent-stageMask-01149", "stageMask must not include VK_PIPELINE_STAGE_HOST_BIT", "1.2-extensions"},
+ {"VUID-vkCmdSetEvent-stageMask-04090", "If the geometry shaders feature is not enabled, pname:stageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT", "1.2-extensions"},
+ {"VUID-vkCmdSetEvent-stageMask-04091", "If the tessellation shaders feature is not enabled, pname:stageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT", "1.2-extensions"},
+ {"VUID-vkCmdSetEvent-stageMask-04092", "If the conditional rendering feature is not enabled, pname:stageMask must not contain VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdSetEvent-stageMask-04093", "If the fragment density map feature is not enabled, pname:stageMask must not contain VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdSetEvent-stageMask-04094", "If the transform feedback feature is not enabled, pname:stageMask must not contain VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdSetEvent-stageMask-04095", "If the mesh shaders feature is not enabled, pname:stageMask must not contain VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdSetEvent-stageMask-04096", "If the task shaders feature is not enabled, pname:stageMask must not contain VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdSetEvent-stageMask-04097", "If the shading rate image feature is not enabled, pname:stageMask must not contain VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdSetEvent-stageMask-4098", "Any pipeline stage included in pname:stageMask must be supported by the capabilities of the queue family specified by the queueFamilyIndex member of the VkCommandPoolCreateInfo structure that was used to create the VkCommandPool that commandBuffer was allocated from, as specified in the table of supported pipeline stages", "1.2-extensions"},
+ {"VUID-vkCmdSetEvent-stageMask-parameter", "stageMask must be a valid combination of VkPipelineStageFlagBits values", "1.2-extensions"},
+ {"VUID-vkCmdSetEvent-stageMask-requiredbitmask", "stageMask must not be 0", "1.2-extensions"},
+ {"VUID-vkCmdSetExclusiveScissorNV-None-02031", "The exclusive scissor feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdSetExclusiveScissorNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetExclusiveScissorNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetExclusiveScissorNV-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036", "If the multiple viewports feature is not enabled, exclusiveScissorCount must be 1", "1.2-extensions"},
+ {"VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-arraylength", "exclusiveScissorCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02033", "firstExclusiveScissor must be less than VkPhysicalDeviceLimits::maxViewports", "1.2-extensions"},
+ {"VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02034", "The sum of firstExclusiveScissor and exclusiveScissorCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive", "1.2-extensions"},
+ {"VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035", "If the multiple viewports feature is not enabled, firstExclusiveScissor must be 0", "1.2-extensions"},
+ {"VUID-vkCmdSetExclusiveScissorNV-offset-02038", "Evaluation of (offset.x + extent.width) for each member of pExclusiveScissors must not cause a signed integer addition overflow", "1.2-extensions"},
+ {"VUID-vkCmdSetExclusiveScissorNV-offset-02039", "Evaluation of (offset.y + extent.height) for each member of pExclusiveScissors must not cause a signed integer addition overflow", "1.2-extensions"},
+ {"VUID-vkCmdSetExclusiveScissorNV-pExclusiveScissors-parameter", "pExclusiveScissors must be a valid pointer to an array of exclusiveScissorCount VkRect2D structures", "1.2-extensions"},
+ {"VUID-vkCmdSetExclusiveScissorNV-x-02037", "The x and y members of offset in each member of pExclusiveScissors must be greater than or equal to 0", "1.2-extensions"},
+ {"VUID-vkCmdSetFrontFaceEXT-None-03383", "The extendedDynamicState feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdSetFrontFaceEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetFrontFaceEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetFrontFaceEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetFrontFaceEXT-frontFace-parameter", "frontFace must be a valid VkFrontFace value", "1.2-extensions"},
+ {"VUID-vkCmdSetLineStippleEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetLineStippleEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetLineStippleEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetLineStippleEXT-lineStippleFactor-02776", "lineStippleFactor must be in the range [1,256]", "1.2-extensions"},
+ {"VUID-vkCmdSetLineWidth-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetLineWidth-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetLineWidth-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetLineWidth-lineWidth-00788", "If the wide lines feature is not enabled, lineWidth must be 1.0", "1.2-extensions"},
+ {"VUID-vkCmdSetPerformanceMarkerINTEL-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, compute, or transfer operations", "1.2-extensions"},
+ {"VUID-vkCmdSetPerformanceMarkerINTEL-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetPerformanceMarkerINTEL-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetPerformanceMarkerINTEL-pMarkerInfo-parameter", "pMarkerInfo must be a valid pointer to a valid VkPerformanceMarkerInfoINTEL structure", "1.2-extensions"},
+ {"VUID-vkCmdSetPerformanceOverrideINTEL-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, compute, or transfer operations", "1.2-extensions"},
+ {"VUID-vkCmdSetPerformanceOverrideINTEL-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetPerformanceOverrideINTEL-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetPerformanceOverrideINTEL-pOverrideInfo-02736", "pOverrideInfo must not be used with a VkPerformanceOverrideTypeINTEL that is not reported available by vkGetPerformanceParameterINTEL", "1.2-extensions"},
+ {"VUID-vkCmdSetPerformanceOverrideINTEL-pOverrideInfo-parameter", "pOverrideInfo must be a valid pointer to a valid VkPerformanceOverrideInfoINTEL structure", "1.2-extensions"},
+ {"VUID-vkCmdSetPerformanceStreamMarkerINTEL-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, compute, or transfer operations", "1.2-extensions"},
+ {"VUID-vkCmdSetPerformanceStreamMarkerINTEL-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetPerformanceStreamMarkerINTEL-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetPerformanceStreamMarkerINTEL-pMarkerInfo-parameter", "pMarkerInfo must be a valid pointer to a valid VkPerformanceStreamMarkerInfoINTEL structure", "1.2-extensions"},
+ {"VUID-vkCmdSetPrimitiveTopologyEXT-None-03347", "The extendedDynamicState feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdSetPrimitiveTopologyEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetPrimitiveTopologyEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetPrimitiveTopologyEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetPrimitiveTopologyEXT-primitiveTopology-parameter", "primitiveTopology must be a valid VkPrimitiveTopology value", "1.2-extensions"},
+ {"VUID-vkCmdSetSampleLocationsEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetSampleLocationsEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetSampleLocationsEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetSampleLocationsEXT-pSampleLocationsInfo-parameter", "pSampleLocationsInfo must be a valid pointer to a valid VkSampleLocationsInfoEXT structure", "1.2-extensions"},
+ {"VUID-vkCmdSetSampleLocationsEXT-sampleLocationsPerPixel-01529", "The sampleLocationsPerPixel member of pSampleLocationsInfo must equal the rasterizationSamples member of the VkPipelineMultisampleStateCreateInfo structure the bound graphics pipeline has been created with", "1.2-extensions"},
+ {"VUID-vkCmdSetSampleLocationsEXT-variableSampleLocations-01530", "If VkPhysicalDeviceSampleLocationsPropertiesEXT::variableSampleLocations is VK_FALSE then the current render pass must have been begun by specifying a VkRenderPassSampleLocationsBeginInfoEXT structure whose pPostSubpassSampleLocations member contains an element with a subpassIndex matching the current subpass index and the sampleLocationsInfo member of that element must match the sample locations state pointed to by pSampleLocationsInfo", "1.2-extensions"},
+ {"VUID-vkCmdSetScissor-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetScissor-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetScissor-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetScissor-firstScissor-00591", "firstScissor must be less than VkPhysicalDeviceLimits::maxViewports", "1.2-extensions"},
+ {"VUID-vkCmdSetScissor-firstScissor-00592", "The sum of firstScissor and scissorCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive", "1.2-extensions"},
+ {"VUID-vkCmdSetScissor-firstScissor-00593", "If the multiple viewports feature is not enabled, firstScissor must be 0", "1.2-extensions"},
+ {"VUID-vkCmdSetScissor-offset-00596", "Evaluation of (offset.x + extent.width) must not cause a signed integer addition overflow for any element of pScissors", "1.2-extensions"},
+ {"VUID-vkCmdSetScissor-offset-00597", "Evaluation of (offset.y + extent.height) must not cause a signed integer addition overflow for any element of pScissors", "1.2-extensions"},
+ {"VUID-vkCmdSetScissor-pScissors-parameter", "pScissors must be a valid pointer to an array of scissorCount VkRect2D structures", "1.2-extensions"},
+ {"VUID-vkCmdSetScissor-scissorCount-00594", "If the multiple viewports feature is not enabled, scissorCount must be 1", "1.2-extensions"},
+ {"VUID-vkCmdSetScissor-scissorCount-arraylength", "scissorCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdSetScissor-x-00595", "The x and y members of offset member of any element of pScissors must be greater than or equal to 0", "1.2-extensions"},
+ {"VUID-vkCmdSetScissorWithCountEXT-None-03396", "The extendedDynamicState feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdSetScissorWithCountEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetScissorWithCountEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetScissorWithCountEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetScissorWithCountEXT-offset-03400", "Evaluation of (offset.x + extent.width) must not cause a signed integer addition overflow for any element of pScissors", "1.2-extensions"},
+ {"VUID-vkCmdSetScissorWithCountEXT-offset-03401", "Evaluation of (offset.y + extent.height) must not cause a signed integer addition overflow for any element of pScissors", "1.2-extensions"},
+ {"VUID-vkCmdSetScissorWithCountEXT-pScissors-parameter", "pScissors must be a valid pointer to an array of scissorCount VkRect2D structures", "1.2-extensions"},
+ {"VUID-vkCmdSetScissorWithCountEXT-scissorCount-03397", "scissorCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive", "1.2-extensions"},
+ {"VUID-vkCmdSetScissorWithCountEXT-scissorCount-03398", "If the multiple viewports feature is not enabled, scissorCount must be 1", "1.2-extensions"},
+ {"VUID-vkCmdSetScissorWithCountEXT-scissorCount-arraylength", "scissorCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdSetScissorWithCountEXT-x-03399", "The x and y members of offset member of any element of pScissors must be greater than or equal to 0", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilCompareMask-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilCompareMask-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilCompareMask-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilCompareMask-faceMask-parameter", "faceMask must be a valid combination of VkStencilFaceFlagBits values", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilCompareMask-faceMask-requiredbitmask", "faceMask must not be 0", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilOpEXT-None-03351", "The extendedDynamicState feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilOpEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilOpEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilOpEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilOpEXT-compareOp-parameter", "compareOp must be a valid VkCompareOp value", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilOpEXT-depthFailOp-parameter", "depthFailOp must be a valid VkStencilOp value", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilOpEXT-faceMask-parameter", "faceMask must be a valid combination of VkStencilFaceFlagBits values", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilOpEXT-faceMask-requiredbitmask", "faceMask must not be 0", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilOpEXT-failOp-parameter", "failOp must be a valid VkStencilOp value", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilOpEXT-passOp-parameter", "passOp must be a valid VkStencilOp value", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilReference-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilReference-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilReference-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilReference-faceMask-parameter", "faceMask must be a valid combination of VkStencilFaceFlagBits values", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilReference-faceMask-requiredbitmask", "faceMask must not be 0", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilTestEnableEXT-None-03350", "The extendedDynamicState feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilTestEnableEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilTestEnableEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilTestEnableEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilWriteMask-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilWriteMask-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilWriteMask-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilWriteMask-faceMask-parameter", "faceMask must be a valid combination of VkStencilFaceFlagBits values", "1.2-extensions"},
+ {"VUID-vkCmdSetStencilWriteMask-faceMask-requiredbitmask", "faceMask must not be 0", "1.2-extensions"},
+ {"VUID-vkCmdSetViewport-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetViewport-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetViewport-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetViewport-firstViewport-01222", "firstViewport must be less than VkPhysicalDeviceLimits::maxViewports", "1.2-extensions"},
+ {"VUID-vkCmdSetViewport-firstViewport-01223", "The sum of firstViewport and viewportCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive", "1.2-extensions"},
+ {"VUID-vkCmdSetViewport-firstViewport-01224", "If the multiple viewports feature is not enabled, firstViewport must be 0", "1.2-extensions"},
+ {"VUID-vkCmdSetViewport-pViewports-parameter", "pViewports must be a valid pointer to an array of viewportCount valid VkViewport structures", "1.2-extensions"},
+ {"VUID-vkCmdSetViewport-viewportCount-01225", "If the multiple viewports feature is not enabled, viewportCount must be 1", "1.2-extensions"},
+ {"VUID-vkCmdSetViewport-viewportCount-arraylength", "viewportCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportShadingRatePaletteNV-None-02064", "The shading rate image feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportShadingRatePaletteNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportShadingRatePaletteNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportShadingRatePaletteNV-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportShadingRatePaletteNV-firstViewport-02066", "firstViewport must be less than VkPhysicalDeviceLimits::maxViewports", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportShadingRatePaletteNV-firstViewport-02067", "The sum of firstViewport and viewportCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportShadingRatePaletteNV-firstViewport-02068", "If the multiple viewports feature is not enabled, firstViewport must be 0", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportShadingRatePaletteNV-pShadingRatePalettes-parameter", "pShadingRatePalettes must be a valid pointer to an array of viewportCount valid VkShadingRatePaletteNV structures", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportShadingRatePaletteNV-viewportCount-02069", "If the multiple viewports feature is not enabled, viewportCount must be 1", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportShadingRatePaletteNV-viewportCount-arraylength", "viewportCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportWScalingNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportWScalingNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportWScalingNV-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportWScalingNV-firstViewport-01323", "firstViewport must be less than VkPhysicalDeviceLimits::maxViewports", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportWScalingNV-firstViewport-01324", "The sum of firstViewport and viewportCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportWScalingNV-pViewportWScalings-parameter", "pViewportWScalings must be a valid pointer to an array of viewportCount VkViewportWScalingNV structures", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportWScalingNV-viewportCount-arraylength", "viewportCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportWithCountEXT-None-03393", "The extendedDynamicState feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportWithCountEXT-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics operations", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportWithCountEXT-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportWithCountEXT-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportWithCountEXT-pViewports-parameter", "pViewports must be a valid pointer to an array of viewportCount valid VkViewport structures", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportWithCountEXT-viewportCount-03394", "viewportCount must be between 1 and VkPhysicalDeviceLimits::maxViewports, inclusive", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportWithCountEXT-viewportCount-03395", "If the multiple viewports feature is not enabled, viewportCount must be 1", "1.2-extensions"},
+ {"VUID-vkCmdSetViewportWithCountEXT-viewportCount-arraylength", "viewportCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY", "default"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-None-03429", "Any shader group handle referenced by this call must have been queried from the currently bound ray tracing shader pipeline", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-None-04115", "If a VkImageView is accessed using OpImageWrite as a result of this command, then the Type of the Texel operand of that instruction must have at least as many components as the image view's format.", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-buffer-02708", "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-buffer-02709", "buffer must have been created with the VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT bit set", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-buffer-parameter", "buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-02711", "commandBuffer must not be a protected command buffer", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-commonparent", "Both of buffer, and commandBuffer must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-flags-03508", "If the currently bound ray tracing pipeline was created with flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR, the buffer member of pHitShaderBindingTable must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-flags-03509", "If the currently bound ray tracing pipeline was created with flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, the buffer member of pHitShaderBindingTable must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-flags-03510", "If the currently bound ray tracing pipeline was created with flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR, the buffer member of pHitShaderBindingTable must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-flags-03511", "If the currently bound ray tracing pipeline was created with flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR, the shader group handle identified by pMissShaderBindingTable must contain a valid miss shader", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-flags-03512", "If the currently bound ray tracing pipeline was created with flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR, entries in pHitShaderBindingTable accessed as a result of this command in order to execute an any hit shader must not be set to zero", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-flags-03513", "If the currently bound ray tracing pipeline was created with flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, entries in pHitShaderBindingTable accessed as a result of this command in order to execute a closest hit shader must not be set to zero", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-flags-03514", "If the currently bound ray tracing pipeline was created with flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR, entries in pHitShaderBindingTable accessed as a result of this command in order to execute an intersection shader must not be set to zero", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-maxRecursionDepth-03430", "This command must not cause a shader call instruction to be executed from a shader invocation with a recursion depth greater than the value of maxRecursionDepth used to create the bound ray tracing pipeline", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-offset-02710", "offset must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-offset-03517", "(offset + sizeof(VkTraceRaysIndirectCommandKHR)) must be less than or equal to the size of buffer", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-offset-04020", "The offset member of pRayGenShaderBindingTable must be less than the size of the pRayGenShaderBindingTable->buffer", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-offset-04025", "The offset member of pMissShaderBindingTable must be less than the size of pMissShaderBindingTable->buffer", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-offset-04026", "The offset member of pMissShaderBindingTable must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-offset-04031", "The offset member of pHitShaderBindingTable must be less than the size of pHitShaderBindingTable->buffer", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-offset-04032", "The offset member of pHitShaderBindingTable must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-offset-04037", "The offset member of pCallableShaderBindingTable must be less than the size of pCallableShaderBindingTable->buffer", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-offset-04038", "The offset member of pCallableShaderBindingTable must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-pCallableShaderBindingTable-04036", "If pCallableShaderBindingTable->buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-pCallableShaderBindingTable-04039", "pCallableShaderBindingTable->offset + pCallableShaderBindingTable->size must be less than or equal to the size of pCallableShaderBindingTable->buffer", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-pCallableShaderBindingTable-parameter", "pCallableShaderBindingTable must be a valid pointer to a valid VkStridedBufferRegionKHR structure", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-pHitShaderBindingTable-04030", "If pHitShaderBindingTable->buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-pHitShaderBindingTable-04033", "pHitShaderBindingTable->offset + pHitShaderBindingTable->size must be less than or equal to the size of pHitShaderBindingTable->buffer", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-pHitShaderBindingTable-parameter", "pHitShaderBindingTable must be a valid pointer to a valid VkStridedBufferRegionKHR structure", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-pMissShaderBindingTable-04024", "If pMissShaderBindingTable->buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-pMissShaderBindingTable-04027", "pMissShaderBindingTable->offset + pMissShaderBindingTable->size must be less than or equal to the size of pMissShaderBindingTable->buffer", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-pMissShaderBindingTable-parameter", "pMissShaderBindingTable must be a valid pointer to a valid VkStridedBufferRegionKHR structure", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-pRayGenShaderBindingTable-04019", "If pRayGenShaderBindingTable->buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-pRayGenShaderBindingTable-04021", "pRayGenShaderBindingTable->offset must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-pRayGenShaderBindingTable-04022", "pRayGenShaderBindingTable->offset + pRayGenShaderBindingTable->size must be less than or equal to the size of pRayGenShaderBindingTable->buffer", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-pRaygenShaderBindingTable-parameter", "pRaygenShaderBindingTable must be a valid pointer to a valid VkStridedBufferRegionKHR structure", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-rayTracingIndirectTraceRays-03518", "the VkPhysicalDeviceRayTracingFeaturesKHR::rayTracingIndirectTraceRays feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-size-04023", "The size member of pRayGenShaderBindingTable must be equal to its stride member", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-stride-04028", "The stride member of pMissShaderBindingTable must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-stride-04029", "The stride member of pMissShaderBindingTable must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxShaderGroupStride", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-stride-04034", "The stride member of pHitShaderBindingTable must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-stride-04035", "The stride member of pHitShaderBindingTable must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxShaderGroupStride", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-stride-04040", "The stride member of pCallableShaderBindingTable must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysIndirectKHR-stride-04041", "The stride member of pCallableShaderBindingTable must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxShaderGroupStride", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY", "default"},
+ {"VUID-vkCmdTraceRaysKHR-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-None-03429", "Any shader group handle referenced by this call must have been queried from the currently bound ray tracing shader pipeline", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-None-04115", "If a VkImageView is accessed using OpImageWrite as a result of this command, then the Type of the Texel operand of that instruction must have at least as many components as the image view's format.", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-commandBuffer-02712", "If commandBuffer is a protected command buffer, any resource written to by the VkPipeline object bound to the pipeline bind point used by this command must not be an unprotected resource", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-commandBuffer-02713", "If commandBuffer is a protected command buffer, pipeline stages other than the framebuffer-space and compute stages in the VkPipeline object bound to the pipeline bind point must not write to any resource", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-depth-03507", "depth must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-flags-03508", "If the currently bound ray tracing pipeline was created with flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR, the buffer member of pHitShaderBindingTable must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-flags-03509", "If the currently bound ray tracing pipeline was created with flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, the buffer member of pHitShaderBindingTable must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-flags-03510", "If the currently bound ray tracing pipeline was created with flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR, the buffer member of pHitShaderBindingTable must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-flags-03511", "If the currently bound ray tracing pipeline was created with flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR, the shader group handle identified by pMissShaderBindingTable must contain a valid miss shader", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-flags-03512", "If the currently bound ray tracing pipeline was created with flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR, entries in pHitShaderBindingTable accessed as a result of this command in order to execute an any hit shader must not be set to zero", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-flags-03513", "If the currently bound ray tracing pipeline was created with flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR, entries in pHitShaderBindingTable accessed as a result of this command in order to execute a closest hit shader must not be set to zero", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-flags-03514", "If the currently bound ray tracing pipeline was created with flags that included VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR, entries in pHitShaderBindingTable accessed as a result of this command in order to execute an intersection shader must not be set to zero", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-height-03506", "height must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1]", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-maxRecursionDepth-03430", "This command must not cause a shader call instruction to be executed from a shader invocation with a recursion depth greater than the value of maxRecursionDepth used to create the bound ray tracing pipeline", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-offset-04020", "The offset member of pRayGenShaderBindingTable must be less than the size of the pRayGenShaderBindingTable->buffer", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-offset-04025", "The offset member of pMissShaderBindingTable must be less than the size of pMissShaderBindingTable->buffer", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-offset-04026", "The offset member of pMissShaderBindingTable must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-offset-04031", "The offset member of pHitShaderBindingTable must be less than the size of pHitShaderBindingTable->buffer", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-offset-04032", "The offset member of pHitShaderBindingTable must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-offset-04037", "The offset member of pCallableShaderBindingTable must be less than the size of pCallableShaderBindingTable->buffer", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-offset-04038", "The offset member of pCallableShaderBindingTable must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-pCallableShaderBindingTable-04036", "If pCallableShaderBindingTable->buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-pCallableShaderBindingTable-04039", "pCallableShaderBindingTable->offset + pCallableShaderBindingTable->size must be less than or equal to the size of pCallableShaderBindingTable->buffer", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-pCallableShaderBindingTable-parameter", "pCallableShaderBindingTable must be a valid pointer to a valid VkStridedBufferRegionKHR structure", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-pHitShaderBindingTable-04030", "If pHitShaderBindingTable->buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-pHitShaderBindingTable-04033", "pHitShaderBindingTable->offset + pHitShaderBindingTable->size must be less than or equal to the size of pHitShaderBindingTable->buffer", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-pHitShaderBindingTable-parameter", "pHitShaderBindingTable must be a valid pointer to a valid VkStridedBufferRegionKHR structure", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-pMissShaderBindingTable-04024", "If pMissShaderBindingTable->buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-pMissShaderBindingTable-04027", "pMissShaderBindingTable->offset + pMissShaderBindingTable->size must be less than or equal to the size of pMissShaderBindingTable->buffer", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-pMissShaderBindingTable-parameter", "pMissShaderBindingTable must be a valid pointer to a valid VkStridedBufferRegionKHR structure", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-pRayGenShaderBindingTable-04019", "If pRayGenShaderBindingTable->buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-pRayGenShaderBindingTable-04021", "pRayGenShaderBindingTable->offset must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-pRayGenShaderBindingTable-04022", "pRayGenShaderBindingTable->offset + pRayGenShaderBindingTable->size must be less than or equal to the size of pRayGenShaderBindingTable->buffer", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-pRaygenShaderBindingTable-parameter", "pRaygenShaderBindingTable must be a valid pointer to a valid VkStridedBufferRegionKHR structure", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-size-04023", "The size member of pRayGenShaderBindingTable must be equal to its stride member", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-stride-04028", "The stride member of pMissShaderBindingTable must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-stride-04029", "The stride member of pMissShaderBindingTable must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxShaderGroupStride", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-stride-04034", "The stride member of pHitShaderBindingTable must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-stride-04035", "The stride member of pHitShaderBindingTable must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxShaderGroupStride", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-stride-04040", "The stride member of pCallableShaderBindingTable must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-stride-04041", "The stride member of pCallableShaderBindingTable must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxShaderGroupStride", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysKHR-width-03505", "width must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-None-02690", "If a VkImageView is sampled with VK_FILTER_LINEAR as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-None-02691", "If a VkImageView is accessed using atomic operations as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-None-02692", "If a VkImageView is sampled with VK_FILTER_CUBIC_EXT as a result of this command, then the image view's format features must contain VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-None-02693", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must not have a VkImageViewType of VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY", "default"},
+ {"VUID-vkCmdTraceRaysNV-None-02697", "For each set n that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a descriptor set must have been bound to n at the same pipeline bind point, with a VkPipelineLayout that is compatible for set n, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-None-02698", "For each push constant that is statically used by the VkPipeline bound to the pipeline bind point used by this command, a push constant value must have been set for the same pipeline bind point, with a VkPipelineLayout that is compatible for push constants, with the VkPipelineLayout used to create the current VkPipeline, as described in Pipeline Layout Compatibility", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-None-02699", "Descriptors in each bound descriptor set, specified via vkCmdBindDescriptorSets, must be valid if they are statically used by the VkPipeline bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-None-02700", "A valid pipeline must be bound to the pipeline bind point used by this command", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-None-02702", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used to sample from any VkImage with a VkImageView of the type VK_IMAGE_VIEW_TYPE_3D, VK_IMAGE_VIEW_TYPE_CUBE, VK_IMAGE_VIEW_TYPE_1D_ARRAY, VK_IMAGE_VIEW_TYPE_2D_ARRAY or VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-None-02703", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions with ImplicitLod, Dref or Proj in their name, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-None-02704", "If the VkPipeline object bound to the pipeline bind point used by this command accesses a VkSampler object that uses unnormalized coordinates, that sampler must not be used with any of the SPIR-V OpImageSample* or OpImageSparseSample* instructions that includes a LOD bias or any offset values, in any shader stage", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-None-02705", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a uniform buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-None-02706", "If the robust buffer access feature is not enabled, and if the VkPipeline object bound to the pipeline bind point used by this command accesses a storage buffer, it must not access values outside of the range of the buffer as specified in the descriptor set bound to the same pipeline bind point", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-None-02859", "There must not have been any calls to dynamic state setting commands for any state not specified as dynamic in the VkPipeline object bound to the pipeline bind point used by this command, since that pipeline was bound", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-None-03429", "Any shader group handle referenced by this call must have been queried from the currently bound ray tracing shader pipeline", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-None-04115", "If a VkImageView is accessed using OpImageWrite as a result of this command, then the Type of the Texel operand of that instruction must have at least as many components as the image view's format.", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-callableShaderBindingOffset-02461", "callableShaderBindingOffset must be less than the size of callableShaderBindingTableBuffer", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-callableShaderBindingOffset-02462", "callableShaderBindingOffset must be a multiple of VkPhysicalDeviceRayTracingPropertiesNV::shaderGroupBaseAlignment", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-callableShaderBindingStride-02465", "callableShaderBindingStride must be a multiple of VkPhysicalDeviceRayTracingPropertiesNV::shaderGroupHandleSize", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-callableShaderBindingStride-02468", "callableShaderBindingStride must be less than or equal to VkPhysicalDeviceRayTracingPropertiesNV::maxShaderGroupStride", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-callableShaderBindingTableBuffer-04045", "If callableShaderBindingTableBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-callableShaderBindingTableBuffer-parameter", "If callableShaderBindingTableBuffer is not VK_NULL_HANDLE, callableShaderBindingTableBuffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-commandBuffer-02701", "If the VkPipeline object bound to the pipeline bind point used by this command requires any dynamic state, that state must have been set for commandBuffer, and done so after any previously bound pipeline with the corresponding state not specified as dynamic", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-commandBuffer-02707", "If commandBuffer is an unprotected command buffer, any resource accessed by the VkPipeline object bound to the pipeline bind point used by this command must not be a protected resource", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-commandBuffer-02712", "If commandBuffer is a protected command buffer, any resource written to by the VkPipeline object bound to the pipeline bind point used by this command must not be an unprotected resource", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-commandBuffer-02713", "If commandBuffer is a protected command buffer, pipeline stages other than the framebuffer-space and compute stages in the VkPipeline object bound to the pipeline bind point must not write to any resource", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-commonparent", "Each of callableShaderBindingTableBuffer, commandBuffer, hitShaderBindingTableBuffer, missShaderBindingTableBuffer, and raygenShaderBindingTableBuffer that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-depth-02471", "depth must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2]", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-filterCubic-02694", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT as a result of this command must have a VkImageViewType and format that supports cubic filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubic returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-filterCubicMinmax-02695", "Any VkImageView being sampled with VK_FILTER_CUBIC_EXT with a reduction mode of either VK_SAMPLER_REDUCTION_MODE_MIN or VK_SAMPLER_REDUCTION_MODE_MAX as a result of this command must have a VkImageViewType and format that supports cubic filtering together with minmax filtering, as specified by VkFilterCubicImageViewImageFormatPropertiesEXT::filterCubicMinmax returned by vkGetPhysicalDeviceImageFormatProperties2", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-flags-02696", "Any VkImage created with a VkImageCreateInfo::flags containing VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV sampled as a result of this command must only be sampled using a VkSamplerAddressMode of VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-height-02470", "height must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1]", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-hitShaderBindingOffset-02459", "hitShaderBindingOffset must be less than the size of hitShaderBindingTableBuffer", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-hitShaderBindingOffset-02460", "hitShaderBindingOffset must be a multiple of VkPhysicalDeviceRayTracingPropertiesNV::shaderGroupBaseAlignment", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-hitShaderBindingStride-02464", "hitShaderBindingStride must be a multiple of VkPhysicalDeviceRayTracingPropertiesNV::shaderGroupHandleSize", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-hitShaderBindingStride-02467", "hitShaderBindingStride must be less than or equal to VkPhysicalDeviceRayTracingPropertiesNV::maxShaderGroupStride", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-hitShaderBindingTableBuffer-04044", "If hitShaderBindingTableBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-hitShaderBindingTableBuffer-parameter", "If hitShaderBindingTableBuffer is not VK_NULL_HANDLE, hitShaderBindingTableBuffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-maxRecursionDepth-03430", "This command must not cause a shader call instruction to be executed from a shader invocation with a recursion depth greater than the value of maxRecursionDepth used to create the bound ray tracing pipeline", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-missShaderBindingOffset-02457", "missShaderBindingOffset must be less than the size of missShaderBindingTableBuffer", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-missShaderBindingOffset-02458", "missShaderBindingOffset must be a multiple of VkPhysicalDeviceRayTracingPropertiesNV::shaderGroupBaseAlignment", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-missShaderBindingStride-02463", "missShaderBindingStride must be a multiple of VkPhysicalDeviceRayTracingPropertiesNV::shaderGroupHandleSize", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-missShaderBindingStride-02466", "missShaderBindingStride must be less than or equal to VkPhysicalDeviceRayTracingPropertiesNV::maxShaderGroupStride", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-missShaderBindingTableBuffer-04043", "If missShaderBindingTableBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-missShaderBindingTableBuffer-parameter", "If missShaderBindingTableBuffer is not VK_NULL_HANDLE, missShaderBindingTableBuffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-raygenShaderBindingOffset-02455", "raygenShaderBindingOffset must be less than the size of raygenShaderBindingTableBuffer", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-raygenShaderBindingOffset-02456", "raygenShaderBindingOffset must be a multiple of VkPhysicalDeviceRayTracingPropertiesNV::shaderGroupBaseAlignment", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-raygenShaderBindingTableBuffer-04042", "If raygenShaderBindingTableBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-raygenShaderBindingTableBuffer-parameter", "raygenShaderBindingTableBuffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdTraceRaysNV-width-02469", "width must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[0]", "1.2-extensions"},
+ {"VUID-vkCmdUpdateBuffer-commandBuffer-01813", "If commandBuffer is an unprotected command buffer, then dstBuffer must not be a protected buffer", "1.2-extensions"},
+ {"VUID-vkCmdUpdateBuffer-commandBuffer-01814", "If commandBuffer is a protected command buffer, then dstBuffer must not be an unprotected buffer", "1.2-extensions"},
+ {"VUID-vkCmdUpdateBuffer-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdUpdateBuffer-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdUpdateBuffer-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdUpdateBuffer-commonparent", "Both of commandBuffer, and dstBuffer must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdUpdateBuffer-dataSize-00033", "dataSize must be less than or equal to the size of dstBuffer minus dstOffset", "1.2-extensions"},
+ {"VUID-vkCmdUpdateBuffer-dataSize-00037", "dataSize must be less than or equal to 65536", "1.2-extensions"},
+ {"VUID-vkCmdUpdateBuffer-dataSize-00038", "dataSize must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdUpdateBuffer-dataSize-arraylength", "dataSize must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdUpdateBuffer-dstBuffer-00034", "dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag", "1.2-extensions"},
+ {"VUID-vkCmdUpdateBuffer-dstBuffer-00035", "If dstBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdUpdateBuffer-dstBuffer-parameter", "dstBuffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdUpdateBuffer-dstOffset-00032", "dstOffset must be less than the size of dstBuffer", "1.2-extensions"},
+ {"VUID-vkCmdUpdateBuffer-dstOffset-00036", "dstOffset must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdUpdateBuffer-pData-parameter", "pData must be a valid pointer to an array of dataSize bytes", "1.2-extensions"},
+ {"VUID-vkCmdUpdateBuffer-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-commandBuffer-01167", "commandBuffer's current device mask must include exactly one physical device", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-commonparent", "Both of commandBuffer, and the elements of pEvents must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-dstAccessMask-02816", "The dstAccessMask member of each element of pMemoryBarriers must only include access flags that are supported by one or more of the pipeline stages in dstStageMask, as specified in the table of supported access types", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-dstStageMask-04090", "If the geometry shaders feature is not enabled, pname:dstStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-dstStageMask-04091", "If the tessellation shaders feature is not enabled, pname:dstStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-dstStageMask-04092", "If the conditional rendering feature is not enabled, pname:dstStageMask must not contain VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-dstStageMask-04093", "If the fragment density map feature is not enabled, pname:dstStageMask must not contain VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-dstStageMask-04094", "If the transform feedback feature is not enabled, pname:dstStageMask must not contain VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-dstStageMask-04095", "If the mesh shaders feature is not enabled, pname:dstStageMask must not contain VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-dstStageMask-04096", "If the task shaders feature is not enabled, pname:dstStageMask must not contain VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-dstStageMask-04097", "If the shading rate image feature is not enabled, pname:dstStageMask must not contain VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-dstStageMask-4098", "Any pipeline stage included in pname:dstStageMask must be supported by the capabilities of the queue family specified by the queueFamilyIndex member of the VkCommandPoolCreateInfo structure that was used to create the VkCommandPool that commandBuffer was allocated from, as specified in the table of supported pipeline stages", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-dstStageMask-parameter", "dstStageMask must be a valid combination of VkPipelineStageFlagBits values", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-dstStageMask-requiredbitmask", "dstStageMask must not be 0", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-eventCount-arraylength", "eventCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-pBufferMemoryBarriers-02817", "For any element of pBufferMemoryBarriers, if its srcQueueFamilyIndex and dstQueueFamilyIndex members are equal, or if its srcQueueFamilyIndex is the queue family index that was used to create the command pool that commandBuffer was allocated from, then its srcAccessMask member must only contain access flags that are supported by one or more of the pipeline stages in srcStageMask, as specified in the table of supported access types", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-pBufferMemoryBarriers-02818", "For any element of pBufferMemoryBarriers, if its srcQueueFamilyIndex and dstQueueFamilyIndex members are equal, or if its dstQueueFamilyIndex is the queue family index that was used to create the command pool that commandBuffer was allocated from, then its dstAccessMask member must only contain access flags that are supported by one or more of the pipeline stages in dstStageMask, as specified in the table of supported access types", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-pBufferMemoryBarriers-parameter", "If bufferMemoryBarrierCount is not 0, pBufferMemoryBarriers must be a valid pointer to an array of bufferMemoryBarrierCount valid VkBufferMemoryBarrier structures", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-pEvents-01163", "If pEvents includes one or more events that will be signaled by vkSetEvent after commandBuffer has been submitted to a queue, then vkCmdWaitEvents must not be called inside a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-pEvents-parameter", "pEvents must be a valid pointer to an array of eventCount valid VkEvent handles", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-pImageMemoryBarriers-02819", "For any element of pImageMemoryBarriers, if its srcQueueFamilyIndex and dstQueueFamilyIndex members are equal, or if its srcQueueFamilyIndex is the queue family index that was used to create the command pool that commandBuffer was allocated from, then its srcAccessMask member must only contain access flags that are supported by one or more of the pipeline stages in srcStageMask, as specified in the table of supported access types", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-pImageMemoryBarriers-02820", "For any element of pImageMemoryBarriers, if its srcQueueFamilyIndex and dstQueueFamilyIndex members are equal, or if its dstQueueFamilyIndex is the queue family index that was used to create the command pool that commandBuffer was allocated from, then its dstAccessMask member must only contain access flags that are supported by one or more of the pipeline stages in dstStageMask, as specified in the table of supported access types", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-pImageMemoryBarriers-parameter", "If imageMemoryBarrierCount is not 0, pImageMemoryBarriers must be a valid pointer to an array of imageMemoryBarrierCount valid VkImageMemoryBarrier structures", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-pMemoryBarriers-parameter", "If memoryBarrierCount is not 0, pMemoryBarriers must be a valid pointer to an array of memoryBarrierCount valid VkMemoryBarrier structures", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-srcAccessMask-02815", "The srcAccessMask member of each element of pMemoryBarriers must only include access flags that are supported by one or more of the pipeline stages in srcStageMask, as specified in the table of supported access types", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-srcQueueFamilyIndex-02803", "The srcQueueFamilyIndex and dstQueueFamilyIndex members of any element of pBufferMemoryBarriers or pImageMemoryBarriers must be equal", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-srcStageMask-01158", "srcStageMask must be the bitwise OR of the stageMask parameter used in previous calls to vkCmdSetEvent with any of the members of pEvents and VK_PIPELINE_STAGE_HOST_BIT if any of the members of pEvents was set using vkSetEvent", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-srcStageMask-04090", "If the geometry shaders feature is not enabled, pname:srcStageMask must not contain VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-srcStageMask-04091", "If the tessellation shaders feature is not enabled, pname:srcStageMask must not contain VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-srcStageMask-04092", "If the conditional rendering feature is not enabled, pname:srcStageMask must not contain VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-srcStageMask-04093", "If the fragment density map feature is not enabled, pname:srcStageMask must not contain VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-srcStageMask-04094", "If the transform feedback feature is not enabled, pname:srcStageMask must not contain VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-srcStageMask-04095", "If the mesh shaders feature is not enabled, pname:srcStageMask must not contain VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-srcStageMask-04096", "If the task shaders feature is not enabled, pname:srcStageMask must not contain VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-srcStageMask-04097", "If the shading rate image feature is not enabled, pname:srcStageMask must not contain VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-srcStageMask-4098", "Any pipeline stage included in pname:srcStageMask must be supported by the capabilities of the queue family specified by the queueFamilyIndex member of the VkCommandPoolCreateInfo structure that was used to create the VkCommandPool that commandBuffer was allocated from, as specified in the table of supported pipeline stages", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-srcStageMask-parameter", "srcStageMask must be a valid combination of VkPipelineStageFlagBits values", "1.2-extensions"},
+ {"VUID-vkCmdWaitEvents-srcStageMask-requiredbitmask", "srcStageMask must not be 0", "1.2-extensions"},
+ {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-accelerationStructureCount-arraylength", "accelerationStructureCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-accelerationStructures-03431", "All acceleration structures in accelerationStructures must have been built with VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR if queryType is VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR", "1.2-extensions"},
+ {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support compute operations", "1.2-extensions"},
+ {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-commonparent", "Each of commandBuffer, queryPool, and the elements of pAccelerationStructures must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-pAccelerationStructures-parameter", "pAccelerationStructures must be a valid pointer to an array of accelerationStructureCount valid VkAccelerationStructureKHR handles", "1.2-extensions"},
+ {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryPool-02493", "queryPool must have been created with a queryType matching queryType", "1.2-extensions"},
+ {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryPool-02494", "The queries identified by queryPool and firstQuery must be unavailable", "1.2-extensions"},
+ {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryPool-parameter", "queryPool must be a valid VkQueryPool handle", "1.2-extensions"},
+ {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryType-03432", "queryType must be VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR or VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR", "1.2-extensions"},
+ {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryType-parameter", "queryType must be a valid VkQueryType value", "1.2-extensions"},
+ {"VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-renderpass", "This command must only be called outside of a render pass instance", "1.2-extensions"},
+ {"VUID-vkCmdWriteBufferMarkerAMD-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdWriteBufferMarkerAMD-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdWriteBufferMarkerAMD-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdWriteBufferMarkerAMD-commonparent", "Both of commandBuffer, and dstBuffer must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-01799", "dstBuffer must have been created with VK_BUFFER_USAGE_TRANSFER_DST_BIT usage flag", "1.2-extensions"},
+ {"VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-01800", "If dstBuffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object", "1.2-extensions"},
+ {"VUID-vkCmdWriteBufferMarkerAMD-dstBuffer-parameter", "dstBuffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdWriteBufferMarkerAMD-dstOffset-01798", "dstOffset must be less than or equal to the size of dstBuffer minus 4", "1.2-extensions"},
+ {"VUID-vkCmdWriteBufferMarkerAMD-dstOffset-01801", "dstOffset must be a multiple of 4", "1.2-extensions"},
+ {"VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-04074", "pipelineStage must be a valid stage for the queue family that was used to create the command pool that commandBuffer was allocated from", "1.2-extensions"},
+ {"VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-04075", "If the geometry shaders feature is not enabled, pipelineStage must not be VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT", "1.2-extensions"},
+ {"VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-04076", "If the tessellation shaders feature is not enabled, pipelineStage must not be VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT", "1.2-extensions"},
+ {"VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-04077", "If the conditional rendering feature is not enabled, pipelineStage must not be VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-04078", "If the fragment density map feature is not enabled, pipelineStage must not be VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-04079", "If the transform feedback feature is not enabled, pipelineStage must not be VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-04080", "If the mesh shaders feature is not enabled, pipelineStage must not be VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV or VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-04081", "If the shading rate image feature is not enabled, pipelineStage must not be VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdWriteBufferMarkerAMD-pipelineStage-parameter", "pipelineStage must be a valid VkPipelineStageFlagBits value", "1.2-extensions"},
+ {"VUID-vkCmdWriteTimestamp-None-00830", "All queries used by the command must be unavailable", "1.2-extensions"},
+ {"VUID-vkCmdWriteTimestamp-commandBuffer-cmdpool", "The VkCommandPool that commandBuffer was allocated from must support transfer, graphics, or compute operations", "1.2-extensions"},
+ {"VUID-vkCmdWriteTimestamp-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkCmdWriteTimestamp-commandBuffer-recording", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkCmdWriteTimestamp-commonparent", "Both of commandBuffer, and queryPool must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkCmdWriteTimestamp-pipelineStage-04074", "pipelineStage must be a valid stage for the queue family that was used to create the command pool that commandBuffer was allocated from", "1.2-extensions"},
+ {"VUID-vkCmdWriteTimestamp-pipelineStage-04075", "If the geometry shaders feature is not enabled, pipelineStage must not be VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT", "1.2-extensions"},
+ {"VUID-vkCmdWriteTimestamp-pipelineStage-04076", "If the tessellation shaders feature is not enabled, pipelineStage must not be VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT or VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT", "1.2-extensions"},
+ {"VUID-vkCmdWriteTimestamp-pipelineStage-04077", "If the conditional rendering feature is not enabled, pipelineStage must not be VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdWriteTimestamp-pipelineStage-04078", "If the fragment density map feature is not enabled, pipelineStage must not be VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdWriteTimestamp-pipelineStage-04079", "If the transform feedback feature is not enabled, pipelineStage must not be VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkCmdWriteTimestamp-pipelineStage-04080", "If the mesh shaders feature is not enabled, pipelineStage must not be VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV or VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdWriteTimestamp-pipelineStage-04081", "If the shading rate image feature is not enabled, pipelineStage must not be VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCmdWriteTimestamp-pipelineStage-parameter", "pipelineStage must be a valid VkPipelineStageFlagBits value", "1.2-extensions"},
+ {"VUID-vkCmdWriteTimestamp-query-00831", "If vkCmdWriteTimestamp is called within a render pass instance, the sum of query and the number of bits set in the current subpass's view mask must be less than or equal to the number of queries in queryPool", "1.2-extensions"},
+ {"VUID-vkCmdWriteTimestamp-queryPool-00828", "The query identified by queryPool and query must be unavailable", "1.2-extensions"},
+ {"VUID-vkCmdWriteTimestamp-queryPool-01416", "queryPool must have been created with a queryType of VK_QUERY_TYPE_TIMESTAMP", "1.2-extensions"},
+ {"VUID-vkCmdWriteTimestamp-queryPool-parameter", "queryPool must be a valid VkQueryPool handle", "1.2-extensions"},
+ {"VUID-vkCmdWriteTimestamp-timestampValidBits-00829", "The command pool's queue family must support a non-zero timestampValidBits", "1.2-extensions"},
+ {"VUID-vkCompileDeferredNV-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCompileDeferredNV-pipeline-02237", "pipeline must have been created with VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV", "1.2-extensions"},
+ {"VUID-vkCompileDeferredNV-pipeline-parameter", "pipeline must be a valid VkPipeline handle", "1.2-extensions"},
+ {"VUID-vkCompileDeferredNV-pipeline-parent", "pipeline must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkCompileDeferredNV-shader-02238", "shader must not have been called as a deferred compile before", "1.2-extensions"},
+ {"VUID-vkCopyAccelerationStructureKHR-None-03440", "All VkAccelerationStructureKHR objects referenced by this command must be bound to host-visible memory", "1.2-extensions"},
+ {"VUID-vkCopyAccelerationStructureKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCopyAccelerationStructureKHR-pInfo-parameter", "pInfo must be a valid pointer to a valid VkCopyAccelerationStructureInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkCopyAccelerationStructureKHR-rayTracingHostAccelerationStructureCommands-03441", "the VkPhysicalDeviceRayTracingFeaturesKHR::rayTracingHostAccelerationStructureCommands feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCopyAccelerationStructureToMemoryKHR-None-03445", "All VkAccelerationStructureKHR objects referenced by this command must be bound to host-visible memory", "1.2-extensions"},
+ {"VUID-vkCopyAccelerationStructureToMemoryKHR-None-03446", "All VkDeviceOrHostAddressKHR referenced by this command must contain valid host pointers", "1.2-extensions"},
+ {"VUID-vkCopyAccelerationStructureToMemoryKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCopyAccelerationStructureToMemoryKHR-pInfo-parameter", "pInfo must be a valid pointer to a valid VkCopyAccelerationStructureToMemoryInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkCopyAccelerationStructureToMemoryKHR-rayTracingHostAccelerationStructureCommands-03447", "the VkPhysicalDeviceRayTracingFeaturesKHR::rayTracingHostAccelerationStructureCommands feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCopyMemoryToAccelerationStructureKHR-None-03442", "All VkAccelerationStructureKHR objects referenced by this command must be bound to host-visible memory", "1.2-extensions"},
+ {"VUID-vkCopyMemoryToAccelerationStructureKHR-None-03443", "All VkDeviceOrHostAddressConstKHR referenced by this command must contain valid host pointers", "1.2-extensions"},
+ {"VUID-vkCopyMemoryToAccelerationStructureKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCopyMemoryToAccelerationStructureKHR-pInfo-parameter", "pInfo must be a valid pointer to a valid VkCopyMemoryToAccelerationStructureInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkCopyMemoryToAccelerationStructureKHR-rayTracingHostAccelerationStructureCommands-03444", "the VkPhysicalDeviceRayTracingFeaturesKHR::rayTracingHostAccelerationStructureCommands feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCreateAccelerationStructureKHR-device-03489", "If device was created with multiple physical devices, then the bufferDeviceAddressMultiDevice feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCreateAccelerationStructureKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateAccelerationStructureKHR-deviceAddress-03488", "If VkAccelerationStructureCreateInfoKHR::deviceAddress is not zero, the rayTracingAccelerationStructureCaptureReplay feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCreateAccelerationStructureKHR-pAccelerationStructure-parameter", "pAccelerationStructure must be a valid pointer to a VkAccelerationStructureKHR handle", "1.2-extensions"},
+ {"VUID-vkCreateAccelerationStructureKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateAccelerationStructureKHR-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkAccelerationStructureCreateInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkCreateAccelerationStructureKHR-rayTracing-03487", "The rayTracing or rayQuery feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCreateAccelerationStructureNV-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateAccelerationStructureNV-pAccelerationStructure-parameter", "pAccelerationStructure must be a valid pointer to a VkAccelerationStructureNV handle", "1.2-extensions"},
+ {"VUID-vkCreateAccelerationStructureNV-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateAccelerationStructureNV-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkAccelerationStructureCreateInfoNV structure", "1.2-extensions"},
+ {"VUID-vkCreateAndroidSurfaceKHR-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkCreateAndroidSurfaceKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateAndroidSurfaceKHR-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkAndroidSurfaceCreateInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkCreateAndroidSurfaceKHR-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-vkCreateBuffer-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateBuffer-flags-00911", "If the flags member of pCreateInfo includes VK_BUFFER_CREATE_SPARSE_BINDING_BIT, creating this VkBuffer must not cause the total required sparse memory for all currently valid sparse resources on the device to exceed VkPhysicalDeviceLimits::sparseAddressSpaceSize", "1.2-extensions"},
+ {"VUID-vkCreateBuffer-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateBuffer-pBuffer-parameter", "pBuffer must be a valid pointer to a VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkCreateBuffer-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkBufferCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkCreateBufferView-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateBufferView-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateBufferView-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkBufferViewCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkCreateBufferView-pView-parameter", "pView must be a valid pointer to a VkBufferView handle", "1.2-extensions"},
+ {"VUID-vkCreateCommandPool-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateCommandPool-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateCommandPool-pCommandPool-parameter", "pCommandPool must be a valid pointer to a VkCommandPool handle", "1.2-extensions"},
+ {"VUID-vkCreateCommandPool-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkCommandPoolCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkCreateCommandPool-queueFamilyIndex-01937", "pCreateInfo->queueFamilyIndex must be the index of a queue family available in the logical device device", "1.2-extensions"},
+ {"VUID-vkCreateComputePipelines-createInfoCount-arraylength", "createInfoCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCreateComputePipelines-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateComputePipelines-flags-00695", "If the flags member of any element of pCreateInfos contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and the basePipelineIndex member of that same element is not -1, basePipelineIndex must be less than the index into pCreateInfos that corresponds to that element", "1.2-extensions"},
+ {"VUID-vkCreateComputePipelines-flags-00696", "If the flags member of any element of pCreateInfos contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, the base pipeline must have been created with the VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT flag set", "1.2-extensions"},
+ {"VUID-vkCreateComputePipelines-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateComputePipelines-pCreateInfos-parameter", "pCreateInfos must be a valid pointer to an array of createInfoCount valid VkComputePipelineCreateInfo structures", "1.2-extensions"},
+ {"VUID-vkCreateComputePipelines-pPipelines-parameter", "pPipelines must be a valid pointer to an array of createInfoCount VkPipeline handles", "1.2-extensions"},
+ {"VUID-vkCreateComputePipelines-pipelineCache-02873", "If pipelineCache was created with VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT, host access to pipelineCache must be externally synchronized", "1.2-extensions"},
+ {"VUID-vkCreateComputePipelines-pipelineCache-parameter", "If pipelineCache is not VK_NULL_HANDLE, pipelineCache must be a valid VkPipelineCache handle", "1.2-extensions"},
+ {"VUID-vkCreateComputePipelines-pipelineCache-parent", "If pipelineCache is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkCreateDebugReportCallbackEXT-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkCreateDebugReportCallbackEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateDebugReportCallbackEXT-pCallback-parameter", "pCallback must be a valid pointer to a VkDebugReportCallbackEXT handle", "1.2-extensions"},
+ {"VUID-vkCreateDebugReportCallbackEXT-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkDebugReportCallbackCreateInfoEXT structure", "1.2-extensions"},
+ {"VUID-vkCreateDebugUtilsMessengerEXT-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkCreateDebugUtilsMessengerEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateDebugUtilsMessengerEXT-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkDebugUtilsMessengerCreateInfoEXT structure", "1.2-extensions"},
+ {"VUID-vkCreateDebugUtilsMessengerEXT-pMessenger-parameter", "pMessenger must be a valid pointer to a VkDebugUtilsMessengerEXT handle", "1.2-extensions"},
+ {"VUID-vkCreateDeferredOperationKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateDeferredOperationKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateDeferredOperationKHR-pDeferredOperation-parameter", "pDeferredOperation must be a valid pointer to a VkDeferredOperationKHR handle", "1.2-extensions"},
+ {"VUID-vkCreateDescriptorPool-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateDescriptorPool-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateDescriptorPool-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkDescriptorPoolCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkCreateDescriptorPool-pDescriptorPool-parameter", "pDescriptorPool must be a valid pointer to a VkDescriptorPool handle", "1.2-extensions"},
+ {"VUID-vkCreateDescriptorSetLayout-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateDescriptorSetLayout-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateDescriptorSetLayout-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkDescriptorSetLayoutCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkCreateDescriptorSetLayout-pSetLayout-parameter", "pSetLayout must be a valid pointer to a VkDescriptorSetLayout handle", "1.2-extensions"},
+ {"VUID-vkCreateDescriptorUpdateTemplate-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateDescriptorUpdateTemplate-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateDescriptorUpdateTemplate-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkDescriptorUpdateTemplateCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkCreateDescriptorUpdateTemplate-pDescriptorUpdateTemplate-parameter", "pDescriptorUpdateTemplate must be a valid pointer to a VkDescriptorUpdateTemplate handle", "1.2-extensions"},
+ {"VUID-vkCreateDevice-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateDevice-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkDeviceCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkCreateDevice-pDevice-parameter", "pDevice must be a valid pointer to a VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateDevice-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateDevice-ppEnabledExtensionNames-01387", "All required extensions for each extension in the VkDeviceCreateInfo::ppEnabledExtensionNames list must also be present in that list", "1.2-extensions"},
+ {"VUID-vkCreateDirectFBSurfaceEXT-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkCreateDirectFBSurfaceEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateDirectFBSurfaceEXT-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkDirectFBSurfaceCreateInfoEXT structure", "1.2-extensions"},
+ {"VUID-vkCreateDirectFBSurfaceEXT-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-vkCreateDisplayModeKHR-display-parameter", "display must be a valid VkDisplayKHR handle", "1.2-extensions"},
+ {"VUID-vkCreateDisplayModeKHR-display-parent", "display must have been created, allocated, or retrieved from physicalDevice", "1.2-extensions"},
+ {"VUID-vkCreateDisplayModeKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateDisplayModeKHR-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkDisplayModeCreateInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkCreateDisplayModeKHR-pMode-parameter", "pMode must be a valid pointer to a VkDisplayModeKHR handle", "1.2-extensions"},
+ {"VUID-vkCreateDisplayModeKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateDisplayPlaneSurfaceKHR-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkCreateDisplayPlaneSurfaceKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateDisplayPlaneSurfaceKHR-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkDisplaySurfaceCreateInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkCreateDisplayPlaneSurfaceKHR-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-vkCreateEvent-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateEvent-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateEvent-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkEventCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkCreateEvent-pEvent-parameter", "pEvent must be a valid pointer to a VkEvent handle", "1.2-extensions"},
+ {"VUID-vkCreateFence-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateFence-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateFence-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkFenceCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkCreateFence-pFence-parameter", "pFence must be a valid pointer to a VkFence handle", "1.2-extensions"},
+ {"VUID-vkCreateFramebuffer-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateFramebuffer-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateFramebuffer-pCreateInfo-02777", "If pCreateInfo->flags does not include VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT, and attachmentCount is not 0, each element of pCreateInfo->pAttachments must have been created on device", "1.2-extensions"},
+ {"VUID-vkCreateFramebuffer-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkFramebufferCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkCreateFramebuffer-pFramebuffer-parameter", "pFramebuffer must be a valid pointer to a VkFramebuffer handle", "1.2-extensions"},
+ {"VUID-vkCreateGraphicsPipelines-createInfoCount-arraylength", "createInfoCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCreateGraphicsPipelines-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateGraphicsPipelines-flags-00720", "If the flags member of any element of pCreateInfos contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and the basePipelineIndex member of that same element is not -1, basePipelineIndex must be less than the index into pCreateInfos that corresponds to that element", "1.2-extensions"},
+ {"VUID-vkCreateGraphicsPipelines-flags-00721", "If the flags member of any element of pCreateInfos contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, the base pipeline must have been created with the VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT flag set", "1.2-extensions"},
+ {"VUID-vkCreateGraphicsPipelines-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateGraphicsPipelines-pCreateInfos-parameter", "pCreateInfos must be a valid pointer to an array of createInfoCount valid VkGraphicsPipelineCreateInfo structures", "1.2-extensions"},
+ {"VUID-vkCreateGraphicsPipelines-pPipelines-parameter", "pPipelines must be a valid pointer to an array of createInfoCount VkPipeline handles", "1.2-extensions"},
+ {"VUID-vkCreateGraphicsPipelines-pipelineCache-02876", "If pipelineCache was created with VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT, host access to pipelineCache must be externally synchronized", "1.2-extensions"},
+ {"VUID-vkCreateGraphicsPipelines-pipelineCache-parameter", "If pipelineCache is not VK_NULL_HANDLE, pipelineCache must be a valid VkPipelineCache handle", "1.2-extensions"},
+ {"VUID-vkCreateGraphicsPipelines-pipelineCache-parent", "If pipelineCache is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkCreateHeadlessSurfaceEXT-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkCreateHeadlessSurfaceEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateHeadlessSurfaceEXT-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkHeadlessSurfaceCreateInfoEXT structure", "1.2-extensions"},
+ {"VUID-vkCreateHeadlessSurfaceEXT-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-vkCreateIOSSurfaceMVK-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkCreateIOSSurfaceMVK-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateIOSSurfaceMVK-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkIOSSurfaceCreateInfoMVK structure", "1.2-extensions"},
+ {"VUID-vkCreateIOSSurfaceMVK-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-vkCreateImage-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateImage-flags-00939", "If the flags member of pCreateInfo includes VK_IMAGE_CREATE_SPARSE_BINDING_BIT, creating this VkImage must not cause the total required sparse memory for all currently valid sparse resources on the device to exceed VkPhysicalDeviceLimits::sparseAddressSpaceSize", "1.2-extensions"},
+ {"VUID-vkCreateImage-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateImage-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkImageCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkCreateImage-pImage-parameter", "pImage must be a valid pointer to a VkImage handle", "1.2-extensions"},
+ {"VUID-vkCreateImagePipeSurfaceFUCHSIA-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkCreateImagePipeSurfaceFUCHSIA-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateImagePipeSurfaceFUCHSIA-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkImagePipeSurfaceCreateInfoFUCHSIA structure", "1.2-extensions"},
+ {"VUID-vkCreateImagePipeSurfaceFUCHSIA-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-vkCreateImageView-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateImageView-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateImageView-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkImageViewCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkCreateImageView-pView-parameter", "pView must be a valid pointer to a VkImageView handle", "1.2-extensions"},
+ {"VUID-vkCreateIndirectCommandsLayoutNV-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateIndirectCommandsLayoutNV-deviceGeneratedCommands-02929", "The VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::deviceGeneratedCommands feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCreateIndirectCommandsLayoutNV-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateIndirectCommandsLayoutNV-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkIndirectCommandsLayoutCreateInfoNV structure", "1.2-extensions"},
+ {"VUID-vkCreateIndirectCommandsLayoutNV-pIndirectCommandsLayout-parameter", "pIndirectCommandsLayout must be a valid pointer to a VkIndirectCommandsLayoutNV handle", "1.2-extensions"},
+ {"VUID-vkCreateInstance-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateInstance-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkInstanceCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkCreateInstance-pInstance-parameter", "pInstance must be a valid pointer to a VkInstance handle", "1.2-extensions"},
+ {"VUID-vkCreateInstance-ppEnabledExtensionNames-01388", "All required extensions for each extension in the VkInstanceCreateInfo::ppEnabledExtensionNames list must also be present in that list", "1.2-extensions"},
+ {"VUID-vkCreateMacOSSurfaceMVK-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkCreateMacOSSurfaceMVK-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateMacOSSurfaceMVK-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkMacOSSurfaceCreateInfoMVK structure", "1.2-extensions"},
+ {"VUID-vkCreateMacOSSurfaceMVK-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-vkCreateMetalSurfaceEXT-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkCreateMetalSurfaceEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateMetalSurfaceEXT-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkMetalSurfaceCreateInfoEXT structure", "1.2-extensions"},
+ {"VUID-vkCreateMetalSurfaceEXT-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-vkCreatePipelineCache-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreatePipelineCache-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreatePipelineCache-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkPipelineCacheCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkCreatePipelineCache-pPipelineCache-parameter", "pPipelineCache must be a valid pointer to a VkPipelineCache handle", "1.2-extensions"},
+ {"VUID-vkCreatePipelineLayout-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreatePipelineLayout-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreatePipelineLayout-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkPipelineLayoutCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkCreatePipelineLayout-pPipelineLayout-parameter", "pPipelineLayout must be a valid pointer to a VkPipelineLayout handle", "1.2-extensions"},
+ {"VUID-vkCreatePrivateDataSlotEXT-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreatePrivateDataSlotEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreatePrivateDataSlotEXT-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkPrivateDataSlotCreateInfoEXT structure", "1.2-extensions"},
+ {"VUID-vkCreatePrivateDataSlotEXT-pPrivateDataSlot-parameter", "pPrivateDataSlot must be a valid pointer to a VkPrivateDataSlotEXT handle", "1.2-extensions"},
+ {"VUID-vkCreateQueryPool-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateQueryPool-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateQueryPool-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkQueryPoolCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkCreateQueryPool-pQueryPool-parameter", "pQueryPool must be a valid pointer to a VkQueryPool handle", "1.2-extensions"},
+ {"VUID-vkCreateRayTracingPipelinesKHR-createInfoCount-arraylength", "createInfoCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCreateRayTracingPipelinesKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateRayTracingPipelinesKHR-flags-03415", "If the flags member of any element of pCreateInfos contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and the basePipelineIndex member of that same element is not -1, basePipelineIndex must be less than the index into pCreateInfos that corresponds to that element", "1.2-extensions"},
+ {"VUID-vkCreateRayTracingPipelinesKHR-flags-03416", "If the flags member of any element of pCreateInfos contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, the base pipeline must have been created with the VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT flag set", "1.2-extensions"},
+ {"VUID-vkCreateRayTracingPipelinesKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateRayTracingPipelinesKHR-pCreateInfos-parameter", "pCreateInfos must be a valid pointer to an array of createInfoCount valid VkRayTracingPipelineCreateInfoKHR structures", "1.2-extensions"},
+ {"VUID-vkCreateRayTracingPipelinesKHR-pPipelines-parameter", "pPipelines must be a valid pointer to an array of createInfoCount VkPipeline handles", "1.2-extensions"},
+ {"VUID-vkCreateRayTracingPipelinesKHR-pipelineCache-02903", "If pipelineCache was created with VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT, host access to pipelineCache must be externally synchronized", "1.2-extensions"},
+ {"VUID-vkCreateRayTracingPipelinesKHR-pipelineCache-parameter", "If pipelineCache is not VK_NULL_HANDLE, pipelineCache must be a valid VkPipelineCache handle", "1.2-extensions"},
+ {"VUID-vkCreateRayTracingPipelinesKHR-pipelineCache-parent", "If pipelineCache is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkCreateRayTracingPipelinesKHR-rayTracing-03455", "The rayTracing feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCreateRayTracingPipelinesNV-createInfoCount-arraylength", "createInfoCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCreateRayTracingPipelinesNV-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateRayTracingPipelinesNV-flags-03415", "If the flags member of any element of pCreateInfos contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and the basePipelineIndex member of that same element is not -1, basePipelineIndex must be less than the index into pCreateInfos that corresponds to that element", "1.2-extensions"},
+ {"VUID-vkCreateRayTracingPipelinesNV-flags-03416", "If the flags member of any element of pCreateInfos contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, the base pipeline must have been created with the VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT flag set", "1.2-extensions"},
+ {"VUID-vkCreateRayTracingPipelinesNV-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateRayTracingPipelinesNV-pCreateInfos-parameter", "pCreateInfos must be a valid pointer to an array of createInfoCount valid VkRayTracingPipelineCreateInfoNV structures", "1.2-extensions"},
+ {"VUID-vkCreateRayTracingPipelinesNV-pPipelines-parameter", "pPipelines must be a valid pointer to an array of createInfoCount VkPipeline handles", "1.2-extensions"},
+ {"VUID-vkCreateRayTracingPipelinesNV-pipelineCache-02903", "If pipelineCache was created with VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT, host access to pipelineCache must be externally synchronized", "1.2-extensions"},
+ {"VUID-vkCreateRayTracingPipelinesNV-pipelineCache-parameter", "If pipelineCache is not VK_NULL_HANDLE, pipelineCache must be a valid VkPipelineCache handle", "1.2-extensions"},
+ {"VUID-vkCreateRayTracingPipelinesNV-pipelineCache-parent", "If pipelineCache is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkCreateRenderPass-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateRenderPass-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateRenderPass-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkRenderPassCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkCreateRenderPass-pRenderPass-parameter", "pRenderPass must be a valid pointer to a VkRenderPass handle", "1.2-extensions"},
+ {"VUID-vkCreateRenderPass2-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateRenderPass2-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateRenderPass2-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkRenderPassCreateInfo2 structure", "1.2-extensions"},
+ {"VUID-vkCreateRenderPass2-pRenderPass-parameter", "pRenderPass must be a valid pointer to a VkRenderPass handle", "1.2-extensions"},
+ {"VUID-vkCreateSampler-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateSampler-maxSamplerAllocationCount-04110", "There must be less than VkPhysicalDeviceLimits::maxSamplerAllocationCount VkSampler objects currently created on the device.", "1.2-extensions"},
+ {"VUID-vkCreateSampler-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateSampler-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkSamplerCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkCreateSampler-pSampler-parameter", "pSampler must be a valid pointer to a VkSampler handle", "1.2-extensions"},
+ {"VUID-vkCreateSamplerYcbcrConversion-None-01648", "The sampler {YCbCr} conversion feature must be enabled", "1.2-extensions"},
+ {"VUID-vkCreateSamplerYcbcrConversion-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateSamplerYcbcrConversion-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateSamplerYcbcrConversion-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkSamplerYcbcrConversionCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkCreateSamplerYcbcrConversion-pYcbcrConversion-parameter", "pYcbcrConversion must be a valid pointer to a VkSamplerYcbcrConversion handle", "1.2-extensions"},
+ {"VUID-vkCreateSemaphore-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateSemaphore-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateSemaphore-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkSemaphoreCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkCreateSemaphore-pSemaphore-parameter", "pSemaphore must be a valid pointer to a VkSemaphore handle", "1.2-extensions"},
+ {"VUID-vkCreateShaderModule-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateShaderModule-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateShaderModule-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkShaderModuleCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkCreateShaderModule-pShaderModule-parameter", "pShaderModule must be a valid pointer to a VkShaderModule handle", "1.2-extensions"},
+ {"VUID-vkCreateSharedSwapchainsKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateSharedSwapchainsKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateSharedSwapchainsKHR-pCreateInfos-parameter", "pCreateInfos must be a valid pointer to an array of swapchainCount valid VkSwapchainCreateInfoKHR structures", "1.2-extensions"},
+ {"VUID-vkCreateSharedSwapchainsKHR-pSwapchains-parameter", "pSwapchains must be a valid pointer to an array of swapchainCount VkSwapchainKHR handles", "1.2-extensions"},
+ {"VUID-vkCreateSharedSwapchainsKHR-swapchainCount-arraylength", "swapchainCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkCreateStreamDescriptorSurfaceGGP-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkCreateStreamDescriptorSurfaceGGP-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateStreamDescriptorSurfaceGGP-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkStreamDescriptorSurfaceCreateInfoGGP structure", "1.2-extensions"},
+ {"VUID-vkCreateStreamDescriptorSurfaceGGP-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-vkCreateSwapchainKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateSwapchainKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateSwapchainKHR-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkSwapchainCreateInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkCreateSwapchainKHR-pSwapchain-parameter", "pSwapchain must be a valid pointer to a VkSwapchainKHR handle", "1.2-extensions"},
+ {"VUID-vkCreateValidationCacheEXT-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkCreateValidationCacheEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateValidationCacheEXT-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkValidationCacheCreateInfoEXT structure", "1.2-extensions"},
+ {"VUID-vkCreateValidationCacheEXT-pValidationCache-parameter", "pValidationCache must be a valid pointer to a VkValidationCacheEXT handle", "1.2-extensions"},
+ {"VUID-vkCreateViSurfaceNN-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkCreateViSurfaceNN-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateViSurfaceNN-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkViSurfaceCreateInfoNN structure", "1.2-extensions"},
+ {"VUID-vkCreateViSurfaceNN-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-vkCreateWaylandSurfaceKHR-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkCreateWaylandSurfaceKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateWaylandSurfaceKHR-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkWaylandSurfaceCreateInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkCreateWaylandSurfaceKHR-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-vkCreateWin32SurfaceKHR-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkCreateWin32SurfaceKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateWin32SurfaceKHR-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkWin32SurfaceCreateInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkCreateWin32SurfaceKHR-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-vkCreateXcbSurfaceKHR-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkCreateXcbSurfaceKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateXcbSurfaceKHR-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkXcbSurfaceCreateInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkCreateXcbSurfaceKHR-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-vkCreateXlibSurfaceKHR-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkCreateXlibSurfaceKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkCreateXlibSurfaceKHR-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkXlibSurfaceCreateInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkCreateXlibSurfaceKHR-pSurface-parameter", "pSurface must be a valid pointer to a VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-vkDebugMarkerSetObjectNameEXT-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDebugMarkerSetObjectNameEXT-pNameInfo-parameter", "pNameInfo must be a valid pointer to a valid VkDebugMarkerObjectNameInfoEXT structure", "1.2-extensions"},
+ {"VUID-vkDebugMarkerSetObjectTagEXT-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDebugMarkerSetObjectTagEXT-pTagInfo-parameter", "pTagInfo must be a valid pointer to a valid VkDebugMarkerObjectTagInfoEXT structure", "1.2-extensions"},
+ {"VUID-vkDebugReportMessageEXT-flags-parameter", "flags must be a valid combination of VkDebugReportFlagBitsEXT values", "1.2-extensions"},
+ {"VUID-vkDebugReportMessageEXT-flags-requiredbitmask", "flags must not be 0", "1.2-extensions"},
+ {"VUID-vkDebugReportMessageEXT-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkDebugReportMessageEXT-object-01241", "object must be a Vulkan object or VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkDebugReportMessageEXT-objectType-01498", "If objectType is not VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT and object is not VK_NULL_HANDLE, object must be a Vulkan object of the corresponding type associated with objectType as defined in VkDebugReportObjectTypeEXT and Vulkan Handle Relationship", "1.2-extensions"},
+ {"VUID-vkDebugReportMessageEXT-objectType-parameter", "objectType must be a valid VkDebugReportObjectTypeEXT value", "1.2-extensions"},
+ {"VUID-vkDebugReportMessageEXT-pLayerPrefix-parameter", "pLayerPrefix must be a null-terminated UTF-8 string", "1.2-extensions"},
+ {"VUID-vkDebugReportMessageEXT-pMessage-parameter", "pMessage must be a null-terminated UTF-8 string", "1.2-extensions"},
+ {"VUID-vkDeferredOperationJoinKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDeferredOperationJoinKHR-operation-parameter", "operation must be a valid VkDeferredOperationKHR handle", "1.2-extensions"},
+ {"VUID-vkDeferredOperationJoinKHR-operation-parent", "operation must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-02442", "All submitted commands that refer to accelerationStructure must have completed execution", "1.2-extensions"},
+ {"VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-02443", "If VkAllocationCallbacks were provided when accelerationStructure was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-02444", "If no VkAllocationCallbacks were provided when accelerationStructure was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-parameter", "If accelerationStructure is not VK_NULL_HANDLE, accelerationStructure must be a valid VkAccelerationStructureKHR handle", "1.2-extensions"},
+ {"VUID-vkDestroyAccelerationStructureKHR-accelerationStructure-parent", "If accelerationStructure is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroyAccelerationStructureKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyAccelerationStructureKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyBuffer-buffer-00922", "All submitted commands that refer to buffer, either directly or via a VkBufferView, must have completed execution", "1.2-extensions"},
+ {"VUID-vkDestroyBuffer-buffer-00923", "If VkAllocationCallbacks were provided when buffer was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyBuffer-buffer-00924", "If no VkAllocationCallbacks were provided when buffer was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyBuffer-buffer-parameter", "If buffer is not VK_NULL_HANDLE, buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkDestroyBuffer-buffer-parent", "If buffer is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroyBuffer-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyBuffer-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyBufferView-bufferView-00936", "All submitted commands that refer to bufferView must have completed execution", "1.2-extensions"},
+ {"VUID-vkDestroyBufferView-bufferView-00937", "If VkAllocationCallbacks were provided when bufferView was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyBufferView-bufferView-00938", "If no VkAllocationCallbacks were provided when bufferView was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyBufferView-bufferView-parameter", "If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle", "1.2-extensions"},
+ {"VUID-vkDestroyBufferView-bufferView-parent", "If bufferView is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroyBufferView-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyBufferView-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyCommandPool-commandPool-00041", "All VkCommandBuffer objects allocated from commandPool must not be in the pending state", "1.2-extensions"},
+ {"VUID-vkDestroyCommandPool-commandPool-00042", "If VkAllocationCallbacks were provided when commandPool was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyCommandPool-commandPool-00043", "If no VkAllocationCallbacks were provided when commandPool was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyCommandPool-commandPool-parameter", "If commandPool is not VK_NULL_HANDLE, commandPool must be a valid VkCommandPool handle", "1.2-extensions"},
+ {"VUID-vkDestroyCommandPool-commandPool-parent", "If commandPool is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroyCommandPool-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyCommandPool-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyDebugReportCallbackEXT-callback-parameter", "If callback is not VK_NULL_HANDLE, callback must be a valid VkDebugReportCallbackEXT handle", "1.2-extensions"},
+ {"VUID-vkDestroyDebugReportCallbackEXT-callback-parent", "If callback is a valid handle, it must have been created, allocated, or retrieved from instance", "1.2-extensions"},
+ {"VUID-vkDestroyDebugReportCallbackEXT-instance-01242", "If VkAllocationCallbacks were provided when callback was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyDebugReportCallbackEXT-instance-01243", "If no VkAllocationCallbacks were provided when callback was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyDebugReportCallbackEXT-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkDestroyDebugReportCallbackEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyDebugUtilsMessengerEXT-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkDestroyDebugUtilsMessengerEXT-messenger-01915", "If VkAllocationCallbacks were provided when messenger was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyDebugUtilsMessengerEXT-messenger-01916", "If no VkAllocationCallbacks were provided when messenger was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parameter", "If messenger is not VK_NULL_HANDLE, messenger must be a valid VkDebugUtilsMessengerEXT handle", "1.2-extensions"},
+ {"VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parent", "If messenger is a valid handle, it must have been created, allocated, or retrieved from instance", "1.2-extensions"},
+ {"VUID-vkDestroyDebugUtilsMessengerEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyDeferredOperationKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyDeferredOperationKHR-operation-03434", "If VkAllocationCallbacks were provided when operation was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyDeferredOperationKHR-operation-03435", "If no VkAllocationCallbacks were provided when operation was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyDeferredOperationKHR-operation-03436", "operation must be completed", "1.2-extensions"},
+ {"VUID-vkDestroyDeferredOperationKHR-operation-parameter", "If operation is not VK_NULL_HANDLE, operation must be a valid VkDeferredOperationKHR handle", "1.2-extensions"},
+ {"VUID-vkDestroyDeferredOperationKHR-operation-parent", "If operation is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroyDeferredOperationKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyDescriptorPool-descriptorPool-00303", "All submitted commands that refer to descriptorPool (via any allocated descriptor sets) must have completed execution", "1.2-extensions"},
+ {"VUID-vkDestroyDescriptorPool-descriptorPool-00304", "If VkAllocationCallbacks were provided when descriptorPool was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyDescriptorPool-descriptorPool-00305", "If no VkAllocationCallbacks were provided when descriptorPool was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyDescriptorPool-descriptorPool-parameter", "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle", "1.2-extensions"},
+ {"VUID-vkDestroyDescriptorPool-descriptorPool-parent", "If descriptorPool is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroyDescriptorPool-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyDescriptorPool-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-00284", "If VkAllocationCallbacks were provided when descriptorSetLayout was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-00285", "If no VkAllocationCallbacks were provided when descriptorSetLayout was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-parameter", "If descriptorSetLayout is not VK_NULL_HANDLE, descriptorSetLayout must be a valid VkDescriptorSetLayout handle", "1.2-extensions"},
+ {"VUID-vkDestroyDescriptorSetLayout-descriptorSetLayout-parent", "If descriptorSetLayout is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroyDescriptorSetLayout-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyDescriptorSetLayout-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00356", "If VkAllocationCallbacks were provided when descriptorSetLayout was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyDescriptorUpdateTemplate-descriptorSetLayout-00357", "If no VkAllocationCallbacks were provided when descriptorSetLayout was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyDescriptorUpdateTemplate-descriptorUpdateTemplate-parameter", "If descriptorUpdateTemplate is not VK_NULL_HANDLE, descriptorUpdateTemplate must be a valid VkDescriptorUpdateTemplate handle", "1.2-extensions"},
+ {"VUID-vkDestroyDescriptorUpdateTemplate-descriptorUpdateTemplate-parent", "If descriptorUpdateTemplate is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroyDescriptorUpdateTemplate-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyDescriptorUpdateTemplate-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyDevice-device-00378", "All child objects created on device must have been destroyed prior to destroying device", "1.2-extensions"},
+ {"VUID-vkDestroyDevice-device-00379", "If VkAllocationCallbacks were provided when device was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyDevice-device-00380", "If no VkAllocationCallbacks were provided when device was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyDevice-device-parameter", "If device is not NULL, device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyDevice-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyEvent-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyEvent-event-01145", "All submitted commands that refer to event must have completed execution", "1.2-extensions"},
+ {"VUID-vkDestroyEvent-event-01146", "If VkAllocationCallbacks were provided when event was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyEvent-event-01147", "If no VkAllocationCallbacks were provided when event was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyEvent-event-parameter", "If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle", "1.2-extensions"},
+ {"VUID-vkDestroyEvent-event-parent", "If event is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroyEvent-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyFence-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyFence-fence-01120", "All queue submission commands that refer to fence must have completed execution", "1.2-extensions"},
+ {"VUID-vkDestroyFence-fence-01121", "If VkAllocationCallbacks were provided when fence was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyFence-fence-01122", "If no VkAllocationCallbacks were provided when fence was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyFence-fence-parameter", "If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle", "1.2-extensions"},
+ {"VUID-vkDestroyFence-fence-parent", "If fence is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroyFence-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyFramebuffer-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyFramebuffer-framebuffer-00892", "All submitted commands that refer to framebuffer must have completed execution", "1.2-extensions"},
+ {"VUID-vkDestroyFramebuffer-framebuffer-00893", "If VkAllocationCallbacks were provided when framebuffer was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyFramebuffer-framebuffer-00894", "If no VkAllocationCallbacks were provided when framebuffer was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyFramebuffer-framebuffer-parameter", "If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle", "1.2-extensions"},
+ {"VUID-vkDestroyFramebuffer-framebuffer-parent", "If framebuffer is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroyFramebuffer-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyImage-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyImage-image-01000", "All submitted commands that refer to image, either directly or via a VkImageView, must have completed execution", "1.2-extensions"},
+ {"VUID-vkDestroyImage-image-01001", "If VkAllocationCallbacks were provided when image was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyImage-image-01002", "If no VkAllocationCallbacks were provided when image was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyImage-image-parameter", "If image is not VK_NULL_HANDLE, image must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-vkDestroyImage-image-parent", "If image is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroyImage-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyImageView-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyImageView-imageView-01026", "All submitted commands that refer to imageView must have completed execution", "1.2-extensions"},
+ {"VUID-vkDestroyImageView-imageView-01027", "If VkAllocationCallbacks were provided when imageView was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyImageView-imageView-01028", "If no VkAllocationCallbacks were provided when imageView was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyImageView-imageView-parameter", "If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle", "1.2-extensions"},
+ {"VUID-vkDestroyImageView-imageView-parent", "If imageView is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroyImageView-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyIndirectCommandsLayoutNV-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyIndirectCommandsLayoutNV-deviceGeneratedCommands-02941", "The VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::deviceGeneratedCommands feature must be enabled", "1.2-extensions"},
+ {"VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-02938", "All submitted commands that refer to indirectCommandsLayout must have completed execution", "1.2-extensions"},
+ {"VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-02939", "If VkAllocationCallbacks were provided when indirectCommandsLayout was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-02940", "If no VkAllocationCallbacks were provided when indirectCommandsLayout was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-parameter", "If indirectCommandsLayout is not VK_NULL_HANDLE, indirectCommandsLayout must be a valid VkIndirectCommandsLayoutNV handle", "1.2-extensions"},
+ {"VUID-vkDestroyIndirectCommandsLayoutNV-indirectCommandsLayout-parent", "If indirectCommandsLayout is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroyIndirectCommandsLayoutNV-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyInstance-instance-00629", "All child objects created using instance must have been destroyed prior to destroying instance", "1.2-extensions"},
+ {"VUID-vkDestroyInstance-instance-00630", "If VkAllocationCallbacks were provided when instance was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyInstance-instance-00631", "If no VkAllocationCallbacks were provided when instance was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyInstance-instance-parameter", "If instance is not NULL, instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkDestroyInstance-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyPipeline-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyPipeline-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyPipeline-pipeline-00765", "All submitted commands that refer to pipeline must have completed execution", "1.2-extensions"},
+ {"VUID-vkDestroyPipeline-pipeline-00766", "If VkAllocationCallbacks were provided when pipeline was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyPipeline-pipeline-00767", "If no VkAllocationCallbacks were provided when pipeline was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyPipeline-pipeline-parameter", "If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle", "1.2-extensions"},
+ {"VUID-vkDestroyPipeline-pipeline-parent", "If pipeline is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroyPipelineCache-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyPipelineCache-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyPipelineCache-pipelineCache-00771", "If VkAllocationCallbacks were provided when pipelineCache was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyPipelineCache-pipelineCache-00772", "If no VkAllocationCallbacks were provided when pipelineCache was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyPipelineCache-pipelineCache-parameter", "If pipelineCache is not VK_NULL_HANDLE, pipelineCache must be a valid VkPipelineCache handle", "1.2-extensions"},
+ {"VUID-vkDestroyPipelineCache-pipelineCache-parent", "If pipelineCache is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroyPipelineLayout-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyPipelineLayout-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyPipelineLayout-pipelineLayout-00299", "If VkAllocationCallbacks were provided when pipelineLayout was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyPipelineLayout-pipelineLayout-00300", "If no VkAllocationCallbacks were provided when pipelineLayout was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyPipelineLayout-pipelineLayout-02004", "pipelineLayout must not have been passed to any vkCmd* command for any command buffers that are still in the recording state when vkDestroyPipelineLayout is called", "1.2-extensions"},
+ {"VUID-vkDestroyPipelineLayout-pipelineLayout-parameter", "If pipelineLayout is not VK_NULL_HANDLE, pipelineLayout must be a valid VkPipelineLayout handle", "1.2-extensions"},
+ {"VUID-vkDestroyPipelineLayout-pipelineLayout-parent", "If pipelineLayout is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroyPrivateDataSlotEXT-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyPrivateDataSlotEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyPrivateDataSlotEXT-privateDataSlot-04062", "If VkAllocationCallbacks were provided when privateDataSlot was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyPrivateDataSlotEXT-privateDataSlot-04063", "If no VkAllocationCallbacks were provided when privateDataSlot was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyPrivateDataSlotEXT-privateDataSlot-parameter", "If privateDataSlot is not VK_NULL_HANDLE, privateDataSlot must be a valid VkPrivateDataSlotEXT handle", "1.2-extensions"},
+ {"VUID-vkDestroyPrivateDataSlotEXT-privateDataSlot-parent", "If privateDataSlot is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroyQueryPool-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyQueryPool-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyQueryPool-queryPool-00793", "All submitted commands that refer to queryPool must have completed execution", "1.2-extensions"},
+ {"VUID-vkDestroyQueryPool-queryPool-00794", "If VkAllocationCallbacks were provided when queryPool was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyQueryPool-queryPool-00795", "If no VkAllocationCallbacks were provided when queryPool was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyQueryPool-queryPool-parameter", "If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle", "1.2-extensions"},
+ {"VUID-vkDestroyQueryPool-queryPool-parent", "If queryPool is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroyRenderPass-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyRenderPass-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyRenderPass-renderPass-00873", "All submitted commands that refer to renderPass must have completed execution", "1.2-extensions"},
+ {"VUID-vkDestroyRenderPass-renderPass-00874", "If VkAllocationCallbacks were provided when renderPass was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyRenderPass-renderPass-00875", "If no VkAllocationCallbacks were provided when renderPass was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyRenderPass-renderPass-parameter", "If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle", "1.2-extensions"},
+ {"VUID-vkDestroyRenderPass-renderPass-parent", "If renderPass is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroySampler-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroySampler-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroySampler-sampler-01082", "All submitted commands that refer to sampler must have completed execution", "1.2-extensions"},
+ {"VUID-vkDestroySampler-sampler-01083", "If VkAllocationCallbacks were provided when sampler was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroySampler-sampler-01084", "If no VkAllocationCallbacks were provided when sampler was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroySampler-sampler-parameter", "If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle", "1.2-extensions"},
+ {"VUID-vkDestroySampler-sampler-parent", "If sampler is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroySamplerYcbcrConversion-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroySamplerYcbcrConversion-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parameter", "If ycbcrConversion is not VK_NULL_HANDLE, ycbcrConversion must be a valid VkSamplerYcbcrConversion handle", "1.2-extensions"},
+ {"VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parent", "If ycbcrConversion is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroySemaphore-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroySemaphore-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroySemaphore-semaphore-01137", "All submitted batches that refer to semaphore must have completed execution", "1.2-extensions"},
+ {"VUID-vkDestroySemaphore-semaphore-01138", "If VkAllocationCallbacks were provided when semaphore was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroySemaphore-semaphore-01139", "If no VkAllocationCallbacks were provided when semaphore was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroySemaphore-semaphore-parameter", "If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle", "1.2-extensions"},
+ {"VUID-vkDestroySemaphore-semaphore-parent", "If semaphore is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroyShaderModule-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyShaderModule-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyShaderModule-shaderModule-01092", "If VkAllocationCallbacks were provided when shaderModule was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyShaderModule-shaderModule-01093", "If no VkAllocationCallbacks were provided when shaderModule was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyShaderModule-shaderModule-parameter", "If shaderModule is not VK_NULL_HANDLE, shaderModule must be a valid VkShaderModule handle", "1.2-extensions"},
+ {"VUID-vkDestroyShaderModule-shaderModule-parent", "If shaderModule is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDestroySurfaceKHR-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkDestroySurfaceKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroySurfaceKHR-surface-01266", "All VkSwapchainKHR objects created for surface must have been destroyed prior to destroying surface", "1.2-extensions"},
+ {"VUID-vkDestroySurfaceKHR-surface-01267", "If VkAllocationCallbacks were provided when surface was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroySurfaceKHR-surface-01268", "If no VkAllocationCallbacks were provided when surface was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroySurfaceKHR-surface-parameter", "If surface is not VK_NULL_HANDLE, surface must be a valid VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-vkDestroySurfaceKHR-surface-parent", "If surface is a valid handle, it must have been created, allocated, or retrieved from instance", "1.2-extensions"},
+ {"VUID-vkDestroySwapchainKHR-commonparent", "Both of device, and swapchain that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkInstance", "1.2-extensions"},
+ {"VUID-vkDestroySwapchainKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroySwapchainKHR-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroySwapchainKHR-swapchain-01282", "All uses of presentable images acquired from swapchain must have completed execution", "1.2-extensions"},
+ {"VUID-vkDestroySwapchainKHR-swapchain-01283", "If VkAllocationCallbacks were provided when swapchain was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroySwapchainKHR-swapchain-01284", "If no VkAllocationCallbacks were provided when swapchain was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroySwapchainKHR-swapchain-parameter", "If swapchain is not VK_NULL_HANDLE, swapchain must be a valid VkSwapchainKHR handle", "1.2-extensions"},
+ {"VUID-vkDestroyValidationCacheEXT-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDestroyValidationCacheEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkDestroyValidationCacheEXT-validationCache-01537", "If VkAllocationCallbacks were provided when validationCache was created, a compatible set of callbacks must be provided here", "1.2-extensions"},
+ {"VUID-vkDestroyValidationCacheEXT-validationCache-01538", "If no VkAllocationCallbacks were provided when validationCache was created, pAllocator must be NULL", "1.2-extensions"},
+ {"VUID-vkDestroyValidationCacheEXT-validationCache-parameter", "If validationCache is not VK_NULL_HANDLE, validationCache must be a valid VkValidationCacheEXT handle", "1.2-extensions"},
+ {"VUID-vkDestroyValidationCacheEXT-validationCache-parent", "If validationCache is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkDeviceWaitIdle-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDisplayPowerControlEXT-commonparent", "Both of device, and display must have been created, allocated, or retrieved from the same VkPhysicalDevice", "1.2-extensions"},
+ {"VUID-vkDisplayPowerControlEXT-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkDisplayPowerControlEXT-display-parameter", "display must be a valid VkDisplayKHR handle", "1.2-extensions"},
+ {"VUID-vkDisplayPowerControlEXT-pDisplayPowerInfo-parameter", "pDisplayPowerInfo must be a valid pointer to a valid VkDisplayPowerInfoEXT structure", "1.2-extensions"},
+ {"VUID-vkEndCommandBuffer-None-01978", "Conditional rendering must not be active", "1.2-extensions"},
+ {"VUID-vkEndCommandBuffer-commandBuffer-00059", "commandBuffer must be in the recording state", "1.2-extensions"},
+ {"VUID-vkEndCommandBuffer-commandBuffer-00060", "If commandBuffer is a primary command buffer, there must not be an active render pass instance", "1.2-extensions"},
+ {"VUID-vkEndCommandBuffer-commandBuffer-00061", "All queries made active during the recording of commandBuffer must have been made inactive", "1.2-extensions"},
+ {"VUID-vkEndCommandBuffer-commandBuffer-00062", "If commandBuffer is a secondary command buffer, there must not be an outstanding vkCmdDebugMarkerBeginEXT command recorded to commandBuffer that has not previously been ended by a call to vkCmdDebugMarkerEndEXT", "1.2-extensions"},
+ {"VUID-vkEndCommandBuffer-commandBuffer-01815", "If commandBuffer is a secondary command buffer, there must not be an outstanding vkCmdBeginDebugUtilsLabelEXT command recorded to commandBuffer that has not previously been ended by a call to vkCmdEndDebugUtilsLabelEXT", "1.2-extensions"},
+ {"VUID-vkEndCommandBuffer-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkEnumerateDeviceExtensionProperties-pLayerName-parameter", "If pLayerName is not NULL, pLayerName must be a null-terminated UTF-8 string", "1.2-extensions"},
+ {"VUID-vkEnumerateDeviceExtensionProperties-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkExtensionProperties structures", "1.2-extensions"},
+ {"VUID-vkEnumerateDeviceExtensionProperties-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkEnumerateDeviceExtensionProperties-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkEnumerateDeviceLayerProperties-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkLayerProperties structures", "1.2-extensions"},
+ {"VUID-vkEnumerateDeviceLayerProperties-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkEnumerateDeviceLayerProperties-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkEnumerateInstanceExtensionProperties-pLayerName-parameter", "If pLayerName is not NULL, pLayerName must be a null-terminated UTF-8 string", "1.2-extensions"},
+ {"VUID-vkEnumerateInstanceExtensionProperties-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkExtensionProperties structures", "1.2-extensions"},
+ {"VUID-vkEnumerateInstanceExtensionProperties-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkEnumerateInstanceLayerProperties-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkLayerProperties structures", "1.2-extensions"},
+ {"VUID-vkEnumerateInstanceLayerProperties-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkEnumerateInstanceVersion-pApiVersion-parameter", "pApiVersion must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkEnumeratePhysicalDeviceGroups-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkEnumeratePhysicalDeviceGroups-pPhysicalDeviceGroupCount-parameter", "pPhysicalDeviceGroupCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkEnumeratePhysicalDeviceGroups-pPhysicalDeviceGroupProperties-parameter", "If the value referenced by pPhysicalDeviceGroupCount is not 0, and pPhysicalDeviceGroupProperties is not NULL, pPhysicalDeviceGroupProperties must be a valid pointer to an array of pPhysicalDeviceGroupCount VkPhysicalDeviceGroupProperties structures", "1.2-extensions"},
+ {"VUID-vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR-pCounterCount-parameter", "pCounterCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR-pCounterDescriptions-parameter", "If the value referenced by pCounterCount is not 0, and pCounterDescriptions is not NULL, pCounterDescriptions must be a valid pointer to an array of pCounterCount VkPerformanceCounterDescriptionKHR structures", "1.2-extensions"},
+ {"VUID-vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR-pCounters-parameter", "If the value referenced by pCounterCount is not 0, and pCounters is not NULL, pCounters must be a valid pointer to an array of pCounterCount VkPerformanceCounterKHR structures", "1.2-extensions"},
+ {"VUID-vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkEnumeratePhysicalDevices-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkEnumeratePhysicalDevices-pPhysicalDeviceCount-parameter", "pPhysicalDeviceCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkEnumeratePhysicalDevices-pPhysicalDevices-parameter", "If the value referenced by pPhysicalDeviceCount is not 0, and pPhysicalDevices is not NULL, pPhysicalDevices must be a valid pointer to an array of pPhysicalDeviceCount VkPhysicalDevice handles", "1.2-extensions"},
+ {"VUID-vkFlushMappedMemoryRanges-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkFlushMappedMemoryRanges-memoryRangeCount-arraylength", "memoryRangeCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkFlushMappedMemoryRanges-pMemoryRanges-parameter", "pMemoryRanges must be a valid pointer to an array of memoryRangeCount valid VkMappedMemoryRange structures", "1.2-extensions"},
+ {"VUID-vkFreeCommandBuffers-commandBufferCount-arraylength", "commandBufferCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkFreeCommandBuffers-commandPool-parameter", "commandPool must be a valid VkCommandPool handle", "1.2-extensions"},
+ {"VUID-vkFreeCommandBuffers-commandPool-parent", "commandPool must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkFreeCommandBuffers-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkFreeCommandBuffers-pCommandBuffers-00047", "All elements of pCommandBuffers must not be in the pending state", "1.2-extensions"},
+ {"VUID-vkFreeCommandBuffers-pCommandBuffers-00048", "pCommandBuffers must be a valid pointer to an array of commandBufferCount VkCommandBuffer handles, each element of which must either be a valid handle or NULL", "1.2-extensions"},
+ {"VUID-vkFreeCommandBuffers-pCommandBuffers-parent", "Each element of pCommandBuffers that is a valid handle must have been created, allocated, or retrieved from commandPool", "1.2-extensions"},
+ {"VUID-vkFreeDescriptorSets-descriptorPool-00312", "descriptorPool must have been created with the VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT flag", "1.2-extensions"},
+ {"VUID-vkFreeDescriptorSets-descriptorPool-parameter", "descriptorPool must be a valid VkDescriptorPool handle", "1.2-extensions"},
+ {"VUID-vkFreeDescriptorSets-descriptorPool-parent", "descriptorPool must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkFreeDescriptorSets-descriptorSetCount-arraylength", "descriptorSetCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkFreeDescriptorSets-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkFreeDescriptorSets-pDescriptorSets-00309", "All submitted commands that refer to any element of pDescriptorSets must have completed execution", "1.2-extensions"},
+ {"VUID-vkFreeDescriptorSets-pDescriptorSets-00310", "pDescriptorSets must be a valid pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must either be a valid handle or VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkFreeDescriptorSets-pDescriptorSets-00311", "Each valid handle in pDescriptorSets must have been allocated from descriptorPool", "1.2-extensions"},
+ {"VUID-vkFreeDescriptorSets-pDescriptorSets-parent", "Each element of pDescriptorSets that is a valid handle must have been created, allocated, or retrieved from descriptorPool", "1.2-extensions"},
+ {"VUID-vkFreeMemory-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkFreeMemory-memory-00677", "All submitted commands that refer to memory (via images or buffers) must have completed execution", "1.2-extensions"},
+ {"VUID-vkFreeMemory-memory-parameter", "If memory is not VK_NULL_HANDLE, memory must be a valid VkDeviceMemory handle", "1.2-extensions"},
+ {"VUID-vkFreeMemory-memory-parent", "If memory is a valid handle, it must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkFreeMemory-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkGetAccelerationStructureDeviceAddressKHR-device-03504", "If device was created with multiple physical devices, then the bufferDeviceAddressMultiDevice feature must be enabled", "1.2-extensions"},
+ {"VUID-vkGetAccelerationStructureDeviceAddressKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetAccelerationStructureDeviceAddressKHR-pInfo-parameter", "pInfo must be a valid pointer to a valid VkAccelerationStructureDeviceAddressInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkGetAccelerationStructureHandleNV-accelerationStructure-02787", "accelerationStructure must be bound completely and contiguously to a single VkDeviceMemory object via vkBindAccelerationStructureMemoryKHR", "1.2-extensions"},
+ {"VUID-vkGetAccelerationStructureHandleNV-accelerationStructure-parameter", "accelerationStructure must be a valid VkAccelerationStructureKHR handle", "1.2-extensions"},
+ {"VUID-vkGetAccelerationStructureHandleNV-accelerationStructure-parent", "accelerationStructure must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkGetAccelerationStructureHandleNV-dataSize-02240", "dataSize must be large enough to contain the result of the query, as described above", "1.2-extensions"},
+ {"VUID-vkGetAccelerationStructureHandleNV-dataSize-arraylength", "dataSize must be greater than 0", "1.2-extensions"},
+ {"VUID-vkGetAccelerationStructureHandleNV-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetAccelerationStructureHandleNV-pData-parameter", "pData must be a valid pointer to an array of dataSize bytes", "1.2-extensions"},
+ {"VUID-vkGetAccelerationStructureMemoryRequirementsKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetAccelerationStructureMemoryRequirementsKHR-pInfo-parameter", "pInfo must be a valid pointer to a valid VkAccelerationStructureMemoryRequirementsInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkGetAccelerationStructureMemoryRequirementsKHR-pMemoryRequirements-parameter", "pMemoryRequirements must be a valid pointer to a VkMemoryRequirements2 structure", "1.2-extensions"},
+ {"VUID-vkGetAccelerationStructureMemoryRequirementsNV-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetAccelerationStructureMemoryRequirementsNV-pInfo-parameter", "pInfo must be a valid pointer to a valid VkAccelerationStructureMemoryRequirementsInfoNV structure", "1.2-extensions"},
+ {"VUID-vkGetAccelerationStructureMemoryRequirementsNV-pMemoryRequirements-parameter", "pMemoryRequirements must be a valid pointer to a VkMemoryRequirements2KHR structure", "1.2-extensions"},
+ {"VUID-vkGetAndroidHardwareBufferPropertiesANDROID-buffer-01884", "buffer must be a valid Android hardware buffer object with at least one of the AHARDWAREBUFFER_USAGE_GPU_* flags in its AHardwareBuffer_Desc::usage", "1.2-extensions"},
+ {"VUID-vkGetAndroidHardwareBufferPropertiesANDROID-buffer-parameter", "buffer must be a valid pointer to a valid AHardwareBuffer value", "1.2-extensions"},
+ {"VUID-vkGetAndroidHardwareBufferPropertiesANDROID-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetAndroidHardwareBufferPropertiesANDROID-pProperties-parameter", "pProperties must be a valid pointer to a VkAndroidHardwareBufferPropertiesANDROID structure", "1.2-extensions"},
+ {"VUID-vkGetBufferDeviceAddress-bufferDeviceAddress-03324", "The bufferDeviceAddress or VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::bufferDeviceAddress feature must be enabled", "1.2-extensions"},
+ {"VUID-vkGetBufferDeviceAddress-device-03325", "If device was created with multiple physical devices, then the bufferDeviceAddressMultiDevice or VkPhysicalDeviceBufferDeviceAddressFeaturesEXT::bufferDeviceAddressMultiDevice feature must be enabled", "1.2-extensions"},
+ {"VUID-vkGetBufferDeviceAddress-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetBufferDeviceAddress-pInfo-parameter", "pInfo must be a valid pointer to a valid VkBufferDeviceAddressInfo structure", "1.2-extensions"},
+ {"VUID-vkGetBufferMemoryRequirements-buffer-parameter", "buffer must be a valid VkBuffer handle", "1.2-extensions"},
+ {"VUID-vkGetBufferMemoryRequirements-buffer-parent", "buffer must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkGetBufferMemoryRequirements-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetBufferMemoryRequirements-pMemoryRequirements-parameter", "pMemoryRequirements must be a valid pointer to a VkMemoryRequirements structure", "1.2-extensions"},
+ {"VUID-vkGetBufferMemoryRequirements2-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetBufferMemoryRequirements2-pInfo-parameter", "pInfo must be a valid pointer to a valid VkBufferMemoryRequirementsInfo2 structure", "1.2-extensions"},
+ {"VUID-vkGetBufferMemoryRequirements2-pMemoryRequirements-parameter", "pMemoryRequirements must be a valid pointer to a VkMemoryRequirements2 structure", "1.2-extensions"},
+ {"VUID-vkGetBufferOpaqueCaptureAddress-None-03326", "The bufferDeviceAddress feature must be enabled", "1.2-extensions"},
+ {"VUID-vkGetBufferOpaqueCaptureAddress-device-03327", "If device was created with multiple physical devices, then the bufferDeviceAddressMultiDevice feature must be enabled", "1.2-extensions"},
+ {"VUID-vkGetBufferOpaqueCaptureAddress-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetBufferOpaqueCaptureAddress-pInfo-parameter", "pInfo must be a valid pointer to a valid VkBufferDeviceAddressInfo structure", "1.2-extensions"},
+ {"VUID-vkGetCalibratedTimestampsEXT-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetCalibratedTimestampsEXT-pMaxDeviation-parameter", "pMaxDeviation must be a valid pointer to a uint64_t value", "1.2-extensions"},
+ {"VUID-vkGetCalibratedTimestampsEXT-pTimestampInfos-parameter", "pTimestampInfos must be a valid pointer to an array of timestampCount valid VkCalibratedTimestampInfoEXT structures", "1.2-extensions"},
+ {"VUID-vkGetCalibratedTimestampsEXT-pTimestamps-parameter", "pTimestamps must be a valid pointer to an array of timestampCount uint64_t values", "1.2-extensions"},
+ {"VUID-vkGetCalibratedTimestampsEXT-timestampCount-arraylength", "timestampCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkGetDeferredOperationMaxConcurrencyKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetDeferredOperationMaxConcurrencyKHR-operation-parameter", "operation must be a valid VkDeferredOperationKHR handle", "1.2-extensions"},
+ {"VUID-vkGetDeferredOperationMaxConcurrencyKHR-operation-parent", "operation must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkGetDeferredOperationResultKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetDeferredOperationResultKHR-operation-parameter", "operation must be a valid VkDeferredOperationKHR handle", "1.2-extensions"},
+ {"VUID-vkGetDeferredOperationResultKHR-operation-parent", "operation must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkGetDescriptorSetLayoutSupport-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetDescriptorSetLayoutSupport-pCreateInfo-parameter", "pCreateInfo must be a valid pointer to a valid VkDescriptorSetLayoutCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkGetDescriptorSetLayoutSupport-pSupport-parameter", "pSupport must be a valid pointer to a VkDescriptorSetLayoutSupport structure", "1.2-extensions"},
+ {"VUID-vkGetDeviceAccelerationStructureCompatibilityKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetDeviceAccelerationStructureCompatibilityKHR-rayTracing-03565", "The rayTracing or rayQuery feature must be enabled", "1.2-extensions"},
+ {"VUID-vkGetDeviceAccelerationStructureCompatibilityKHR-version-parameter", "version must be a valid pointer to a valid VkAccelerationStructureVersionKHR structure", "1.2-extensions"},
+ {"VUID-vkGetDeviceGroupPeerMemoryFeatures-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetDeviceGroupPeerMemoryFeatures-heapIndex-00691", "heapIndex must be less than memoryHeapCount", "1.2-extensions"},
+ {"VUID-vkGetDeviceGroupPeerMemoryFeatures-localDeviceIndex-00692", "localDeviceIndex must be a valid device index", "1.2-extensions"},
+ {"VUID-vkGetDeviceGroupPeerMemoryFeatures-localDeviceIndex-00694", "localDeviceIndex must not equal remoteDeviceIndex", "1.2-extensions"},
+ {"VUID-vkGetDeviceGroupPeerMemoryFeatures-pPeerMemoryFeatures-parameter", "pPeerMemoryFeatures must be a valid pointer to a VkPeerMemoryFeatureFlags value", "1.2-extensions"},
+ {"VUID-vkGetDeviceGroupPeerMemoryFeatures-remoteDeviceIndex-00693", "remoteDeviceIndex must be a valid device index", "1.2-extensions"},
+ {"VUID-vkGetDeviceGroupPresentCapabilitiesKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetDeviceGroupPresentCapabilitiesKHR-pDeviceGroupPresentCapabilities-parameter", "pDeviceGroupPresentCapabilities must be a valid pointer to a VkDeviceGroupPresentCapabilitiesKHR structure", "1.2-extensions"},
+ {"VUID-vkGetDeviceGroupSurfacePresentModes2EXT-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetDeviceGroupSurfacePresentModes2EXT-pModes-parameter", "pModes must be a valid pointer to a VkDeviceGroupPresentModeFlagsKHR value", "1.2-extensions"},
+ {"VUID-vkGetDeviceGroupSurfacePresentModes2EXT-pSurfaceInfo-parameter", "pSurfaceInfo must be a valid pointer to a valid VkPhysicalDeviceSurfaceInfo2KHR structure", "1.2-extensions"},
+ {"VUID-vkGetDeviceGroupSurfacePresentModesKHR-commonparent", "Both of device, and surface must have been created, allocated, or retrieved from the same VkInstance", "1.2-extensions"},
+ {"VUID-vkGetDeviceGroupSurfacePresentModesKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetDeviceGroupSurfacePresentModesKHR-pModes-parameter", "pModes must be a valid pointer to a VkDeviceGroupPresentModeFlagsKHR value", "1.2-extensions"},
+ {"VUID-vkGetDeviceGroupSurfacePresentModesKHR-surface-parameter", "surface must be a valid VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-vkGetDeviceMemoryCommitment-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetDeviceMemoryCommitment-memory-00690", "memory must have been created with a memory type that reports VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT", "1.2-extensions"},
+ {"VUID-vkGetDeviceMemoryCommitment-memory-parameter", "memory must be a valid VkDeviceMemory handle", "1.2-extensions"},
+ {"VUID-vkGetDeviceMemoryCommitment-memory-parent", "memory must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkGetDeviceMemoryCommitment-pCommittedMemoryInBytes-parameter", "pCommittedMemoryInBytes must be a valid pointer to a VkDeviceSize value", "1.2-extensions"},
+ {"VUID-vkGetDeviceMemoryOpaqueCaptureAddress-None-03334", "The bufferDeviceAddress feature must be enabled", "1.2-extensions"},
+ {"VUID-vkGetDeviceMemoryOpaqueCaptureAddress-device-03335", "If device was created with multiple physical devices, then the bufferDeviceAddressMultiDevice feature must be enabled", "1.2-extensions"},
+ {"VUID-vkGetDeviceMemoryOpaqueCaptureAddress-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetDeviceMemoryOpaqueCaptureAddress-pInfo-parameter", "pInfo must be a valid pointer to a valid VkDeviceMemoryOpaqueCaptureAddressInfo structure", "1.2-extensions"},
+ {"VUID-vkGetDeviceProcAddr-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetDeviceProcAddr-pName-parameter", "pName must be a null-terminated UTF-8 string", "1.2-extensions"},
+ {"VUID-vkGetDeviceQueue-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetDeviceQueue-flags-01841", "VkDeviceQueueCreateInfo::flags must have been set to zero when device was created", "1.2-extensions"},
+ {"VUID-vkGetDeviceQueue-pQueue-parameter", "pQueue must be a valid pointer to a VkQueue handle", "1.2-extensions"},
+ {"VUID-vkGetDeviceQueue-queueFamilyIndex-00384", "queueFamilyIndex must be one of the queue family indices specified when device was created, via the VkDeviceQueueCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkGetDeviceQueue-queueIndex-00385", "queueIndex must be less than the number of queues created for the specified queue family index when device was created, via the queueCount member of the VkDeviceQueueCreateInfo structure", "1.2-extensions"},
+ {"VUID-vkGetDeviceQueue2-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetDeviceQueue2-pQueue-parameter", "pQueue must be a valid pointer to a VkQueue handle", "1.2-extensions"},
+ {"VUID-vkGetDeviceQueue2-pQueueInfo-parameter", "pQueueInfo must be a valid pointer to a valid VkDeviceQueueInfo2 structure", "1.2-extensions"},
+ {"VUID-vkGetDisplayModeProperties2KHR-display-parameter", "display must be a valid VkDisplayKHR handle", "1.2-extensions"},
+ {"VUID-vkGetDisplayModeProperties2KHR-display-parent", "display must have been created, allocated, or retrieved from physicalDevice", "1.2-extensions"},
+ {"VUID-vkGetDisplayModeProperties2KHR-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkDisplayModeProperties2KHR structures", "1.2-extensions"},
+ {"VUID-vkGetDisplayModeProperties2KHR-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetDisplayModeProperties2KHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetDisplayModePropertiesKHR-display-parameter", "display must be a valid VkDisplayKHR handle", "1.2-extensions"},
+ {"VUID-vkGetDisplayModePropertiesKHR-display-parent", "display must have been created, allocated, or retrieved from physicalDevice", "1.2-extensions"},
+ {"VUID-vkGetDisplayModePropertiesKHR-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkDisplayModePropertiesKHR structures", "1.2-extensions"},
+ {"VUID-vkGetDisplayModePropertiesKHR-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetDisplayModePropertiesKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetDisplayPlaneCapabilities2KHR-pCapabilities-parameter", "pCapabilities must be a valid pointer to a VkDisplayPlaneCapabilities2KHR structure", "1.2-extensions"},
+ {"VUID-vkGetDisplayPlaneCapabilities2KHR-pDisplayPlaneInfo-parameter", "pDisplayPlaneInfo must be a valid pointer to a valid VkDisplayPlaneInfo2KHR structure", "1.2-extensions"},
+ {"VUID-vkGetDisplayPlaneCapabilities2KHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetDisplayPlaneCapabilitiesKHR-mode-parameter", "mode must be a valid VkDisplayModeKHR handle", "1.2-extensions"},
+ {"VUID-vkGetDisplayPlaneCapabilitiesKHR-pCapabilities-parameter", "pCapabilities must be a valid pointer to a VkDisplayPlaneCapabilitiesKHR structure", "1.2-extensions"},
+ {"VUID-vkGetDisplayPlaneCapabilitiesKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetDisplayPlaneSupportedDisplaysKHR-pDisplayCount-parameter", "pDisplayCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetDisplayPlaneSupportedDisplaysKHR-pDisplays-parameter", "If the value referenced by pDisplayCount is not 0, and pDisplays is not NULL, pDisplays must be a valid pointer to an array of pDisplayCount VkDisplayKHR handles", "1.2-extensions"},
+ {"VUID-vkGetDisplayPlaneSupportedDisplaysKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetDisplayPlaneSupportedDisplaysKHR-planeIndex-01249", "planeIndex must be less than the number of display planes supported by the device as determined by calling vkGetPhysicalDeviceDisplayPlanePropertiesKHR", "1.2-extensions"},
+ {"VUID-vkGetEventStatus-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetEventStatus-event-parameter", "event must be a valid VkEvent handle", "1.2-extensions"},
+ {"VUID-vkGetEventStatus-event-parent", "event must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkGetFenceFdKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetFenceFdKHR-pFd-parameter", "pFd must be a valid pointer to an int value", "1.2-extensions"},
+ {"VUID-vkGetFenceFdKHR-pGetFdInfo-parameter", "pGetFdInfo must be a valid pointer to a valid VkFenceGetFdInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkGetFenceStatus-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetFenceStatus-fence-parameter", "fence must be a valid VkFence handle", "1.2-extensions"},
+ {"VUID-vkGetFenceStatus-fence-parent", "fence must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkGetFenceWin32HandleKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetFenceWin32HandleKHR-pGetWin32HandleInfo-parameter", "pGetWin32HandleInfo must be a valid pointer to a valid VkFenceGetWin32HandleInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkGetFenceWin32HandleKHR-pHandle-parameter", "pHandle must be a valid pointer to a HANDLE value", "1.2-extensions"},
+ {"VUID-vkGetGeneratedCommandsMemoryRequirementsNV-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetGeneratedCommandsMemoryRequirementsNV-deviceGeneratedCommands-02906", "The VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV::deviceGeneratedCommands feature must be enabled", "1.2-extensions"},
+ {"VUID-vkGetGeneratedCommandsMemoryRequirementsNV-pInfo-parameter", "pInfo must be a valid pointer to a valid VkGeneratedCommandsMemoryRequirementsInfoNV structure", "1.2-extensions"},
+ {"VUID-vkGetGeneratedCommandsMemoryRequirementsNV-pMemoryRequirements-parameter", "pMemoryRequirements must be a valid pointer to a VkMemoryRequirements2 structure", "1.2-extensions"},
+ {"VUID-vkGetImageDrmFormatModifierPropertiesEXT-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetImageDrmFormatModifierPropertiesEXT-image-02272", "image must have been created with tiling equal to VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT", "1.2-extensions"},
+ {"VUID-vkGetImageDrmFormatModifierPropertiesEXT-image-parameter", "image must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-vkGetImageDrmFormatModifierPropertiesEXT-image-parent", "image must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkGetImageDrmFormatModifierPropertiesEXT-pProperties-parameter", "pProperties must be a valid pointer to a VkImageDrmFormatModifierPropertiesEXT structure", "1.2-extensions"},
+ {"VUID-vkGetImageMemoryRequirements-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetImageMemoryRequirements-image-01588", "image must not have been created with the VK_IMAGE_CREATE_DISJOINT_BIT flag set", "1.2-extensions"},
+ {"VUID-vkGetImageMemoryRequirements-image-04004", "If image was created with the VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID external memory handle type, then image must be bound to memory", "1.2-extensions"},
+ {"VUID-vkGetImageMemoryRequirements-image-parameter", "image must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-vkGetImageMemoryRequirements-image-parent", "image must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkGetImageMemoryRequirements-pMemoryRequirements-parameter", "pMemoryRequirements must be a valid pointer to a VkMemoryRequirements structure", "1.2-extensions"},
+ {"VUID-vkGetImageMemoryRequirements2-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetImageMemoryRequirements2-pInfo-parameter", "pInfo must be a valid pointer to a valid VkImageMemoryRequirementsInfo2 structure", "1.2-extensions"},
+ {"VUID-vkGetImageMemoryRequirements2-pMemoryRequirements-parameter", "pMemoryRequirements must be a valid pointer to a VkMemoryRequirements2 structure", "1.2-extensions"},
+ {"VUID-vkGetImageSparseMemoryRequirements-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetImageSparseMemoryRequirements-image-parameter", "image must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-vkGetImageSparseMemoryRequirements-image-parent", "image must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkGetImageSparseMemoryRequirements-pSparseMemoryRequirementCount-parameter", "pSparseMemoryRequirementCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetImageSparseMemoryRequirements-pSparseMemoryRequirements-parameter", "If the value referenced by pSparseMemoryRequirementCount is not 0, and pSparseMemoryRequirements is not NULL, pSparseMemoryRequirements must be a valid pointer to an array of pSparseMemoryRequirementCount VkSparseImageMemoryRequirements structures", "1.2-extensions"},
+ {"VUID-vkGetImageSparseMemoryRequirements2-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetImageSparseMemoryRequirements2-pInfo-parameter", "pInfo must be a valid pointer to a valid VkImageSparseMemoryRequirementsInfo2 structure", "1.2-extensions"},
+ {"VUID-vkGetImageSparseMemoryRequirements2-pSparseMemoryRequirementCount-parameter", "pSparseMemoryRequirementCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetImageSparseMemoryRequirements2-pSparseMemoryRequirements-parameter", "If the value referenced by pSparseMemoryRequirementCount is not 0, and pSparseMemoryRequirements is not NULL, pSparseMemoryRequirements must be a valid pointer to an array of pSparseMemoryRequirementCount VkSparseImageMemoryRequirements2 structures", "1.2-extensions"},
+ {"VUID-vkGetImageSubresourceLayout-arrayLayer-01717", "The arrayLayer member of pSubresource must be less than the arrayLayers specified in VkImageCreateInfo when image was created", "1.2-extensions"},
+ {"VUID-vkGetImageSubresourceLayout-aspectMask-00997", "The aspectMask member of pSubresource must only have a single bit set", "1.2-extensions"},
+ {"VUID-vkGetImageSubresourceLayout-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetImageSubresourceLayout-format-01581", "If the tiling of the image is VK_IMAGE_TILING_LINEAR and its format is a multi-planar format with two planes, the aspectMask member of pSubresource must be VK_IMAGE_ASPECT_PLANE_0_BIT or VK_IMAGE_ASPECT_PLANE_1_BIT", "1.2-extensions"},
+ {"VUID-vkGetImageSubresourceLayout-format-01582", "If the tiling of the image is VK_IMAGE_TILING_LINEAR and its format is a multi-planar format with three planes, the aspectMask member of pSubresource must be VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT or VK_IMAGE_ASPECT_PLANE_2_BIT", "1.2-extensions"},
+ {"VUID-vkGetImageSubresourceLayout-image-00996", "image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR", "1.2-khr-extensions"},
+ {"VUID-vkGetImageSubresourceLayout-image-01895", "If image was created with the VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID external memory handle type, then image must be bound to memory", "1.2-extensions"},
+ {"VUID-vkGetImageSubresourceLayout-image-02270", "image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR or VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT", "1.2-extensions"},
+ {"VUID-vkGetImageSubresourceLayout-image-parameter", "image must be a valid VkImage handle", "1.2-extensions"},
+ {"VUID-vkGetImageSubresourceLayout-image-parent", "image must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkGetImageSubresourceLayout-mipLevel-01716", "The mipLevel member of pSubresource must be less than the mipLevels specified in VkImageCreateInfo when image was created", "1.2-extensions"},
+ {"VUID-vkGetImageSubresourceLayout-pLayout-parameter", "pLayout must be a valid pointer to a VkSubresourceLayout structure", "1.2-extensions"},
+ {"VUID-vkGetImageSubresourceLayout-pSubresource-parameter", "pSubresource must be a valid pointer to a valid VkImageSubresource structure", "1.2-extensions"},
+ {"VUID-vkGetImageSubresourceLayout-tiling-02271", "If the tiling of the image is VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT, then the aspectMask member of pSubresource must be VK_IMAGE_ASPECT_MEMORY_PLANE_i_BIT_EXT and the index i must be less than the VkDrmFormatModifierPropertiesEXT::drmFormatModifierPlaneCount associated with the image's format and VkImageDrmFormatModifierPropertiesEXT::drmFormatModifier", "1.2-extensions"},
+ {"VUID-vkGetImageViewAddressNVX-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetImageViewAddressNVX-imageView-parameter", "imageView must be a valid VkImageView handle", "1.2-extensions"},
+ {"VUID-vkGetImageViewAddressNVX-imageView-parent", "imageView must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkGetImageViewAddressNVX-pProperties-parameter", "pProperties must be a valid pointer to a VkImageViewAddressPropertiesNVX structure", "1.2-extensions"},
+ {"VUID-vkGetImageViewHandleNVX-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetImageViewHandleNVX-pInfo-parameter", "pInfo must be a valid pointer to a valid VkImageViewHandleInfoNVX structure", "1.2-extensions"},
+ {"VUID-vkGetInstanceProcAddr-instance-parameter", "If instance is not NULL, instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkGetInstanceProcAddr-pName-parameter", "pName must be a null-terminated UTF-8 string", "1.2-extensions"},
+ {"VUID-vkGetMemoryAndroidHardwareBufferANDROID-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetMemoryAndroidHardwareBufferANDROID-pBuffer-parameter", "pBuffer must be a valid pointer to a valid pointer to an AHardwareBuffer value", "1.2-extensions"},
+ {"VUID-vkGetMemoryAndroidHardwareBufferANDROID-pInfo-parameter", "pInfo must be a valid pointer to a valid VkMemoryGetAndroidHardwareBufferInfoANDROID structure", "1.2-extensions"},
+ {"VUID-vkGetMemoryFdKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetMemoryFdKHR-pFd-parameter", "pFd must be a valid pointer to an int value", "1.2-extensions"},
+ {"VUID-vkGetMemoryFdKHR-pGetFdInfo-parameter", "pGetFdInfo must be a valid pointer to a valid VkMemoryGetFdInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkGetMemoryFdPropertiesKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetMemoryFdPropertiesKHR-fd-00673", "fd must be an external memory handle created outside of the Vulkan API", "1.2-extensions"},
+ {"VUID-vkGetMemoryFdPropertiesKHR-handleType-00674", "handleType must not be VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR", "1.2-extensions"},
+ {"VUID-vkGetMemoryFdPropertiesKHR-handleType-parameter", "handleType must be a valid VkExternalMemoryHandleTypeFlagBits value", "1.2-extensions"},
+ {"VUID-vkGetMemoryFdPropertiesKHR-pMemoryFdProperties-parameter", "pMemoryFdProperties must be a valid pointer to a VkMemoryFdPropertiesKHR structure", "1.2-extensions"},
+ {"VUID-vkGetMemoryHostPointerPropertiesEXT-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-01752", "handleType must be VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT or VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT", "1.2-extensions"},
+ {"VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-01754", "If handleType is VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT, pHostPointer must be a pointer to host memory", "1.2-extensions"},
+ {"VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-01755", "If handleType is VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT, pHostPointer must be a pointer to host mapped foreign memory", "1.2-extensions"},
+ {"VUID-vkGetMemoryHostPointerPropertiesEXT-handleType-parameter", "handleType must be a valid VkExternalMemoryHandleTypeFlagBits value", "1.2-extensions"},
+ {"VUID-vkGetMemoryHostPointerPropertiesEXT-pHostPointer-01753", "pHostPointer must be a pointer aligned to an integer multiple of VkPhysicalDeviceExternalMemoryHostPropertiesEXT::minImportedHostPointerAlignment", "1.2-extensions"},
+ {"VUID-vkGetMemoryHostPointerPropertiesEXT-pMemoryHostPointerProperties-parameter", "pMemoryHostPointerProperties must be a valid pointer to a VkMemoryHostPointerPropertiesEXT structure", "1.2-extensions"},
+ {"VUID-vkGetMemoryWin32HandleKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetMemoryWin32HandleKHR-pGetWin32HandleInfo-parameter", "pGetWin32HandleInfo must be a valid pointer to a valid VkMemoryGetWin32HandleInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkGetMemoryWin32HandleKHR-pHandle-parameter", "pHandle must be a valid pointer to a HANDLE value", "1.2-extensions"},
+ {"VUID-vkGetMemoryWin32HandleNV-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetMemoryWin32HandleNV-handleType-01326", "handleType must be a flag specified in VkExportMemoryAllocateInfoNV::handleTypes when allocating memory", "1.2-extensions"},
+ {"VUID-vkGetMemoryWin32HandleNV-handleType-parameter", "handleType must be a valid combination of VkExternalMemoryHandleTypeFlagBitsNV values", "1.2-extensions"},
+ {"VUID-vkGetMemoryWin32HandleNV-handleType-requiredbitmask", "handleType must not be 0", "1.2-extensions"},
+ {"VUID-vkGetMemoryWin32HandleNV-memory-parameter", "memory must be a valid VkDeviceMemory handle", "1.2-extensions"},
+ {"VUID-vkGetMemoryWin32HandleNV-memory-parent", "memory must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkGetMemoryWin32HandleNV-pHandle-parameter", "pHandle must be a valid pointer to a HANDLE value", "1.2-extensions"},
+ {"VUID-vkGetMemoryWin32HandlePropertiesKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetMemoryWin32HandlePropertiesKHR-handle-00665", "handle must be an external memory handle created outside of the Vulkan API", "1.2-extensions"},
+ {"VUID-vkGetMemoryWin32HandlePropertiesKHR-handleType-00666", "handleType must not be one of the handle types defined as opaque", "1.2-extensions"},
+ {"VUID-vkGetMemoryWin32HandlePropertiesKHR-handleType-parameter", "handleType must be a valid VkExternalMemoryHandleTypeFlagBits value", "1.2-extensions"},
+ {"VUID-vkGetMemoryWin32HandlePropertiesKHR-pMemoryWin32HandleProperties-parameter", "pMemoryWin32HandleProperties must be a valid pointer to a VkMemoryWin32HandlePropertiesKHR structure", "1.2-extensions"},
+ {"VUID-vkGetPastPresentationTimingGOOGLE-commonparent", "Both of device, and swapchain must have been created, allocated, or retrieved from the same VkInstance", "1.2-extensions"},
+ {"VUID-vkGetPastPresentationTimingGOOGLE-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPastPresentationTimingGOOGLE-pPresentationTimingCount-parameter", "pPresentationTimingCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetPastPresentationTimingGOOGLE-pPresentationTimings-parameter", "If the value referenced by pPresentationTimingCount is not 0, and pPresentationTimings is not NULL, pPresentationTimings must be a valid pointer to an array of pPresentationTimingCount VkPastPresentationTimingGOOGLE structures", "1.2-extensions"},
+ {"VUID-vkGetPastPresentationTimingGOOGLE-swapchain-parameter", "swapchain must be a valid VkSwapchainKHR handle", "1.2-extensions"},
+ {"VUID-vkGetPerformanceParameterINTEL-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPerformanceParameterINTEL-pValue-parameter", "pValue must be a valid pointer to a VkPerformanceValueINTEL structure", "1.2-extensions"},
+ {"VUID-vkGetPerformanceParameterINTEL-parameter-parameter", "parameter must be a valid VkPerformanceParameterTypeINTEL value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceCalibrateableTimeDomainsEXT-pTimeDomainCount-parameter", "pTimeDomainCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceCalibrateableTimeDomainsEXT-pTimeDomains-parameter", "If the value referenced by pTimeDomainCount is not 0, and pTimeDomains is not NULL, pTimeDomains must be a valid pointer to an array of pTimeDomainCount VkTimeDomainEXT values", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceCalibrateableTimeDomainsEXT-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceCooperativeMatrixPropertiesNV-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkCooperativeMatrixPropertiesNV structures", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceCooperativeMatrixPropertiesNV-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceCooperativeMatrixPropertiesNV-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceDirectFBPresentationSupportEXT-dfb-parameter", "dfb must be a valid pointer to an IDirectFB value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceDirectFBPresentationSupportEXT-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceDirectFBPresentationSupportEXT-queueFamilyIndex-04119", "queueFamilyIndex must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the given physicalDevice", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceDisplayPlaneProperties2KHR-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkDisplayPlaneProperties2KHR structures", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceDisplayPlaneProperties2KHR-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceDisplayPlaneProperties2KHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceDisplayPlanePropertiesKHR-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkDisplayPlanePropertiesKHR structures", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceDisplayPlanePropertiesKHR-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceDisplayPlanePropertiesKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceDisplayProperties2KHR-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkDisplayProperties2KHR structures", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceDisplayProperties2KHR-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceDisplayProperties2KHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceDisplayPropertiesKHR-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkDisplayPropertiesKHR structures", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceDisplayPropertiesKHR-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceDisplayPropertiesKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceExternalBufferProperties-pExternalBufferInfo-parameter", "pExternalBufferInfo must be a valid pointer to a valid VkPhysicalDeviceExternalBufferInfo structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceExternalBufferProperties-pExternalBufferProperties-parameter", "pExternalBufferProperties must be a valid pointer to a VkExternalBufferProperties structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceExternalBufferProperties-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceExternalFenceProperties-pExternalFenceInfo-parameter", "pExternalFenceInfo must be a valid pointer to a valid VkPhysicalDeviceExternalFenceInfo structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceExternalFenceProperties-pExternalFenceProperties-parameter", "pExternalFenceProperties must be a valid pointer to a VkExternalFenceProperties structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceExternalFenceProperties-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-externalHandleType-parameter", "externalHandleType must be a valid combination of VkExternalMemoryHandleTypeFlagBitsNV values", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-flags-parameter", "flags must be a valid combination of VkImageCreateFlagBits values", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-format-parameter", "format must be a valid VkFormat value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-pExternalImageFormatProperties-parameter", "pExternalImageFormatProperties must be a valid pointer to a VkExternalImageFormatPropertiesNV structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-tiling-parameter", "tiling must be a valid VkImageTiling value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-type-parameter", "type must be a valid VkImageType value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-usage-parameter", "usage must be a valid combination of VkImageUsageFlagBits values", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceExternalImageFormatPropertiesNV-usage-requiredbitmask", "usage must not be 0", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-pExternalSemaphoreInfo-parameter", "pExternalSemaphoreInfo must be a valid pointer to a valid VkPhysicalDeviceExternalSemaphoreInfo structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-pExternalSemaphoreProperties-parameter", "pExternalSemaphoreProperties must be a valid pointer to a VkExternalSemaphoreProperties structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceFeatures-pFeatures-parameter", "pFeatures must be a valid pointer to a VkPhysicalDeviceFeatures structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceFeatures-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceFeatures2-pFeatures-parameter", "pFeatures must be a valid pointer to a VkPhysicalDeviceFeatures2 structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceFeatures2-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceFormatProperties-format-parameter", "format must be a valid VkFormat value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceFormatProperties-pFormatProperties-parameter", "pFormatProperties must be a valid pointer to a VkFormatProperties structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceFormatProperties-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceFormatProperties2-format-parameter", "format must be a valid VkFormat value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceFormatProperties2-pFormatProperties-parameter", "pFormatProperties must be a valid pointer to a VkFormatProperties2 structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceFormatProperties2-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceImageFormatProperties-flags-parameter", "flags must be a valid combination of VkImageCreateFlagBits values", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceImageFormatProperties-format-parameter", "format must be a valid VkFormat value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceImageFormatProperties-pImageFormatProperties-parameter", "pImageFormatProperties must be a valid pointer to a VkImageFormatProperties structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceImageFormatProperties-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceImageFormatProperties-tiling-02248", "tiling must not be VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT. (Use vkGetPhysicalDeviceImageFormatProperties2 instead)", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceImageFormatProperties-tiling-parameter", "tiling must be a valid VkImageTiling value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceImageFormatProperties-type-parameter", "type must be a valid VkImageType value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceImageFormatProperties-usage-parameter", "usage must be a valid combination of VkImageUsageFlagBits values", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceImageFormatProperties-usage-requiredbitmask", "usage must not be 0", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatInfo-parameter", "pImageFormatInfo must be a valid pointer to a valid VkPhysicalDeviceImageFormatInfo2 structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatProperties-parameter", "pImageFormatProperties must be a valid pointer to a VkImageFormatProperties2 structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceImageFormatProperties2-pNext-01868", "If the pNext chain of pImageFormatProperties includes a VkAndroidHardwareBufferUsageANDROID structure, the pNext chain of pImageFormatInfo must include a VkPhysicalDeviceExternalImageFormatInfo structure with handleType set to VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceImageFormatProperties2-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceMemoryProperties-pMemoryProperties-parameter", "pMemoryProperties must be a valid pointer to a VkPhysicalDeviceMemoryProperties structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceMemoryProperties-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceMemoryProperties2-pMemoryProperties-parameter", "pMemoryProperties must be a valid pointer to a VkPhysicalDeviceMemoryProperties2 structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceMemoryProperties2-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceMultisamplePropertiesEXT-pMultisampleProperties-parameter", "pMultisampleProperties must be a valid pointer to a VkMultisamplePropertiesEXT structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceMultisamplePropertiesEXT-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceMultisamplePropertiesEXT-samples-parameter", "samples must be a valid VkSampleCountFlagBits value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDevicePresentRectanglesKHR-commonparent", "Both of physicalDevice, and surface must have been created, allocated, or retrieved from the same VkInstance", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDevicePresentRectanglesKHR-pRectCount-parameter", "pRectCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDevicePresentRectanglesKHR-pRects-parameter", "If the value referenced by pRectCount is not 0, and pRects is not NULL, pRects must be a valid pointer to an array of pRectCount VkRect2D structures", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDevicePresentRectanglesKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDevicePresentRectanglesKHR-surface-parameter", "surface must be a valid VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceProperties-pProperties-parameter", "pProperties must be a valid pointer to a VkPhysicalDeviceProperties structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceProperties-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceProperties2-pProperties-parameter", "pProperties must be a valid pointer to a VkPhysicalDeviceProperties2 structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceProperties2-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR-pNumPasses-parameter", "pNumPasses must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR-pPerformanceQueryCreateInfo-parameter", "pPerformanceQueryCreateInfo must be a valid pointer to a valid VkQueryPoolPerformanceCreateInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceQueueFamilyProperties-pQueueFamilyProperties-parameter", "If the value referenced by pQueueFamilyPropertyCount is not 0, and pQueueFamilyProperties is not NULL, pQueueFamilyProperties must be a valid pointer to an array of pQueueFamilyPropertyCount VkQueueFamilyProperties structures", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceQueueFamilyProperties-pQueueFamilyPropertyCount-parameter", "pQueueFamilyPropertyCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceQueueFamilyProperties-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceQueueFamilyProperties2-pQueueFamilyProperties-parameter", "If the value referenced by pQueueFamilyPropertyCount is not 0, and pQueueFamilyProperties is not NULL, pQueueFamilyProperties must be a valid pointer to an array of pQueueFamilyPropertyCount VkQueueFamilyProperties2 structures", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceQueueFamilyProperties2-pQueueFamilyPropertyCount-parameter", "pQueueFamilyPropertyCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceQueueFamilyProperties2-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-format-parameter", "format must be a valid VkFormat value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkSparseImageFormatProperties structures", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-samples-01094", "samples must be a bit value that is set in VkImageFormatProperties::sampleCounts returned by vkGetPhysicalDeviceImageFormatProperties with format, type, tiling, and usage equal to those in this command and flags equal to the value that is set in VkImageCreateInfo::flags when the image is created", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-samples-parameter", "samples must be a valid VkSampleCountFlagBits value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-tiling-parameter", "tiling must be a valid VkImageTiling value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-type-parameter", "type must be a valid VkImageType value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-usage-parameter", "usage must be a valid combination of VkImageUsageFlagBits values", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties-usage-requiredbitmask", "usage must not be 0", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pFormatInfo-parameter", "pFormatInfo must be a valid pointer to a valid VkPhysicalDeviceSparseImageFormatInfo2 structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pProperties-parameter", "If the value referenced by pPropertyCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pPropertyCount VkSparseImageFormatProperties2 structures", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pPropertyCount-parameter", "pPropertyCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV-pCombinationCount-parameter", "pCombinationCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV-pCombinations-parameter", "If the value referenced by pCombinationCount is not 0, and pCombinations is not NULL, pCombinations must be a valid pointer to an array of pCombinationCount VkFramebufferMixedSamplesCombinationNV structures", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-commonparent", "Both of physicalDevice, and surface must have been created, allocated, or retrieved from the same VkInstance", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-pSurfaceCapabilities-parameter", "pSurfaceCapabilities must be a valid pointer to a VkSurfaceCapabilities2EXT structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2EXT-surface-parameter", "surface must be a valid VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2KHR-pNext-02671", "If a VkSurfaceCapabilitiesFullScreenExclusiveEXT structure is included in the pNext chain of pSurfaceCapabilities, a VkSurfaceFullScreenExclusiveWin32InfoEXT structure must be included in the pNext chain of pSurfaceInfo", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2KHR-pSurfaceCapabilities-parameter", "pSurfaceCapabilities must be a valid pointer to a VkSurfaceCapabilities2KHR structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2KHR-pSurfaceInfo-parameter", "pSurfaceInfo must be a valid pointer to a valid VkPhysicalDeviceSurfaceInfo2KHR structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceCapabilities2KHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceCapabilitiesKHR-commonparent", "Both of physicalDevice, and surface must have been created, allocated, or retrieved from the same VkInstance", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceCapabilitiesKHR-pSurfaceCapabilities-parameter", "pSurfaceCapabilities must be a valid pointer to a VkSurfaceCapabilitiesKHR structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceCapabilitiesKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceCapabilitiesKHR-surface-parameter", "surface must be a valid VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-pSurfaceFormatCount-parameter", "pSurfaceFormatCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-pSurfaceFormats-parameter", "If the value referenced by pSurfaceFormatCount is not 0, and pSurfaceFormats is not NULL, pSurfaceFormats must be a valid pointer to an array of pSurfaceFormatCount VkSurfaceFormat2KHR structures", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-pSurfaceInfo-02740", "pSurfaceInfo->surface must be supported by physicalDevice, as reported by vkGetPhysicalDeviceSurfaceSupportKHR or an equivalent platform-specific mechanism", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-pSurfaceInfo-parameter", "pSurfaceInfo must be a valid pointer to a valid VkPhysicalDeviceSurfaceInfo2KHR structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceFormats2KHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-commonparent", "Both of physicalDevice, and surface must have been created, allocated, or retrieved from the same VkInstance", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-pSurfaceFormatCount-parameter", "pSurfaceFormatCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-pSurfaceFormats-parameter", "If the value referenced by pSurfaceFormatCount is not 0, and pSurfaceFormats is not NULL, pSurfaceFormats must be a valid pointer to an array of pSurfaceFormatCount VkSurfaceFormatKHR structures", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-surface-02739", "surface must be supported by physicalDevice, as reported by vkGetPhysicalDeviceSurfaceSupportKHR or an equivalent platform-specific mechanism", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceFormatsKHR-surface-parameter", "surface must be a valid VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfacePresentModes2EXT-pPresentModeCount-parameter", "pPresentModeCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfacePresentModes2EXT-pPresentModes-parameter", "If the value referenced by pPresentModeCount is not 0, and pPresentModes is not NULL, pPresentModes must be a valid pointer to an array of pPresentModeCount VkPresentModeKHR values", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfacePresentModes2EXT-pSurfaceInfo-parameter", "pSurfaceInfo must be a valid pointer to a valid VkPhysicalDeviceSurfaceInfo2KHR structure", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfacePresentModes2EXT-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-commonparent", "Both of physicalDevice, and surface must have been created, allocated, or retrieved from the same VkInstance", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-pPresentModeCount-parameter", "pPresentModeCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-pPresentModes-parameter", "If the value referenced by pPresentModeCount is not 0, and pPresentModes is not NULL, pPresentModes must be a valid pointer to an array of pPresentModeCount VkPresentModeKHR values", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfacePresentModesKHR-surface-parameter", "surface must be a valid VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceSupportKHR-commonparent", "Both of physicalDevice, and surface must have been created, allocated, or retrieved from the same VkInstance", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceSupportKHR-pSupported-parameter", "pSupported must be a valid pointer to a VkBool32 value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceSupportKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceSupportKHR-queueFamilyIndex-01269", "queueFamilyIndex must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the given physicalDevice", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceSurfaceSupportKHR-surface-parameter", "surface must be a valid VkSurfaceKHR handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceToolPropertiesEXT-pToolCount-parameter", "pToolCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceToolPropertiesEXT-pToolProperties-parameter", "If the value referenced by pToolCount is not 0, and pToolProperties is not NULL, pToolProperties must be a valid pointer to an array of pToolCount VkPhysicalDeviceToolPropertiesEXT structures", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceToolPropertiesEXT-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceWaylandPresentationSupportKHR-display-parameter", "display must be a valid pointer to a wl_display value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceWaylandPresentationSupportKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceWaylandPresentationSupportKHR-queueFamilyIndex-01306", "queueFamilyIndex must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the given physicalDevice", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceWin32PresentationSupportKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceWin32PresentationSupportKHR-queueFamilyIndex-01309", "queueFamilyIndex must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the given physicalDevice", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceXcbPresentationSupportKHR-connection-parameter", "connection must be a valid pointer to an xcb_connection_t value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceXcbPresentationSupportKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceXcbPresentationSupportKHR-queueFamilyIndex-01312", "queueFamilyIndex must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the given physicalDevice", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceXlibPresentationSupportKHR-dpy-parameter", "dpy must be a valid pointer to a Display value", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceXlibPresentationSupportKHR-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPhysicalDeviceXlibPresentationSupportKHR-queueFamilyIndex-01315", "queueFamilyIndex must be less than pQueueFamilyPropertyCount returned by vkGetPhysicalDeviceQueueFamilyProperties for the given physicalDevice", "1.2-extensions"},
+ {"VUID-vkGetPipelineCacheData-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPipelineCacheData-pData-parameter", "If the value referenced by pDataSize is not 0, and pData is not NULL, pData must be a valid pointer to an array of pDataSize bytes", "1.2-extensions"},
+ {"VUID-vkGetPipelineCacheData-pDataSize-parameter", "pDataSize must be a valid pointer to a size_t value", "1.2-extensions"},
+ {"VUID-vkGetPipelineCacheData-pipelineCache-parameter", "pipelineCache must be a valid VkPipelineCache handle", "1.2-extensions"},
+ {"VUID-vkGetPipelineCacheData-pipelineCache-parent", "pipelineCache must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkGetPipelineExecutableInternalRepresentationsKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pExecutableInfo-parameter", "pExecutableInfo must be a valid pointer to a valid VkPipelineExecutableInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pInternalRepresentationCount-parameter", "pInternalRepresentationCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pInternalRepresentations-parameter", "If the value referenced by pInternalRepresentationCount is not 0, and pInternalRepresentations is not NULL, pInternalRepresentations must be a valid pointer to an array of pInternalRepresentationCount VkPipelineExecutableInternalRepresentationKHR structures", "1.2-extensions"},
+ {"VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pipeline-03277", "pipeline member of pExecutableInfo must have been created with device", "1.2-extensions"},
+ {"VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pipeline-03278", "pipeline member of pExecutableInfo must have been created with VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR set in the flags field of VkGraphicsPipelineCreateInfo or VkComputePipelineCreateInfo", "1.2-extensions"},
+ {"VUID-vkGetPipelineExecutableInternalRepresentationsKHR-pipelineExecutableInfo-03276", "pipelineExecutableInfo must be enabled", "1.2-extensions"},
+ {"VUID-vkGetPipelineExecutablePropertiesKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPipelineExecutablePropertiesKHR-pExecutableCount-parameter", "pExecutableCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetPipelineExecutablePropertiesKHR-pPipelineInfo-parameter", "pPipelineInfo must be a valid pointer to a valid VkPipelineInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkGetPipelineExecutablePropertiesKHR-pProperties-parameter", "If the value referenced by pExecutableCount is not 0, and pProperties is not NULL, pProperties must be a valid pointer to an array of pExecutableCount VkPipelineExecutablePropertiesKHR structures", "1.2-extensions"},
+ {"VUID-vkGetPipelineExecutablePropertiesKHR-pipeline-03271", "pipeline member of pPipelineInfo must have been created with device", "1.2-extensions"},
+ {"VUID-vkGetPipelineExecutablePropertiesKHR-pipelineExecutableInfo-03270", "pipelineExecutableInfo must be enabled", "1.2-extensions"},
+ {"VUID-vkGetPipelineExecutableStatisticsKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPipelineExecutableStatisticsKHR-pExecutableInfo-parameter", "pExecutableInfo must be a valid pointer to a valid VkPipelineExecutableInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkGetPipelineExecutableStatisticsKHR-pStatisticCount-parameter", "pStatisticCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetPipelineExecutableStatisticsKHR-pStatistics-parameter", "If the value referenced by pStatisticCount is not 0, and pStatistics is not NULL, pStatistics must be a valid pointer to an array of pStatisticCount VkPipelineExecutableStatisticKHR structures", "1.2-extensions"},
+ {"VUID-vkGetPipelineExecutableStatisticsKHR-pipeline-03273", "pipeline member of pExecutableInfo must have been created with device", "1.2-extensions"},
+ {"VUID-vkGetPipelineExecutableStatisticsKHR-pipeline-03274", "pipeline member of pExecutableInfo must have been created with VK_PIPELINE_CREATE_CAPTURE_STATISTICS_BIT_KHR set in the flags field of VkGraphicsPipelineCreateInfo or VkComputePipelineCreateInfo", "1.2-extensions"},
+ {"VUID-vkGetPipelineExecutableStatisticsKHR-pipelineExecutableInfo-03272", "pipelineExecutableInfo must be enabled", "1.2-extensions"},
+ {"VUID-vkGetPrivateDataEXT-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetPrivateDataEXT-objectType-04018", "objectType must be VkDevice or an object type whose parent is VkDevice", "1.2-extensions"},
+ {"VUID-vkGetPrivateDataEXT-objectType-parameter", "objectType must be a valid VkObjectType value", "1.2-extensions"},
+ {"VUID-vkGetPrivateDataEXT-pData-parameter", "pData must be a valid pointer to a uint64_t value", "1.2-extensions"},
+ {"VUID-vkGetPrivateDataEXT-privateDataSlot-parameter", "privateDataSlot must be a valid VkPrivateDataSlotEXT handle", "1.2-extensions"},
+ {"VUID-vkGetPrivateDataEXT-privateDataSlot-parent", "privateDataSlot must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkGetQueryPoolResults-dataSize-00817", "dataSize must be large enough to contain the result of each query, as described here", "1.2-extensions"},
+ {"VUID-vkGetQueryPoolResults-dataSize-arraylength", "dataSize must be greater than 0", "1.2-extensions"},
+ {"VUID-vkGetQueryPoolResults-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetQueryPoolResults-firstQuery-00813", "firstQuery must be less than the number of queries in queryPool", "1.2-extensions"},
+ {"VUID-vkGetQueryPoolResults-firstQuery-00816", "The sum of firstQuery and queryCount must be less than or equal to the number of queries in queryPool", "1.2-extensions"},
+ {"VUID-vkGetQueryPoolResults-flags-00815", "If VK_QUERY_RESULT_64_BIT is set in flags then pData and stride must be multiples of 8", "1.2-extensions"},
+ {"VUID-vkGetQueryPoolResults-flags-02827", "If VK_QUERY_RESULT_64_BIT is not set in flags, then pData and stride must be multiples of 4", "1.2-extensions"},
+ {"VUID-vkGetQueryPoolResults-flags-02828", "If VK_QUERY_RESULT_64_BIT is not set in flags and the queryType used to create queryPool was not VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, then pData and stride must be multiples of 4", "1.2-extensions"},
+ {"VUID-vkGetQueryPoolResults-flags-parameter", "flags must be a valid combination of VkQueryResultFlagBits values", "1.2-extensions"},
+ {"VUID-vkGetQueryPoolResults-pData-parameter", "pData must be a valid pointer to an array of dataSize bytes", "1.2-extensions"},
+ {"VUID-vkGetQueryPoolResults-queryPool-parameter", "queryPool must be a valid VkQueryPool handle", "1.2-extensions"},
+ {"VUID-vkGetQueryPoolResults-queryPool-parent", "queryPool must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkGetQueryPoolResults-queryType-00818", "If the queryType used to create queryPool was VK_QUERY_TYPE_TIMESTAMP, flags must not contain VK_QUERY_RESULT_PARTIAL_BIT", "1.2-extensions"},
+ {"VUID-vkGetQueryPoolResults-queryType-03229", "If the queryType used to create queryPool was VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, then pData and stride must be multiples of the size of VkPerformanceCounterResultKHR", "1.2-extensions"},
+ {"VUID-vkGetQueryPoolResults-queryType-03230", "If the queryType used to create queryPool was VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, flags must not contain VK_QUERY_RESULT_WITH_AVAILABILITY_BIT, VK_QUERY_RESULT_PARTIAL_BIT or VK_QUERY_RESULT_64_BIT", "1.2-extensions"},
+ {"VUID-vkGetQueryPoolResults-queryType-03231", "If the queryType used to create queryPool was VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, the queryPool must have been recorded once for each pass as retrieved via a call to vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR", "1.2-extensions"},
+ {"VUID-vkGetQueueCheckpointDataNV-pCheckpointData-parameter", "If the value referenced by pCheckpointDataCount is not 0, and pCheckpointData is not NULL, pCheckpointData must be a valid pointer to an array of pCheckpointDataCount VkCheckpointDataNV structures", "1.2-extensions"},
+ {"VUID-vkGetQueueCheckpointDataNV-pCheckpointDataCount-parameter", "pCheckpointDataCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetQueueCheckpointDataNV-queue-02025", "The device that queue belongs to must be in the lost state", "1.2-extensions"},
+ {"VUID-vkGetQueueCheckpointDataNV-queue-parameter", "queue must be a valid VkQueue handle", "1.2-extensions"},
+ {"VUID-vkGetRandROutputDisplayEXT-dpy-parameter", "dpy must be a valid pointer to a Display value", "1.2-extensions"},
+ {"VUID-vkGetRandROutputDisplayEXT-pDisplay-parameter", "pDisplay must be a valid pointer to a VkDisplayKHR handle", "1.2-extensions"},
+ {"VUID-vkGetRandROutputDisplayEXT-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-dataSize-03484", "dataSize must be at least VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleCaptureReplaySize {times} groupCount", "1.2-extensions"},
+ {"VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-dataSize-arraylength", "dataSize must be greater than 0", "1.2-extensions"},
+ {"VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-firstGroup-03483", "The sum of firstGroup and groupCount must be less than or equal to the number of shader groups in pipeline", "1.2-extensions"},
+ {"VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-firstGroup-04051", "firstGroup must be less than the number of shader groups in pipeline", "1.2-extensions"},
+ {"VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pData-parameter", "pData must be a valid pointer to an array of dataSize bytes", "1.2-extensions"},
+ {"VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pipeline-parameter", "pipeline must be a valid VkPipeline handle", "1.2-extensions"},
+ {"VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-pipeline-parent", "pipeline must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-rayTracingShaderGroupHandleCaptureReplay-03485", "VkPhysicalDeviceRayTracingFeaturesKHR::rayTracingShaderGroupHandleCaptureReplay must be enabled to call this function", "1.2-extensions"},
+ {"VUID-vkGetRayTracingShaderGroupHandlesKHR-dataSize-02420", "dataSize must be at least VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize {times} groupCount", "1.2-extensions"},
+ {"VUID-vkGetRayTracingShaderGroupHandlesKHR-dataSize-arraylength", "dataSize must be greater than 0", "1.2-extensions"},
+ {"VUID-vkGetRayTracingShaderGroupHandlesKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetRayTracingShaderGroupHandlesKHR-firstGroup-02419", "The sum of firstGroup and groupCount must be less than or equal to the number of shader groups in pipeline", "1.2-extensions"},
+ {"VUID-vkGetRayTracingShaderGroupHandlesKHR-firstGroup-04050", "firstGroup must be less than the number of shader groups in pipeline", "1.2-extensions"},
+ {"VUID-vkGetRayTracingShaderGroupHandlesKHR-pData-parameter", "pData must be a valid pointer to an array of dataSize bytes", "1.2-extensions"},
+ {"VUID-vkGetRayTracingShaderGroupHandlesKHR-pipeline-03482", "pipeline must have not been created with VK_PIPELINE_CREATE_LIBRARY_BIT_KHR", "1.2-extensions"},
+ {"VUID-vkGetRayTracingShaderGroupHandlesKHR-pipeline-parameter", "pipeline must be a valid VkPipeline handle", "1.2-extensions"},
+ {"VUID-vkGetRayTracingShaderGroupHandlesKHR-pipeline-parent", "pipeline must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkGetRefreshCycleDurationGOOGLE-commonparent", "Both of device, and swapchain must have been created, allocated, or retrieved from the same VkInstance", "1.2-extensions"},
+ {"VUID-vkGetRefreshCycleDurationGOOGLE-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetRefreshCycleDurationGOOGLE-pDisplayTimingProperties-parameter", "pDisplayTimingProperties must be a valid pointer to a VkRefreshCycleDurationGOOGLE structure", "1.2-extensions"},
+ {"VUID-vkGetRefreshCycleDurationGOOGLE-swapchain-parameter", "swapchain must be a valid VkSwapchainKHR handle", "1.2-extensions"},
+ {"VUID-vkGetRenderAreaGranularity-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetRenderAreaGranularity-pGranularity-parameter", "pGranularity must be a valid pointer to a VkExtent2D structure", "1.2-extensions"},
+ {"VUID-vkGetRenderAreaGranularity-renderPass-parameter", "renderPass must be a valid VkRenderPass handle", "1.2-extensions"},
+ {"VUID-vkGetRenderAreaGranularity-renderPass-parent", "renderPass must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkGetSemaphoreCounterValue-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetSemaphoreCounterValue-pValue-parameter", "pValue must be a valid pointer to a uint64_t value", "1.2-extensions"},
+ {"VUID-vkGetSemaphoreCounterValue-semaphore-03255", "semaphore must have been created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_TIMELINE", "1.2-extensions"},
+ {"VUID-vkGetSemaphoreCounterValue-semaphore-parameter", "semaphore must be a valid VkSemaphore handle", "1.2-extensions"},
+ {"VUID-vkGetSemaphoreCounterValue-semaphore-parent", "semaphore must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkGetSemaphoreFdKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetSemaphoreFdKHR-pFd-parameter", "pFd must be a valid pointer to an int value", "1.2-extensions"},
+ {"VUID-vkGetSemaphoreFdKHR-pGetFdInfo-parameter", "pGetFdInfo must be a valid pointer to a valid VkSemaphoreGetFdInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkGetSemaphoreWin32HandleKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetSemaphoreWin32HandleKHR-pGetWin32HandleInfo-parameter", "pGetWin32HandleInfo must be a valid pointer to a valid VkSemaphoreGetWin32HandleInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkGetSemaphoreWin32HandleKHR-pHandle-parameter", "pHandle must be a valid pointer to a HANDLE value", "1.2-extensions"},
+ {"VUID-vkGetShaderInfoAMD-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetShaderInfoAMD-infoType-parameter", "infoType must be a valid VkShaderInfoTypeAMD value", "1.2-extensions"},
+ {"VUID-vkGetShaderInfoAMD-pInfo-parameter", "If the value referenced by pInfoSize is not 0, and pInfo is not NULL, pInfo must be a valid pointer to an array of pInfoSize bytes", "1.2-extensions"},
+ {"VUID-vkGetShaderInfoAMD-pInfoSize-parameter", "pInfoSize must be a valid pointer to a size_t value", "1.2-extensions"},
+ {"VUID-vkGetShaderInfoAMD-pipeline-parameter", "pipeline must be a valid VkPipeline handle", "1.2-extensions"},
+ {"VUID-vkGetShaderInfoAMD-pipeline-parent", "pipeline must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkGetShaderInfoAMD-shaderStage-parameter", "shaderStage must be a valid VkShaderStageFlagBits value", "1.2-extensions"},
+ {"VUID-vkGetSwapchainCounterEXT-commonparent", "Both of device, and swapchain must have been created, allocated, or retrieved from the same VkInstance", "1.2-extensions"},
+ {"VUID-vkGetSwapchainCounterEXT-counter-parameter", "counter must be a valid VkSurfaceCounterFlagBitsEXT value", "1.2-extensions"},
+ {"VUID-vkGetSwapchainCounterEXT-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetSwapchainCounterEXT-pCounterValue-parameter", "pCounterValue must be a valid pointer to a uint64_t value", "1.2-extensions"},
+ {"VUID-vkGetSwapchainCounterEXT-swapchain-01245", "One or more present commands on swapchain must have been processed by the presentation engine", "1.2-extensions"},
+ {"VUID-vkGetSwapchainCounterEXT-swapchain-parameter", "swapchain must be a valid VkSwapchainKHR handle", "1.2-extensions"},
+ {"VUID-vkGetSwapchainImagesKHR-commonparent", "Both of device, and swapchain must have been created, allocated, or retrieved from the same VkInstance", "1.2-extensions"},
+ {"VUID-vkGetSwapchainImagesKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetSwapchainImagesKHR-pSwapchainImageCount-parameter", "pSwapchainImageCount must be a valid pointer to a uint32_t value", "1.2-extensions"},
+ {"VUID-vkGetSwapchainImagesKHR-pSwapchainImages-parameter", "If the value referenced by pSwapchainImageCount is not 0, and pSwapchainImages is not NULL, pSwapchainImages must be a valid pointer to an array of pSwapchainImageCount VkImage handles", "1.2-extensions"},
+ {"VUID-vkGetSwapchainImagesKHR-swapchain-parameter", "swapchain must be a valid VkSwapchainKHR handle", "1.2-extensions"},
+ {"VUID-vkGetSwapchainStatusKHR-commonparent", "Both of device, and swapchain must have been created, allocated, or retrieved from the same VkInstance", "1.2-extensions"},
+ {"VUID-vkGetSwapchainStatusKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetSwapchainStatusKHR-swapchain-parameter", "swapchain must be a valid VkSwapchainKHR handle", "1.2-extensions"},
+ {"VUID-vkGetValidationCacheDataEXT-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkGetValidationCacheDataEXT-pData-parameter", "If the value referenced by pDataSize is not 0, and pData is not NULL, pData must be a valid pointer to an array of pDataSize bytes", "1.2-extensions"},
+ {"VUID-vkGetValidationCacheDataEXT-pDataSize-parameter", "pDataSize must be a valid pointer to a size_t value", "1.2-extensions"},
+ {"VUID-vkGetValidationCacheDataEXT-validationCache-parameter", "validationCache must be a valid VkValidationCacheEXT handle", "1.2-extensions"},
+ {"VUID-vkGetValidationCacheDataEXT-validationCache-parent", "validationCache must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkImportFenceFdKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkImportFenceFdKHR-fence-01463", "fence must not be associated with any queue command that has not yet completed execution on that queue", "1.2-extensions"},
+ {"VUID-vkImportFenceFdKHR-pImportFenceFdInfo-parameter", "pImportFenceFdInfo must be a valid pointer to a valid VkImportFenceFdInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkImportFenceWin32HandleKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkImportFenceWin32HandleKHR-pImportFenceWin32HandleInfo-parameter", "pImportFenceWin32HandleInfo must be a valid pointer to a valid VkImportFenceWin32HandleInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkImportSemaphoreFdKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkImportSemaphoreFdKHR-pImportSemaphoreFdInfo-parameter", "pImportSemaphoreFdInfo must be a valid pointer to a valid VkImportSemaphoreFdInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkImportSemaphoreFdKHR-semaphore-01142", "semaphore must not be associated with any queue command that has not yet completed execution on that queue", "1.2-extensions"},
+ {"VUID-vkImportSemaphoreWin32HandleKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkImportSemaphoreWin32HandleKHR-pImportSemaphoreWin32HandleInfo-parameter", "pImportSemaphoreWin32HandleInfo must be a valid pointer to a valid VkImportSemaphoreWin32HandleInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkInitializePerformanceApiINTEL-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkInitializePerformanceApiINTEL-pInitializeInfo-parameter", "pInitializeInfo must be a valid pointer to a valid VkInitializePerformanceApiInfoINTEL structure", "1.2-extensions"},
+ {"VUID-vkInvalidateMappedMemoryRanges-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkInvalidateMappedMemoryRanges-memoryRangeCount-arraylength", "memoryRangeCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkInvalidateMappedMemoryRanges-pMemoryRanges-parameter", "pMemoryRanges must be a valid pointer to an array of memoryRangeCount valid VkMappedMemoryRange structures", "1.2-extensions"},
+ {"VUID-vkMapMemory-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkMapMemory-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-vkMapMemory-memory-00678", "memory must not be currently host mapped", "1.2-extensions"},
+ {"VUID-vkMapMemory-memory-00682", "memory must have been created with a memory type that reports VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT", "1.2-extensions"},
+ {"VUID-vkMapMemory-memory-00683", "memory must not have been allocated with multiple instances", "1.2-extensions"},
+ {"VUID-vkMapMemory-memory-parameter", "memory must be a valid VkDeviceMemory handle", "1.2-extensions"},
+ {"VUID-vkMapMemory-memory-parent", "memory must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkMapMemory-offset-00679", "offset must be less than the size of memory", "1.2-extensions"},
+ {"VUID-vkMapMemory-ppData-parameter", "ppData must be a valid pointer to a pointer value", "1.2-extensions"},
+ {"VUID-vkMapMemory-size-00680", "If size is not equal to VK_WHOLE_SIZE, size must be greater than 0", "1.2-extensions"},
+ {"VUID-vkMapMemory-size-00681", "If size is not equal to VK_WHOLE_SIZE, size must be less than or equal to the size of the memory minus offset", "1.2-extensions"},
+ {"VUID-vkMergePipelineCaches-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkMergePipelineCaches-dstCache-00770", "dstCache must not appear in the list of source caches", "1.2-extensions"},
+ {"VUID-vkMergePipelineCaches-dstCache-parameter", "dstCache must be a valid VkPipelineCache handle", "1.2-extensions"},
+ {"VUID-vkMergePipelineCaches-dstCache-parent", "dstCache must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkMergePipelineCaches-pSrcCaches-parameter", "pSrcCaches must be a valid pointer to an array of srcCacheCount valid VkPipelineCache handles", "1.2-extensions"},
+ {"VUID-vkMergePipelineCaches-pSrcCaches-parent", "Each element of pSrcCaches must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkMergePipelineCaches-srcCacheCount-arraylength", "srcCacheCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkMergeValidationCachesEXT-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkMergeValidationCachesEXT-dstCache-01536", "dstCache must not appear in the list of source caches", "1.2-extensions"},
+ {"VUID-vkMergeValidationCachesEXT-dstCache-parameter", "dstCache must be a valid VkValidationCacheEXT handle", "1.2-extensions"},
+ {"VUID-vkMergeValidationCachesEXT-dstCache-parent", "dstCache must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkMergeValidationCachesEXT-pSrcCaches-parameter", "pSrcCaches must be a valid pointer to an array of srcCacheCount valid VkValidationCacheEXT handles", "1.2-extensions"},
+ {"VUID-vkMergeValidationCachesEXT-pSrcCaches-parent", "Each element of pSrcCaches must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkMergeValidationCachesEXT-srcCacheCount-arraylength", "srcCacheCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkQueueBeginDebugUtilsLabelEXT-pLabelInfo-parameter", "pLabelInfo must be a valid pointer to a valid VkDebugUtilsLabelEXT structure", "1.2-extensions"},
+ {"VUID-vkQueueBeginDebugUtilsLabelEXT-queue-parameter", "queue must be a valid VkQueue handle", "1.2-extensions"},
+ {"VUID-vkQueueBindSparse-commonparent", "Both of fence, and queue that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkQueueBindSparse-fence-01113", "If fence is not VK_NULL_HANDLE, fence must be unsignaled", "1.2-extensions"},
+ {"VUID-vkQueueBindSparse-fence-01114", "If fence is not VK_NULL_HANDLE, fence must not be associated with any other queue command that has not yet completed execution on that queue", "1.2-extensions"},
+ {"VUID-vkQueueBindSparse-fence-parameter", "If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle", "1.2-extensions"},
+ {"VUID-vkQueueBindSparse-pBindInfo-parameter", "If bindInfoCount is not 0, pBindInfo must be a valid pointer to an array of bindInfoCount valid VkBindSparseInfo structures", "1.2-extensions"},
+ {"VUID-vkQueueBindSparse-pSignalSemaphores-01115", "Each element of the pSignalSemaphores member of each element of pBindInfo must be unsignaled when the semaphore signal operation it defines is executed on the device", "1.2-extensions"},
+ {"VUID-vkQueueBindSparse-pWaitSemaphores-01116", "When a semaphore wait operation referring to a binary semaphore defined by any element of the pWaitSemaphores member of any element of pBindInfo executes on queue, there must be no other queues waiting on the same semaphore", "1.2-extensions"},
+ {"VUID-vkQueueBindSparse-pWaitSemaphores-01117", "All elements of the pWaitSemaphores member of all elements of pBindInfo member referring to a binary semaphore must be semaphores that are signaled, or have semaphore signal operations previously submitted for execution", "1.2-extensions"},
+ {"VUID-vkQueueBindSparse-pWaitSemaphores-03245", "All elements of the pWaitSemaphores member of all elements of pBindInfo created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_BINARY must reference a semaphore signal operation that has been submitted for execution and any semaphore signal operations on which it depends (if any) must have also been submitted for execution", "1.2-extensions"},
+ {"VUID-vkQueueBindSparse-queue-parameter", "queue must be a valid VkQueue handle", "1.2-extensions"},
+ {"VUID-vkQueueBindSparse-queuetype", "The queue must support sparse binding operations", "1.2-extensions"},
+ {"VUID-vkQueueEndDebugUtilsLabelEXT-None-01911", "There must be an outstanding vkQueueBeginDebugUtilsLabelEXT command prior to the vkQueueEndDebugUtilsLabelEXT on the queue", "1.2-extensions"},
+ {"VUID-vkQueueEndDebugUtilsLabelEXT-queue-parameter", "queue must be a valid VkQueue handle", "1.2-extensions"},
+ {"VUID-vkQueueInsertDebugUtilsLabelEXT-pLabelInfo-parameter", "pLabelInfo must be a valid pointer to a valid VkDebugUtilsLabelEXT structure", "1.2-extensions"},
+ {"VUID-vkQueueInsertDebugUtilsLabelEXT-queue-parameter", "queue must be a valid VkQueue handle", "1.2-extensions"},
+ {"VUID-vkQueuePresentKHR-pPresentInfo-parameter", "pPresentInfo must be a valid pointer to a valid VkPresentInfoKHR structure", "1.2-extensions"},
+ {"VUID-vkQueuePresentKHR-pSwapchains-01292", "Each element of pSwapchains member of pPresentInfo must be a swapchain that is created for a surface for which presentation is supported from queue as determined using a call to vkGetPhysicalDeviceSurfaceSupportKHR", "1.2-extensions"},
+ {"VUID-vkQueuePresentKHR-pSwapchains-01293", "If more than one member of pSwapchains was created from a display surface, all display surfaces referenced that refer to the same display must use the same display mode", "1.2-extensions"},
+ {"VUID-vkQueuePresentKHR-pWaitSemaphores-01294", "When a semaphore wait operation referring to a binary semaphore defined by the elements of the pWaitSemaphores member of pPresentInfo executes on queue, there must be no other queues waiting on the same semaphore", "1.2-extensions"},
+ {"VUID-vkQueuePresentKHR-pWaitSemaphores-01295", "All elements of the pWaitSemaphores member of pPresentInfo must be semaphores that are signaled, or have semaphore signal operations previously submitted for execution", "1.2-extensions"},
+ {"VUID-vkQueuePresentKHR-pWaitSemaphores-03267", "All elements of the pWaitSemaphores member of pPresentInfo must be created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_BINARY", "1.2-extensions"},
+ {"VUID-vkQueuePresentKHR-pWaitSemaphores-03268", "All elements of the pWaitSemaphores member of pPresentInfo must reference a semaphore signal operation that has been submitted for execution and any semaphore signal operations on which it depends (if any) must have also been submitted for execution", "1.2-extensions"},
+ {"VUID-vkQueuePresentKHR-queue-parameter", "queue must be a valid VkQueue handle", "1.2-extensions"},
+ {"VUID-vkQueueSetPerformanceConfigurationINTEL-commonparent", "Both of configuration, and queue must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkQueueSetPerformanceConfigurationINTEL-configuration-parameter", "configuration must be a valid VkPerformanceConfigurationINTEL handle", "1.2-extensions"},
+ {"VUID-vkQueueSetPerformanceConfigurationINTEL-queue-parameter", "queue must be a valid VkQueue handle", "1.2-extensions"},
+ {"VUID-vkQueueSubmit-commonparent", "Both of fence, and queue that are valid handles of non-ignored parameters must have been created, allocated, or retrieved from the same VkDevice", "1.2-extensions"},
+ {"VUID-vkQueueSubmit-fence-00063", "If fence is not VK_NULL_HANDLE, fence must be unsignaled", "1.2-extensions"},
+ {"VUID-vkQueueSubmit-fence-00064", "If fence is not VK_NULL_HANDLE, fence must not be associated with any other queue command that has not yet completed execution on that queue", "1.2-extensions"},
+ {"VUID-vkQueueSubmit-fence-parameter", "If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle", "1.2-extensions"},
+ {"VUID-vkQueueSubmit-pCommandBuffers-00065", "Any calls to vkCmdSetEvent, vkCmdResetEvent or vkCmdWaitEvents that have been recorded into any of the command buffer elements of the pCommandBuffers member of any element of pSubmits, must not reference any VkEvent that is referenced by any of those commands in a command buffer that has been submitted to another queue and is still in the pending state", "1.2-extensions"},
+ {"VUID-vkQueueSubmit-pCommandBuffers-00070", "Each element of the pCommandBuffers member of each element of pSubmits must be in the pending or executable state", "1.2-extensions"},
+ {"VUID-vkQueueSubmit-pCommandBuffers-00071", "If any element of the pCommandBuffers member of any element of pSubmits was not recorded with the VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, it must not be in the pending state", "1.2-extensions"},
+ {"VUID-vkQueueSubmit-pCommandBuffers-00072", "Any secondary command buffers recorded into any element of the pCommandBuffers member of any element of pSubmits must be in the pending or executable state", "1.2-extensions"},
+ {"VUID-vkQueueSubmit-pCommandBuffers-00073", "If any secondary command buffers recorded into any element of the pCommandBuffers member of any element of pSubmits was not recorded with the VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, it must not be in the pending state", "1.2-extensions"},
+ {"VUID-vkQueueSubmit-pCommandBuffers-00074", "Each element of the pCommandBuffers member of each element of pSubmits must have been allocated from a VkCommandPool that was created for the same queue family queue belongs to", "1.2-extensions"},
+ {"VUID-vkQueueSubmit-pCommandBuffers-03220", "If a command recorded into any element of pCommandBuffers was a vkCmdBeginQuery whose queryPool was created with a queryType of VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR, the profiling lock must have been held continuously on the VkDevice that queue was retrieved from, throughout recording of those command buffers", "1.2-extensions"},
+ {"VUID-vkQueueSubmit-pSignalSemaphores-00067", "Each element of the pSignalSemaphores member of any element of pSubmits must be unsignaled when the semaphore signal operation it defines is executed on the device", "1.2-extensions"},
+ {"VUID-vkQueueSubmit-pSubmits-02207", "If any element of pSubmits->pCommandBuffers includes a Queue Family Transfer Acquire Operation, there must exist a previously submitted Queue Family Transfer Release Operation on a queue in the queue family identified by the acquire operation, with parameters matching the acquire operation as defined in the definition of such acquire operations, and which happens-before the acquire operation", "1.2-extensions"},
+ {"VUID-vkQueueSubmit-pSubmits-02808", "Any resource created with VK_SHARING_MODE_EXCLUSIVE that is read by an operation specified by pSubmits must not be owned by any queue family other than the one which queue belongs to, at the time it is executed", "1.2-extensions"},
+ {"VUID-vkQueueSubmit-pSubmits-parameter", "If submitCount is not 0, pSubmits must be a valid pointer to an array of submitCount valid VkSubmitInfo structures", "1.2-extensions"},
+ {"VUID-vkQueueSubmit-pWaitDstStageMask-00066", "Any stage flag included in any element of the pWaitDstStageMask member of any element of pSubmits must be a pipeline stage supported by one of the capabilities of queue, as specified in the table of supported pipeline stages", "1.2-extensions"},
+ {"VUID-vkQueueSubmit-pWaitSemaphores-00068", "When a semaphore wait operation referring to a binary semaphore defined by any element of the pWaitSemaphores member of any element of pSubmits executes on queue, there must be no other queues waiting on the same semaphore", "1.2-extensions"},
+ {"VUID-vkQueueSubmit-pWaitSemaphores-00069", "All elements of the pWaitSemaphores member of all elements of pSubmits must be semaphores that are signaled, or have semaphore signal operations previously submitted for execution", "1.2"},
+ {"VUID-vkQueueSubmit-pWaitSemaphores-03238", "All elements of the pWaitSemaphores member of all elements of pSubmits created with a VkSemaphoreType of VK_SEMAPHORE_TYPE_BINARY must reference a semaphore signal operation that has been submitted for execution and any semaphore signal operations on which it depends (if any) must have also been submitted for execution", "1.2-extensions"},
+ {"VUID-vkQueueSubmit-queue-parameter", "queue must be a valid VkQueue handle", "1.2-extensions"},
+ {"VUID-vkQueueWaitIdle-queue-parameter", "queue must be a valid VkQueue handle", "1.2-extensions"},
+ {"VUID-vkRegisterDeviceEventEXT-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkRegisterDeviceEventEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkRegisterDeviceEventEXT-pDeviceEventInfo-parameter", "pDeviceEventInfo must be a valid pointer to a valid VkDeviceEventInfoEXT structure", "1.2-extensions"},
+ {"VUID-vkRegisterDeviceEventEXT-pFence-parameter", "pFence must be a valid pointer to a VkFence handle", "1.2-extensions"},
+ {"VUID-vkRegisterDisplayEventEXT-commonparent", "Both of device, and display must have been created, allocated, or retrieved from the same VkPhysicalDevice", "1.2-extensions"},
+ {"VUID-vkRegisterDisplayEventEXT-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkRegisterDisplayEventEXT-display-parameter", "display must be a valid VkDisplayKHR handle", "1.2-extensions"},
+ {"VUID-vkRegisterDisplayEventEXT-pAllocator-parameter", "If pAllocator is not NULL, pAllocator must be a valid pointer to a valid VkAllocationCallbacks structure", "1.2-extensions"},
+ {"VUID-vkRegisterDisplayEventEXT-pDisplayEventInfo-parameter", "pDisplayEventInfo must be a valid pointer to a valid VkDisplayEventInfoEXT structure", "1.2-extensions"},
+ {"VUID-vkRegisterDisplayEventEXT-pFence-parameter", "pFence must be a valid pointer to a VkFence handle", "1.2-extensions"},
+ {"VUID-vkReleaseDisplayEXT-display-parameter", "display must be a valid VkDisplayKHR handle", "1.2-extensions"},
+ {"VUID-vkReleaseDisplayEXT-display-parent", "display must have been created, allocated, or retrieved from physicalDevice", "1.2-extensions"},
+ {"VUID-vkReleaseDisplayEXT-physicalDevice-parameter", "physicalDevice must be a valid VkPhysicalDevice handle", "1.2-extensions"},
+ {"VUID-vkReleaseFullScreenExclusiveModeEXT-swapchain-02677", "swapchain must not be in the retired state", "1.2-extensions"},
+ {"VUID-vkReleaseFullScreenExclusiveModeEXT-swapchain-02678", "swapchain must be a swapchain created with a VkSurfaceFullScreenExclusiveInfoEXT structure, with fullScreenExclusive set to VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT", "1.2-extensions"},
+ {"VUID-vkReleasePerformanceConfigurationINTEL-configuration-02737", "configuration must not be released before all command buffers submitted while the configuration was set are in pending state", "1.2-extensions"},
+ {"VUID-vkReleasePerformanceConfigurationINTEL-configuration-parameter", "configuration must be a valid VkPerformanceConfigurationINTEL handle", "1.2-extensions"},
+ {"VUID-vkReleasePerformanceConfigurationINTEL-configuration-parent", "configuration must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkReleasePerformanceConfigurationINTEL-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkReleaseProfilingLockKHR-device-03235", "The profiling lock of device must have been held via a previous successful call to vkAcquireProfilingLockKHR", "1.2-extensions"},
+ {"VUID-vkReleaseProfilingLockKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkResetCommandBuffer-commandBuffer-00045", "commandBuffer must not be in the pending state", "1.2-extensions"},
+ {"VUID-vkResetCommandBuffer-commandBuffer-00046", "commandBuffer must have been allocated from a pool that was created with the VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT", "1.2-extensions"},
+ {"VUID-vkResetCommandBuffer-commandBuffer-parameter", "commandBuffer must be a valid VkCommandBuffer handle", "1.2-extensions"},
+ {"VUID-vkResetCommandBuffer-flags-parameter", "flags must be a valid combination of VkCommandBufferResetFlagBits values", "1.2-extensions"},
+ {"VUID-vkResetCommandPool-commandPool-00040", "All VkCommandBuffer objects allocated from commandPool must not be in the pending state", "1.2-extensions"},
+ {"VUID-vkResetCommandPool-commandPool-parameter", "commandPool must be a valid VkCommandPool handle", "1.2-extensions"},
+ {"VUID-vkResetCommandPool-commandPool-parent", "commandPool must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkResetCommandPool-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkResetCommandPool-flags-parameter", "flags must be a valid combination of VkCommandPoolResetFlagBits values", "1.2-extensions"},
+ {"VUID-vkResetDescriptorPool-descriptorPool-00313", "All uses of descriptorPool (via any allocated descriptor sets) must have completed execution", "1.2-extensions"},
+ {"VUID-vkResetDescriptorPool-descriptorPool-parameter", "descriptorPool must be a valid VkDescriptorPool handle", "1.2-extensions"},
+ {"VUID-vkResetDescriptorPool-descriptorPool-parent", "descriptorPool must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkResetDescriptorPool-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkResetDescriptorPool-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-vkResetEvent-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkResetEvent-event-01148", "event must not be waited on by a vkCmdWaitEvents command that is currently executing", "1.2-extensions"},
+ {"VUID-vkResetEvent-event-parameter", "event must be a valid VkEvent handle", "1.2-extensions"},
+ {"VUID-vkResetEvent-event-parent", "event must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkResetFences-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkResetFences-fenceCount-arraylength", "fenceCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkResetFences-pFences-01123", "Each element of pFences must not be currently associated with any queue command that has not yet completed execution on that queue", "1.2-extensions"},
+ {"VUID-vkResetFences-pFences-parameter", "pFences must be a valid pointer to an array of fenceCount valid VkFence handles", "1.2-extensions"},
+ {"VUID-vkResetFences-pFences-parent", "Each element of pFences must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkResetQueryPool-None-02665", "The hostQueryReset feature must be enabled", "1.2-extensions"},
+ {"VUID-vkResetQueryPool-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkResetQueryPool-firstQuery-02666", "firstQuery must be less than the number of queries in queryPool", "1.2-extensions"},
+ {"VUID-vkResetQueryPool-firstQuery-02667", "The sum of firstQuery and queryCount must be less than or equal to the number of queries in queryPool", "1.2-extensions"},
+ {"VUID-vkResetQueryPool-firstQuery-02741", "Submitted commands that refer to the range specified by firstQuery and queryCount in queryPool must have completed execution", "1.2-extensions"},
+ {"VUID-vkResetQueryPool-firstQuery-02742", "The range of queries specified by firstQuery and queryCount in queryPool must not be in use by calls to vkGetQueryPoolResults or vkResetQueryPool in other threads", "1.2-extensions"},
+ {"VUID-vkResetQueryPool-queryPool-parameter", "queryPool must be a valid VkQueryPool handle", "1.2-extensions"},
+ {"VUID-vkResetQueryPool-queryPool-parent", "queryPool must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkSetDebugUtilsObjectNameEXT-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkSetDebugUtilsObjectNameEXT-pNameInfo-02587", "pNameInfo->objectType must not be VK_OBJECT_TYPE_UNKNOWN", "1.2-extensions"},
+ {"VUID-vkSetDebugUtilsObjectNameEXT-pNameInfo-02588", "pNameInfo->objectHandle must not be VK_NULL_HANDLE", "1.2-extensions"},
+ {"VUID-vkSetDebugUtilsObjectNameEXT-pNameInfo-parameter", "pNameInfo must be a valid pointer to a valid VkDebugUtilsObjectNameInfoEXT structure", "1.2-extensions"},
+ {"VUID-vkSetDebugUtilsObjectTagEXT-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkSetDebugUtilsObjectTagEXT-pTagInfo-parameter", "pTagInfo must be a valid pointer to a valid VkDebugUtilsObjectTagInfoEXT structure", "1.2-extensions"},
+ {"VUID-vkSetEvent-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkSetEvent-event-parameter", "event must be a valid VkEvent handle", "1.2-extensions"},
+ {"VUID-vkSetEvent-event-parent", "event must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkSetHdrMetadataEXT-commonparent", "Both of device, and the elements of pSwapchains must have been created, allocated, or retrieved from the same VkInstance", "1.2-extensions"},
+ {"VUID-vkSetHdrMetadataEXT-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkSetHdrMetadataEXT-pMetadata-parameter", "pMetadata must be a valid pointer to an array of swapchainCount valid VkHdrMetadataEXT structures", "1.2-extensions"},
+ {"VUID-vkSetHdrMetadataEXT-pSwapchains-parameter", "pSwapchains must be a valid pointer to an array of swapchainCount valid VkSwapchainKHR handles", "1.2-extensions"},
+ {"VUID-vkSetHdrMetadataEXT-swapchainCount-arraylength", "swapchainCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkSetLocalDimmingAMD-XXXXX", "It is only valid to call vkSetLocalDimmingAMD if VkDisplayNativeHdrSurfaceCapabilitiesAMD::localDimmingSupport is supported", "1.2-extensions"},
+ {"VUID-vkSetLocalDimmingAMD-commonparent", "Both of device, and swapChain must have been created, allocated, or retrieved from the same VkInstance", "1.2-extensions"},
+ {"VUID-vkSetLocalDimmingAMD-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkSetLocalDimmingAMD-swapChain-parameter", "swapChain must be a valid VkSwapchainKHR handle", "1.2-extensions"},
+ {"VUID-vkSetPrivateDataEXT-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkSetPrivateDataEXT-objectHandle-04016", "objectHandle must be device or a child of device", "1.2-extensions"},
+ {"VUID-vkSetPrivateDataEXT-objectHandle-04017", "objectHandle must be a valid handle to an object of type objectType", "1.2-extensions"},
+ {"VUID-vkSetPrivateDataEXT-objectType-parameter", "objectType must be a valid VkObjectType value", "1.2-extensions"},
+ {"VUID-vkSetPrivateDataEXT-privateDataSlot-parameter", "privateDataSlot must be a valid VkPrivateDataSlotEXT handle", "1.2-extensions"},
+ {"VUID-vkSetPrivateDataEXT-privateDataSlot-parent", "privateDataSlot must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkSignalSemaphore-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkSignalSemaphore-pSignalInfo-parameter", "pSignalInfo must be a valid pointer to a valid VkSemaphoreSignalInfo structure", "1.2-extensions"},
+ {"VUID-vkSubmitDebugUtilsMessageEXT-instance-parameter", "instance must be a valid VkInstance handle", "1.2-extensions"},
+ {"VUID-vkSubmitDebugUtilsMessageEXT-messageSeverity-parameter", "messageSeverity must be a valid VkDebugUtilsMessageSeverityFlagBitsEXT value", "1.2-extensions"},
+ {"VUID-vkSubmitDebugUtilsMessageEXT-messageTypes-parameter", "messageTypes must be a valid combination of VkDebugUtilsMessageTypeFlagBitsEXT values", "1.2-extensions"},
+ {"VUID-vkSubmitDebugUtilsMessageEXT-messageTypes-requiredbitmask", "messageTypes must not be 0", "1.2-extensions"},
+ {"VUID-vkSubmitDebugUtilsMessageEXT-objectType-02591", "The objectType member of each element of pCallbackData->pObjects must not be VK_OBJECT_TYPE_UNKNOWN", "1.2-extensions"},
+ {"VUID-vkSubmitDebugUtilsMessageEXT-pCallbackData-parameter", "pCallbackData must be a valid pointer to a valid VkDebugUtilsMessengerCallbackDataEXT structure", "1.2-extensions"},
+ {"VUID-vkTrimCommandPool-commandPool-parameter", "commandPool must be a valid VkCommandPool handle", "1.2-extensions"},
+ {"VUID-vkTrimCommandPool-commandPool-parent", "commandPool must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkTrimCommandPool-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkTrimCommandPool-flags-zerobitmask", "flags must be 0", "1.2-extensions"},
+ {"VUID-vkUninitializePerformanceApiINTEL-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkUnmapMemory-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkUnmapMemory-memory-00689", "memory must be currently host mapped", "1.2-extensions"},
+ {"VUID-vkUnmapMemory-memory-parameter", "memory must be a valid VkDeviceMemory handle", "1.2-extensions"},
+ {"VUID-vkUnmapMemory-memory-parent", "memory must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkUpdateDescriptorSetWithTemplate-descriptorSet-parameter", "descriptorSet must be a valid VkDescriptorSet handle", "1.2-extensions"},
+ {"VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parameter", "descriptorUpdateTemplate must be a valid VkDescriptorUpdateTemplate handle", "1.2-extensions"},
+ {"VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parent", "descriptorUpdateTemplate must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkUpdateDescriptorSetWithTemplate-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkUpdateDescriptorSetWithTemplate-pData-01685", "pData must be a valid pointer to a memory containing one or more valid instances of VkDescriptorImageInfo, VkDescriptorBufferInfo, or VkBufferView in a layout defined by descriptorUpdateTemplate when it was created with vkCreateDescriptorUpdateTemplate", "1.2-extensions"},
+ {"VUID-vkUpdateDescriptorSets-None-03047", "Descriptor bindings updated by this command which were created without the VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT or VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT bits set must not be used by any command that was recorded to a command buffer which is in the pending state", "1.2-extensions"},
+ {"VUID-vkUpdateDescriptorSets-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkUpdateDescriptorSets-dstSet-00314", "The dstSet member of each element of pDescriptorWrites or pDescriptorCopies must not be used by any command that was recorded to a command buffer which is in the pending state", "1.1-khr-extensions"},
+ {"VUID-vkUpdateDescriptorSets-pDescriptorCopies-parameter", "If descriptorCopyCount is not 0, pDescriptorCopies must be a valid pointer to an array of descriptorCopyCount valid VkCopyDescriptorSet structures", "1.2-extensions"},
+ {"VUID-vkUpdateDescriptorSets-pDescriptorWrites-parameter", "If descriptorWriteCount is not 0, pDescriptorWrites must be a valid pointer to an array of descriptorWriteCount valid VkWriteDescriptorSet structures", "1.2-extensions"},
+ {"VUID-vkWaitForFences-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkWaitForFences-fenceCount-arraylength", "fenceCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkWaitForFences-pFences-parameter", "pFences must be a valid pointer to an array of fenceCount valid VkFence handles", "1.2-extensions"},
+ {"VUID-vkWaitForFences-pFences-parent", "Each element of pFences must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkWaitSemaphores-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkWaitSemaphores-pWaitInfo-parameter", "pWaitInfo must be a valid pointer to a valid VkSemaphoreWaitInfo structure", "1.2-extensions"},
+ {"VUID-vkWriteAccelerationStructuresPropertiesKHR-accelerationStructureCount-arraylength", "accelerationStructureCount must be greater than 0", "1.2-extensions"},
+ {"VUID-vkWriteAccelerationStructuresPropertiesKHR-accelerationStructures-03431", "All acceleration structures in accelerationStructures must have been built with VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_COMPACTION_BIT_KHR if queryType is VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR", "1.2-extensions"},
+ {"VUID-vkWriteAccelerationStructuresPropertiesKHR-dataSize-03452", "dataSize must be greater than or equal to accelerationStructureCount*stride", "1.2-extensions"},
+ {"VUID-vkWriteAccelerationStructuresPropertiesKHR-dataSize-arraylength", "dataSize must be greater than 0", "1.2-extensions"},
+ {"VUID-vkWriteAccelerationStructuresPropertiesKHR-device-parameter", "device must be a valid VkDevice handle", "1.2-extensions"},
+ {"VUID-vkWriteAccelerationStructuresPropertiesKHR-pAccelerationStructures-03453", "The acceleration structures referenced by pAccelerationStructures must be bound to host-visible memory", "1.2-extensions"},
+ {"VUID-vkWriteAccelerationStructuresPropertiesKHR-pAccelerationStructures-parameter", "pAccelerationStructures must be a valid pointer to an array of accelerationStructureCount valid VkAccelerationStructureKHR handles", "1.2-extensions"},
+ {"VUID-vkWriteAccelerationStructuresPropertiesKHR-pAccelerationStructures-parent", "Each element of pAccelerationStructures must have been created, allocated, or retrieved from device", "1.2-extensions"},
+ {"VUID-vkWriteAccelerationStructuresPropertiesKHR-pData-parameter", "pData must be a valid pointer to an array of dataSize bytes", "1.2-extensions"},
+ {"VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03432", "queryType must be VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR or VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR", "1.2-extensions"},
+ {"VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03448", "If queryType is VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR, then stride must be a multiple of the size of VkDeviceSize", "1.2-extensions"},
+ {"VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03449", "If queryType is VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR, then data must point to a VkDeviceSize", "1.2-extensions"},
+ {"VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03450", "If queryType is VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR, then stride must be a multiple of the size of VkDeviceSize", "1.2-extensions"},
+ {"VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03451", "If queryType is VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR, then data must point to a VkDeviceSize", "1.2-extensions"},
+ {"VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-parameter", "queryType must be a valid VkQueryType value", "1.2-extensions"},
+ {"VUID-vkWriteAccelerationStructuresPropertiesKHR-rayTracingHostAccelerationStructureCommands-03454", "the VkPhysicalDeviceRayTracingFeaturesKHR::rayTracingHostAccelerationStructureCommands feature must be enabled", "1.2-extensions"},
};
// Defines to allow creating "must be recording" meta data
@@ -6143,91 +6517,103 @@
prefix##BINDSHADINGRATEIMAGENV = 12,\
prefix##BINDTRANSFORMFEEDBACKBUFFERSEXT = 13,\
prefix##BINDVERTEXBUFFERS = 14,\
- prefix##BLITIMAGE = 15,\
- prefix##BUILDACCELERATIONSTRUCTUREINDIRECTKHR = 16,\
- prefix##BUILDACCELERATIONSTRUCTUREKHR = 17,\
- prefix##BUILDACCELERATIONSTRUCTURENV = 18,\
- prefix##CLEARATTACHMENTS = 19,\
- prefix##CLEARCOLORIMAGE = 20,\
- prefix##CLEARDEPTHSTENCILIMAGE = 21,\
- prefix##COPYACCELERATIONSTRUCTUREKHR = 22,\
- prefix##COPYACCELERATIONSTRUCTURENV = 23,\
- prefix##COPYACCELERATIONSTRUCTURETOMEMORYKHR = 24,\
- prefix##COPYBUFFER = 25,\
- prefix##COPYBUFFERTOIMAGE = 26,\
- prefix##COPYIMAGE = 27,\
- prefix##COPYIMAGETOBUFFER = 28,\
- prefix##COPYMEMORYTOACCELERATIONSTRUCTUREKHR = 29,\
- prefix##COPYQUERYPOOLRESULTS = 30,\
- prefix##DEBUGMARKERBEGINEXT = 31,\
- prefix##DEBUGMARKERENDEXT = 32,\
- prefix##DEBUGMARKERINSERTEXT = 33,\
- prefix##DISPATCH = 34,\
- prefix##DISPATCHBASE = 35,\
- prefix##DISPATCHINDIRECT = 36,\
- prefix##DRAW = 37,\
- prefix##DRAWINDEXED = 38,\
- prefix##DRAWINDEXEDINDIRECT = 39,\
- prefix##DRAWINDEXEDINDIRECTCOUNT = 40,\
- prefix##DRAWINDIRECT = 41,\
- prefix##DRAWINDIRECTBYTECOUNTEXT = 42,\
- prefix##DRAWINDIRECTCOUNT = 43,\
- prefix##DRAWMESHTASKSINDIRECTCOUNTNV = 44,\
- prefix##DRAWMESHTASKSINDIRECTNV = 45,\
- prefix##DRAWMESHTASKSNV = 46,\
- prefix##ENDCONDITIONALRENDERINGEXT = 47,\
- prefix##ENDDEBUGUTILSLABELEXT = 48,\
- prefix##ENDQUERY = 49,\
- prefix##ENDQUERYINDEXEDEXT = 50,\
- prefix##ENDRENDERPASS = 51,\
- prefix##ENDRENDERPASS2 = 52,\
- prefix##ENDTRANSFORMFEEDBACKEXT = 53,\
- prefix##EXECUTECOMMANDS = 54,\
- prefix##EXECUTEGENERATEDCOMMANDSNV = 55,\
- prefix##FILLBUFFER = 56,\
- prefix##INSERTDEBUGUTILSLABELEXT = 57,\
- prefix##NEXTSUBPASS = 58,\
- prefix##NEXTSUBPASS2 = 59,\
- prefix##PIPELINEBARRIER = 60,\
- prefix##PREPROCESSGENERATEDCOMMANDSNV = 61,\
- prefix##PUSHCONSTANTS = 62,\
- prefix##PUSHDESCRIPTORSETKHR = 63,\
- prefix##PUSHDESCRIPTORSETWITHTEMPLATEKHR = 64,\
- prefix##RESETEVENT = 65,\
- prefix##RESETQUERYPOOL = 66,\
- prefix##RESOLVEIMAGE = 67,\
- prefix##SETBLENDCONSTANTS = 68,\
- prefix##SETCHECKPOINTNV = 69,\
- prefix##SETCOARSESAMPLEORDERNV = 70,\
- prefix##SETDEPTHBIAS = 71,\
- prefix##SETDEPTHBOUNDS = 72,\
- prefix##SETDEVICEMASK = 73,\
- prefix##SETDISCARDRECTANGLEEXT = 74,\
- prefix##SETEVENT = 75,\
- prefix##SETEXCLUSIVESCISSORNV = 76,\
- prefix##SETLINESTIPPLEEXT = 77,\
- prefix##SETLINEWIDTH = 78,\
- prefix##SETPERFORMANCEMARKERINTEL = 79,\
- prefix##SETPERFORMANCEOVERRIDEINTEL = 80,\
- prefix##SETPERFORMANCESTREAMMARKERINTEL = 81,\
- prefix##SETSAMPLELOCATIONSEXT = 82,\
- prefix##SETSCISSOR = 83,\
- prefix##SETSTENCILCOMPAREMASK = 84,\
- prefix##SETSTENCILREFERENCE = 85,\
- prefix##SETSTENCILWRITEMASK = 86,\
- prefix##SETVIEWPORT = 87,\
- prefix##SETVIEWPORTSHADINGRATEPALETTENV = 88,\
- prefix##SETVIEWPORTWSCALINGNV = 89,\
- prefix##TRACERAYSINDIRECTKHR = 90,\
- prefix##TRACERAYSKHR = 91,\
- prefix##TRACERAYSNV = 92,\
- prefix##UPDATEBUFFER = 93,\
- prefix##WAITEVENTS = 94,\
- prefix##WRITEACCELERATIONSTRUCTURESPROPERTIESKHR = 95,\
- prefix##WRITEBUFFERMARKERAMD = 96,\
- prefix##WRITETIMESTAMP = 97,\
- prefix##ENDCOMMANDBUFFER = 98,\
- prefix##RANGE_SIZE = 99
+ prefix##BINDVERTEXBUFFERS2EXT = 15,\
+ prefix##BLITIMAGE = 16,\
+ prefix##BUILDACCELERATIONSTRUCTUREINDIRECTKHR = 17,\
+ prefix##BUILDACCELERATIONSTRUCTUREKHR = 18,\
+ prefix##BUILDACCELERATIONSTRUCTURENV = 19,\
+ prefix##CLEARATTACHMENTS = 20,\
+ prefix##CLEARCOLORIMAGE = 21,\
+ prefix##CLEARDEPTHSTENCILIMAGE = 22,\
+ prefix##COPYACCELERATIONSTRUCTUREKHR = 23,\
+ prefix##COPYACCELERATIONSTRUCTURENV = 24,\
+ prefix##COPYACCELERATIONSTRUCTURETOMEMORYKHR = 25,\
+ prefix##COPYBUFFER = 26,\
+ prefix##COPYBUFFERTOIMAGE = 27,\
+ prefix##COPYIMAGE = 28,\
+ prefix##COPYIMAGETOBUFFER = 29,\
+ prefix##COPYMEMORYTOACCELERATIONSTRUCTUREKHR = 30,\
+ prefix##COPYQUERYPOOLRESULTS = 31,\
+ prefix##DEBUGMARKERBEGINEXT = 32,\
+ prefix##DEBUGMARKERENDEXT = 33,\
+ prefix##DEBUGMARKERINSERTEXT = 34,\
+ prefix##DISPATCH = 35,\
+ prefix##DISPATCHBASE = 36,\
+ prefix##DISPATCHINDIRECT = 37,\
+ prefix##DRAW = 38,\
+ prefix##DRAWINDEXED = 39,\
+ prefix##DRAWINDEXEDINDIRECT = 40,\
+ prefix##DRAWINDEXEDINDIRECTCOUNT = 41,\
+ prefix##DRAWINDIRECT = 42,\
+ prefix##DRAWINDIRECTBYTECOUNTEXT = 43,\
+ prefix##DRAWINDIRECTCOUNT = 44,\
+ prefix##DRAWMESHTASKSINDIRECTCOUNTNV = 45,\
+ prefix##DRAWMESHTASKSINDIRECTNV = 46,\
+ prefix##DRAWMESHTASKSNV = 47,\
+ prefix##ENDCONDITIONALRENDERINGEXT = 48,\
+ prefix##ENDDEBUGUTILSLABELEXT = 49,\
+ prefix##ENDQUERY = 50,\
+ prefix##ENDQUERYINDEXEDEXT = 51,\
+ prefix##ENDRENDERPASS = 52,\
+ prefix##ENDRENDERPASS2 = 53,\
+ prefix##ENDTRANSFORMFEEDBACKEXT = 54,\
+ prefix##EXECUTECOMMANDS = 55,\
+ prefix##EXECUTEGENERATEDCOMMANDSNV = 56,\
+ prefix##FILLBUFFER = 57,\
+ prefix##INSERTDEBUGUTILSLABELEXT = 58,\
+ prefix##NEXTSUBPASS = 59,\
+ prefix##NEXTSUBPASS2 = 60,\
+ prefix##PIPELINEBARRIER = 61,\
+ prefix##PREPROCESSGENERATEDCOMMANDSNV = 62,\
+ prefix##PUSHCONSTANTS = 63,\
+ prefix##PUSHDESCRIPTORSETKHR = 64,\
+ prefix##PUSHDESCRIPTORSETWITHTEMPLATEKHR = 65,\
+ prefix##RESETEVENT = 66,\
+ prefix##RESETQUERYPOOL = 67,\
+ prefix##RESOLVEIMAGE = 68,\
+ prefix##SETBLENDCONSTANTS = 69,\
+ prefix##SETCHECKPOINTNV = 70,\
+ prefix##SETCOARSESAMPLEORDERNV = 71,\
+ prefix##SETCULLMODEEXT = 72,\
+ prefix##SETDEPTHBIAS = 73,\
+ prefix##SETDEPTHBOUNDS = 74,\
+ prefix##SETDEPTHBOUNDSTESTENABLEEXT = 75,\
+ prefix##SETDEPTHCOMPAREOPEXT = 76,\
+ prefix##SETDEPTHTESTENABLEEXT = 77,\
+ prefix##SETDEPTHWRITEENABLEEXT = 78,\
+ prefix##SETDEVICEMASK = 79,\
+ prefix##SETDISCARDRECTANGLEEXT = 80,\
+ prefix##SETEVENT = 81,\
+ prefix##SETEXCLUSIVESCISSORNV = 82,\
+ prefix##SETFRONTFACEEXT = 83,\
+ prefix##SETLINESTIPPLEEXT = 84,\
+ prefix##SETLINEWIDTH = 85,\
+ prefix##SETPERFORMANCEMARKERINTEL = 86,\
+ prefix##SETPERFORMANCEOVERRIDEINTEL = 87,\
+ prefix##SETPERFORMANCESTREAMMARKERINTEL = 88,\
+ prefix##SETPRIMITIVETOPOLOGYEXT = 89,\
+ prefix##SETSAMPLELOCATIONSEXT = 90,\
+ prefix##SETSCISSOR = 91,\
+ prefix##SETSCISSORWITHCOUNTEXT = 92,\
+ prefix##SETSTENCILCOMPAREMASK = 93,\
+ prefix##SETSTENCILOPEXT = 94,\
+ prefix##SETSTENCILREFERENCE = 95,\
+ prefix##SETSTENCILTESTENABLEEXT = 96,\
+ prefix##SETSTENCILWRITEMASK = 97,\
+ prefix##SETVIEWPORT = 98,\
+ prefix##SETVIEWPORTSHADINGRATEPALETTENV = 99,\
+ prefix##SETVIEWPORTWSCALINGNV = 100,\
+ prefix##SETVIEWPORTWITHCOUNTEXT = 101,\
+ prefix##TRACERAYSINDIRECTKHR = 102,\
+ prefix##TRACERAYSKHR = 103,\
+ prefix##TRACERAYSNV = 104,\
+ prefix##UPDATEBUFFER = 105,\
+ prefix##WAITEVENTS = 106,\
+ prefix##WRITEACCELERATIONSTRUCTURESPROPERTIESKHR = 107,\
+ prefix##WRITEBUFFERMARKERAMD = 108,\
+ prefix##WRITETIMESTAMP = 109,\
+ prefix##ENDCOMMANDBUFFER = 110,\
+ prefix##RANGE_SIZE = 111
#define VUID_CMD_NAME_LIST\
"Command_Undefined",\
@@ -6245,6 +6631,7 @@
"vkCmdBindShadingRateImageNV",\
"vkCmdBindTransformFeedbackBuffersEXT",\
"vkCmdBindVertexBuffers",\
+ "vkCmdBindVertexBuffers2EXT",\
"vkCmdBlitImage",\
"vkCmdBuildAccelerationStructureIndirectKHR",\
"vkCmdBuildAccelerationStructureKHR",\
@@ -6301,25 +6688,36 @@
"vkCmdSetBlendConstants",\
"vkCmdSetCheckpointNV",\
"vkCmdSetCoarseSampleOrderNV",\
+ "vkCmdSetCullModeEXT",\
"vkCmdSetDepthBias",\
"vkCmdSetDepthBounds",\
+ "vkCmdSetDepthBoundsTestEnableEXT",\
+ "vkCmdSetDepthCompareOpEXT",\
+ "vkCmdSetDepthTestEnableEXT",\
+ "vkCmdSetDepthWriteEnableEXT",\
"vkCmdSetDeviceMask",\
"vkCmdSetDiscardRectangleEXT",\
"vkCmdSetEvent",\
"vkCmdSetExclusiveScissorNV",\
+ "vkCmdSetFrontFaceEXT",\
"vkCmdSetLineStippleEXT",\
"vkCmdSetLineWidth",\
"vkCmdSetPerformanceMarkerINTEL",\
"vkCmdSetPerformanceOverrideINTEL",\
"vkCmdSetPerformanceStreamMarkerINTEL",\
+ "vkCmdSetPrimitiveTopologyEXT",\
"vkCmdSetSampleLocationsEXT",\
"vkCmdSetScissor",\
+ "vkCmdSetScissorWithCountEXT",\
"vkCmdSetStencilCompareMask",\
+ "vkCmdSetStencilOpEXT",\
"vkCmdSetStencilReference",\
+ "vkCmdSetStencilTestEnableEXT",\
"vkCmdSetStencilWriteMask",\
"vkCmdSetViewport",\
"vkCmdSetViewportShadingRatePaletteNV",\
"vkCmdSetViewportWScalingNV",\
+ "vkCmdSetViewportWithCountEXT",\
"vkCmdTraceRaysIndirectKHR",\
"vkCmdTraceRaysKHR",\
"vkCmdTraceRaysNV",\
@@ -6346,6 +6744,7 @@
"VUID-vkCmdBindShadingRateImageNV-commandBuffer-recording",\
"VUID-vkCmdBindTransformFeedbackBuffersEXT-commandBuffer-recording",\
"VUID-vkCmdBindVertexBuffers-commandBuffer-recording",\
+ "VUID-vkCmdBindVertexBuffers2EXT-commandBuffer-recording",\
"VUID-vkCmdBlitImage-commandBuffer-recording",\
"VUID-vkCmdBuildAccelerationStructureIndirectKHR-commandBuffer-recording",\
"VUID-vkCmdBuildAccelerationStructureKHR-commandBuffer-recording",\
@@ -6402,25 +6801,36 @@
"VUID-vkCmdSetBlendConstants-commandBuffer-recording",\
"VUID-vkCmdSetCheckpointNV-commandBuffer-recording",\
"VUID-vkCmdSetCoarseSampleOrderNV-commandBuffer-recording",\
+ "VUID-vkCmdSetCullModeEXT-commandBuffer-recording",\
"VUID-vkCmdSetDepthBias-commandBuffer-recording",\
"VUID-vkCmdSetDepthBounds-commandBuffer-recording",\
+ "VUID-vkCmdSetDepthBoundsTestEnableEXT-commandBuffer-recording",\
+ "VUID-vkCmdSetDepthCompareOpEXT-commandBuffer-recording",\
+ "VUID-vkCmdSetDepthTestEnableEXT-commandBuffer-recording",\
+ "VUID-vkCmdSetDepthWriteEnableEXT-commandBuffer-recording",\
"VUID-vkCmdSetDeviceMask-commandBuffer-recording",\
"VUID-vkCmdSetDiscardRectangleEXT-commandBuffer-recording",\
"VUID-vkCmdSetEvent-commandBuffer-recording",\
"VUID-vkCmdSetExclusiveScissorNV-commandBuffer-recording",\
+ "VUID-vkCmdSetFrontFaceEXT-commandBuffer-recording",\
"VUID-vkCmdSetLineStippleEXT-commandBuffer-recording",\
"VUID-vkCmdSetLineWidth-commandBuffer-recording",\
"VUID-vkCmdSetPerformanceMarkerINTEL-commandBuffer-recording",\
"VUID-vkCmdSetPerformanceOverrideINTEL-commandBuffer-recording",\
"VUID-vkCmdSetPerformanceStreamMarkerINTEL-commandBuffer-recording",\
+ "VUID-vkCmdSetPrimitiveTopologyEXT-commandBuffer-recording",\
"VUID-vkCmdSetSampleLocationsEXT-commandBuffer-recording",\
"VUID-vkCmdSetScissor-commandBuffer-recording",\
+ "VUID-vkCmdSetScissorWithCountEXT-commandBuffer-recording",\
"VUID-vkCmdSetStencilCompareMask-commandBuffer-recording",\
+ "VUID-vkCmdSetStencilOpEXT-commandBuffer-recording",\
"VUID-vkCmdSetStencilReference-commandBuffer-recording",\
+ "VUID-vkCmdSetStencilTestEnableEXT-commandBuffer-recording",\
"VUID-vkCmdSetStencilWriteMask-commandBuffer-recording",\
"VUID-vkCmdSetViewport-commandBuffer-recording",\
"VUID-vkCmdSetViewportShadingRatePaletteNV-commandBuffer-recording",\
"VUID-vkCmdSetViewportWScalingNV-commandBuffer-recording",\
+ "VUID-vkCmdSetViewportWithCountEXT-commandBuffer-recording",\
"VUID-vkCmdTraceRaysIndirectKHR-commandBuffer-recording",\
"VUID-vkCmdTraceRaysKHR-commandBuffer-recording",\
"VUID-vkCmdTraceRaysNV-commandBuffer-recording",\
diff --git a/layers/gpu_utils.cpp b/layers/gpu_utils.cpp
index e7059a3..055a716 100644
--- a/layers/gpu_utils.cpp
+++ b/layers/gpu_utils.cpp
@@ -24,7 +24,7 @@
#include "spirv-tools/libspirv.h"
#include "spirv-tools/optimizer.hpp"
#include "spirv-tools/instrument.hpp"
-#include <SPIRV/spirv.hpp>
+#include <spirv/unified1/spirv.hpp>
#include <algorithm>
#include <regex>
@@ -255,10 +255,15 @@
}
if (features) {
VkBool32 *desired = reinterpret_cast<VkBool32 *>(&desired_features);
- VkBool32 *featurePtr = reinterpret_cast<VkBool32 *>(&features);
+ VkBool32 *featurePtr = reinterpret_cast<VkBool32 *>(features);
VkBool32 *supported = reinterpret_cast<VkBool32 *>(&supported_features);
for (size_t i = 0; i < sizeof(VkPhysicalDeviceFeatures); i += (sizeof(VkBool32))) {
- *featurePtr++ |= (*supported++ & *desired++);
+ if (*supported && *desired) {
+ *featurePtr = true;
+ }
+ supported++;
+ desired++;
+ featurePtr++;
}
} else {
VkPhysicalDeviceFeatures new_features = {};
@@ -323,6 +328,14 @@
strm << "Stage = Callable. Global Launch ID (x,y,z) = (" << debug_record[kInstRayTracingOutLaunchIdX] << ", "
<< debug_record[kInstRayTracingOutLaunchIdY] << ", " << debug_record[kInstRayTracingOutLaunchIdZ] << "). ";
} break;
+ case spv::ExecutionModelTaskNV: {
+ strm << "Stage = Task. Global invocation ID (x, y, z) = (" << debug_record[kInstTaskOutGlobalInvocationIdX] << ", "
+ << debug_record[kInstTaskOutGlobalInvocationIdY] << ", " << debug_record[kInstTaskOutGlobalInvocationIdZ] << " )";
+ } break;
+ case spv::ExecutionModelMeshNV: {
+ strm << "Stage = Mesh.Global invocation ID (x, y, z) = (" << debug_record[kInstMeshOutGlobalInvocationIdX] << ", "
+ << debug_record[kInstMeshOutGlobalInvocationIdY] << ", " << debug_record[kInstMeshOutGlobalInvocationIdZ] << " )";
+ } break;
default: {
strm << "Internal Error (unexpected stage = " << debug_record[kInstCommonOutStageIdx] << "). ";
assert(false);
diff --git a/layers/gpu_validation.cpp b/layers/gpu_validation.cpp
index efb6a2f..0ecb5ce 100644
--- a/layers/gpu_validation.cpp
+++ b/layers/gpu_validation.cpp
@@ -182,6 +182,31 @@
LogError(object, "UNASSIGNED-GPU-Assisted Validation Error. ", "Detail: (%s)", specific_message);
}
+bool GpuAssisted::CheckForDescriptorIndexing(DeviceFeatures enabled_features) const {
+ bool result =
+ (IsExtEnabled(device_extensions.vk_ext_descriptor_indexing) &&
+ (enabled_features.core12.descriptorIndexing || enabled_features.core12.shaderInputAttachmentArrayDynamicIndexing ||
+ enabled_features.core12.shaderUniformTexelBufferArrayDynamicIndexing ||
+ enabled_features.core12.shaderStorageTexelBufferArrayDynamicIndexing ||
+ enabled_features.core12.shaderUniformBufferArrayNonUniformIndexing ||
+ enabled_features.core12.shaderSampledImageArrayNonUniformIndexing ||
+ enabled_features.core12.shaderStorageBufferArrayNonUniformIndexing ||
+ enabled_features.core12.shaderStorageImageArrayNonUniformIndexing ||
+ enabled_features.core12.shaderInputAttachmentArrayNonUniformIndexing ||
+ enabled_features.core12.shaderUniformTexelBufferArrayNonUniformIndexing ||
+ enabled_features.core12.shaderStorageTexelBufferArrayNonUniformIndexing ||
+ enabled_features.core12.descriptorBindingUniformBufferUpdateAfterBind ||
+ enabled_features.core12.descriptorBindingSampledImageUpdateAfterBind ||
+ enabled_features.core12.descriptorBindingStorageImageUpdateAfterBind ||
+ enabled_features.core12.descriptorBindingStorageBufferUpdateAfterBind ||
+ enabled_features.core12.descriptorBindingUniformTexelBufferUpdateAfterBind ||
+ enabled_features.core12.descriptorBindingStorageTexelBufferUpdateAfterBind ||
+ enabled_features.core12.descriptorBindingUpdateUnusedWhilePending ||
+ enabled_features.core12.descriptorBindingPartiallyBound ||
+ enabled_features.core12.descriptorBindingVariableDescriptorCount || enabled_features.core12.runtimeDescriptorArray));
+ return result;
+}
+
void GpuAssisted::PreCallRecordCreateBuffer(VkDevice device, const VkBufferCreateInfo *pCreateInfo,
const VkAllocationCallbacks *pAllocator, VkBuffer *pBuffer, void *cb_state_data) {
// Ray tracing acceleration structure instance buffers also need the storage buffer usage as
@@ -220,8 +245,7 @@
return;
}
- if (!device_gpu_assisted->enabled_features.core.fragmentStoresAndAtomics ||
- !device_gpu_assisted->enabled_features.core.vertexPipelineStoresAndAtomics) {
+ if (!supported_features.fragmentStoresAndAtomics || !supported_features.vertexPipelineStoresAndAtomics) {
ReportSetupProblem(device,
"GPU-Assisted validation requires fragmentStoresAndAtomics and vertexPipelineStoresAndAtomics. "
"GPU-Assisted Validation disabled.");
@@ -230,17 +254,20 @@
}
if ((device_extensions.vk_ext_buffer_device_address || device_extensions.vk_khr_buffer_device_address) &&
- !device_gpu_assisted->enabled_features.core.shaderInt64) {
+ !supported_features.shaderInt64) {
LogWarning(device, "UNASSIGNED-GPU-Assisted Validation Warning",
"shaderInt64 feature is not available. No buffer device address checking will be attempted");
}
- device_gpu_assisted->shaderInt64 = device_gpu_assisted->enabled_features.core.shaderInt64;
+ device_gpu_assisted->shaderInt64 = supported_features.shaderInt64;
device_gpu_assisted->physicalDevice = physicalDevice;
device_gpu_assisted->device = *pDevice;
device_gpu_assisted->output_buffer_size = sizeof(uint32_t) * (spvtools::kInstMaxOutCnt + 1);
+ device_gpu_assisted->descriptor_indexing = CheckForDescriptorIndexing(device_gpu_assisted->enabled_features);
std::vector<VkDescriptorSetLayoutBinding> bindings;
VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1,
- VK_SHADER_STAGE_ALL_GRAPHICS | VK_SHADER_STAGE_COMPUTE_BIT | kShaderStageAllRayTracing,
+ VK_SHADER_STAGE_ALL_GRAPHICS | VK_SHADER_STAGE_COMPUTE_BIT |
+ VK_SHADER_STAGE_MESH_BIT_NV | VK_SHADER_STAGE_TASK_BIT_NV |
+ kShaderStageAllRayTracing,
NULL};
bindings.push_back(binding);
for (auto i = 1; i < 3; i++) {
@@ -251,8 +278,8 @@
CreateAccelerationStructureBuildValidationState(device_gpu_assisted);
}
-void GpuAssisted::PostCallRecordGetBufferDeviceAddressEXT(VkDevice device, const VkBufferDeviceAddressInfoEXT *pInfo,
- VkDeviceAddress address) {
+void GpuAssisted::PostCallRecordGetBufferDeviceAddress(VkDevice device, const VkBufferDeviceAddressInfoEXT *pInfo,
+ VkDeviceAddress address) {
BUFFER_STATE *buffer_state = GetBufferState(pInfo->buffer);
// Validate against the size requested when the buffer was created
if (buffer_state) {
@@ -261,25 +288,27 @@
}
}
+void GpuAssisted::PostCallRecordGetBufferDeviceAddressEXT(VkDevice device, const VkBufferDeviceAddressInfoEXT *pInfo,
+ VkDeviceAddress address) {
+ PostCallRecordGetBufferDeviceAddress(device, pInfo, address);
+}
+
void GpuAssisted::PostCallRecordGetBufferDeviceAddressKHR(VkDevice device, const VkBufferDeviceAddressInfoEXT *pInfo,
VkDeviceAddress address) {
- BUFFER_STATE *buffer_state = GetBufferState(pInfo->buffer);
- // Validate against the size requested when the buffer was created
- if (buffer_state) {
- buffer_map[address] = buffer_state->createInfo.size;
- buffer_state->deviceAddress = address;
- }
+ PostCallRecordGetBufferDeviceAddress(device, pInfo, address);
}
void GpuAssisted::PreCallRecordDestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks *pAllocator) {
BUFFER_STATE *buffer_state = GetBufferState(buffer);
if (buffer_state) buffer_map.erase(buffer_state->deviceAddress);
+ ValidationStateTracker::PreCallRecordDestroyBuffer(device, buffer, pAllocator);
}
// Clean up device-related resources
void GpuAssisted::PreCallRecordDestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
DestroyAccelerationStructureBuildValidationState();
UtilPreCallRecordDestroyDevice(this);
+ ValidationStateTracker::PreCallRecordDestroyDevice(device, pAllocator);
}
void GpuAssisted::CreateAccelerationStructureBuildValidationState(GpuAssisted *device_gpuav) {
@@ -465,37 +494,19 @@
}
VkBuffer scratch = VK_NULL_HANDLE;
+ VmaAllocation scratch_allocation = {};
if (result == VK_SUCCESS) {
VkBufferCreateInfo scratch_ci = {};
scratch_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
scratch_ci.size = scratch_mem_requirements.memoryRequirements.size;
scratch_ci.usage = VK_BUFFER_USAGE_RAY_TRACING_BIT_NV;
-
- result = DispatchCreateBuffer(device_gpuav->device, &scratch_ci, nullptr, &scratch);
- if (result != VK_SUCCESS) {
- ReportSetupProblem(device_gpuav->device,
- "Failed to create scratch buffer for acceleration structure build validation.");
- }
- }
-
- VmaAllocation scratch_allocation = VK_NULL_HANDLE;
- VmaAllocationInfo scratch_allocation_info = {};
- if (result == VK_SUCCESS) {
VmaAllocationCreateInfo scratch_aci = {};
scratch_aci.usage = VMA_MEMORY_USAGE_GPU_ONLY;
- result = vmaAllocateMemory(device_gpuav->vmaAllocator, &scratch_mem_requirements.memoryRequirements, &scratch_aci,
- &scratch_allocation, &scratch_allocation_info);
+ result = vmaCreateBuffer(device_gpuav->vmaAllocator, &scratch_ci, &scratch_aci, &scratch, &scratch_allocation, nullptr);
if (result != VK_SUCCESS) {
- ReportSetupProblem(device_gpuav->device, "Failed to alloc scratch memory for acceleration structure build validation.");
- }
- }
-
- if (result == VK_SUCCESS) {
- result = DispatchBindBufferMemory(device_gpuav->device, scratch, scratch_allocation_info.deviceMemory,
- scratch_allocation_info.offset);
- if (result != VK_SUCCESS) {
- ReportSetupProblem(device_gpuav->device, "Failed to bind scratch memory for acceleration structure build validation.");
+ ReportSetupProblem(device_gpuav->device,
+ "Failed to create scratch buffer for acceleration structure build validation.");
}
}
@@ -578,8 +589,7 @@
vmaDestroyBuffer(device_gpuav->vmaAllocator, ibo, ibo_allocation);
}
if (scratch != VK_NULL_HANDLE) {
- DispatchDestroyBuffer(device_gpuav->device, scratch, nullptr);
- vmaFreeMemory(device_gpuav->vmaAllocator, scratch_allocation);
+ vmaDestroyBuffer(device_gpuav->vmaAllocator, scratch, scratch_allocation);
}
if (command_pool != VK_NULL_HANDLE) {
DispatchDestroyCommandPool(device_gpuav->device, command_pool, nullptr);
@@ -757,7 +767,7 @@
std::vector<uint64_t> current_valid_handles;
for (const auto &as_state_kv : accelerationStructureMap) {
const ACCELERATION_STRUCTURE_STATE &as_state = *as_state_kv.second;
- if (as_state.built && as_state.create_info.info.type == VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV) {
+ if (as_state.built && as_state.create_infoNV.info.type == VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV) {
current_valid_handles.push_back(as_state.opaque_handle);
}
}
@@ -1027,7 +1037,7 @@
void GpuAssisted::PostCallRecordGetPhysicalDeviceProperties(VkPhysicalDevice physicalDevice,
VkPhysicalDeviceProperties *pPhysicalDeviceProperties) {
// There is an implicit layer that can cause this call to return 0 for maxBoundDescriptorSets - Ignore such calls
- if (enabled.gpu_validation_reserve_binding_slot && pPhysicalDeviceProperties->limits.maxBoundDescriptorSets > 0) {
+ if (enabled[gpu_validation_reserve_binding_slot] && pPhysicalDeviceProperties->limits.maxBoundDescriptorSets > 0) {
if (pPhysicalDeviceProperties->limits.maxBoundDescriptorSets > 1) {
pPhysicalDeviceProperties->limits.maxBoundDescriptorSets -= 1;
} else {
@@ -1040,7 +1050,7 @@
void GpuAssisted::PostCallRecordGetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice,
VkPhysicalDeviceProperties2 *pPhysicalDeviceProperties2) {
// There is an implicit layer that can cause this call to return 0 for maxBoundDescriptorSets - Ignore such calls
- if (enabled.gpu_validation_reserve_binding_slot && pPhysicalDeviceProperties2->properties.limits.maxBoundDescriptorSets > 0) {
+ if (enabled[gpu_validation_reserve_binding_slot] && pPhysicalDeviceProperties2->properties.limits.maxBoundDescriptorSets > 0) {
if (pPhysicalDeviceProperties2->properties.limits.maxBoundDescriptorSets > 1) {
pPhysicalDeviceProperties2->properties.limits.maxBoundDescriptorSets -= 1;
} else {
@@ -1152,6 +1162,20 @@
if (aborted) return false;
if (pCreateInfo->pCode[0] != spv::MagicNumber) return false;
+ const spvtools::MessageConsumer GpuConsoleMessageConsumer =
+ [this](spv_message_level_t level, const char *, const spv_position_t &position, const char *message) -> void {
+ switch (level) {
+ case SPV_MSG_FATAL:
+ case SPV_MSG_INTERNAL_ERROR:
+ case SPV_MSG_ERROR:
+ this->LogError(this->device, "UNASSIGNED-GPU-Assisted", "Error during shader instrumentation: line %zu: %s",
+ position.index, message);
+ break;
+ default:
+ break;
+ }
+ };
+
// Load original shader SPIR-V
uint32_t num_words = static_cast<uint32_t>(pCreateInfo->codeSize / 4);
new_pgm.clear();
@@ -1161,14 +1185,15 @@
// Call the optimizer to instrument the shader.
// Use the unique_shader_module_id as a shader ID so we can look up its handle later in the shader_map.
// If descriptor indexing is enabled, enable length checks and updated descriptor checks
- const bool descriptor_indexing = IsExtEnabled(device_extensions.vk_ext_descriptor_indexing);
using namespace spvtools;
- spv_target_env target_env = SPV_ENV_VULKAN_1_1;
+ spv_target_env target_env = PickSpirvEnv(api_version, (device_extensions.vk_khr_spirv_1_4 != kNotEnabled));
Optimizer optimizer(target_env);
+ optimizer.SetMessageConsumer(GpuConsoleMessageConsumer);
optimizer.RegisterPass(
CreateInstBindlessCheckPass(desc_set_bind_index, unique_shader_module_id, descriptor_indexing, descriptor_indexing));
optimizer.RegisterPass(CreateAggressiveDCEPass());
- if ((device_extensions.vk_ext_buffer_device_address || device_extensions.vk_khr_buffer_device_address) && shaderInt64)
+ if ((device_extensions.vk_ext_buffer_device_address || device_extensions.vk_khr_buffer_device_address) && shaderInt64 &&
+ enabled_features.core12.bufferDeviceAddress)
optimizer.RegisterPass(CreateInstBuffAddrCheckPass(desc_set_bind_index, unique_shader_module_id));
bool pass = optimizer.Run(new_pgm.data(), new_pgm.size(), &new_pgm);
if (!pass) {
@@ -1311,7 +1336,7 @@
VkResult result) {
ValidationStateTracker::PostCallRecordQueueSubmit(queue, submitCount, pSubmits, fence, result);
- if (aborted) return;
+ if (aborted || (result != VK_SUCCESS)) return;
bool buffers_present = false;
// Don't QueueWaitIdle if there's nothing to process
for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
@@ -1365,6 +1390,57 @@
AllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
}
+void GpuAssisted::PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride) {
+ ValidationStateTracker::PreCallRecordCmdDrawIndirectCountKHR(commandBuffer, buffer, offset, countBuffer, countBufferOffset,
+ maxDrawCount, stride);
+ AllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
+}
+
+void GpuAssisted::PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride) {
+ ValidationStateTracker::PreCallRecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset,
+ maxDrawCount, stride);
+ AllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
+}
+
+void GpuAssisted::PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset,
+ uint32_t maxDrawCount, uint32_t stride) {
+ ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCountKHR(commandBuffer, buffer, offset, countBuffer,
+ countBufferOffset, maxDrawCount, stride);
+ AllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
+}
+
+void GpuAssisted::PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset,
+ uint32_t maxDrawCount, uint32_t stride) {
+ ValidationStateTracker::PreCallRecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset,
+ maxDrawCount, stride);
+ AllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
+}
+
+void GpuAssisted::PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask) {
+ ValidationStateTracker::PreCallRecordCmdDrawMeshTasksNV(commandBuffer, taskCount, firstTask);
+ AllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
+}
+
+void GpuAssisted::PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ uint32_t drawCount, uint32_t stride) {
+ ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectNV(commandBuffer, buffer, offset, drawCount, stride);
+ AllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
+}
+
+void GpuAssisted::PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset,
+ uint32_t maxDrawCount, uint32_t stride) {
+ ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectCountNV(commandBuffer, buffer, offset, countBuffer,
+ countBufferOffset, maxDrawCount, stride);
+ AllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS);
+}
+
void GpuAssisted::PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
AllocateValidationResources(commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE);
}
@@ -1493,7 +1569,7 @@
// Figure out how much memory we need for the input block based on how many sets and bindings there are
// and how big each of the bindings is
- if (number_of_sets > 0 && device_extensions.vk_ext_descriptor_indexing) {
+ if (number_of_sets > 0 && descriptor_indexing) {
uint32_t descriptor_count = 0; // Number of descriptors, including all array elements
uint32_t binding_count = 0; // Number of bindings based on the max binding number used
for (auto s : state.per_set) {
@@ -1621,8 +1697,8 @@
desc_count = 2;
}
- if (number_of_sets > 0 && (device_extensions.vk_ext_buffer_device_address || device_extensions.vk_khr_buffer_device_address) &&
- buffer_map.size() && shaderInt64) {
+ if ((device_extensions.vk_ext_buffer_device_address || device_extensions.vk_khr_buffer_device_address) && buffer_map.size() &&
+ shaderInt64 && enabled_features.core12.bufferDeviceAddress) {
// Example BDA input buffer assuming 2 buffers using BDA:
// Word 0 | Index of start of buffer sizes (in this case 5)
// Word 1 | 0x0000000000000000
@@ -1689,18 +1765,27 @@
auto iter = cb_node->lastBound.find(bind_point); // find() allows read-only access to cb_state
if (iter != cb_node->lastBound.end()) {
auto pipeline_state = iter->second.pipeline_state;
- if (pipeline_state && (pipeline_state->pipeline_layout->set_layouts.size() <= desc_set_bind_index)) {
+ if (pipeline_state && (pipeline_state->pipeline_layout->set_layouts.size() <= desc_set_bind_index) &&
+ !pipeline_state->pipeline_layout->destroyed) {
DispatchCmdBindDescriptorSets(cmd_buffer, bind_point, pipeline_state->pipeline_layout->layout, desc_set_bind_index, 1,
desc_sets.data(), 0, nullptr);
}
- // Record buffer and memory info in CB state tracking
- GetBufferInfo(cmd_buffer).emplace_back(output_block, di_input_block, bda_input_block, desc_sets[0], desc_pool, bind_point);
+ if (pipeline_state && pipeline_state->pipeline_layout->destroyed) {
+ ReportSetupProblem(device, "Pipeline layout has been destroyed, aborting GPU-AV");
+ aborted = true;
+ } else {
+ // Record buffer and memory info in CB state tracking
+ GetBufferInfo(cmd_buffer)
+ .emplace_back(output_block, di_input_block, bda_input_block, desc_sets[0], desc_pool, bind_point);
+ }
} else {
ReportSetupProblem(device, "Unable to find pipeline state");
+ aborted = true;
+ }
+ if (aborted) {
vmaDestroyBuffer(vmaAllocator, di_input_block.buffer, di_input_block.allocation);
vmaDestroyBuffer(vmaAllocator, bda_input_block.buffer, bda_input_block.allocation);
vmaDestroyBuffer(vmaAllocator, output_block.buffer, output_block.allocation);
- aborted = true;
return;
}
}
diff --git a/layers/gpu_validation.h b/layers/gpu_validation.h
index e73b5e5..b357d56 100644
--- a/layers/gpu_validation.h
+++ b/layers/gpu_validation.h
@@ -93,13 +93,16 @@
GpuAssistedAccelerationStructureBuildValidationState acceleration_structure_validation_state;
public:
+ GpuAssisted() { container_type = LayerObjectTypeGpuAssisted; }
+
bool aborted = false;
+ bool descriptor_indexing = false;
VkDevice device;
VkPhysicalDevice physicalDevice;
uint32_t adjusted_max_desc_sets;
uint32_t desc_set_bind_index;
- VkDescriptorSetLayout debug_desc_layout;
- VkDescriptorSetLayout dummy_desc_layout;
+ VkDescriptorSetLayout debug_desc_layout = VK_NULL_HANDLE;
+ VkDescriptorSetLayout dummy_desc_layout = VK_NULL_HANDLE;
std::unique_ptr<UtilDescriptorSetManager> desc_set_manager;
std::unordered_map<uint32_t, GpuAssistedShaderTracker> shader_map;
PFN_vkSetDeviceLoaderData vkSetDeviceLoaderData;
@@ -118,11 +121,13 @@
public:
template <typename T>
void ReportSetupProblem(T object, const char* const specific_message) const;
+ bool CheckForDescriptorIndexing(DeviceFeatures enabled_features) const;
void PreCallRecordCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator, VkDevice* pDevice,
safe_VkDeviceCreateInfo* modified_create_info);
void PostCallRecordCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator, VkDevice* pDevice, VkResult result);
+ void PostCallRecordGetBufferDeviceAddress(VkDevice device, const VkBufferDeviceAddressInfoEXT* pInfo, VkDeviceAddress address);
void PostCallRecordGetBufferDeviceAddressKHR(VkDevice device, const VkBufferDeviceAddressInfoEXT* pInfo,
VkDeviceAddress address);
void PostCallRecordGetBufferDeviceAddressEXT(VkDevice device, const VkBufferDeviceAddressInfoEXT* pInfo,
@@ -205,6 +210,24 @@
uint32_t stride);
void PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t count,
uint32_t stride);
+ void PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride);
+ void PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride);
+ void PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride);
+ void PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride);
+ void PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount, uint32_t firstTask);
+ void PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ uint32_t drawCount, uint32_t stride);
+ void PreCallRecordCmdDrawMeshTasksIndirectCountNV(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride);
void PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z);
void PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset);
void PreCallRecordCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
diff --git a/layers/image_layout_map.cpp b/layers/image_layout_map.cpp
index 5fa2c13..71760a8 100644
--- a/layers/image_layout_map.cpp
+++ b/layers/image_layout_map.cpp
@@ -63,7 +63,7 @@
}
ImageSubresourceLayoutMap::ImageSubresourceLayoutMap(const IMAGE_STATE& image_state)
: image_state_(image_state),
- encoder_(image_state.range_encoder),
+ encoder_(image_state.subresource_encoder),
layouts_(encoder_.SubresourceCount()),
initial_layout_states_(),
initial_layout_state_map_(encoder_.SubresourceCount()) {}
@@ -220,7 +220,7 @@
// TODO: make sure this paranoia check is sufficient and not too much.
uintptr_t ImageSubresourceLayoutMap::CompatibilityKey() const {
- return (reinterpret_cast<const uintptr_t>(&image_state_) ^ encoder_.AspectMask());
+ return (reinterpret_cast<uintptr_t>(&image_state_) ^ encoder_.AspectMask());
}
bool ImageSubresourceLayoutMap::UpdateFrom(const ImageSubresourceLayoutMap& other) {
diff --git a/layers/layer_options.cpp b/layers/layer_options.cpp
new file mode 100644
index 0000000..4822307
--- /dev/null
+++ b/layers/layer_options.cpp
@@ -0,0 +1,379 @@
+/* Copyright (c) 2020 The Khronos Group Inc.
+ * Copyright (c) 2020 Valve Corporation
+ * Copyright (c) 2020 LunarG, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Author: Mark Lobodzinski <mark@lunarg.com>
+ */
+
+#include "layer_options.h"
+
+// Set the local disable flag for the appropriate VALIDATION_CHECK_DISABLE enum
+void SetValidationDisable(CHECK_DISABLED &disable_data, const ValidationCheckDisables disable_id) {
+ switch (disable_id) {
+ case VALIDATION_CHECK_DISABLE_COMMAND_BUFFER_STATE:
+ disable_data[command_buffer_state] = true;
+ break;
+ case VALIDATION_CHECK_DISABLE_OBJECT_IN_USE:
+ disable_data[object_in_use] = true;
+ break;
+ case VALIDATION_CHECK_DISABLE_IDLE_DESCRIPTOR_SET:
+ disable_data[idle_descriptor_set] = true;
+ break;
+ case VALIDATION_CHECK_DISABLE_PUSH_CONSTANT_RANGE:
+ disable_data[push_constant_range] = true;
+ break;
+ case VALIDATION_CHECK_DISABLE_QUERY_VALIDATION:
+ disable_data[query_validation] = true;
+ break;
+ case VALIDATION_CHECK_DISABLE_IMAGE_LAYOUT_VALIDATION:
+ disable_data[image_layout_validation] = true;
+ break;
+ default:
+ assert(true);
+ }
+}
+
+// Set the local disable flag for a single VK_VALIDATION_FEATURE_DISABLE_* flag
+void SetValidationFeatureDisable(CHECK_DISABLED &disable_data, const VkValidationFeatureDisableEXT feature_disable) {
+ switch (feature_disable) {
+ case VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT:
+ disable_data[shader_validation] = true;
+ break;
+ case VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT:
+ disable_data[thread_safety] = true;
+ break;
+ case VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT:
+ disable_data[stateless_checks] = true;
+ break;
+ case VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT:
+ disable_data[object_tracking] = true;
+ break;
+ case VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT:
+ disable_data[core_checks] = true;
+ break;
+ case VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT:
+ disable_data[handle_wrapping] = true;
+ break;
+ case VK_VALIDATION_FEATURE_DISABLE_ALL_EXT:
+ // Set all disabled flags to true
+ std::fill(disable_data.begin(), disable_data.end(), true);
+ break;
+ default:
+ break;
+ }
+}
+
+// Set the local enable flag for the appropriate VALIDATION_CHECK_ENABLE enum
+void SetValidationEnable(CHECK_ENABLED &enable_data, const ValidationCheckEnables enable_id) {
+ switch (enable_id) {
+ case VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ARM:
+ enable_data[vendor_specific_arm] = true;
+ break;
+ case VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ALL:
+ enable_data[vendor_specific_arm] = true;
+ break;
+ default:
+ assert(true);
+ }
+}
+
+// Set the local enable flag for a single VK_VALIDATION_FEATURE_ENABLE_* flag
+void SetValidationFeatureEnable(CHECK_ENABLED &enable_data, const VkValidationFeatureEnableEXT feature_enable) {
+ switch (feature_enable) {
+ case VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT:
+ enable_data[gpu_validation] = true;
+ break;
+ case VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT:
+ enable_data[gpu_validation_reserve_binding_slot] = true;
+ break;
+ case VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT:
+ enable_data[best_practices] = true;
+ break;
+ case VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT:
+ enable_data[debug_printf] = true;
+ default:
+ break;
+ }
+}
+
+void SetValidationFeatureEnable2(CHECK_ENABLED &enable_data, const VkValidationFeatureEnable feature_enable) {
+ switch (feature_enable) {
+ case VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION:
+ enable_data[sync_validation] = true;
+ break;
+ default:
+ break;
+ }
+}
+
+// Set the local disable flag for settings specified through the VK_EXT_validation_flags extension
+void SetValidationFlags(CHECK_DISABLED &disables, const VkValidationFlagsEXT *val_flags_struct) {
+ for (uint32_t i = 0; i < val_flags_struct->disabledValidationCheckCount; ++i) {
+ switch (val_flags_struct->pDisabledValidationChecks[i]) {
+ case VK_VALIDATION_CHECK_SHADERS_EXT:
+ disables[shader_validation] = true;
+ break;
+ case VK_VALIDATION_CHECK_ALL_EXT:
+ // Set all disabled flags to true
+ disables[shader_validation] = true;
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+// Process Validation Features flags specified through the ValidationFeature extension
+void SetValidationFeatures(CHECK_DISABLED &disable_data, CHECK_ENABLED &enable_data,
+ const VkValidationFeaturesEXT *val_features_struct) {
+ for (uint32_t i = 0; i < val_features_struct->disabledValidationFeatureCount; ++i) {
+ SetValidationFeatureDisable(disable_data, val_features_struct->pDisabledValidationFeatures[i]);
+ }
+ for (uint32_t i = 0; i < val_features_struct->enabledValidationFeatureCount; ++i) {
+ SetValidationFeatureEnable(enable_data, val_features_struct->pEnabledValidationFeatures[i]);
+ }
+}
+
+std::string GetNextToken(std::string *token_list, const std::string &delimiter, size_t *pos) {
+ std::string token;
+ *pos = token_list->find(delimiter);
+ if (*pos != std::string::npos) {
+ token = token_list->substr(0, *pos);
+ } else {
+ *pos = token_list->length() - delimiter.length();
+ token = *token_list;
+ }
+ token_list->erase(0, *pos + delimiter.length());
+ return token;
+}
+
+// Given a string representation of a list of enable enum values, call the appropriate setter function
+void SetLocalEnableSetting(std::string list_of_enables, std::string delimiter, CHECK_ENABLED &enables) {
+ size_t pos = 0;
+ std::string token;
+ while (list_of_enables.length() != 0) {
+ token = GetNextToken(&list_of_enables, delimiter, &pos);
+ if (token.find("VK_VALIDATION_FEATURE_ENABLE_") != std::string::npos) {
+ auto result = VkValFeatureEnableLookup.find(token);
+ if (result != VkValFeatureEnableLookup.end()) {
+ SetValidationFeatureEnable(enables, result->second);
+ } else {
+ auto result2 = VkValFeatureEnableLookup2.find(token);
+ if (result2 != VkValFeatureEnableLookup2.end()) {
+ SetValidationFeatureEnable2(enables, result2->second);
+ }
+ }
+ } else if (token.find("VALIDATION_CHECK_ENABLE_") != std::string::npos) {
+ auto result = ValidationEnableLookup.find(token);
+ if (result != ValidationEnableLookup.end()) {
+ SetValidationEnable(enables, result->second);
+ }
+ }
+ }
+}
+
+// Given a string representation of a list of disable enum values, call the appropriate setter function
+void SetLocalDisableSetting(std::string list_of_disables, std::string delimiter, CHECK_DISABLED &disables) {
+ size_t pos = 0;
+ std::string token;
+ while (list_of_disables.length() != 0) {
+ token = GetNextToken(&list_of_disables, delimiter, &pos);
+ if (token.find("VK_VALIDATION_FEATURE_DISABLE_") != std::string::npos) {
+ auto result = VkValFeatureDisableLookup.find(token);
+ if (result != VkValFeatureDisableLookup.end()) {
+ SetValidationFeatureDisable(disables, result->second);
+ }
+ } else if (token.find("VALIDATION_CHECK_DISABLE_") != std::string::npos) {
+ auto result = ValidationDisableLookup.find(token);
+ if (result != ValidationDisableLookup.end()) {
+ SetValidationDisable(disables, result->second);
+ }
+ }
+ }
+}
+
+uint32_t TokenToUint(std::string &token) {
+ uint32_t int_id = 0;
+ if ((token.find("0x") == 0) || token.find("0X") == 0) { // Handle hex format
+ int_id = std::strtoul(token.c_str(), nullptr, 16);
+ } else {
+ int_id = std::strtoul(token.c_str(), nullptr, 10); // Decimal format
+ }
+ return int_id;
+}
+
+void CreateFilterMessageIdList(std::string raw_id_list, std::string delimiter, std::vector<uint32_t> &filter_list) {
+ size_t pos = 0;
+ std::string token;
+ while (raw_id_list.length() != 0) {
+ token = GetNextToken(&raw_id_list, delimiter, &pos);
+ uint32_t int_id = TokenToUint(token);
+ if (int_id == 0) {
+ size_t id_hash = XXH32(token.c_str(), strlen(token.c_str()), 8); // String
+ if (id_hash != 0) {
+ int_id = static_cast<uint32_t>(id_hash);
+ }
+ }
+ if ((int_id != 0) && (std::find(filter_list.begin(), filter_list.end(), int_id)) == filter_list.end()) {
+ filter_list.push_back(int_id);
+ }
+ }
+}
+
+void SetCustomStypeInfo(std::string raw_id_list, std::string delimiter) {
+ size_t pos = 0;
+ std::string token;
+ // List format is a list of integer pairs
+ while (raw_id_list.length() != 0) {
+ token = GetNextToken(&raw_id_list, delimiter, &pos);
+ uint32_t stype_id = TokenToUint(token);
+ token = GetNextToken(&raw_id_list, delimiter, &pos);
+ uint32_t struct_size_in_bytes = TokenToUint(token);
+ if ((stype_id != 0) && (struct_size_in_bytes != 0)) {
+ bool found = false;
+ // Prevent duplicate entries
+ for (auto item : custom_stype_info) {
+ if (item.first == stype_id) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) custom_stype_info.push_back(std::make_pair(stype_id, struct_size_in_bytes));
+ }
+ }
+}
+
+uint32_t SetMessageDuplicateLimit(std::string &config_message_limit, std::string &env_message_limit) {
+ uint32_t limit = 0;
+ auto GetNum = [](std::string &source_string) {
+ uint32_t limit = 0;
+ int radix = ((source_string.find("0x") == 0) ? 16 : 10);
+ limit = std::strtoul(source_string.c_str(), nullptr, radix);
+ return limit;
+ };
+ // ENV var takes precedence over settings file
+ limit = GetNum(env_message_limit);
+ if (limit == 0) {
+ limit = GetNum(config_message_limit);
+ }
+ return limit;
+}
+
+const VkLayerSettingsEXT *FindSettingsInChain(const void *next) {
+ const VkBaseOutStructure *current = reinterpret_cast<const VkBaseOutStructure *>(next);
+ const VkLayerSettingsEXT *found = nullptr;
+ while (current) {
+ if (static_cast<VkStructureType>(VK_STRUCTURE_TYPE_INSTANCE_LAYER_SETTINGS_EXT) == current->sType) {
+ found = reinterpret_cast<const VkLayerSettingsEXT *>(current);
+ current = nullptr;
+ } else {
+ current = current->pNext;
+ }
+ }
+ return found;
+}
+
+// Process enables and disables set though the vk_layer_settings.txt config file or through an environment variable
+void ProcessConfigAndEnvSettings(ConfigAndEnvSettings *settings_data) {
+ const auto layer_settings_ext = FindSettingsInChain(settings_data->pnext_chain);
+ if (layer_settings_ext) {
+ for (uint32_t i = 0; i < layer_settings_ext->settingCount; i++) {
+ auto cur_setting = layer_settings_ext->pSettings[i];
+ std::string name(cur_setting.name);
+ if (name == "enables") {
+ std::string data(cur_setting.data.arrayString.pCharArray);
+ SetLocalEnableSetting(data, ",", settings_data->enables);
+ } else if (name == "disables") {
+ std::string data(cur_setting.data.arrayString.pCharArray);
+ SetLocalDisableSetting(data, ",", settings_data->disables);
+ } else if (name == "message_id_filter") {
+ std::string data(cur_setting.data.arrayString.pCharArray);
+ CreateFilterMessageIdList(data, ",", settings_data->message_filter_list);
+ } else if (name == "duplicate_message_limit") {
+ *settings_data->duplicate_message_limit = cur_setting.data.value32;
+ } else if (name == "custom_stype_list") {
+ if (cur_setting.type == VK_LAYER_SETTING_VALUE_TYPE_STRING_ARRAY_EXT) {
+ std::string data(cur_setting.data.arrayString.pCharArray);
+ SetCustomStypeInfo(data, ",");
+ } else if (cur_setting.type == VK_LAYER_SETTING_VALUE_TYPE_UINT32_ARRAY_EXT) {
+ for (uint32_t j = 0; j < cur_setting.data.arrayInt32.count / 2; j++) {
+ auto stype_id = cur_setting.data.arrayInt32.pInt32Array[j * 2];
+ auto struct_size = cur_setting.data.arrayInt32.pInt32Array[(j * 2) + 1];
+ bool found = false;
+ // Prevent duplicate entries
+ for (auto item : custom_stype_info) {
+ if (item.first == stype_id) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) custom_stype_info.push_back(std::make_pair(stype_id, struct_size));
+ }
+ }
+ }
+ }
+ }
+ const auto *validation_features_ext = lvl_find_in_chain<VkValidationFeaturesEXT>(settings_data->pnext_chain);
+ if (validation_features_ext) {
+ SetValidationFeatures(settings_data->disables, settings_data->enables, validation_features_ext);
+ }
+ const auto *validation_flags_ext = lvl_find_in_chain<VkValidationFlagsEXT>(settings_data->pnext_chain);
+ if (validation_flags_ext) {
+ SetValidationFlags(settings_data->disables, validation_flags_ext);
+ }
+
+ std::string enable_key(settings_data->layer_description);
+ std::string disable_key(settings_data->layer_description);
+ std::string stypes_key(settings_data->layer_description);
+ std::string filter_msg_key(settings_data->layer_description);
+ std::string message_limit(settings_data->layer_description);
+ enable_key.append(".enables");
+ disable_key.append(".disables");
+ stypes_key.append(".custom_stype_list");
+ filter_msg_key.append(".message_id_filter");
+ message_limit.append(".duplicate_message_limit");
+ std::string list_of_config_enables = getLayerOption(enable_key.c_str());
+ std::string list_of_env_enables = GetLayerEnvVar("VK_LAYER_ENABLES");
+ std::string list_of_config_disables = getLayerOption(disable_key.c_str());
+ std::string list_of_env_disables = GetLayerEnvVar("VK_LAYER_DISABLES");
+ std::string list_of_config_filter_ids = getLayerOption(filter_msg_key.c_str());
+ std::string list_of_env_filter_ids = GetLayerEnvVar("VK_LAYER_MESSAGE_ID_FILTER");
+ std::string list_of_config_stypes = getLayerOption(stypes_key.c_str());
+ std::string list_of_env_stypes = GetLayerEnvVar("VK_LAYER_CUSTOM_STYPE_LIST");
+ std::string config_message_limit = getLayerOption(message_limit.c_str());
+ std::string env_message_limit = GetLayerEnvVar("VK_LAYER_DUPLICATE_MESSAGE_LIMIT");
+
+#if defined(_WIN32)
+ std::string env_delimiter = ";";
+#else
+ std::string env_delimiter = ":";
+#endif
+ // Process layer enables and disable settings
+ SetLocalEnableSetting(list_of_config_enables, ",", settings_data->enables);
+ SetLocalEnableSetting(list_of_env_enables, env_delimiter, settings_data->enables);
+ SetLocalDisableSetting(list_of_config_disables, ",", settings_data->disables);
+ SetLocalDisableSetting(list_of_env_disables, env_delimiter, settings_data->disables);
+ // Process message filter ID list
+ CreateFilterMessageIdList(list_of_config_filter_ids, ",", settings_data->message_filter_list);
+ CreateFilterMessageIdList(list_of_env_filter_ids, env_delimiter, settings_data->message_filter_list);
+ // Process custom stype struct list
+ SetCustomStypeInfo(list_of_config_stypes, ",");
+ SetCustomStypeInfo(list_of_env_stypes, env_delimiter);
+ // Process message limit
+ uint32_t config_limit_setting = SetMessageDuplicateLimit(config_message_limit, env_message_limit);
+ if (config_limit_setting != 0) {
+ *settings_data->duplicate_message_limit = config_limit_setting;
+ }
+}
diff --git a/layers/layer_options.h b/layers/layer_options.h
new file mode 100644
index 0000000..6920035
--- /dev/null
+++ b/layers/layer_options.h
@@ -0,0 +1,97 @@
+/* Copyright (c) 2020 The Khronos Group Inc.
+ * Copyright (c) 2020 Valve Corporation
+ * Copyright (c) 2020 LunarG, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Author: Mark Lobodzinski <mark@lunarg.com>
+ */
+
+#include "chassis.h"
+
+extern std::vector<std::pair<uint32_t, uint32_t>> custom_stype_info;
+
+// Process validation features, flags and settings specified through extensions, a layer settings file, or environment variables
+
+typedef struct {
+ const char *layer_description;
+ const void *pnext_chain;
+ CHECK_ENABLED &enables;
+ CHECK_DISABLED &disables;
+ std::vector<uint32_t> &message_filter_list;
+ int32_t *duplicate_message_limit;
+} ConfigAndEnvSettings;
+
+static const std::unordered_map<std::string, VkValidationFeatureDisableEXT> VkValFeatureDisableLookup = {
+ {"VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT", VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT},
+ {"VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT", VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT},
+ {"VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT", VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT},
+ {"VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT", VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT},
+ {"VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT", VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT},
+ {"VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT", VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT},
+ {"VK_VALIDATION_FEATURE_DISABLE_ALL_EXT", VK_VALIDATION_FEATURE_DISABLE_ALL_EXT},
+};
+
+static const std::unordered_map<std::string, VkValidationFeatureEnableEXT> VkValFeatureEnableLookup = {
+ {"VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT", VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT},
+ {"VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT",
+ VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT},
+ {"VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT", VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT},
+ {"VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT", VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT},
+};
+
+static const std::unordered_map<std::string, VkValidationFeatureEnable> VkValFeatureEnableLookup2 = {
+ {"VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION", VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION},
+};
+
+static const std::unordered_map<std::string, ValidationCheckDisables> ValidationDisableLookup = {
+ {"VALIDATION_CHECK_DISABLE_COMMAND_BUFFER_STATE", VALIDATION_CHECK_DISABLE_COMMAND_BUFFER_STATE},
+ {"VALIDATION_CHECK_DISABLE_OBJECT_IN_USE", VALIDATION_CHECK_DISABLE_OBJECT_IN_USE},
+ {"VALIDATION_CHECK_DISABLE_IDLE_DESCRIPTOR_SET", VALIDATION_CHECK_DISABLE_IDLE_DESCRIPTOR_SET},
+ {"VALIDATION_CHECK_DISABLE_PUSH_CONSTANT_RANGE", VALIDATION_CHECK_DISABLE_PUSH_CONSTANT_RANGE},
+ {"VALIDATION_CHECK_DISABLE_QUERY_VALIDATION", VALIDATION_CHECK_DISABLE_QUERY_VALIDATION},
+ {"VALIDATION_CHECK_DISABLE_IMAGE_LAYOUT_VALIDATION", VALIDATION_CHECK_DISABLE_IMAGE_LAYOUT_VALIDATION},
+};
+
+static const std::unordered_map<std::string, ValidationCheckEnables> ValidationEnableLookup = {
+ {"VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ARM", VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ARM},
+ {"VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ALL", VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ALL},
+};
+
+// This should mirror the 'DisableFlags' enumerated type
+static const std::vector<std::string> DisableFlagNameHelper = {
+ "VALIDATION_CHECK_DISABLE_COMMAND_BUFFER_STATE", // command_buffer_state,
+ "VALIDATION_CHECK_DISABLE_OBJECT_IN_USE", // object_in_use,
+ "VALIDATION_CHECK_DISABLE_IDLE_DESCRIPTOR_SET", // idle_descriptor_set,
+ "VALIDATION_CHECK_DISABLE_PUSH_CONSTANT_RANGE", // push_constant_range,
+ "VALIDATION_CHECK_DISABLE_QUERY_VALIDATION", // query_validation,
+ "VALIDATION_CHECK_DISABLE_IMAGE_LAYOUT_VALIDATION", // image_layout_validation,
+ "VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT", // object_tracking,
+ "VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT", // core_checks,
+ "VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT", // thread_safety,
+ "VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT", // stateless_checks,
+ "VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT", // handle_wrapping,
+ "VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT" // shader_validation,
+};
+
+// This should mirror the 'EnableFlags' enumerated type
+static const std::vector<std::string> EnableFlagNameHelper = {
+ "VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT", // gpu_validation,
+ "VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT", // gpu_validation_reserve_binding_slot,
+ "VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT", // best_practices,
+ "VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ARM", // vendor_specific_arm,
+ "VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT", // debug_printf,
+ "VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION" // sync_validation,
+};
+
+void ProcessConfigAndEnvSettings(ConfigAndEnvSettings *settings_data);
diff --git a/layers/object_lifetime_validation.h b/layers/object_lifetime_validation.h
index 815be20..4b213d4 100644
--- a/layers/object_lifetime_validation.h
+++ b/layers/object_lifetime_validation.h
@@ -76,8 +76,18 @@
// Special-case map for swapchain images
object_map_type swapchainImageMap;
+ void *device_createinfo_pnext;
+ bool null_descriptor_enabled;
+
// Constructor for object lifetime tracking
- ObjectLifetimes() : num_objects{}, num_total_objects(0) {}
+ ObjectLifetimes() : num_objects{}, num_total_objects(0), device_createinfo_pnext(nullptr), null_descriptor_enabled(false) {
+ container_type = LayerObjectTypeObjectTracker;
+ }
+ ~ObjectLifetimes() {
+ if (device_createinfo_pnext) {
+ FreePnextChain(device_createinfo_pnext);
+ }
+ }
template <typename T1>
void InsertObject(object_map_type &map, T1 object, VulkanObjectType object_type, std::shared_ptr<ObjTrackState> pNode) {
@@ -86,11 +96,11 @@
if (!inserted) {
// The object should not already exist. If we couldn't add it to the map, there was probably
// a race condition in the app. Report an error and move on.
- LogError(object, kVUID_ObjectTracker_Info,
- "Couldn't insert %s Object 0x%" PRIxLEAST64
- ", already existed. This should not happen and may indicate a "
- "race condition in the application.",
- object_string[object_type], object_handle);
+ (void)LogError(object, kVUID_ObjectTracker_Info,
+ "Couldn't insert %s Object 0x%" PRIxLEAST64
+ ", already existed. This should not happen and may indicate a "
+ "race condition in the application.",
+ object_string[object_type], object_handle);
}
}
@@ -210,10 +220,10 @@
if (item == object_map[object_type].end()) {
// We've already checked that the object exists. If we couldn't find and atomically remove it
// from the map, there must have been a race condition in the app. Report an error and move on.
- LogError(device, kVUID_ObjectTracker_Info,
- "Couldn't destroy %s Object 0x%" PRIxLEAST64
- ", not found. This should not happen and may indicate a race condition in the application.",
- object_string[object_type], object_handle);
+ (void)LogError(device, kVUID_ObjectTracker_Info,
+ "Couldn't destroy %s Object 0x%" PRIxLEAST64
+ ", not found. This should not happen and may indicate a race condition in the application.",
+ object_string[object_type], object_handle);
return;
}
diff --git a/layers/object_tracker_utils.cpp b/layers/object_tracker_utils.cpp
index 84c8ef0..3563772 100644
--- a/layers/object_tracker_utils.cpp
+++ b/layers/object_tracker_utils.cpp
@@ -174,8 +174,12 @@
if ((desc->descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
(desc->descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
for (uint32_t idx2 = 0; idx2 < desc->descriptorCount; ++idx2) {
- skip |= ValidateObject(desc->pTexelBufferView[idx2], kVulkanObjectTypeBufferView, false,
- "VUID-VkWriteDescriptorSet-descriptorType-00323", "VUID-VkWriteDescriptorSet-commonparent");
+ skip |= ValidateObject(desc->pTexelBufferView[idx2], kVulkanObjectTypeBufferView, true,
+ "VUID-VkWriteDescriptorSet-descriptorType-02994", "VUID-VkWriteDescriptorSet-commonparent");
+ if (!null_descriptor_enabled && desc->pTexelBufferView[idx2] == VK_NULL_HANDLE) {
+ skip |= LogError(desc->dstSet, "VUID-VkWriteDescriptorSet-descriptorType-02995",
+ "VkWriteDescriptorSet: texel buffer view must not be VK_NULL_HANDLE.");
+ }
}
}
@@ -183,8 +187,12 @@
(desc->descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) || (desc->descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) ||
(desc->descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
for (uint32_t idx3 = 0; idx3 < desc->descriptorCount; ++idx3) {
- skip |= ValidateObject(desc->pImageInfo[idx3].imageView, kVulkanObjectTypeImageView, false,
- "VUID-VkWriteDescriptorSet-descriptorType-00326", "VUID-VkDescriptorImageInfo-commonparent");
+ skip |= ValidateObject(desc->pImageInfo[idx3].imageView, kVulkanObjectTypeImageView, true,
+ "VUID-VkWriteDescriptorSet-descriptorType-02996", "VUID-VkDescriptorImageInfo-commonparent");
+ if (!null_descriptor_enabled && desc->pImageInfo[idx3].imageView == VK_NULL_HANDLE) {
+ skip |= LogError(desc->dstSet, "VUID-VkWriteDescriptorSet-descriptorType-02997",
+ "VkWriteDescriptorSet: image view must not be VK_NULL_HANDLE.");
+ }
}
}
@@ -193,13 +201,24 @@
(desc->descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) ||
(desc->descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC)) {
for (uint32_t idx4 = 0; idx4 < desc->descriptorCount; ++idx4) {
- if (desc->pBufferInfo[idx4].buffer) {
- skip |= ValidateObject(desc->pBufferInfo[idx4].buffer, kVulkanObjectTypeBuffer, false,
- "VUID-VkDescriptorBufferInfo-buffer-parameter", kVUIDUndefined);
+ skip |= ValidateObject(desc->pBufferInfo[idx4].buffer, kVulkanObjectTypeBuffer, true,
+ "VUID-VkDescriptorBufferInfo-buffer-parameter", kVUIDUndefined);
+ if (!null_descriptor_enabled && desc->pBufferInfo[idx4].buffer == VK_NULL_HANDLE) {
+ skip |= LogError(desc->dstSet, "VUID-VkDescriptorBufferInfo-buffer-02998",
+ "VkWriteDescriptorSet: buffer must not be VK_NULL_HANDLE.");
}
}
}
+ if (desc->descriptorType == VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR) {
+ const auto *accInfo = lvl_find_in_chain<VkWriteDescriptorSetAccelerationStructureKHR>(desc->pNext);
+ for (uint32_t idx5 = 0; idx5 < desc->descriptorCount; ++idx5) {
+ skip |= ValidateObject(accInfo->pAccelerationStructures[idx5], kVulkanObjectTypeAccelerationStructureKHR, false,
+ "VUID-VkWriteDescriptorSetAccelerationStructureKHR-pAccelerationStructures-parameter",
+ kVUIDUndefined);
+ }
+ }
+
return skip;
}
@@ -281,10 +300,9 @@
bool ObjectLifetimes::PreCallValidateDestroyInstance(VkInstance instance, const VkAllocationCallbacks *pAllocator) const {
bool skip = false;
- // We validate here for coverage, though we'd not have made it this for with a bad instance.
+ // We validate here for coverage, though we'd not have made it this far with a bad instance.
skip |= ValidateObject(instance, kVulkanObjectTypeInstance, true, "VUID-vkDestroyInstance-instance-parameter", kVUIDUndefined);
- // Validate that child devices have been destroyed
auto snapshot = object_map[kVulkanObjectTypeDevice].snapshot();
for (const auto &iit : snapshot) {
auto pNode = iit.second;
@@ -306,9 +324,8 @@
"VUID-vkDestroyInstance-instance-00631");
}
- // Throw errors if any instance objects created on this instance have not been destroyed
- ValidateDestroyObject(instance, kVulkanObjectTypeInstance, pAllocator, "VUID-vkDestroyInstance-instance-00630",
- "VUID-vkDestroyInstance-instance-00631");
+ skip |= ValidateDestroyObject(instance, kVulkanObjectTypeInstance, pAllocator, "VUID-vkDestroyInstance-instance-00630",
+ "VUID-vkDestroyInstance-instance-00631");
// Report any remaining instance objects
skip |= ReportUndestroyedInstanceObjects(instance, "VUID-vkDestroyInstance-instance-00629");
@@ -592,6 +609,30 @@
CreateObject(*pInstance, kVulkanObjectTypeInstance, pAllocator);
}
+bool ObjectLifetimes::PreCallValidateCreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
+ const VkAllocationCallbacks *pAllocator, VkDevice *pDevice) const {
+ bool skip = false;
+ skip |= ValidateObject(physicalDevice, kVulkanObjectTypePhysicalDevice, false, "VUID-vkCreateDevice-physicalDevice-parameter",
+ kVUIDUndefined);
+
+ return skip;
+}
+
+void ObjectLifetimes::PostCallRecordCreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCreateInfo,
+ const VkAllocationCallbacks *pAllocator, VkDevice *pDevice, VkResult result) {
+ if (result != VK_SUCCESS) return;
+ CreateObject(*pDevice, kVulkanObjectTypeDevice, pAllocator);
+
+ auto device_data = GetLayerDataPtr(get_dispatch_key(*pDevice), layer_data_map);
+ ValidationObject *validation_data = GetValidationObject(device_data->object_dispatch, LayerObjectTypeObjectTracker);
+ ObjectLifetimes *object_tracking = static_cast<ObjectLifetimes *>(validation_data);
+
+ object_tracking->device_createinfo_pnext = SafePnextCopy(pCreateInfo->pNext);
+ const auto *robustness2_features =
+ lvl_find_in_chain<VkPhysicalDeviceRobustness2FeaturesEXT>(object_tracking->device_createinfo_pnext);
+ object_tracking->null_descriptor_enabled = robustness2_features && robustness2_features->nullDescriptor;
+}
+
bool ObjectLifetimes::PreCallValidateAllocateCommandBuffers(VkDevice device, const VkCommandBufferAllocateInfo *pAllocateInfo,
VkCommandBuffer *pCommandBuffers) const {
bool skip = false;
@@ -846,8 +887,10 @@
uint32_t *pPropertyCount,
VkDisplayProperties2KHR *pProperties, VkResult result) {
if ((result != VK_SUCCESS) && (result != VK_INCOMPLETE)) return;
- for (uint32_t index = 0; index < *pPropertyCount; ++index) {
- CreateObject(pProperties[index].displayProperties.display, kVulkanObjectTypeDisplayKHR, nullptr);
+ if (pProperties) {
+ for (uint32_t index = 0; index < *pPropertyCount; ++index) {
+ CreateObject(pProperties[index].displayProperties.display, kVulkanObjectTypeDisplayKHR, nullptr);
+ }
}
}
@@ -867,8 +910,10 @@
uint32_t *pPropertyCount, VkDisplayModeProperties2KHR *pProperties,
VkResult result) {
if ((result != VK_SUCCESS) && (result != VK_INCOMPLETE)) return;
- for (uint32_t index = 0; index < *pPropertyCount; ++index) {
- CreateObject(pProperties[index].displayModeProperties.displayMode, kVulkanObjectTypeDisplayModeKHR, nullptr);
+ if (pProperties) {
+ for (uint32_t index = 0; index < *pPropertyCount; ++index) {
+ CreateObject(pProperties[index].displayModeProperties.displayMode, kVulkanObjectTypeDisplayModeKHR, nullptr);
+ }
}
}
diff --git a/layers/parameter_validation_utils.cpp b/layers/parameter_validation_utils.cpp
index b78cdfa..9e49a30 100644
--- a/layers/parameter_validation_utils.cpp
+++ b/layers/parameter_validation_utils.cpp
@@ -85,6 +85,44 @@
return skip;
}
+bool StatelessValidation::validate_validation_features(const VkInstanceCreateInfo *pCreateInfo,
+ const VkValidationFeaturesEXT *validation_features) const {
+ bool skip = false;
+ bool debug_printf = false;
+ bool gpu_assisted = false;
+ bool reserve_slot = false;
+ for (uint32_t i = 0; i < validation_features->enabledValidationFeatureCount; i++) {
+ switch (validation_features->pEnabledValidationFeatures[i]) {
+ case VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT:
+ gpu_assisted = true;
+ break;
+
+ case VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT:
+ debug_printf = true;
+ break;
+
+ case VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT:
+ reserve_slot = true;
+ break;
+
+ default:
+ break;
+ }
+ }
+ if (reserve_slot && !gpu_assisted) {
+ skip |= LogError(instance, "VUID-VkValidationFeaturesEXT-pEnabledValidationFeatures-02967",
+ "If VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT is in pEnabledValidationFeatures, "
+ "VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT must also be in pEnabledValidationFeatures.");
+ }
+ if (gpu_assisted && debug_printf) {
+ skip |= LogError(instance, "VUID-VkValidationFeaturesEXT-pEnabledValidationFeatures-02968",
+ "If VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT is in pEnabledValidationFeatures, "
+ "VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT must not also be in pEnabledValidationFeatures.");
+ }
+
+ return skip;
+}
+
template <typename ExtensionState>
ExtEnabled extension_state_by_name(const ExtensionState &extensions, const char *extension_name) {
if (!extension_name) return kNotEnabled; // null strings specify nothing
@@ -106,6 +144,9 @@
: VK_API_VERSION_1_0;
skip |= validate_api_version(local_api_version, api_version);
skip |= validate_instance_extensions(pCreateInfo);
+ const auto *validation_features = lvl_find_in_chain<VkValidationFeaturesEXT>(pCreateInfo->pNext);
+ if (validation_features) skip |= validate_validation_features(pCreateInfo, validation_features);
+
return skip;
}
@@ -236,7 +277,7 @@
const auto *features2 = lvl_find_in_chain<VkPhysicalDeviceFeatures2KHR>(pCreateInfo->pNext);
if (features2) {
// Cannot include VkPhysicalDeviceFeatures2KHR and have non-null pEnabledFeatures
- skip |= LogError(device, kVUID_PVError_InvalidUsage,
+ skip |= LogError(device, "VUID-VkDeviceCreateInfo-pNext-00373",
"VkDeviceCreateInfo->pNext includes a VkPhysicalDeviceFeatures2KHR struct when "
"pCreateInfo->pEnabledFeatures is non-NULL.");
}
@@ -251,6 +292,19 @@
}
}
+ const VkPhysicalDeviceFeatures *features = features2 ? &features2->features : pCreateInfo->pEnabledFeatures;
+ const auto *robustness2_features = lvl_find_in_chain<VkPhysicalDeviceRobustness2FeaturesEXT>(pCreateInfo->pNext);
+ if (features && robustness2_features && robustness2_features->robustBufferAccess2 && !features->robustBufferAccess) {
+ skip |= LogError(device, "VUID-VkPhysicalDeviceRobustness2FeaturesEXT-robustBufferAccess2-04000",
+ "If robustBufferAccess2 is enabled then robustBufferAccess must be enabled.");
+ }
+ const auto *raytracing_features = lvl_find_in_chain<VkPhysicalDeviceRayTracingFeaturesKHR>(pCreateInfo->pNext);
+ if (raytracing_features && raytracing_features->rayTracingShaderGroupHandleCaptureReplayMixed &&
+ !raytracing_features->rayTracingShaderGroupHandleCaptureReplay) {
+ skip |= LogError(device, "VUID-VkPhysicalDeviceRayTracingFeaturesKHR-rayTracingShaderGroupHandleCaptureReplayMixed-03348",
+ "If rayTracingShaderGroupHandleCaptureReplayMixed is VK_TRUE, rayTracingShaderGroupHandleCaptureReplay "
+ "must also be VK_TRUE.");
+ }
auto vertex_attribute_divisor_features =
lvl_find_in_chain<VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT>(pCreateInfo->pNext);
if (vertex_attribute_divisor_features) {
@@ -322,6 +376,47 @@
}
current = reinterpret_cast<const VkBaseOutStructure *>(current->pNext);
}
+ // Check features are enabled if matching extension is passed in as well
+ for (uint32_t i = 0; i < pCreateInfo->enabledExtensionCount; i++) {
+ const char *extension = pCreateInfo->ppEnabledExtensionNames[i];
+ if ((0 == strncmp(extension, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME, VK_MAX_EXTENSION_NAME_SIZE)) &&
+ (vulkan_12_features->drawIndirectCount == VK_FALSE)) {
+ skip |= LogError(
+ instance, "VUID-VkDeviceCreateInfo-ppEnabledExtensions-02831",
+ "vkCreateDevice(): %s is enabled but VkPhysicalDeviceVulkan12Features::drawIndirectCount is not VK_TRUE.",
+ VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
+ }
+ if ((0 == strncmp(extension, VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME, VK_MAX_EXTENSION_NAME_SIZE)) &&
+ (vulkan_12_features->samplerMirrorClampToEdge == VK_FALSE)) {
+ skip |= LogError(instance, "VUID-VkDeviceCreateInfo-ppEnabledExtensions-02832",
+ "vkCreateDevice(): %s is enabled but VkPhysicalDeviceVulkan12Features::samplerMirrorClampToEdge "
+ "is not VK_TRUE.",
+ VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME);
+ }
+ if ((0 == strncmp(extension, VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, VK_MAX_EXTENSION_NAME_SIZE)) &&
+ (vulkan_12_features->descriptorIndexing == VK_FALSE)) {
+ skip |= LogError(
+ instance, "VUID-VkDeviceCreateInfo-ppEnabledExtensions-02833",
+ "vkCreateDevice(): %s is enabled but VkPhysicalDeviceVulkan12Features::descriptorIndexing is not VK_TRUE.",
+ VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME);
+ }
+ if ((0 == strncmp(extension, VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME, VK_MAX_EXTENSION_NAME_SIZE)) &&
+ (vulkan_12_features->samplerFilterMinmax == VK_FALSE)) {
+ skip |= LogError(
+ instance, "VUID-VkDeviceCreateInfo-ppEnabledExtensions-02834",
+ "vkCreateDevice(): %s is enabled but VkPhysicalDeviceVulkan12Features::samplerFilterMinmax is not VK_TRUE.",
+ VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME);
+ }
+ if ((0 == strncmp(extension, VK_EXT_SHADER_VIEWPORT_INDEX_LAYER_EXTENSION_NAME, VK_MAX_EXTENSION_NAME_SIZE)) &&
+ ((vulkan_12_features->shaderOutputViewportIndex == VK_FALSE) ||
+ (vulkan_12_features->shaderOutputLayer == VK_FALSE))) {
+ skip |=
+ LogError(instance, "VUID-VkDeviceCreateInfo-ppEnabledExtensions-02835",
+ "vkCreateDevice(): %s is enabled but both VkPhysicalDeviceVulkan12Features::shaderOutputViewportIndex "
+ "and VkPhysicalDeviceVulkan12Features::shaderOutputLayer are not VK_TRUE.",
+ VK_EXT_SHADER_VIEWPORT_INDEX_LAYER_EXTENSION_NAME);
+ }
+ }
}
// Validate pCreateInfo->pQueueCreateInfos
@@ -329,7 +424,8 @@
std::unordered_set<uint32_t> set;
for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
- const uint32_t requested_queue_family = pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex;
+ const VkDeviceQueueCreateInfo &queue_create_info = pCreateInfo->pQueueCreateInfos[i];
+ const uint32_t requested_queue_family = queue_create_info.queueFamilyIndex;
if (requested_queue_family == VK_QUEUE_FAMILY_IGNORED) {
skip |=
LogError(physicalDevice, "VUID-VkDeviceQueueCreateInfo-queueFamilyIndex-00381",
@@ -346,9 +442,9 @@
set.insert(requested_queue_family);
}
- if (pCreateInfo->pQueueCreateInfos[i].pQueuePriorities != nullptr) {
- for (uint32_t j = 0; j < pCreateInfo->pQueueCreateInfos[i].queueCount; ++j) {
- const float queue_priority = pCreateInfo->pQueueCreateInfos[i].pQueuePriorities[j];
+ if (queue_create_info.pQueuePriorities != nullptr) {
+ for (uint32_t j = 0; j < queue_create_info.queueCount; ++j) {
+ const float queue_priority = queue_create_info.pQueuePriorities[j];
if (!(queue_priority >= 0.f) || !(queue_priority <= 1.f)) {
skip |= LogError(physicalDevice, "VUID-VkDeviceQueueCreateInfo-pQueuePriorities-00383",
"vkCreateDevice: pCreateInfo->pQueueCreateInfos[%" PRIu32 "].pQueuePriorities[%" PRIu32
@@ -357,9 +453,63 @@
}
}
}
+
+ // Need to know if protectedMemory feature is passed in preCall to creating the device
+ VkBool32 protectedMemory = VK_FALSE;
+ const VkPhysicalDeviceProtectedMemoryFeatures *protected_features =
+ lvl_find_in_chain<VkPhysicalDeviceProtectedMemoryFeatures>(pCreateInfo->pNext);
+ if (protected_features) {
+ protectedMemory = protected_features->protectedMemory;
+ } else if (vulkan_11_features) {
+ protectedMemory = vulkan_11_features->protectedMemory;
+ }
+ if ((queue_create_info.flags == VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT) && (protectedMemory == VK_FALSE)) {
+ skip |= LogError(physicalDevice, "VUID-VkDeviceQueueCreateInfo-flags-02861",
+ "vkCreateDevice: pCreateInfo->flags set to VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT without the "
+ "protectedMemory feature being set as well.");
+ }
}
}
+ // feature dependencies for VK_KHR_variable_pointers
+ const auto *variable_pointers_features = lvl_find_in_chain<VkPhysicalDeviceVariablePointersFeatures>(pCreateInfo->pNext);
+ VkBool32 variablePointers = VK_FALSE;
+ VkBool32 variablePointersStorageBuffer = VK_FALSE;
+ if (vulkan_11_features) {
+ variablePointers = vulkan_11_features->variablePointers;
+ variablePointersStorageBuffer = vulkan_11_features->variablePointersStorageBuffer;
+ } else if (variable_pointers_features) {
+ variablePointers = variable_pointers_features->variablePointers;
+ variablePointersStorageBuffer = variable_pointers_features->variablePointersStorageBuffer;
+ }
+ if ((variablePointers == VK_TRUE) && (variablePointersStorageBuffer == VK_FALSE)) {
+ skip |= LogError(instance, "VUID-VkPhysicalDeviceVariablePointersFeatures-variablePointers-01431",
+ "If variablePointers is VK_TRUE then variablePointersStorageBuffer also needs to be VK_TRUE");
+ }
+
+ // feature dependencies for VK_KHR_multiview
+ const auto *multiview_features = lvl_find_in_chain<VkPhysicalDeviceMultiviewFeatures>(pCreateInfo->pNext);
+ VkBool32 multiview = VK_FALSE;
+ VkBool32 multiviewGeometryShader = VK_FALSE;
+ VkBool32 multiviewTessellationShader = VK_FALSE;
+ if (vulkan_11_features) {
+ multiview = vulkan_11_features->multiview;
+ multiviewGeometryShader = vulkan_11_features->multiviewGeometryShader;
+ multiviewTessellationShader = vulkan_11_features->multiviewTessellationShader;
+ } else if (multiview_features) {
+ multiview = multiview_features->multiview;
+ multiviewGeometryShader = multiview_features->multiviewGeometryShader;
+ multiviewTessellationShader = multiview_features->multiviewTessellationShader;
+ }
+ if ((multiview == VK_FALSE) && (multiviewGeometryShader == VK_TRUE)) {
+ skip |= LogError(instance, "VUID-VkPhysicalDeviceMultiviewFeatures-multiviewGeometryShader-00580",
+ "If multiviewGeometryShader is VK_TRUE then multiview also needs to be VK_TRUE");
+ }
+ if ((multiview == VK_FALSE) && (multiviewTessellationShader == VK_TRUE)) {
+ skip |= LogError(instance, "VUID-VkPhysicalDeviceMultiviewFeatures-multiviewTessellationShader-00581",
+ "If multiviewTessellationShader is VK_TRUE then multiview also needs to be VK_TRUE");
+ }
+
return skip;
}
@@ -400,6 +550,26 @@
}
}
+ if ((pCreateInfo->flags & VK_BUFFER_CREATE_SPARSE_BINDING_BIT) && (!physical_device_features.sparseBinding)) {
+ skip |= LogError(device, "VUID-VkBufferCreateInfo-flags-00915",
+ "vkCreateBuffer(): the sparseBinding device feature is disabled: Buffers cannot be created with the "
+ "VK_BUFFER_CREATE_SPARSE_BINDING_BIT set.");
+ }
+
+ if ((pCreateInfo->flags & VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT) && (!physical_device_features.sparseResidencyBuffer)) {
+ skip |=
+ LogError(device, "VUID-VkBufferCreateInfo-flags-00916",
+ "vkCreateBuffer(): the sparseResidencyBuffer device feature is disabled: Buffers cannot be created with "
+ "the VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT set.");
+ }
+
+ if ((pCreateInfo->flags & VK_BUFFER_CREATE_SPARSE_ALIASED_BIT) && (!physical_device_features.sparseResidencyAliased)) {
+ skip |=
+ LogError(device, "VUID-VkBufferCreateInfo-flags-00917",
+ "vkCreateBuffer(): the sparseResidencyAliased device feature is disabled: Buffers cannot be created with "
+ "the VK_BUFFER_CREATE_SPARSE_ALIASED_BIT set.");
+ }
+
// If flags contains VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT or VK_BUFFER_CREATE_SPARSE_ALIASED_BIT, it must also contain
// VK_BUFFER_CREATE_SPARSE_BINDING_BIT
if (((pCreateInfo->flags & (VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
@@ -545,6 +715,13 @@
"VkPhysicalDeviceFeatures::sparseBinding feature is disabled.");
}
+ if ((pCreateInfo->flags & VK_IMAGE_CREATE_SPARSE_ALIASED_BIT) && (!physical_device_features.sparseResidencyAliased)) {
+ skip |= LogError(
+ device, "VUID-VkImageCreateInfo-flags-01924",
+ "vkCreateImage(): the sparseResidencyAliased device feature is disabled: Images cannot be created with the "
+ "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT set.");
+ }
+
// If flags contains VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT or VK_IMAGE_CREATE_SPARSE_ALIASED_BIT, it must also contain
// VK_IMAGE_CREATE_SPARSE_BINDING_BIT
if (((pCreateInfo->flags & (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_IMAGE_CREATE_SPARSE_ALIASED_BIT)) != 0) &&
@@ -655,6 +832,13 @@
}
}
+ if (((pCreateInfo->flags & VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT) != 0) &&
+ (FormatHasDepth(pCreateInfo->format) == false)) {
+ skip |= LogError(device, "VUID-VkImageCreateInfo-flags-01533",
+ "vkCreateImage(): if flags contain VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT the "
+ "format must be a depth or depth/stencil format.");
+ }
+
const auto image_stencil_struct = lvl_find_in_chain<VkImageStencilUsageCreateInfoEXT>(pCreateInfo->pNext);
if (image_stencil_struct != nullptr) {
if ((image_stencil_struct->stencilUsage & VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT) != 0) {
@@ -740,11 +924,175 @@
"vkCreateImage(): usage contains VK_IMAGE_USAGE_STORAGE_BIT and the multisampled storage images "
"feature is not enabled, image samples must be VK_SAMPLE_COUNT_1_BIT");
}
+
+ if (device_extensions.vk_ext_image_drm_format_modifier) {
+ const auto drm_format_mod_list = lvl_find_in_chain<VkImageDrmFormatModifierListCreateInfoEXT>(pCreateInfo->pNext);
+ const auto drm_format_mod_explict =
+ lvl_find_in_chain<VkImageDrmFormatModifierExplicitCreateInfoEXT>(pCreateInfo->pNext);
+ if (pCreateInfo->tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
+ if (((drm_format_mod_list != nullptr) && (drm_format_mod_explict != nullptr)) ||
+ ((drm_format_mod_list == nullptr) && (drm_format_mod_explict == nullptr))) {
+ skip |= LogError(device, "VUID-VkImageCreateInfo-tiling-02261",
+ "vkCreateImage(): Tiling is VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT but pNext must have "
+ "either VkImageDrmFormatModifierListCreateInfoEXT or "
+ "VkImageDrmFormatModifierExplicitCreateInfoEXT in the pNext chain");
+ }
+ } else if ((drm_format_mod_list != nullptr) || (drm_format_mod_explict != nullptr)) {
+ skip |= LogError(device, "VUID-VkImageCreateInfo-pNext-02262",
+ "vkCreateImage(): Tiling is not VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT but there is a "
+ "VkImageDrmFormatModifierListCreateInfoEXT or VkImageDrmFormatModifierExplicitCreateInfoEXT "
+ "in the pNext chain");
+ }
+ }
+
+ if (pCreateInfo->usage & VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT) {
+ if (pCreateInfo->imageType != VK_IMAGE_TYPE_2D) {
+ skip |= LogError(device, "VUID-VkImageCreateInfo-flags-02557",
+ "vkCreateImage: if usage includes VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT, "
+ "imageType must be VK_IMAGE_TYPE_2D.");
+ }
+ if (pCreateInfo->samples != VK_SAMPLE_COUNT_1_BIT) {
+ skip |= LogError(device, "VUID-VkImageCreateInfo-samples-02558",
+ "vkCreateImage: if usage includes VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT, "
+ "samples must be VK_SAMPLE_COUNT_1_BIT.");
+ }
+ if (pCreateInfo->tiling != VK_IMAGE_TILING_OPTIMAL) {
+ skip |= LogError(device, "VUID-VkImageCreateInfo-tiling-02084",
+ "vkCreateImage: if usage includes VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT, "
+ "tiling must be VK_IMAGE_TILING_OPTIMAL.");
+ }
+ }
+ if (pCreateInfo->flags & VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT) {
+ if (pCreateInfo->tiling != VK_IMAGE_TILING_OPTIMAL) {
+ skip |= LogError(device, "VUID-VkImageCreateInfo-flags-02565",
+ "vkCreateImage: if usage includes VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT, "
+ "tiling must be VK_IMAGE_TILING_OPTIMAL.");
+ }
+ if (pCreateInfo->imageType != VK_IMAGE_TYPE_2D) {
+ skip |= LogError(device, "VUID-VkImageCreateInfo-flags-02566",
+ "vkCreateImage: if flags includes VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT, "
+ "imageType must be VK_IMAGE_TYPE_2D.");
+ }
+ if (pCreateInfo->flags & VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT) {
+ skip |= LogError(device, "VUID-VkImageCreateInfo-flags-02567",
+ "vkCreateImage: if flags includes VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT, "
+ "flags must not include VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT.");
+ }
+ if (pCreateInfo->mipLevels != 1) {
+ skip |= LogError(device, "VUID-VkImageCreateInfo-flags-02568",
+ "vkCreateImage: if flags includes VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT, mipLevels (%d) must be 1.",
+ pCreateInfo->mipLevels);
+ }
+ }
+
+ const auto swapchain_create_info = lvl_find_in_chain<VkImageSwapchainCreateInfoKHR>(pCreateInfo->pNext);
+ if (swapchain_create_info != nullptr) {
+ if (swapchain_create_info->swapchain != VK_NULL_HANDLE) {
+ // All the following fall under the same VU that checks that the swapchain image uses parameters limited by the
+ // table in #swapchain-wsi-image-create-info. Breaking up into multiple checks allows for more useful information
+ // returned why this error occured. Check for matching Swapchain flags is done later in state tracking validation
+ const char *vuid = "VUID-VkImageSwapchainCreateInfoKHR-swapchain-00995";
+ const char *base_message = "vkCreateImage(): The image used for creating a presentable swapchain image";
+
+ if (pCreateInfo->imageType != VK_IMAGE_TYPE_2D) {
+ // also implicitly forces the check above that extent.depth is 1
+ skip |= LogError(device, vuid, "%s must have a imageType value VK_IMAGE_TYPE_2D instead of %s.", base_message,
+ string_VkImageType(pCreateInfo->imageType));
+ }
+ if (pCreateInfo->mipLevels != 1) {
+ skip |= LogError(device, vuid, "%s must have a mipLevels value of 1 instead of %u.", base_message,
+ pCreateInfo->mipLevels);
+ }
+ if (pCreateInfo->samples != VK_SAMPLE_COUNT_1_BIT) {
+ skip |= LogError(device, vuid, "%s must have a samples value of VK_SAMPLE_COUNT_1_BIT instead of %s.",
+ base_message, string_VkSampleCountFlagBits(pCreateInfo->samples));
+ }
+ if (pCreateInfo->tiling != VK_IMAGE_TILING_OPTIMAL) {
+ skip |= LogError(device, vuid, "%s must have a tiling value of VK_IMAGE_TILING_OPTIMAL instead of %s.",
+ base_message, string_VkImageTiling(pCreateInfo->tiling));
+ }
+ if (pCreateInfo->initialLayout != VK_IMAGE_LAYOUT_UNDEFINED) {
+ skip |= LogError(device, vuid, "%s must have a initialLayout value of VK_IMAGE_LAYOUT_UNDEFINED instead of %s.",
+ base_message, string_VkImageLayout(pCreateInfo->initialLayout));
+ }
+ const VkImageCreateFlags valid_flags =
+ (VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT | VK_IMAGE_CREATE_PROTECTED_BIT |
+ VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR);
+ if ((pCreateInfo->flags & ~valid_flags) != 0) {
+ skip |= LogError(device, vuid, "%s flags are %" PRIu32 "and must only have valid flags set.", base_message,
+ pCreateInfo->flags);
+ }
+ }
+ }
}
return skip;
}
+bool StatelessValidation::manual_PreCallValidateCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
+ const VkAllocationCallbacks *pAllocator, VkImageView *pView) const {
+ bool skip = false;
+
+ if (pCreateInfo != nullptr) {
+ // Validate feature set if using CUBE_ARRAY
+ if ((pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY) && (physical_device_features.imageCubeArray == false)) {
+ skip |= LogError(pCreateInfo->image, "VUID-VkImageViewCreateInfo-viewType-01004",
+ "vkCreateImageView(): pCreateInfo->viewType can't be VK_IMAGE_VIEW_TYPE_CUBE_ARRAY without "
+ "enabling the imageCubeArray feature.");
+ }
+
+ if (pCreateInfo->subresourceRange.layerCount != VK_REMAINING_ARRAY_LAYERS) {
+ if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE && pCreateInfo->subresourceRange.layerCount != 6) {
+ skip |= LogError(device, "VUID-VkImageViewCreateInfo-viewType-02960",
+ "vkCreateImageView(): subresourceRange.layerCount (%d) must be 6 or VK_REMAINING_ARRAY_LAYERS.",
+ pCreateInfo->subresourceRange.layerCount);
+ }
+ if (pCreateInfo->viewType == VK_IMAGE_VIEW_TYPE_CUBE_ARRAY && (pCreateInfo->subresourceRange.layerCount % 6) != 0) {
+ skip |= LogError(
+ device, "VUID-VkImageViewCreateInfo-viewType-02961",
+ "vkCreateImageView(): subresourceRange.layerCount (%d) must be a multiple of 6 or VK_REMAINING_ARRAY_LAYERS.",
+ pCreateInfo->subresourceRange.layerCount);
+ }
+ }
+
+ auto astc_decode_mode = lvl_find_in_chain<VkImageViewASTCDecodeModeEXT>(pCreateInfo->pNext);
+ if ((device_extensions.vk_ext_astc_decode_mode) && (astc_decode_mode != nullptr)) {
+ if ((astc_decode_mode->decodeMode != VK_FORMAT_R16G16B16A16_SFLOAT) &&
+ (astc_decode_mode->decodeMode != VK_FORMAT_R8G8B8A8_UNORM) &&
+ (astc_decode_mode->decodeMode != VK_FORMAT_E5B9G9R9_UFLOAT_PACK32)) {
+ skip |= LogError(device, "VUID-VkImageViewASTCDecodeModeEXT-decodeMode-02230",
+ "vkCreateImageView(): VkImageViewASTCDecodeModeEXT::decodeMode must be "
+ "VK_FORMAT_R16G16B16A16_SFLOAT, VK_FORMAT_R8G8B8A8_UNORM, or VK_FORMAT_E5B9G9R9_UFLOAT_PACK32.");
+ }
+ if (FormatIsCompressed_ASTC(pCreateInfo->format) == false) {
+ skip |= LogError(device, "VUID-VkImageViewASTCDecodeModeEXT-format-04084",
+ "vkCreateImageView(): is using a VkImageViewASTCDecodeModeEXT but the image view format is %s and "
+ "not an ASTC format.",
+ string_VkFormat(pCreateInfo->format));
+ }
+ }
+
+ auto ycbcr_conversion = lvl_find_in_chain<VkSamplerYcbcrConversionInfo>(pCreateInfo->pNext);
+ if (ycbcr_conversion != nullptr) {
+ if (ycbcr_conversion->conversion != VK_NULL_HANDLE) {
+ if (IsIdentitySwizzle(pCreateInfo->components) == false) {
+ skip |= LogError(
+ device, "VUID-VkImageViewCreateInfo-pNext-01970",
+ "vkCreateImageView(): If there is a VkSamplerYcbcrConversion, the imageView must "
+ "be created with the identity swizzle. Here are the actual swizzle values:\n"
+ "r swizzle = %s\n"
+ "g swizzle = %s\n"
+ "b swizzle = %s\n"
+ "a swizzle = %s\n",
+ string_VkComponentSwizzle(pCreateInfo->components.r), string_VkComponentSwizzle(pCreateInfo->components.g),
+ string_VkComponentSwizzle(pCreateInfo->components.b), string_VkComponentSwizzle(pCreateInfo->components.a));
+ }
+ }
+ }
+ }
+ return skip;
+}
+
bool StatelessValidation::manual_PreCallValidateViewport(const VkViewport &viewport, const char *fn_name,
const ParameterName ¶meter_name, VkCommandBuffer object) const {
bool skip = false;
@@ -1024,6 +1372,18 @@
bool has_dynamic_shading_rate_palette_nv = false;
bool has_dynamic_viewport_course_sample_order_nv = false;
bool has_dynamic_line_stipple = false;
+ bool has_dynamic_cull_mode = false;
+ bool has_dynamic_front_face = false;
+ bool has_dynamic_primitive_topology = false;
+ bool has_dynamic_viewport_with_count = false;
+ bool has_dynamic_scissor_with_count = false;
+ bool has_dynamic_vertex_input_binding_stride = false;
+ bool has_dynamic_depth_test_enable = false;
+ bool has_dynamic_depth_write_enable = false;
+ bool has_dynamic_depth_compare_op = false;
+ bool has_dynamic_depth_bounds_test_enable = false;
+ bool has_dynamic_stencil_test_enable = false;
+ bool has_dynamic_stencil_op = false;
if (pCreateInfos[i].pDynamicState != nullptr) {
const auto &dynamic_state_info = *pCreateInfos[i].pDynamicState;
for (uint32_t state_index = 0; state_index < dynamic_state_info.dynamicStateCount; ++state_index) {
@@ -1172,6 +1532,123 @@
}
has_dynamic_line_stipple = true;
}
+ if (dynamic_state == VK_DYNAMIC_STATE_CULL_MODE_EXT) {
+ if (has_dynamic_cull_mode) {
+ skip |= LogError(device, "VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442",
+ "vkCreateGraphicsPipelines: VK_DYNAMIC_STATE_CULL_MODE_EXT was listed twice in the "
+ "pCreateInfos[%d].pDynamicState->pDynamicStates array",
+ i);
+ }
+ has_dynamic_cull_mode = true;
+ }
+ if (dynamic_state == VK_DYNAMIC_STATE_FRONT_FACE_EXT) {
+ if (has_dynamic_front_face) {
+ skip |= LogError(device, "VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442",
+ "vkCreateGraphicsPipelines: VK_DYNAMIC_STATE_FRONT_FACE_EXT was listed twice in the "
+ "pCreateInfos[%d].pDynamicState->pDynamicStates array",
+ i);
+ }
+ has_dynamic_front_face = true;
+ }
+ if (dynamic_state == VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT) {
+ if (has_dynamic_primitive_topology) {
+ skip |= LogError(
+ device, "VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442",
+ "vkCreateGraphicsPipelines: VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT was listed twice in the "
+ "pCreateInfos[%d].pDynamicState->pDynamicStates array",
+ i);
+ }
+ has_dynamic_primitive_topology = true;
+ }
+ if (dynamic_state == VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT) {
+ if (has_dynamic_viewport_with_count) {
+ skip |= LogError(
+ device, "VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442",
+ "vkCreateGraphicsPipelines: VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT was listed twice in the "
+ "pCreateInfos[%d].pDynamicState->pDynamicStates array",
+ i);
+ }
+ has_dynamic_viewport_with_count = true;
+ }
+ if (dynamic_state == VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT) {
+ if (has_dynamic_scissor_with_count) {
+ skip |= LogError(
+ device, "VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442",
+ "vkCreateGraphicsPipelines: VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT was listed twice in the "
+ "pCreateInfos[%d].pDynamicState->pDynamicStates array",
+ i);
+ }
+ has_dynamic_scissor_with_count = true;
+ }
+ if (dynamic_state == VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT) {
+ if (has_dynamic_vertex_input_binding_stride) {
+ skip |= LogError(device, "VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442",
+ "vkCreateGraphicsPipelines: VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT was "
+ "listed twice in the "
+ "pCreateInfos[%d].pDynamicState->pDynamicStates array",
+ i);
+ }
+ has_dynamic_vertex_input_binding_stride = true;
+ }
+ if (dynamic_state == VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT) {
+ if (has_dynamic_depth_test_enable) {
+ skip |= LogError(
+ device, "VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442",
+ "vkCreateGraphicsPipelines: VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT was listed twice in the "
+ "pCreateInfos[%d].pDynamicState->pDynamicStates array",
+ i);
+ }
+ has_dynamic_depth_test_enable = true;
+ }
+ if (dynamic_state == VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT) {
+ if (has_dynamic_depth_write_enable) {
+ skip |= LogError(
+ device, "VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442",
+ "vkCreateGraphicsPipelines: VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT was listed twice in the "
+ "pCreateInfos[%d].pDynamicState->pDynamicStates array",
+ i);
+ }
+ has_dynamic_depth_write_enable = true;
+ }
+ if (dynamic_state == VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT) {
+ if (has_dynamic_depth_compare_op) {
+ skip |=
+ LogError(device, "VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442",
+ "vkCreateGraphicsPipelines: VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT was listed twice in the "
+ "pCreateInfos[%d].pDynamicState->pDynamicStates array",
+ i);
+ }
+ has_dynamic_depth_compare_op = true;
+ }
+ if (dynamic_state == VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT) {
+ if (has_dynamic_depth_bounds_test_enable) {
+ skip |= LogError(
+ device, "VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442",
+ "vkCreateGraphicsPipelines: VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT was listed twice in the "
+ "pCreateInfos[%d].pDynamicState->pDynamicStates array",
+ i);
+ }
+ has_dynamic_depth_bounds_test_enable = true;
+ }
+ if (dynamic_state == VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT) {
+ if (has_dynamic_stencil_test_enable) {
+ skip |= LogError(
+ device, "VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442",
+ "vkCreateGraphicsPipelines: VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT was listed twice in the "
+ "pCreateInfos[%d].pDynamicState->pDynamicStates array",
+ i);
+ }
+ has_dynamic_stencil_test_enable = true;
+ }
+ if (dynamic_state == VK_DYNAMIC_STATE_STENCIL_OP_EXT) {
+ if (has_dynamic_stencil_op) {
+ skip |= LogError(device, "VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442",
+ "vkCreateGraphicsPipelines: VK_DYNAMIC_STATE_STENCIL_OP_EXT was listed twice in the "
+ "pCreateInfos[%d].pDynamicState->pDynamicStates array",
+ i);
+ }
+ has_dynamic_stencil_op = true;
+ }
}
}
@@ -1541,27 +2018,43 @@
} else { // multiViewport enabled
if (viewport_state.viewportCount == 0) {
- skip |= LogError(
- device, "VUID-VkPipelineViewportStateCreateInfo-viewportCount-arraylength",
- "vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32 "].pViewportState->viewportCount is 0.", i);
+ if (!has_dynamic_viewport_with_count) {
+ skip |= LogError(
+ device, "VUID-VkPipelineViewportStateCreateInfo-viewportCount-arraylength",
+ "vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32 "].pViewportState->viewportCount is 0.", i);
+ }
} else if (viewport_state.viewportCount > device_limits.maxViewports) {
skip |= LogError(device, "VUID-VkPipelineViewportStateCreateInfo-viewportCount-01218",
"vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32
"].pViewportState->viewportCount (=%" PRIu32
") is greater than VkPhysicalDeviceLimits::maxViewports (=%" PRIu32 ").",
i, viewport_state.viewportCount, device_limits.maxViewports);
+ } else if (has_dynamic_viewport_with_count) {
+ skip |= LogError(device, "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03379",
+ "vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32
+ "].pViewportState->viewportCount (=%" PRIu32
+ ") must be zero when VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT is used.",
+ i, viewport_state.viewportCount);
}
if (viewport_state.scissorCount == 0) {
- skip |= LogError(
- device, "VUID-VkPipelineViewportStateCreateInfo-scissorCount-arraylength",
- "vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32 "].pViewportState->scissorCount is 0.", i);
+ if (!has_dynamic_scissor_with_count) {
+ skip |= LogError(
+ device, "VUID-VkPipelineViewportStateCreateInfo-scissorCount-arraylength",
+ "vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32 "].pViewportState->scissorCount is 0.", i);
+ }
} else if (viewport_state.scissorCount > device_limits.maxViewports) {
skip |= LogError(device, "VUID-VkPipelineViewportStateCreateInfo-scissorCount-01219",
"vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32
"].pViewportState->scissorCount (=%" PRIu32
") is greater than VkPhysicalDeviceLimits::maxViewports (=%" PRIu32 ").",
i, viewport_state.scissorCount, device_limits.maxViewports);
+ } else if (has_dynamic_scissor_with_count) {
+ skip |= LogError(device, "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03380",
+ "vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32
+ "].pViewportState->scissorCount (=%" PRIu32
+ ") must be zero when VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT is used.",
+ i, viewport_state.viewportCount);
}
}
@@ -1581,7 +2074,8 @@
i, shading_rate_image_struct->viewportCount, device_limits.maxViewports);
}
- if (viewport_state.scissorCount != viewport_state.viewportCount) {
+ if (viewport_state.scissorCount != viewport_state.viewportCount &&
+ !(has_dynamic_viewport_with_count || has_dynamic_scissor_with_count)) {
skip |= LogError(device, "VUID-VkPipelineViewportStateCreateInfo-scissorCount-01220",
"vkCreateGraphicsPipelines: pCreateInfos[%" PRIu32
"].pViewportState->scissorCount (=%" PRIu32 ") is not identical to pCreateInfos[%" PRIu32
@@ -1632,7 +2126,7 @@
exclusive_scissor_struct->exclusiveScissorCount > 0 &&
exclusive_scissor_struct->pExclusiveScissors == nullptr) {
skip |=
- LogError(device, "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-pDynamicStates-02030",
+ LogError(device, "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04056",
"vkCreateGraphicsPipelines: The exclusive scissor state is static (pCreateInfos[%" PRIu32
"].pDynamicState->pDynamicStates does not contain VK_DYNAMIC_STATE_EXCLUSIVE_SCISSOR_NV), but "
"pCreateInfos[%" PRIu32 "] pExclusiveScissors (=NULL) is an invalid pointer.",
@@ -1643,7 +2137,7 @@
shading_rate_image_struct->viewportCount > 0 &&
shading_rate_image_struct->pShadingRatePalettes == nullptr) {
skip |= LogError(
- device, "VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-pDynamicStates-02057",
+ device, "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04057",
"vkCreateGraphicsPipelines: The shading rate palette state is static (pCreateInfos[%" PRIu32
"].pDynamicState->pDynamicStates does not contain VK_DYNAMIC_STATE_VIEWPORT_SHADING_RATE_PALETTE_NV), "
"but pCreateInfos[%" PRIu32 "] pShadingRatePalettes (=NULL) is an invalid pointer.",
@@ -2157,29 +2651,39 @@
if (pCreateInfos[i].basePipelineHandle != VK_NULL_HANDLE) {
skip |=
LogError(device, "VUID-VkGraphicsPipelineCreateInfo-flags-00724",
- "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineHandle, must be "
+ "vkCreateGraphicsPipelines parameter, pCreateInfos[%u]->basePipelineHandle, must be "
"VK_NULL_HANDLE if pCreateInfos->flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag "
- "and pCreateInfos->basePipelineIndex is not -1.");
+ "and pCreateInfos->basePipelineIndex is not -1.",
+ i);
}
}
if (pCreateInfos[i].basePipelineHandle != VK_NULL_HANDLE) {
if (pCreateInfos[i].basePipelineIndex != -1) {
skip |= LogError(device, "VUID-VkGraphicsPipelineCreateInfo-flags-00725",
- "vkCreateGraphicsPipelines parameter, pCreateInfos->basePipelineIndex, must be -1 if "
+ "vkCreateGraphicsPipelines parameter, pCreateInfos[%u]->basePipelineIndex, must be -1 if "
"pCreateInfos->flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag and "
- "pCreateInfos->basePipelineHandle is not VK_NULL_HANDLE.");
+ "pCreateInfos->basePipelineHandle is not VK_NULL_HANDLE.",
+ i);
}
} else {
- if (static_cast<const uint32_t>(pCreateInfos[i].basePipelineIndex) >= createInfoCount) {
- skip |= LogError(device, "VUID-VkGraphicsPipelineCreateInfo-flags-00723",
- "vkCreateGraphicsPipelines parameter pCreateInfos->basePipelineIndex (%d) must be a valid"
- "index into the pCreateInfos array, of size %d.",
- pCreateInfos[i].basePipelineIndex, createInfoCount);
+ if (static_cast<uint32_t>(pCreateInfos[i].basePipelineIndex) >= createInfoCount) {
+ skip |=
+ LogError(device, "VUID-VkGraphicsPipelineCreateInfo-flags-00723",
+ "vkCreateGraphicsPipelines parameter pCreateInfos[%u]->basePipelineIndex (%d) must be a valid"
+ "index into the pCreateInfos array, of size %d.",
+ i, pCreateInfos[i].basePipelineIndex, createInfoCount);
}
}
}
+ if ((pCreateInfos[i].flags & VK_PIPELINE_CREATE_DISPATCH_BASE) != 0) {
+ skip |= LogError(
+ device, "VUID-VkGraphicsPipelineCreateInfo-flags-00764",
+ "vkCreateGraphicsPipelines parameter pCreateInfos[%u]->flags must not contain VK_PIPELINE_CREATE_DISPATCH_BASE",
+ i);
+ }
+
if (pCreateInfos[i].pRasterizationState) {
if (!device_extensions.vk_nv_fill_rectangle) {
if (pCreateInfos[i].pRasterizationState->polygonMode == VK_POLYGON_MODE_FILL_RECTANGLE_NV) {
@@ -2192,8 +2696,9 @@
(physical_device_features.fillModeNonSolid == false)) {
skip |= LogError(device, kVUID_PVError_DeviceFeature,
"vkCreateGraphicsPipelines parameter, VkPolygonMode "
- "pCreateInfos->pRasterizationState->polygonMode cannot be VK_POLYGON_MODE_POINT or "
- "VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false.");
+ "pCreateInfos[%u]->pRasterizationState->polygonMode cannot be VK_POLYGON_MODE_POINT or "
+ "VK_POLYGON_MODE_LINE if VkPhysicalDeviceFeatures->fillModeNonSolid is false.",
+ i);
}
} else {
if ((pCreateInfos[i].pRasterizationState->polygonMode != VK_POLYGON_MODE_FILL) &&
@@ -2202,8 +2707,9 @@
skip |=
LogError(device, "VUID-VkPipelineRasterizationStateCreateInfo-polygonMode-01507",
"vkCreateGraphicsPipelines parameter, VkPolygonMode "
- "pCreateInfos->pRasterizationState->polygonMode must be VK_POLYGON_MODE_FILL or "
- "VK_POLYGON_MODE_FILL_RECTANGLE_NV if VkPhysicalDeviceFeatures->fillModeNonSolid is false.");
+ "pCreateInfos[%u]->pRasterizationState->polygonMode must be VK_POLYGON_MODE_FILL or "
+ "VK_POLYGON_MODE_FILL_RECTANGLE_NV if VkPhysicalDeviceFeatures->fillModeNonSolid is false.",
+ i);
}
}
@@ -2322,6 +2828,14 @@
if (pCreateInfo->compareEnable == VK_TRUE) {
skip |= validate_ranged_enum("vkCreateSampler", "pCreateInfo->compareOp", "VkCompareOp", AllVkCompareOpEnums,
pCreateInfo->compareOp, "VUID-VkSamplerCreateInfo-compareEnable-01080");
+ const auto *sampler_reduction = lvl_find_in_chain<VkSamplerReductionModeCreateInfo>(pCreateInfo->pNext);
+ if (sampler_reduction != nullptr) {
+ if (sampler_reduction->reductionMode != VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE) {
+ skip |= LogError(
+ device, "VUID-VkSamplerCreateInfo-compareEnable-01423",
+ "copmareEnable is true so the sampler reduction mode must be VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE.");
+ }
+ }
}
// If any of addressModeU, addressModeV or addressModeW are VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor must be a
@@ -2385,6 +2899,81 @@
pCreateInfo->unnormalizedCoordinates ? "VK_TRUE" : "VK_FALSE");
}
}
+
+ if (pCreateInfo->flags & VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT) {
+ if (pCreateInfo->minFilter != pCreateInfo->magFilter) {
+ skip |= LogError(device, "VUID-VkSamplerCreateInfo-flags-02574",
+ "vkCreateSampler(): when flags includes VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, "
+ "pCreateInfo->minFilter (%s) and pCreateInfo->magFilter (%s) must be equal.",
+ string_VkFilter(pCreateInfo->minFilter), string_VkFilter(pCreateInfo->magFilter));
+ }
+ if (pCreateInfo->mipmapMode != VK_SAMPLER_MIPMAP_MODE_NEAREST) {
+ skip |= LogError(device, "VUID-VkSamplerCreateInfo-flags-02575",
+ "vkCreateSampler(): when flags includes VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, "
+ "pCreateInfo->mipmapMode (%s) must be VK_SAMPLER_MIPMAP_MODE_NEAREST.",
+ string_VkSamplerMipmapMode(pCreateInfo->mipmapMode));
+ }
+ if (pCreateInfo->minLod != 0.0 || pCreateInfo->maxLod != 0.0) {
+ skip |= LogError(device, "VUID-VkSamplerCreateInfo-flags-02576",
+ "vkCreateSampler(): when flags includes VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, "
+ "pCreateInfo->minLod (%f) and pCreateInfo->maxLod (%f) must be zero.",
+ pCreateInfo->minLod, pCreateInfo->maxLod);
+ }
+ if (((pCreateInfo->addressModeU != VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE) &&
+ (pCreateInfo->addressModeU != VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER)) ||
+ ((pCreateInfo->addressModeV != VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE) &&
+ (pCreateInfo->addressModeV != VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER))) {
+ skip |= LogError(device, "VUID-VkSamplerCreateInfo-flags-02577",
+ "vkCreateSampler(): when flags includes VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, "
+ "pCreateInfo->addressModeU (%s) and pCreateInfo->addressModeV (%s) must be "
+ "VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE or VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER",
+ string_VkSamplerAddressMode(pCreateInfo->addressModeU),
+ string_VkSamplerAddressMode(pCreateInfo->addressModeV));
+ }
+ if (pCreateInfo->anisotropyEnable) {
+ skip |= LogError(device, "VUID-VkSamplerCreateInfo-flags-02578",
+ "vkCreateSampler(): when flags includes VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, "
+ "pCreateInfo->anisotropyEnable must be VK_FALSE");
+ }
+ if (pCreateInfo->compareEnable) {
+ skip |= LogError(device, "VUID-VkSamplerCreateInfo-flags-02579",
+ "vkCreateSampler(): when flags includes VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, "
+ "pCreateInfo->compareEnable must be VK_FALSE");
+ }
+ if (pCreateInfo->unnormalizedCoordinates) {
+ skip |= LogError(device, "VUID-VkSamplerCreateInfo-flags-02580",
+ "vkCreateSampler(): when flags includes VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT, "
+ "pCreateInfo->unnormalizedCoordinates must be VK_FALSE");
+ }
+ }
+ }
+
+ if (pCreateInfo->borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
+ pCreateInfo->borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
+ if (!device_extensions.vk_ext_custom_border_color) {
+ skip |= LogError(device, kVUID_PVError_ExtensionNotEnabled,
+ "VkSamplerCreateInfo->borderColor is %s but %s is not enabled.\n",
+ string_VkBorderColor(pCreateInfo->borderColor), VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME);
+ }
+ auto custom_create_info = lvl_find_in_chain<VkSamplerCustomBorderColorCreateInfoEXT>(pCreateInfo->pNext);
+ if (!custom_create_info) {
+ skip |=
+ LogError(device, "VUID-VkSamplerCreateInfo-borderColor-04011",
+ "VkSamplerCreateInfo->borderColor is set to %s but there is no VkSamplerCustomBorderColorCreateInfoEXT "
+ "struct in pNext chain.\n",
+ string_VkBorderColor(pCreateInfo->borderColor));
+ } else {
+ if ((custom_create_info->format != VK_FORMAT_UNDEFINED) &&
+ ((pCreateInfo->borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT && !FormatIsSampledInt(custom_create_info->format)) ||
+ (pCreateInfo->borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT &&
+ !FormatIsSampledFloat(custom_create_info->format)))) {
+ skip |= LogError(device, "VUID-VkSamplerCustomBorderColorCreateInfoEXT-format-04013",
+ "VkSamplerCreateInfo->borderColor is %s but VkSamplerCustomBorderColorCreateInfoEXT.format = %s "
+ "whose type does not match\n",
+ string_VkBorderColor(pCreateInfo->borderColor), string_VkFormat(custom_create_info->format));
+ ;
+ }
+ }
}
return skip;
@@ -2479,7 +3068,8 @@
(pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT)) {
// If descriptorType is VK_DESCRIPTOR_TYPE_SAMPLER, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
// VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
- // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures
+ // pImageInfo must be a pointer to an array of descriptorCount valid VkDescriptorImageInfo structures.
+ // Valid imageView handles are checked in ObjectLifetimes::ValidateDescriptorWrite.
if (pDescriptorWrites[i].pImageInfo == nullptr) {
skip |= LogError(device, "VUID-VkWriteDescriptorSet-descriptorType-00322",
"%s(): if pDescriptorWrites[%d].descriptorType is "
@@ -2489,14 +3079,10 @@
vkCallingFunction, i, i);
} else if (pDescriptorWrites[i].descriptorType != VK_DESCRIPTOR_TYPE_SAMPLER) {
// If descriptorType is VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE,
- // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageView and imageLayout
- // members of any given element of pImageInfo must be a valid VkImageView and VkImageLayout, respectively
+ // VK_DESCRIPTOR_TYPE_STORAGE_IMAGE or VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, the imageLayout
+ // member of any given element of pImageInfo must be a valid VkImageLayout
for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
++descriptor_index) {
- skip |= validate_required_handle(vkCallingFunction,
- ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageView",
- ParameterName::IndexVector{i, descriptor_index}),
- pDescriptorWrites[i].pImageInfo[descriptor_index].imageView);
skip |= validate_ranged_enum(vkCallingFunction,
ParameterName("pDescriptorWrites[%i].pImageInfo[%i].imageLayout",
ParameterName::IndexVector{i, descriptor_index}),
@@ -2511,6 +3097,7 @@
// If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
// VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, pBufferInfo must be a
// pointer to an array of descriptorCount valid VkDescriptorBufferInfo structures
+ // Valid buffer handles are checked in ObjectLifetimes::ValidateDescriptorWrite.
if (pDescriptorWrites[i].pBufferInfo == nullptr) {
skip |= LogError(device, "VUID-VkWriteDescriptorSet-descriptorType-00324",
"%s(): if pDescriptorWrites[%d].descriptorType is "
@@ -2519,32 +3106,26 @@
"pDescriptorWrites[%d].pBufferInfo must not be NULL.",
vkCallingFunction, i, i);
} else {
- for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount; ++descriptorIndex) {
- skip |= validate_required_handle(vkCallingFunction,
- ParameterName("pDescriptorWrites[%i].pBufferInfo[%i].buffer",
- ParameterName::IndexVector{i, descriptorIndex}),
- pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer);
+ const auto *robustness2_features =
+ lvl_find_in_chain<VkPhysicalDeviceRobustness2FeaturesEXT>(device_createinfo_pnext);
+ if (robustness2_features && robustness2_features->nullDescriptor) {
+ for (uint32_t descriptorIndex = 0; descriptorIndex < pDescriptorWrites[i].descriptorCount;
+ ++descriptorIndex) {
+ if (pDescriptorWrites[i].pBufferInfo[descriptorIndex].buffer == VK_NULL_HANDLE &&
+ (pDescriptorWrites[i].pBufferInfo[descriptorIndex].offset != 0 ||
+ pDescriptorWrites[i].pBufferInfo[descriptorIndex].range != VK_WHOLE_SIZE)) {
+ skip |= LogError(device, "VUID-VkDescriptorBufferInfo-buffer-02999",
+ "%s(): if pDescriptorWrites[%d].buffer is VK_NULL_HANDLE, "
+ "offset (" PRIu64 ") must be zero and range (" PRIu64 ") must be VK_WHOLE_SIZE.",
+ vkCallingFunction, i, pDescriptorWrites[i].pBufferInfo[descriptorIndex].offset,
+ pDescriptorWrites[i].pBufferInfo[descriptorIndex].range);
+ }
+ }
}
}
} else if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) ||
(pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER)) {
- // If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER,
- // pTexelBufferView must be a pointer to an array of descriptorCount valid VkBufferView handles
- if (pDescriptorWrites[i].pTexelBufferView == nullptr) {
- skip |= LogError(device, "VUID-VkWriteDescriptorSet-descriptorType-00323",
- "%s(): if pDescriptorWrites[%d].descriptorType is "
- "VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, "
- "pDescriptorWrites[%d].pTexelBufferView must not be NULL.",
- vkCallingFunction, i, i);
- } else {
- for (uint32_t descriptor_index = 0; descriptor_index < pDescriptorWrites[i].descriptorCount;
- ++descriptor_index) {
- skip |= validate_required_handle(vkCallingFunction,
- ParameterName("pDescriptorWrites[%i].pTexelBufferView[%i]",
- ParameterName::IndexVector{i, descriptor_index}),
- pDescriptorWrites[i].pTexelBufferView[descriptor_index]);
- }
- }
+ // Valid bufferView handles are checked in ObjectLifetimes::ValidateDescriptorWrite.
}
if ((pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER) ||
@@ -2576,9 +3157,39 @@
}
}
}
+ // pNext chain must be either NULL or a pointer to a valid instance of VkWriteDescriptorSetAccelerationStructureKHR
+ // or VkWriteDescriptorSetInlineUniformBlockEX
+ if (pDescriptorWrites[i].pNext) {
+ if (pDescriptorWrites[i].descriptorType == VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR) {
+ const auto *pnext_struct =
+ lvl_find_in_chain<VkWriteDescriptorSetAccelerationStructureKHR>(pDescriptorWrites[i].pNext);
+ if (!pnext_struct || (pnext_struct->accelerationStructureCount != pDescriptorWrites[i].descriptorCount)) {
+ skip |= LogError(device, "VUID-VkWriteDescriptorSet-descriptorType-02382",
+ "%s(): If descriptorType is VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR, the pNext"
+ "chain must include a VkWriteDescriptorSetAccelerationStructureKHR structure whose "
+ "accelerationStructureCount %d member equals descriptorCount %d.",
+ vkCallingFunction, pnext_struct ? pnext_struct->accelerationStructureCount : -1,
+ pDescriptorWrites[i].descriptorCount);
+ }
+ // further checks only if we have right structtype
+ if (pnext_struct) {
+ if (pnext_struct->accelerationStructureCount != pDescriptorWrites[i].descriptorCount) {
+ skip |= LogError(
+ device, "VUID-VkWriteDescriptorSetAccelerationStructureKHR-accelerationStructureCount-02236",
+ "%s(): accelerationStructureCount %d must be equal to descriptorCount %d in the extended structure "
+ ".",
+ vkCallingFunction, pnext_struct->accelerationStructureCount, pDescriptorWrites[i].descriptorCount);
+ }
+ if (pnext_struct->accelerationStructureCount == 0) {
+ skip |= LogError(
+ device, "VUID-VkWriteDescriptorSetAccelerationStructureKHR-accelerationStructureCount-arraylength",
+ "%s(): accelerationStructureCount must be greater than 0 .");
+ }
+ }
+ }
+ }
}
}
-
return skip;
}
@@ -2832,6 +3443,68 @@
return skip;
}
+bool StatelessValidation::ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkDeviceSize offset,
+ VkDeviceSize countBufferOffset, bool khr) const {
+ bool skip = false;
+ const char *apiName = khr ? "vkCmdDrawIndirectCountKHR()" : "vkCmdDrawIndirectCount()";
+ if (offset & 3) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndirectCount-offset-02710",
+ "%s: parameter, VkDeviceSize offset (0x%" PRIxLEAST64 "), is not a multiple of 4.", apiName, offset);
+ }
+
+ if (countBufferOffset & 3) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndirectCount-countBufferOffset-02716",
+ "%s: parameter, VkDeviceSize countBufferOffset (0x%" PRIxLEAST64 "), is not a multiple of 4.", apiName,
+ countBufferOffset);
+ }
+ return skip;
+}
+
+bool StatelessValidation::manual_PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer,
+ VkDeviceSize offset, VkBuffer countBuffer,
+ VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride) const {
+ return ValidateCmdDrawIndirectCount(commandBuffer, offset, countBufferOffset, false);
+}
+
+bool StatelessValidation::manual_PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
+ VkDeviceSize offset, VkBuffer countBuffer,
+ VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride) const {
+ return ValidateCmdDrawIndirectCount(commandBuffer, offset, countBufferOffset, true);
+}
+
+bool StatelessValidation::ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkDeviceSize offset,
+ VkDeviceSize countBufferOffset, bool khr) const {
+ bool skip = false;
+ const char *apiName = khr ? "vkCmdDrawIndexedIndirectCountKHR()" : "vkCmdDrawIndexedIndirectCount()";
+ if (offset & 3) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-offset-02710",
+ "%s: parameter, VkDeviceSize offset (0x%" PRIxLEAST64 "), is not a multiple of 4.", apiName, offset);
+ }
+
+ if (countBufferOffset & 3) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716",
+ "%s: parameter, VkDeviceSize countBufferOffset (0x%" PRIxLEAST64 "), is not a multiple of 4.", apiName,
+ countBufferOffset);
+ }
+ return skip;
+}
+
+bool StatelessValidation::manual_PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer,
+ VkDeviceSize offset, VkBuffer countBuffer,
+ VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride) const {
+ return ValidateCmdDrawIndexedIndirectCount(commandBuffer, offset, countBufferOffset, false);
+}
+
+bool StatelessValidation::manual_PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
+ VkDeviceSize offset, VkBuffer countBuffer,
+ VkDeviceSize countBufferOffset,
+ uint32_t maxDrawCount, uint32_t stride) const {
+ return ValidateCmdDrawIndexedIndirectCount(commandBuffer, offset, countBufferOffset, true);
+}
+
bool StatelessValidation::manual_PreCallValidateCmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
const VkClearAttachment *pAttachments, uint32_t rectCount,
const VkClearRect *pRects) const {
@@ -2841,6 +3514,14 @@
skip |= LogError(commandBuffer, "VUID-vkCmdClearAttachments-layerCount-01934",
"CmdClearAttachments(): pRects[%d].layerCount is zero.", rect);
}
+ if (pRects[rect].rect.extent.width == 0) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdClearAttachments-rect-02682",
+ "CmdClearAttachments(): pRects[%d].rect.extent.width is zero.", rect);
+ }
+ if (pRects[rect].rect.extent.height == 0) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdClearAttachments-rect-02683",
+ "CmdClearAttachments(): pRects[%d].rect.extent.height is zero.", rect);
+ }
}
return skip;
}
@@ -2991,9 +3672,10 @@
if (pRegions != nullptr) {
if ((pRegions->imageSubresource.aspectMask & legal_aspect_flags) == 0) {
- LogError(device, kVUID_PVError_UnrecognizedValue,
- "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
- "enumerator");
+ skip |= LogError(
+ device, kVUID_PVError_UnrecognizedValue,
+ "vkCmdCopyImageToBuffer parameter, VkImageAspect pRegions->imageSubresource.aspectMask, is an unrecognized "
+ "enumerator");
}
}
return skip;
@@ -3487,6 +4169,10 @@
"pCreateInfo->pipelineStatistics must be a valid combination of VkQueryPipelineStatisticFlagBits "
"values.");
}
+ if (pCreateInfo->queryCount == 0) {
+ skip |= LogError(device, "VUID-VkQueryPoolCreateInfo-queryCount-02763",
+ "vkCreateQueryPool(): queryCount must be greater than zero.");
+ }
}
return skip;
}
@@ -3680,8 +4366,8 @@
}
bool StatelessValidation::ValidateAccelerationStructureInfoNV(const VkAccelerationStructureInfoNV &info,
- VkAccelerationStructureNV object_handle,
- const char *func_name) const {
+ VkAccelerationStructureNV object_handle, const char *func_name,
+ bool is_cmd) const {
bool skip = false;
if (info.type == VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV && info.geometryCount != 0) {
skip |= LogError(object_handle, "VUID-VkAccelerationStructureInfoNV-type-02425",
@@ -3700,7 +4386,9 @@
"bit set, then it must not have the VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_BUILD_BIT_NV bit set.");
}
if (info.geometryCount > phys_dev_ext_props.ray_tracing_propsNV.maxGeometryCount) {
- skip |= LogError(object_handle, "VUID-VkAccelerationStructureInfoNV-geometryCount-02422",
+ skip |= LogError(object_handle,
+ is_cmd ? "VUID-vkCmdBuildAccelerationStructureNV-geometryCount-02241"
+ : "VUID-VkAccelerationStructureInfoNV-geometryCount-02422",
"VkAccelerationStructureInfoNV: geometryCount must be less than or equal to "
"VkPhysicalDeviceRayTracingPropertiesNV::maxGeometryCount.");
}
@@ -3739,6 +4427,17 @@
}
}
}
+ for (uint32_t geometry_index = 0; geometry_index < info.geometryCount; ++geometry_index) {
+ if (!(info.pGeometries[geometry_index].geometryType == VK_GEOMETRY_TYPE_TRIANGLES_NV ||
+ info.pGeometries[geometry_index].geometryType == VK_GEOMETRY_TYPE_AABBS_NV)) {
+ skip |= LogError(device, "VUID-VkGeometryNV-geometryType-03503",
+ "VkGeometryNV: geometryType must be VK_GEOMETRY_TYPE_TRIANGLES_NV"
+ "or VK_GEOMETRY_TYPE_AABBS_NV.");
+ }
+ }
+ skip |=
+ validate_flags(func_name, "info.flags", "VkBuildAccelerationStructureFlagBitsNV", AllVkBuildAccelerationStructureFlagBitsNV,
+ info.flags, kOptionalFlags, "VUID-VkAccelerationStructureInfoNV-flags-parameter");
return skip;
}
@@ -3746,7 +4445,6 @@
VkDevice device, const VkAccelerationStructureCreateInfoNV *pCreateInfo, const VkAllocationCallbacks *pAllocator,
VkAccelerationStructureNV *pAccelerationStructure) const {
bool skip = false;
-
if (pCreateInfo) {
if ((pCreateInfo->compactedSize != 0) &&
((pCreateInfo->info.geometryCount != 0) || (pCreateInfo->info.instanceCount != 0))) {
@@ -3757,9 +4455,8 @@
}
skip |= ValidateAccelerationStructureInfoNV(pCreateInfo->info, VkAccelerationStructureNV(0),
- "vkCreateAccelerationStructureNV()");
+ "vkCreateAccelerationStructureNV()", false);
}
-
return skip;
}
@@ -3772,7 +4469,7 @@
bool skip = false;
if (pInfo != nullptr) {
- skip |= ValidateAccelerationStructureInfoNV(*pInfo, dst, "vkCmdBuildAccelerationStructureNV()");
+ skip |= ValidateAccelerationStructureInfoNV(*pInfo, dst, "vkCmdBuildAccelerationStructureNV()", true);
}
return skip;
@@ -3802,6 +4499,38 @@
i);
}
}
+ if (pCreateInfo->pGeometryInfos[i].geometryType == VK_GEOMETRY_TYPE_TRIANGLES_KHR) {
+ if (!(pCreateInfo->pGeometryInfos[i].indexType == VK_INDEX_TYPE_UINT16 ||
+ pCreateInfo->pGeometryInfos[i].indexType == VK_INDEX_TYPE_UINT32 ||
+ pCreateInfo->pGeometryInfos[i].indexType == VK_INDEX_TYPE_NONE_KHR)) {
+ skip |= LogError(
+ device, "VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-geometryType-03502",
+ "VkAccelerationStructureCreateInfoKHR: If geometryType is VK_GEOMETRY_TYPE_TRIANGLES_KHR, indexType"
+ "must be VK_INDEX_TYPE_UINT16, VK_INDEX_TYPE_UINT32, or VK_INDEX_TYPE_NONE_KHR.");
+ }
+ }
+ if (pCreateInfo->type == VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR) {
+ if (pCreateInfo->pGeometryInfos[i].maxPrimitiveCount > phys_dev_ext_props.ray_tracing_propsKHR.maxInstanceCount) {
+ skip |= LogError(device, "VUID-VkAccelerationStructureCreateInfoKHR-type-03492",
+ "VkAccelerationStructureCreateInfoKHR: If type is VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR"
+ "then pGeometryInfos->maxPrimitiveCount %d must be less than or equal to "
+ "VkPhysicalDeviceRayTracingPropertiesKHR::maxInstanceCount %d.",
+ pCreateInfo->pGeometryInfos[i].maxPrimitiveCount,
+ phys_dev_ext_props.ray_tracing_propsKHR.maxInstanceCount);
+ }
+ }
+ }
+
+ if (pCreateInfo->type == VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR && pCreateInfo->compactedSize == 0 &&
+ pCreateInfo->maxGeometryCount != 1) {
+ skip |= LogError(device, "VUID-VkAccelerationStructureCreateInfoKHR-type-03495",
+ "VkAccelerationStructureCreateInfoKHR: If type is VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR"
+ "and compactedSize is 0, maxGeometryCount must be 1.");
+ }
+ // or VUID-VkAccelerationStructureCreateInfoKHR-compactedSize-03490
+ if (pCreateInfo->compactedSize == 0 && pCreateInfo->maxGeometryCount == 0) {
+ skip |= LogError(device, "VUID-VkAccelerationStructureCreateInfoKHR-compactedSize-02993",
+ "VkAccelerationStructureCreateInfoKHR: If compactedSize is 0 then maxGeometryCount must not be 0.");
}
if (pCreateInfo->flags & VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR &&
@@ -3831,8 +4560,28 @@
}
}
}
+ if (pCreateInfo->type == VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR &&
+ (pCreateInfo->maxGeometryCount > phys_dev_ext_props.ray_tracing_propsKHR.maxGeometryCount)) {
+ skip |= LogError(device, "VUID-VkAccelerationStructureCreateInfoKHR-type-03491",
+ "VkAccelerationStructureCreateInfoKHR: If type is VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR"
+ "then maxGeometryCount %d must be less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR "
+ "maxGeometryCount %d.",
+ pCreateInfo->maxGeometryCount, phys_dev_ext_props.ray_tracing_propsKHR.maxGeometryCount);
+ }
}
-
+ const auto *raytracing_features = lvl_find_in_chain<VkPhysicalDeviceRayTracingFeaturesKHR>(device_createinfo_pnext);
+ if (!raytracing_features || raytracing_features->rayTracingAccelerationStructureCaptureReplay == VK_FALSE) {
+ if (pCreateInfo->deviceAddress != 0) {
+ skip |=
+ LogError(device, "VUID-VkAccelerationStructureCreateInfoKHR-deviceAddress-03500",
+ "VkAccelerationStructureCreateInfoKHR: If deviceAddress is not 0, "
+ "VkPhysicalDeviceRayTracingFeaturesKHR::rayTracingAccelerationStructureCaptureReplay must be VK_TRUE.");
+ }
+ }
+ if (!raytracing_features || !(raytracing_features->rayQuery == VK_TRUE || raytracing_features->rayTracing == VK_TRUE)) {
+ skip |= LogError(device, "VUID-vkCreateAccelerationStructureKHR-rayTracing-03487",
+ "vkCreateAccelerationStructureKHR: The rayTracing or rayQuery feature must be enabled.");
+ }
return skip;
}
@@ -3857,12 +4606,104 @@
for (uint32_t i = 0; i < createInfoCount; i++) {
auto feedback_struct = lvl_find_in_chain<VkPipelineCreationFeedbackCreateInfoEXT>(pCreateInfos[i].pNext);
if ((feedback_struct != nullptr) && (feedback_struct->pipelineStageCreationFeedbackCount != pCreateInfos[i].stageCount)) {
- skip |= LogError(device, "VUID-VkPipelineCreationFeedbackCreateInfoEXT-pipelineStageCreationFeedbackCount-02670",
+ skip |= LogError(device, "VUID-VkPipelineCreationFeedbackCreateInfoEXT-pipelineStageCreationFeedbackCount-02969",
"vkCreateRayTracingPipelinesNV(): in pCreateInfo[%" PRIu32
"], VkPipelineCreationFeedbackEXT::pipelineStageCreationFeedbackCount"
"(=%" PRIu32 ") must equal VkRayTracingPipelineCreateInfoNV::stageCount(=%" PRIu32 ").",
i, feedback_struct->pipelineStageCreationFeedbackCount, pCreateInfos[i].stageCount);
}
+
+ const auto *pipeline_cache_contol_features =
+ lvl_find_in_chain<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT>(device_createinfo_pnext);
+ if (!pipeline_cache_contol_features || pipeline_cache_contol_features->pipelineCreationCacheControl == VK_FALSE) {
+ if (pCreateInfos[i].flags & (VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT |
+ VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT)) {
+ skip |= LogError(device, "VUID-VkRayTracingPipelineCreateInfoNV-pipelineCreationCacheControl-02905",
+ "vkCreateRayTracingPipelinesNV(): If the pipelineCreationCacheControl feature is not enabled,"
+ "flags must not include VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT or"
+ "VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT.");
+ }
+ }
+
+ if (pCreateInfos[i].flags & VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV) {
+ skip |=
+ LogError(device, "VUID-VkRayTracingPipelineCreateInfoNV-flags-02904",
+ "vkCreateRayTracingPipelinesNV(): flags must not include VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV.");
+ }
+ if ((pCreateInfos[i].flags & VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV) &&
+ (pCreateInfos[i].flags & VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT)) {
+ skip |=
+ LogError(device, "VUID-VkRayTracingPipelineCreateInfoNV-flags-02957",
+ "vkCreateRayTracingPipelinesNV(): flags must not include both VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV and"
+ "VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT at the same time.");
+ }
+ if (pCreateInfos[i].flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
+ if (pCreateInfos[i].basePipelineIndex != -1) {
+ if (pCreateInfos[i].basePipelineHandle != VK_NULL_HANDLE) {
+ skip |= LogError(device, "VUID-VkRayTracingPipelineCreateInfoNV-flags-03423",
+ "vkCreateRayTracingPipelinesNV parameter, pCreateInfos->basePipelineHandle, must be "
+ "VK_NULL_HANDLE if pCreateInfos->flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag "
+ "and pCreateInfos->basePipelineIndex is not -1.");
+ }
+ if (pCreateInfos[i].basePipelineIndex > (int32_t)(i)) {
+ skip |=
+ LogError(device, "VUID-vkCreateRayTracingPipelinesNV-flags-03415",
+ "vkCreateRayTracingPipelinesNV: If the flags member of any element of pCreateInfos contains the"
+ "VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and the basePipelineIndex member of that same element"
+ "is not -1, basePipelineIndex must be less than the index into pCreateInfos that corresponds to "
+ "that element.");
+ }
+ }
+ if (pCreateInfos[i].basePipelineHandle == VK_NULL_HANDLE) {
+ if (static_cast<const uint32_t>(pCreateInfos[i].basePipelineIndex) >= createInfoCount) {
+ skip |=
+ LogError(device, "VUID-VkRayTracingPipelineCreateInfoNV-flags-03422",
+ "vkCreateRayTracingPipelinesNV if flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT and"
+ "basePipelineHandle is VK_NULL_HANDLE, basePipelineIndex must be a valid index into the calling"
+ "commands pCreateInfos parameter.");
+ }
+ } else {
+ if (pCreateInfos[i].basePipelineIndex != -1) {
+ skip |= LogError(device, "VUID-VkRayTracingPipelineCreateInfoNV-flags-03424",
+ "vkCreateRayTracingPipelinesNV if flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT and"
+ "basePipelineHandle is not VK_NULL_HANDLE, basePipelineIndex must be -1.");
+ }
+ }
+ }
+ if (pCreateInfos[i].flags & VK_PIPELINE_CREATE_LIBRARY_BIT_KHR) {
+ skip |= LogError(device, "VUID-VkRayTracingPipelineCreateInfoNV-flags-03456",
+ "vkCreateRayTracingPipelinesNV: flags must not include VK_PIPELINE_CREATE_LIBRARY_BIT_KHR.");
+ }
+ if (pCreateInfos[i].flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR) {
+ skip |= LogError(device, "VUID-VkRayTracingPipelineCreateInfoNV-flags-03458",
+ "vkCreateRayTracingPipelinesNV: flags must not include "
+ "VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR.");
+ }
+ if (pCreateInfos[i].flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR) {
+ skip |= LogError(device, "VUID-VkRayTracingPipelineCreateInfoNV-flags-03459",
+ "vkCreateRayTracingPipelinesNV: flags must not include "
+ "VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR.");
+ }
+ if (pCreateInfos[i].flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR) {
+ skip |= LogError(device, "VUID-VkRayTracingPipelineCreateInfoNV-flags-03460",
+ "vkCreateRayTracingPipelinesNV: flags must not include "
+ "VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR.");
+ }
+ if (pCreateInfos[i].flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR) {
+ skip |= LogError(device, "VUID-VkRayTracingPipelineCreateInfoNV-flags-03461",
+ "vkCreateRayTracingPipelinesNV: flags must not include "
+ "VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR.");
+ }
+ if (pCreateInfos[i].flags & VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR) {
+ skip |= LogError(
+ device, "VUID-VkRayTracingPipelineCreateInfoNV-flags-03462",
+ "vkCreateRayTracingPipelinesNV: flags must not include VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR.");
+ }
+ if (pCreateInfos[i].flags & VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR) {
+ skip |= LogError(
+ device, "VUID-VkRayTracingPipelineCreateInfoNV-flags-03463",
+ "vkCreateRayTracingPipelinesNV: flags must not include VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR .");
+ }
}
return skip;
@@ -3874,7 +4715,11 @@
const VkAllocationCallbacks *pAllocator,
VkPipeline *pPipelines) const {
bool skip = false;
-
+ const auto *raytracing_features = lvl_find_in_chain<VkPhysicalDeviceRayTracingFeaturesKHR>(device_createinfo_pnext);
+ if (!raytracing_features || raytracing_features->rayTracing == VK_FALSE) {
+ skip |= LogError(device, "VUID-vkCreateRayTracingPipelinesKHR-rayTracing-03455",
+ "vkCreateRayTracingPipelinesKHR(): The rayTracing feature must be enabled.");
+ }
for (uint32_t i = 0; i < createInfoCount; i++) {
auto feedback_struct = lvl_find_in_chain<VkPipelineCreationFeedbackCreateInfoEXT>(pCreateInfos[i].pNext);
if ((feedback_struct != nullptr) && (feedback_struct->pipelineStageCreationFeedbackCount != pCreateInfos[i].stageCount)) {
@@ -3884,6 +4729,111 @@
"(=%" PRIu32 ") must equal VkRayTracingPipelineCreateInfoKHR::stageCount(=%" PRIu32 ").",
i, feedback_struct->pipelineStageCreationFeedbackCount, pCreateInfos[i].stageCount);
}
+ const auto *pipeline_cache_contol_features =
+ lvl_find_in_chain<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT>(device_createinfo_pnext);
+ if (!pipeline_cache_contol_features || pipeline_cache_contol_features->pipelineCreationCacheControl == VK_FALSE) {
+ if (pCreateInfos[i].flags & (VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT |
+ VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT)) {
+ skip |= LogError(device, "VUID-VkRayTracingPipelineCreateInfoKHR-pipelineCreationCacheControl-02905",
+ "vkCreateRayTracingPipelinesKHR(): If the pipelineCreationCacheControl feature is not enabled,"
+ "flags must not include VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT or"
+ "VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT.");
+ }
+ }
+ if (!raytracing_features || raytracing_features->rayTracingPrimitiveCulling == VK_FALSE) {
+ if (pCreateInfos[i].flags & VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR) {
+ skip |= LogError(device, "VUID-VkRayTracingPipelineCreateInfoKHR-rayTracingPrimitiveCulling-03472",
+ "vkCreateRayTracingPipelinesKHR(): If the rayTracingPrimitiveCulling feature is not enabled,"
+ "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR.");
+ }
+ if (pCreateInfos[i].flags & VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR) {
+ skip |= LogError(device, "VUID-VkRayTracingPipelineCreateInfoKHR-rayTracingPrimitiveCulling-03473",
+ "vkCreateRayTracingPipelinesKHR(): If the rayTracingPrimitiveCulling feature is not enabled,"
+ "flags must not include VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR .");
+ }
+ }
+
+ if (pCreateInfos[i].flags & VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV) {
+ skip |=
+ LogError(device, "VUID-VkRayTracingPipelineCreateInfoKHR-flags-02904",
+ "vkCreateRayTracingPipelinesKHR(): flags must not include VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV.");
+ }
+ if (pCreateInfos[i].flags & VK_PIPELINE_CREATE_LIBRARY_BIT_KHR) {
+ if (pCreateInfos[i].pLibraryInterface == NULL)
+ skip |= LogError(device, "VUID-VkRayTracingPipelineCreateInfoKHR-flags-03465",
+ "If flags includes VK_PIPELINE_CREATE_LIBRARY_BIT_KHR, pLibraryInterface must not be NULL.");
+ }
+ for (uint32_t group_index = 0; group_index < pCreateInfos[i].groupCount; ++group_index) {
+ if ((pCreateInfos[i].pGroups[group_index].type == VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR) ||
+ (pCreateInfos[i].pGroups[group_index].type == VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR)) {
+ if ((pCreateInfos[i].flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR) &&
+ (pCreateInfos[i].pGroups[group_index].anyHitShader == VK_SHADER_UNUSED_KHR)) {
+ skip |= LogError(
+ device, "VUID-VkRayTracingPipelineCreateInfoKHR-flags-03470",
+ "If flags includes VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR,"
+ "for any element of pGroups with a type of VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR"
+ "or VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR, the anyHitShader of that element "
+ "must not be VK_SHADER_UNUSED_KHR");
+ }
+ if ((pCreateInfos[i].flags & VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR) &&
+ (pCreateInfos[i].pGroups[group_index].closestHitShader == VK_SHADER_UNUSED_KHR)) {
+ skip |= LogError(
+ device, "VUID-VkRayTracingPipelineCreateInfoKHR-flags-03471",
+ "If flags includes VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR,"
+ "for any element of pGroups with a type of VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR"
+ "or VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR, the closestHitShader of that "
+ "element must not be VK_SHADER_UNUSED_KHR");
+ }
+ }
+ }
+ if (pCreateInfos[i].flags & VK_PIPELINE_CREATE_DERIVATIVE_BIT) {
+ if (pCreateInfos[i].basePipelineIndex != -1) {
+ if (pCreateInfos[i].basePipelineHandle != VK_NULL_HANDLE) {
+ skip |= LogError(device, "VUID-VkRayTracingPipelineCreateInfoKHR-flags-03423",
+ "vkCreateRayTracingPipelinesKHR parameter, pCreateInfos->basePipelineHandle, must be "
+ "VK_NULL_HANDLE if pCreateInfos->flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT flag "
+ "and pCreateInfos->basePipelineIndex is not -1.");
+ }
+ if (pCreateInfos[i].basePipelineIndex > (int32_t)i) {
+ skip |=
+ LogError(device, "VUID-vkCreateRayTracingPipelinesKHR-flags-03415",
+ "vkCreateRayTracingPipelinesKHR: If the flags member of any element of pCreateInfos contains the"
+ "VK_PIPELINE_CREATE_DERIVATIVE_BIT flag, and the basePipelineIndex member of that same element is"
+ "not -1, basePipelineIndex must be less than the index into pCreateInfos that corresponds to that "
+ "element.");
+ }
+ }
+ if (pCreateInfos[i].basePipelineHandle == VK_NULL_HANDLE) {
+ if (static_cast<const uint32_t>(pCreateInfos[i].basePipelineIndex) >= createInfoCount) {
+ skip |= LogError(device, "VUID-VkRayTracingPipelineCreateInfoKHR-flags-03422",
+ "vkCreateRayTracingPipelinesKHR if flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT and"
+ "basePipelineHandle is VK_NULL_HANDLE, basePipelineIndex (%d) must be a valid into the calling"
+ "commands pCreateInfos parameter %d.",
+ pCreateInfos[i].basePipelineIndex, createInfoCount);
+ }
+ } else {
+ if (pCreateInfos[i].basePipelineIndex != -1) {
+ skip |= LogError(device, "VUID-VkRayTracingPipelineCreateInfoKHR-flags-03424",
+ "vkCreateRayTracingPipelinesKHR if flags contains the VK_PIPELINE_CREATE_DERIVATIVE_BIT and"
+ "basePipelineHandle is not VK_NULL_HANDLE, basePipelineIndex must be -1.");
+ }
+ }
+ }
+ if (pCreateInfos[i].libraries.libraryCount == 0) {
+ if (pCreateInfos[i].stageCount == 0) {
+ skip |= LogError(device, "VUID-VkRayTracingPipelineCreateInfoKHR-libraries-02958",
+ "If libraries.libraryCount is zero, then stageCount must not be zero .");
+ }
+ if (pCreateInfos[i].groupCount == 0) {
+ skip |= LogError(device, "VUID-VkRayTracingPipelineCreateInfoKHR-libraries-02959",
+ "If libraries.libraryCount is zero, then groupCount must not be zero .");
+ }
+ } else {
+ if (pCreateInfos[i].pLibraryInterface == NULL) {
+ skip |= LogError(device, "VUID-VkRayTracingPipelineCreateInfoKHR-libraryCount-03466",
+ "If the libraryCount member of libraries is greater than 0, pLibraryInterface must not be NULL.");
+ }
+ }
}
return skip;
@@ -3961,7 +4911,7 @@
}
const auto *index_type_uint8_features = lvl_find_in_chain<VkPhysicalDeviceIndexTypeUint8FeaturesEXT>(device_createinfo_pnext);
- if (indexType == VK_INDEX_TYPE_UINT8_EXT && !index_type_uint8_features->indexTypeUint8) {
+ if (indexType == VK_INDEX_TYPE_UINT8_EXT && (!index_type_uint8_features || !index_type_uint8_features->indexTypeUint8)) {
skip |= LogError(commandBuffer, "VUID-vkCmdBindIndexBuffer-indexType-02765",
"vkCmdBindIndexBuffer() indexType is VK_INDEX_TYPE_UINT8_EXT but indexTypeUint8 feature is not enabled.");
}
@@ -3984,6 +4934,21 @@
firstBinding, bindingCount, device_limits.maxVertexInputBindings);
}
+ for (uint32_t i = 0; i < bindingCount; ++i) {
+ if (pBuffers[i] == VK_NULL_HANDLE) {
+ const auto *robustness2_features = lvl_find_in_chain<VkPhysicalDeviceRobustness2FeaturesEXT>(device_createinfo_pnext);
+ if (!(robustness2_features && robustness2_features->nullDescriptor)) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdBindVertexBuffers-pBuffers-04001",
+ "vkCmdBindVertexBuffers() required parameter pBuffers[%d] specified as VK_NULL_HANDLE", i);
+ } else {
+ if (pOffsets[i] != 0) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdBindVertexBuffers-pBuffers-04002",
+ "vkCmdBindVertexBuffers() pBuffers[%d] is VK_NULL_HANDLE, but pOffsets[%d] is not 0", i, i);
+ }
+ }
+ }
+ }
+
return skip;
}
@@ -4032,6 +4997,109 @@
return skip;
}
+bool StatelessValidation::manual_PreCallValidateCmdBindTransformFeedbackBuffersEXT(VkCommandBuffer commandBuffer,
+ uint32_t firstBinding, uint32_t bindingCount,
+ const VkBuffer *pBuffers,
+ const VkDeviceSize *pOffsets,
+ const VkDeviceSize *pSizes) const {
+ bool skip = false;
+
+ char const *const cmd_name = "CmdBindTransformFeedbackBuffersEXT";
+ for (uint32_t i = 0; i < bindingCount; ++i) {
+ if (pOffsets[i] & 3) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02359",
+ "%s: pOffsets[%" PRIu32 "](0x%" PRIxLEAST64 ") is not a multiple of 4.", cmd_name, i, pOffsets[i]);
+ }
+ }
+
+ if (firstBinding >= phys_dev_ext_props.transform_feedback_props.maxTransformFeedbackBuffers) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02356",
+ "%s: The firstBinding(%" PRIu32
+ ") index is greater than or equal to "
+ "VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackBuffers(%" PRIu32 ").",
+ cmd_name, firstBinding, phys_dev_ext_props.transform_feedback_props.maxTransformFeedbackBuffers);
+ }
+
+ if (firstBinding + bindingCount > phys_dev_ext_props.transform_feedback_props.maxTransformFeedbackBuffers) {
+ skip |=
+ LogError(commandBuffer, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357",
+ "%s: The sum of firstBinding(%" PRIu32 ") and bindCount(%" PRIu32
+ ") is greater than VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackBuffers(%" PRIu32 ").",
+ cmd_name, firstBinding, bindingCount, phys_dev_ext_props.transform_feedback_props.maxTransformFeedbackBuffers);
+ }
+
+ for (uint32_t i = 0; i < bindingCount; ++i) {
+ // pSizes is optional and may be nullptr.
+ if (pSizes != nullptr) {
+ if (pSizes[i] != VK_WHOLE_SIZE &&
+ pSizes[i] > phys_dev_ext_props.transform_feedback_props.maxTransformFeedbackBufferSize) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSize-02361",
+ "%s: pSizes[%" PRIu32 "] (0x%" PRIxLEAST64
+ ") is not VK_WHOLE_SIZE and is greater than "
+ "VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackBufferSize.",
+ cmd_name, i, pSizes[i]);
+ }
+ }
+ }
+
+ return skip;
+}
+
+bool StatelessValidation::manual_PreCallValidateCmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer,
+ uint32_t firstCounterBuffer,
+ uint32_t counterBufferCount,
+ const VkBuffer *pCounterBuffers,
+ const VkDeviceSize *pCounterBufferOffsets) const {
+ bool skip = false;
+
+ char const *const cmd_name = "CmdBeginTransformFeedbackEXT";
+ if (firstCounterBuffer >= phys_dev_ext_props.transform_feedback_props.maxTransformFeedbackBuffers) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02368",
+ "%s: The firstCounterBuffer(%" PRIu32
+ ") index is greater than or equal to "
+ "VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackBuffers(%" PRIu32 ").",
+ cmd_name, firstCounterBuffer, phys_dev_ext_props.transform_feedback_props.maxTransformFeedbackBuffers);
+ }
+
+ if (firstCounterBuffer + counterBufferCount > phys_dev_ext_props.transform_feedback_props.maxTransformFeedbackBuffers) {
+ skip |=
+ LogError(commandBuffer, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369",
+ "%s: The sum of firstCounterBuffer(%" PRIu32 ") and counterBufferCount(%" PRIu32
+ ") is greater than VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackBuffers(%" PRIu32 ").",
+ cmd_name, firstCounterBuffer, counterBufferCount,
+ phys_dev_ext_props.transform_feedback_props.maxTransformFeedbackBuffers);
+ }
+
+ return skip;
+}
+
+bool StatelessValidation::manual_PreCallValidateCmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer,
+ uint32_t firstCounterBuffer, uint32_t counterBufferCount,
+ const VkBuffer *pCounterBuffers,
+ const VkDeviceSize *pCounterBufferOffsets) const {
+ bool skip = false;
+
+ char const *const cmd_name = "CmdEndTransformFeedbackEXT";
+ if (firstCounterBuffer >= phys_dev_ext_props.transform_feedback_props.maxTransformFeedbackBuffers) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02376",
+ "%s: The firstCounterBuffer(%" PRIu32
+ ") index is greater than or equal to "
+ "VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackBuffers(%" PRIu32 ").",
+ cmd_name, firstCounterBuffer, phys_dev_ext_props.transform_feedback_props.maxTransformFeedbackBuffers);
+ }
+
+ if (firstCounterBuffer + counterBufferCount > phys_dev_ext_props.transform_feedback_props.maxTransformFeedbackBuffers) {
+ skip |=
+ LogError(commandBuffer, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377",
+ "%s: The sum of firstCounterBuffer(%" PRIu32 ") and counterBufferCount(%" PRIu32
+ ") is greater than VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackBuffers(%" PRIu32 ").",
+ cmd_name, firstCounterBuffer, counterBufferCount,
+ phys_dev_ext_props.transform_feedback_props.maxTransformFeedbackBuffers);
+ }
+
+ return skip;
+}
+
bool StatelessValidation::manual_PreCallValidateCmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer, uint32_t instanceCount,
uint32_t firstInstance, VkBuffer counterBuffer,
VkDeviceSize counterBufferOffset,
@@ -4058,9 +5126,60 @@
// Check samplerYcbcrConversion feature is set
const auto *ycbcr_features = lvl_find_in_chain<VkPhysicalDeviceSamplerYcbcrConversionFeatures>(device_createinfo_pnext);
if ((ycbcr_features == nullptr) || (ycbcr_features->samplerYcbcrConversion == VK_FALSE)) {
- skip |= LogError(device, "VUID-vkCreateSamplerYcbcrConversion-None-01648",
- "samplerYcbcrConversion must be enabled to call %s.", apiName);
+ const auto *vulkan_11_features = lvl_find_in_chain<VkPhysicalDeviceVulkan11Features>(device_createinfo_pnext);
+ if ((vulkan_11_features == nullptr) || (vulkan_11_features->samplerYcbcrConversion == VK_FALSE)) {
+ skip |= LogError(device, "VUID-vkCreateSamplerYcbcrConversion-None-01648",
+ "%s: samplerYcbcrConversion must be enabled.", apiName);
+ }
}
+
+ const VkComponentMapping components = pCreateInfo->components;
+ // XChroma Subsampled is same as "the format has a _422 or _420 suffix" from spec
+ if (FormatIsXChromaSubsampled(pCreateInfo->format) == true) {
+ if ((components.g != VK_COMPONENT_SWIZZLE_G) && (components.g != VK_COMPONENT_SWIZZLE_IDENTITY)) {
+ skip |= LogError(device, "VUID-VkSamplerYcbcrConversionCreateInfo-components-02581",
+ "%s: When using a XChroma subsampled format (%s) the components.g needs to be VK_COMPONENT_SWIZZLE_G "
+ "or VK_COMPONENT_SWIZZLE_IDENTITY, but is %s.",
+ apiName, string_VkFormat(pCreateInfo->format), string_VkComponentSwizzle(components.g));
+ }
+
+ if ((components.a != VK_COMPONENT_SWIZZLE_A) && (components.a != VK_COMPONENT_SWIZZLE_IDENTITY) &&
+ (components.a != VK_COMPONENT_SWIZZLE_ONE) && (components.a != VK_COMPONENT_SWIZZLE_ZERO)) {
+ skip |=
+ LogError(device, "VUID-VkSamplerYcbcrConversionCreateInfo-components-02582",
+ "%s: When using a XChroma subsampled format (%s) the components.a needs to be VK_COMPONENT_SWIZZLE_A or "
+ "VK_COMPONENT_SWIZZLE_IDENTITY or VK_COMPONENT_SWIZZLE_ONE or VK_COMPONENT_SWIZZLE_ZERO, but is %s.",
+ apiName, string_VkFormat(pCreateInfo->format), string_VkComponentSwizzle(components.a));
+ }
+
+ if ((components.r != VK_COMPONENT_SWIZZLE_R) && (components.r != VK_COMPONENT_SWIZZLE_IDENTITY) &&
+ (components.r != VK_COMPONENT_SWIZZLE_B)) {
+ skip |= LogError(device, "VUID-VkSamplerYcbcrConversionCreateInfo-components-02583",
+ "%s: When using a XChroma subsampled format (%s) the components.r needs to be VK_COMPONENT_SWIZZLE_R "
+ "or VK_COMPONENT_SWIZZLE_IDENTITY or VK_COMPONENT_SWIZZLE_B, but is %s.",
+ apiName, string_VkFormat(pCreateInfo->format), string_VkComponentSwizzle(components.r));
+ }
+
+ if ((components.b != VK_COMPONENT_SWIZZLE_B) && (components.b != VK_COMPONENT_SWIZZLE_IDENTITY) &&
+ (components.b != VK_COMPONENT_SWIZZLE_R)) {
+ skip |= LogError(device, "VUID-VkSamplerYcbcrConversionCreateInfo-components-02584",
+ "%s: When using a XChroma subsampled format (%s) the components.b needs to be VK_COMPONENT_SWIZZLE_B "
+ "or VK_COMPONENT_SWIZZLE_IDENTITY or VK_COMPONENT_SWIZZLE_R, but is %s.",
+ apiName, string_VkFormat(pCreateInfo->format), string_VkComponentSwizzle(components.b));
+ }
+
+ // If one is identity, both need to be
+ const bool rIdentity = ((components.r == VK_COMPONENT_SWIZZLE_R) || (components.r == VK_COMPONENT_SWIZZLE_IDENTITY));
+ const bool bIdentity = ((components.b == VK_COMPONENT_SWIZZLE_B) || (components.b == VK_COMPONENT_SWIZZLE_IDENTITY));
+ if ((rIdentity != bIdentity) && ((rIdentity == true) || (bIdentity == true))) {
+ skip |= LogError(device, "VUID-VkSamplerYcbcrConversionCreateInfo-components-02585",
+ "%s: When using a XChroma subsampled format (%s) if either the components.r (%s) or components.b (%s) "
+ "are an identity swizzle, then both need to be an identity swizzle.",
+ apiName, string_VkFormat(pCreateInfo->format), string_VkComponentSwizzle(components.r),
+ string_VkComponentSwizzle(components.b));
+ }
+ }
+
return skip;
}
@@ -4094,3 +5213,606 @@
}
return skip;
}
+
+bool StatelessValidation::manual_PreCallValidateCopyAccelerationStructureToMemoryKHR(
+ VkDevice device, const VkCopyAccelerationStructureToMemoryInfoKHR *pInfo) const {
+ bool skip = false;
+ const auto *raytracing_features = lvl_find_in_chain<VkPhysicalDeviceRayTracingFeaturesKHR>(device_createinfo_pnext);
+ if (!raytracing_features || raytracing_features->rayTracingHostAccelerationStructureCommands == VK_FALSE) {
+ skip |=
+ LogError(device, "", "VUID-vkCopyAccelerationStructureToMemoryKHR-rayTracingHostAccelerationStructureCommands-03447",
+ "vkCopyAccelerationStructureToMemoryKHR: the "
+ "VkPhysicalDeviceRayTracingFeaturesKHR::rayTracingHostAccelerationStructureCommands feature must be enabled.");
+ }
+ if (pInfo->mode != VK_COPY_ACCELERATION_STRUCTURE_MODE_SERIALIZE_KHR) {
+ skip |= LogError(device, "VUID-VkCopyAccelerationStructureToMemoryInfoKHR-mode-03412",
+ "vkCopyAccelerationStructureToMemoryKHR: mode must be VK_COPY_ACCELERATION_STRUCTURE_MODE_SERIALIZE_KHR.");
+ }
+ return skip;
+}
+
+bool StatelessValidation::manual_PreCallValidateCmdCopyAccelerationStructureToMemoryKHR(
+ VkCommandBuffer commandBuffer, const VkCopyAccelerationStructureToMemoryInfoKHR *pInfo) const {
+ bool skip = false;
+ if (pInfo->mode != VK_COPY_ACCELERATION_STRUCTURE_MODE_SERIALIZE_KHR) {
+ skip |= // to update VUID to VkCmdCopyAccelerationStructureToMemoryInfoKHR after spec update
+ LogError(commandBuffer, "VUID-VkCopyAccelerationStructureToMemoryInfoKHR-mode-03412",
+ "vkCmdCopyAccelerationStructureToMemoryKHR: mode must be VK_COPY_ACCELERATION_STRUCTURE_MODE_SERIALIZE_KHR.");
+ }
+ const auto *pnext_struct = lvl_find_in_chain<VkDeferredOperationInfoKHR>(pInfo->pNext);
+ if (pnext_struct) {
+ skip |= LogError(
+ commandBuffer, "VUID-vkCmdCopyAccelerationStructureToMemoryKHR-pNext-03560",
+ "vkCmdCopyAccelerationStructureToMemoryKHR: The VkDeferredOperationInfoKHR structure must not be included in the"
+ "pNext chain of the VkCopyAccelerationStructureToMemoryInfoKHR structure.");
+ }
+ return skip;
+}
+
+bool StatelessValidation::ValidateCopyAccelerationStructureInfoKHR(const VkCopyAccelerationStructureInfoKHR *pInfo,
+ const char *api_name) const {
+ bool skip = false;
+ if (!(pInfo->mode == VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR ||
+ pInfo->mode == VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR)) {
+ skip |= LogError(device, "VUID-VkCopyAccelerationStructureInfoKHR-mode-03410",
+ "(%s): mode must be VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR"
+ "or VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR.",
+ api_name);
+ }
+ return skip;
+}
+
+bool StatelessValidation::manual_PreCallValidateCopyAccelerationStructureKHR(
+ VkDevice device, const VkCopyAccelerationStructureInfoKHR *pInfo) const {
+ bool skip = false;
+ skip |= ValidateCopyAccelerationStructureInfoKHR(pInfo, "vkCopyAccelerationStructureKHR()");
+ const auto *raytracing_features = lvl_find_in_chain<VkPhysicalDeviceRayTracingFeaturesKHR>(device_createinfo_pnext);
+ if (!raytracing_features || raytracing_features->rayTracingHostAccelerationStructureCommands == VK_FALSE) {
+ skip |= LogError(
+ device, "VUID-vkCopyAccelerationStructureKHR-rayTracingHostAccelerationStructureCommands-03441",
+ "vkCopyAccelerationStructureKHR(): the "
+ "VkPhysicalDeviceRayTracingFeaturesKHR::rayTracingHostAccelerationStructureCommands feature must be enabled .");
+ }
+ return skip;
+}
+
+bool StatelessValidation::manual_PreCallValidateCmdCopyAccelerationStructureKHR(
+ VkCommandBuffer commandBuffer, const VkCopyAccelerationStructureInfoKHR *pInfo) const {
+ bool skip = false;
+ const auto *pnext_struct = lvl_find_in_chain<VkDeferredOperationInfoKHR>(pInfo->pNext);
+ if (pnext_struct) {
+ skip |= LogError(device, "VUID-vkCmdCopyAccelerationStructureKHR-pNext-03557",
+ "vkCmdCopyAccelerationStructureKHR(): The VkDeferredOperationInfoKHR structure must not be included in "
+ "the pNext chain of the VkCopyAccelerationStructureInfoKHR structure.");
+ }
+ skip |= ValidateCopyAccelerationStructureInfoKHR(pInfo, "vkCmdCopyAccelerationStructureKHR()");
+ return skip;
+}
+
+bool StatelessValidation::ValidateCopyMemoryToAccelerationStructureInfoKHR(const VkCopyMemoryToAccelerationStructureInfoKHR *pInfo,
+ const char *api_name, bool is_cmd) const {
+ bool skip = false;
+ if (pInfo->mode != VK_COPY_ACCELERATION_STRUCTURE_MODE_DESERIALIZE_KHR) {
+ skip |= LogError(device,
+ is_cmd ? "VUID-vkCmdCopyMemoryToAccelerationStructureKHR-mode-03413"
+ : "VUID-VkCopyMemoryToAccelerationStructureInfoKHR-mode-03413",
+ "(%s): mode must be VK_COPY_ACCELERATION_STRUCTURE_MODE_DESERIALIZE_KHR.", api_name);
+ }
+ return skip;
+}
+
+bool StatelessValidation::manual_PreCallValidateCopyMemoryToAccelerationStructureKHR(
+ VkDevice device, const VkCopyMemoryToAccelerationStructureInfoKHR *pInfo) const {
+ bool skip = false;
+ skip |= ValidateCopyMemoryToAccelerationStructureInfoKHR(pInfo, "vkCopyMemoryToAccelerationStructureKHR()", true);
+ const auto *raytracing_features = lvl_find_in_chain<VkPhysicalDeviceRayTracingFeaturesKHR>(device_createinfo_pnext);
+ if (!raytracing_features || raytracing_features->rayTracingHostAccelerationStructureCommands == VK_FALSE) {
+ skip |=
+ LogError(device, "VUID-vkCopyMemoryToAccelerationStructureKHR-rayTracingHostAccelerationStructureCommands-03444",
+ "vkCopyMemoryToAccelerationStructureKHR() :the "
+ "VkPhysicalDeviceRayTracingFeaturesKHR::rayTracingHostAccelerationStructureCommands feature must be enabled.");
+ }
+ return skip;
+}
+
+bool StatelessValidation::manual_PreCallValidateCmdCopyMemoryToAccelerationStructureKHR(
+ VkCommandBuffer commandBuffer, const VkCopyMemoryToAccelerationStructureInfoKHR *pInfo) const {
+ bool skip = false;
+ const auto *pnext_struct = lvl_find_in_chain<VkDeferredOperationInfoKHR>(pInfo->pNext);
+ if (pnext_struct) {
+ skip |= LogError(device, "VUID-vkCmdCopyMemoryToAccelerationStructureKHR-pNext-03564",
+ "vkCmdCopyMemoryToAccelerationStructureKHR: The VkDeferredOperationInfoKHR structure must"
+ "not be included in the pNext chain of the VkCopyMemoryToAccelerationStructureInfoKHR structure.");
+ }
+ skip |= ValidateCopyMemoryToAccelerationStructureInfoKHR(pInfo, "vkCmdCopyMemoryToAccelerationStructureKHR()", false);
+ return skip;
+}
+bool StatelessValidation::manual_PreCallValidateCmdWriteAccelerationStructuresPropertiesKHR(
+ VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, const VkAccelerationStructureKHR *pAccelerationStructures,
+ VkQueryType queryType, VkQueryPool queryPool, uint32_t firstQuery) const {
+ bool skip = false;
+ if (!(queryType == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR ||
+ queryType == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR)) {
+ skip |= LogError(device, "VUID-vkCmdWriteAccelerationStructuresPropertiesKHR-queryType-03432",
+ "vkCmdWriteAccelerationStructuresPropertiesKHR: queryType must be "
+ "VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR or "
+ "VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR.");
+ }
+ return skip;
+}
+bool StatelessValidation::manual_PreCallValidateWriteAccelerationStructuresPropertiesKHR(
+ VkDevice device, uint32_t accelerationStructureCount, const VkAccelerationStructureKHR *pAccelerationStructures,
+ VkQueryType queryType, size_t dataSize, void *pData, size_t stride) const {
+ bool skip = false;
+ if (dataSize < accelerationStructureCount * stride) {
+ skip |= LogError(device, "VUID-vkWriteAccelerationStructuresPropertiesKHR-dataSize-03452",
+ "vkWriteAccelerationStructuresPropertiesKHR: dataSize (%zu) must be greater than or equal to "
+ "accelerationStructureCount (%d) *stride(%zu).",
+ dataSize, accelerationStructureCount, stride);
+ }
+ if (!(queryType == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR ||
+ queryType == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR)) {
+ skip |= LogError(device, "VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03432",
+ "vkWriteAccelerationStructuresPropertiesKHR: queryType must be "
+ "VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR or "
+ "VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR.");
+ }
+ if (queryType == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR) {
+ if (SafeModulo(stride, sizeof(VkDeviceSize)) != 0) {
+ skip |= LogError(device, "VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03448",
+ "vkWriteAccelerationStructuresPropertiesKHR: If queryType is "
+ "VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR,"
+ "then stride (%zu) must be a multiple of the size of VkDeviceSize",
+ stride);
+ }
+ }
+ if (queryType == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR) {
+ if (SafeModulo(stride, sizeof(VkDeviceSize)) != 0) {
+ skip |= LogError(device, "VUID-vkWriteAccelerationStructuresPropertiesKHR-queryType-03450",
+ "vkWriteAccelerationStructuresPropertiesKHR: If queryType is "
+ "VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR,"
+ "then stride (%zu) must be a multiple of the size of VkDeviceSize",
+ stride);
+ }
+ }
+ const auto *raytracing_features = lvl_find_in_chain<VkPhysicalDeviceRayTracingFeaturesKHR>(device_createinfo_pnext);
+ if (!raytracing_features || raytracing_features->rayTracingHostAccelerationStructureCommands == VK_FALSE) {
+ skip |=
+ LogError(device, "VUID-vkWriteAccelerationStructuresPropertiesKHR-rayTracingHostAccelerationStructureCommands-03454",
+ "vkWriteAccelerationStructuresPropertiesKHR: the "
+ "vkPhysicalDeviceRayTracingFeaturesKHR::rayTracingHostAccelerationStructureCommands"
+ "feature must be enabled ");
+ }
+ return skip;
+}
+bool StatelessValidation::manual_PreCallValidateGetRayTracingCaptureReplayShaderGroupHandlesKHR(
+ VkDevice device, VkPipeline pipeline, uint32_t firstGroup, uint32_t groupCount, size_t dataSize, void *pData) const {
+ bool skip = false;
+ const auto *raytracing_features = lvl_find_in_chain<VkPhysicalDeviceRayTracingFeaturesKHR>(device_createinfo_pnext);
+ if (!raytracing_features || raytracing_features->rayTracingShaderGroupHandleCaptureReplay == VK_FALSE) {
+ skip |= LogError(device,
+ "VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-rayTracingShaderGroupHandleCaptureReplay-03485",
+ "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR: "
+ "VkPhysicalDeviceRayTracingFeaturesKHR::rayTracingShaderGroupHandleCaptureReplay"
+ "must be enabled to call this function.");
+ }
+ return skip;
+}
+
+bool StatelessValidation::manual_PreCallValidateCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
+ const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
+ const VkStridedBufferRegionKHR *pMissShaderBindingTable,
+ const VkStridedBufferRegionKHR *pHitShaderBindingTable,
+ const VkStridedBufferRegionKHR *pCallableShaderBindingTable,
+ uint32_t width, uint32_t height, uint32_t depth) const {
+ bool skip = false;
+ if (SafeModulo(pCallableShaderBindingTable->offset, phys_dev_ext_props.ray_tracing_propsKHR.shaderGroupBaseAlignment) != 0) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-offset-04038",
+ "vkCmdTraceRaysKHR: The offset member of pCallableShaderBindingTable"
+ "must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment.");
+ }
+ if (SafeModulo(pCallableShaderBindingTable->stride, phys_dev_ext_props.ray_tracing_propsKHR.shaderGroupHandleSize) != 0) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-stride-04040",
+ "vkCmdTraceRaysKHR: The stride member of pCallableShaderBindingTable must be a multiple"
+ "of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize.");
+ }
+ if (pCallableShaderBindingTable->stride > phys_dev_ext_props.ray_tracing_propsKHR.maxShaderGroupStride) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-stride-04041",
+ "vkCmdTraceRaysKHR: The stride member of pCallableShaderBindingTable must be"
+ "less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxShaderGroupStride.");
+ }
+ // hitShader
+ if (SafeModulo(pHitShaderBindingTable->offset, phys_dev_ext_props.ray_tracing_propsKHR.shaderGroupBaseAlignment) != 0) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-offset-04032",
+ "vkCmdTraceRaysKHR: The offset member of pHitShaderBindingTable must be a multiple"
+ "of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment.");
+ }
+ if (SafeModulo(pHitShaderBindingTable->stride, phys_dev_ext_props.ray_tracing_propsKHR.shaderGroupHandleSize) != 0) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-stride-04034",
+ "vkCmdTraceRaysKHR: The stride member of pHitShaderBindingTable must be a multiple"
+ "of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize.");
+ }
+ if (pHitShaderBindingTable->stride > phys_dev_ext_props.ray_tracing_propsKHR.maxShaderGroupStride) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-stride-04035",
+ "vkCmdTraceRaysKHR: The stride member of pHitShaderBindingTable must be"
+ "less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxShaderGroupStride.");
+ }
+
+ // missShader
+ if (SafeModulo(pMissShaderBindingTable->offset, phys_dev_ext_props.ray_tracing_propsKHR.shaderGroupBaseAlignment) != 0) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-offset-04026",
+ "vkCmdTraceRaysKHR: The offset member of pMissShaderBindingTable must be a multiple"
+ "of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment.");
+ }
+ if (SafeModulo(pMissShaderBindingTable->stride, phys_dev_ext_props.ray_tracing_propsKHR.shaderGroupHandleSize) != 0) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-stride-04028",
+ "vkCmdTraceRaysKHR: The stride member of pMissShaderBindingTable must be a multiple"
+ "of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize.");
+ }
+ if (pMissShaderBindingTable->stride > phys_dev_ext_props.ray_tracing_propsKHR.maxShaderGroupStride) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-stride-04029",
+ "vkCmdTraceRaysKHR: The stride member of pMissShaderBindingTable must be"
+ "less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxShaderGroupStride.");
+ }
+
+ // raygenShader
+ if (SafeModulo(pRaygenShaderBindingTable->offset, phys_dev_ext_props.ray_tracing_propsKHR.shaderGroupBaseAlignment) != 0) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysKHR-pRayGenShaderBindingTable-04021",
+ "vkCmdTraceRaysKHR: pRayGenShaderBindingTable->offset must be a multiple"
+ "of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment.");
+ }
+ return skip;
+}
+
+bool StatelessValidation::manual_PreCallValidateCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
+ const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
+ const VkStridedBufferRegionKHR *pMissShaderBindingTable,
+ const VkStridedBufferRegionKHR *pHitShaderBindingTable,
+ const VkStridedBufferRegionKHR *pCallableShaderBindingTable,
+ VkBuffer buffer, VkDeviceSize offset) const {
+ bool skip = false;
+ const auto *raytracing_features = lvl_find_in_chain<VkPhysicalDeviceRayTracingFeaturesKHR>(device_createinfo_pnext);
+ if (!raytracing_features || raytracing_features->rayTracingIndirectTraceRays == VK_FALSE) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-rayTracingIndirectTraceRays-03518",
+ "vkCmdTraceRaysIndirectKHR: the VkPhysicalDeviceRayTracingFeaturesKHR::rayTracingIndirectTraceRays "
+ "feature must be enabled.");
+ }
+ if (SafeModulo(pCallableShaderBindingTable->offset, phys_dev_ext_props.ray_tracing_propsKHR.shaderGroupBaseAlignment) != 0) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-offset-04038",
+ "vkCmdTraceRaysIndirectKHR: The offset member of pCallableShaderBindingTable"
+ "must be a multiple of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment.");
+ }
+ if (SafeModulo(pCallableShaderBindingTable->stride, phys_dev_ext_props.ray_tracing_propsKHR.shaderGroupHandleSize) != 0) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-stride-04040",
+ "vkCmdTraceRaysIndirectKHR: The stride member of pCallableShaderBindingTable must be a multiple"
+ "of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize.");
+ }
+ if (pCallableShaderBindingTable->stride > phys_dev_ext_props.ray_tracing_propsKHR.maxShaderGroupStride) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-stride-04041",
+ "vkCmdTraceRaysIndirectKHR: The stride member of pCallableShaderBindingTable must be"
+ "less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxShaderGroupStride.");
+ }
+ // hitShader
+ if (SafeModulo(pHitShaderBindingTable->offset, phys_dev_ext_props.ray_tracing_propsKHR.shaderGroupBaseAlignment) != 0) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-offset-04032",
+ "vkCmdTraceRaysIndirectKHR: The offset member of pHitShaderBindingTable must be a multiple"
+ "of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment.");
+ }
+ if (SafeModulo(pHitShaderBindingTable->stride, phys_dev_ext_props.ray_tracing_propsKHR.shaderGroupHandleSize) != 0) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-stride-04034",
+ "vkCmdTraceRaysIndirectKHR: The stride member of pHitShaderBindingTable must be a multiple"
+ "of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize.");
+ }
+ if (pHitShaderBindingTable->stride > phys_dev_ext_props.ray_tracing_propsKHR.maxShaderGroupStride) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-stride-04035",
+ "vkCmdTraceRaysIndirectKHR: The stride member of pHitShaderBindingTable must be"
+ "less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxShaderGroupStride.");
+ }
+
+ // missShader
+ if (SafeModulo(pMissShaderBindingTable->offset, phys_dev_ext_props.ray_tracing_propsKHR.shaderGroupBaseAlignment) != 0) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-offset-04026",
+ "vkCmdTraceRaysIndirectKHR: The offset member of pMissShaderBindingTable must be a multiple"
+ "of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment.");
+ }
+ if (SafeModulo(pMissShaderBindingTable->stride, phys_dev_ext_props.ray_tracing_propsKHR.shaderGroupHandleSize) != 0) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-stride-04028",
+ "vkCmdTraceRaysIndirectKHR: The stride member of pMissShaderBindingTable must be a multiple"
+ "of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleSize.");
+ }
+ if (pMissShaderBindingTable->stride > phys_dev_ext_props.ray_tracing_propsKHR.maxShaderGroupStride) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-stride-04029",
+ "vkCmdTraceRaysIndirectKHR: The stride member of pMissShaderBindingTable must be"
+ "less than or equal to VkPhysicalDeviceRayTracingPropertiesKHR::maxShaderGroupStride.");
+ }
+
+ // raygenShader
+ if (SafeModulo(pRaygenShaderBindingTable->offset, phys_dev_ext_props.ray_tracing_propsKHR.shaderGroupBaseAlignment) != 0) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysIndirectKHR-pRayGenShaderBindingTable-04021",
+ "vkCmdTraceRaysIndirectKHR: pRayGenShaderBindingTable->offset must be a multiple"
+ "of VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupBaseAlignment.");
+ }
+ return skip;
+}
+bool StatelessValidation::manual_PreCallValidateCmdTraceRaysNV(
+ VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer, VkDeviceSize raygenShaderBindingOffset,
+ VkBuffer missShaderBindingTableBuffer, VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
+ VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset, VkDeviceSize hitShaderBindingStride,
+ VkBuffer callableShaderBindingTableBuffer, VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
+ uint32_t width, uint32_t height, uint32_t depth) const {
+ bool skip = false;
+ if (SafeModulo(callableShaderBindingOffset, phys_dev_ext_props.ray_tracing_propsNV.shaderGroupBaseAlignment) != 0) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysNV-callableShaderBindingOffset-02462",
+ "vkCmdTraceRaysNV: callableShaderBindingOffset must be a multiple of "
+ "VkPhysicalDeviceRayTracingPropertiesNV::shaderGroupBaseAlignment.");
+ }
+ if (SafeModulo(callableShaderBindingStride, phys_dev_ext_props.ray_tracing_propsNV.shaderGroupHandleSize) != 0) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysNV-callableShaderBindingStride-02465",
+ "vkCmdTraceRaysNV: callableShaderBindingStride must be a multiple of "
+ "VkPhysicalDeviceRayTracingPropertiesNV::shaderGroupHandleSize.");
+ }
+ if (callableShaderBindingStride > phys_dev_ext_props.ray_tracing_propsNV.maxShaderGroupStride) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysNV-callableShaderBindingStride-02468",
+ "vkCmdTraceRaysNV: callableShaderBindingStride must be less than or equal to "
+ "VkPhysicalDeviceRayTracingPropertiesNV::maxShaderGroupStride. ");
+ }
+
+ // hitShader
+ if (SafeModulo(hitShaderBindingOffset, phys_dev_ext_props.ray_tracing_propsNV.shaderGroupBaseAlignment) != 0) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysNV-hitShaderBindingOffset-02460",
+ "vkCmdTraceRaysNV: hitShaderBindingOffset must be a multiple of "
+ "VkPhysicalDeviceRayTracingPropertiesNV::shaderGroupBaseAlignment.");
+ }
+ if (SafeModulo(hitShaderBindingStride, phys_dev_ext_props.ray_tracing_propsNV.shaderGroupHandleSize) != 0) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysNV-hitShaderBindingStride-02464",
+ "vkCmdTraceRaysNV: hitShaderBindingStride must be a multiple of "
+ "VkPhysicalDeviceRayTracingPropertiesNV::shaderGroupHandleSize.");
+ }
+ if (hitShaderBindingStride > phys_dev_ext_props.ray_tracing_propsNV.maxShaderGroupStride) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysNV-hitShaderBindingStride-02467",
+ "vkCmdTraceRaysNV: hitShaderBindingStride must be less than or equal to "
+ "VkPhysicalDeviceRayTracingPropertiesNV::maxShaderGroupStride.");
+ }
+
+ // missShader
+ if (SafeModulo(missShaderBindingOffset, phys_dev_ext_props.ray_tracing_propsNV.shaderGroupBaseAlignment) != 0) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysNV-missShaderBindingOffset-02458",
+ "vkCmdTraceRaysNV: missShaderBindingOffset must be a multiple of "
+ "VkPhysicalDeviceRayTracingPropertiesNV::shaderGroupBaseAlignment.");
+ }
+ if (SafeModulo(missShaderBindingStride, phys_dev_ext_props.ray_tracing_propsNV.shaderGroupHandleSize) != 0) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysNV-missShaderBindingStride-02463",
+ "vkCmdTraceRaysNV: missShaderBindingStride must be a multiple of "
+ "VkPhysicalDeviceRayTracingPropertiesNV::shaderGroupHandleSize.");
+ }
+ if (missShaderBindingStride > phys_dev_ext_props.ray_tracing_propsNV.maxShaderGroupStride) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysNV-missShaderBindingStride-02466",
+ "vkCmdTraceRaysNV: missShaderBindingStride must be less than or equal to "
+ "VkPhysicalDeviceRayTracingPropertiesNV::maxShaderGroupStride.");
+ }
+
+ // raygenShader
+ if (SafeModulo(raygenShaderBindingOffset, phys_dev_ext_props.ray_tracing_propsNV.shaderGroupBaseAlignment) != 0) {
+ skip |= LogError(device, "VUID-vkCmdTraceRaysNV-raygenShaderBindingOffset-02456",
+ "vkCmdTraceRaysNV: raygenShaderBindingOffset must be a multiple of "
+ "VkPhysicalDeviceRayTracingPropertiesNV::shaderGroupBaseAlignment.");
+ }
+ if (width > device_limits.maxComputeWorkGroupCount[0]) {
+ skip |=
+ LogError(device, "VUID-vkCmdTraceRaysNV-width-02469",
+ "vkCmdTraceRaysNV: width must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[o].");
+ }
+ if (height > device_limits.maxComputeWorkGroupCount[1]) {
+ skip |=
+ LogError(device, "VUID-vkCmdTraceRaysNV-height-02470",
+ "vkCmdTraceRaysNV: height must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[1].");
+ }
+ if (depth > device_limits.maxComputeWorkGroupCount[2]) {
+ skip |=
+ LogError(device, "VUID-vkCmdTraceRaysNV-depth-02471",
+ "vkCmdTraceRaysNV: depth must be less than or equal to VkPhysicalDeviceLimits::maxComputeWorkGroupCount[2].");
+ }
+ return skip;
+}
+
+bool StatelessValidation::manual_PreCallValidateCmdBuildAccelerationStructureIndirectKHR(
+ VkCommandBuffer commandBuffer, const VkAccelerationStructureBuildGeometryInfoKHR *pInfo, VkBuffer indirectBuffer,
+ VkDeviceSize indirectOffset, uint32_t indirectStride) const {
+ bool skip = false;
+ const auto *raytracing_features = lvl_find_in_chain<VkPhysicalDeviceRayTracingFeaturesKHR>(device_createinfo_pnext);
+ if (!raytracing_features || raytracing_features->rayTracingIndirectAccelerationStructureBuild == VK_FALSE) {
+ skip |= LogError(
+ device, "VUID-vkCmdBuildAccelerationStructureIndirectKHR-rayTracingIndirectAccelerationStructureBuild-03535",
+ "vkCmdBuildAccelerationStructureIndirectKHR: The "
+ "VkPhysicalDeviceRayTracingFeaturesKHR::rayTracingIndirectAccelerationStructureBuild feature must be enabled.");
+ }
+ const auto *pnext_struct = lvl_find_in_chain<VkDeferredOperationInfoKHR>(pInfo->pNext);
+ if (pnext_struct) {
+ skip |=
+ LogError(device, "VUID-vkCmdBuildAccelerationStructureIndirectKHR-pNext-03536",
+ "vkCmdBuildAccelerationStructureIndirectKHR: The VkDeferredOperationInfoKHR structure must not be included in "
+ "the pNext chain of any of the provided VkAccelerationStructureBuildGeometryInfoKHR structures.");
+ }
+ return false;
+}
+
+bool StatelessValidation::manual_PreCallValidateGetDeviceAccelerationStructureCompatibilityKHR(
+ VkDevice device, const VkAccelerationStructureVersionKHR *version) const {
+ bool skip = false;
+ const auto *raytracing_features = lvl_find_in_chain<VkPhysicalDeviceRayTracingFeaturesKHR>(device_createinfo_pnext);
+ if (!raytracing_features || !(raytracing_features->rayQuery || raytracing_features->rayTracing)) {
+ skip |= LogError(device, "VUID-vkGetDeviceAccelerationStructureCompatibilityKHR-rayTracing-03565",
+ "vkGetDeviceAccelerationStructureCompatibilityKHR: The rayTracing or rayQuery feature must be enabled.");
+ }
+ return skip;
+}
+
+bool StatelessValidation::manual_PreCallValidateBuildAccelerationStructureKHR(
+ VkDevice device, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
+ const VkAccelerationStructureBuildOffsetInfoKHR *const *ppOffsetInfos) const {
+ bool skip = false;
+ const auto *raytracing_features = lvl_find_in_chain<VkPhysicalDeviceRayTracingFeaturesKHR>(device_createinfo_pnext);
+ if (!raytracing_features || raytracing_features->rayTracingHostAccelerationStructureCommands == VK_FALSE) {
+ skip |= LogError(device, "VUID-vkBuildAccelerationStructureKHR-rayTracingHostAccelerationStructureCommands-03439",
+ "vkBuildAccelerationStructureKHR: The "
+ "vkPhysicalDeviceRayTracingFeaturesKHR::rayTracingHostAccelerationStructureCommands"
+ "feature must be enabled .");
+ }
+ return skip;
+}
+bool StatelessValidation::manual_PreCallValidateCmdBuildAccelerationStructureKHR(
+ VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
+ const VkAccelerationStructureBuildOffsetInfoKHR *const *ppOffsetInfos) const {
+ bool skip = false;
+ for (uint32_t i = 0; i < infoCount; ++i) {
+ const auto *pnext_struct = lvl_find_in_chain<VkDeferredOperationInfoKHR>(pInfos->pNext);
+ if (pnext_struct) {
+ skip |=
+ LogError(commandBuffer, "VUID-vkCmdBuildAccelerationStructureKHR-pNext-03532",
+ "vkCmdBuildAccelerationStructureKHR: The VkDeferredOperationInfoKHR structure must not be included in the"
+ "pNext chain of any of the provided VkAccelerationStructureBuildGeometryInfoKHR structures.");
+ }
+ }
+ return skip;
+}
+
+bool StatelessValidation::manual_PreCallValidateCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount,
+ const VkViewport *pViewports) const {
+ bool skip = false;
+
+ if (!physical_device_features.multiViewport) {
+ if (viewportCount != 1) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdSetViewportWithCountEXT-viewportCount-03395",
+ "vkCmdSetViewportWithCountEXT: The multiViewport feature is disabled, but viewportCount (=%" PRIu32
+ ") is not 1.",
+ viewportCount);
+ }
+ } else { // multiViewport enabled
+ if (viewportCount < 1 || viewportCount > device_limits.maxViewports) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdSetViewportWithCountEXT-viewportCount-03394",
+ "vkCmdSetViewportWithCountEXT: viewportCount (=%" PRIu32
+ ") must "
+ "not be greater than VkPhysicalDeviceLimits::maxViewports (=%" PRIu32 ").",
+ viewportCount, device_limits.maxViewports);
+ }
+ }
+
+ if (pViewports) {
+ for (uint32_t viewport_i = 0; viewport_i < viewportCount; ++viewport_i) {
+ const auto &viewport = pViewports[viewport_i]; // will crash on invalid ptr
+ const char *fn_name = "vkCmdSetViewportWithCountEXT";
+ skip |= manual_PreCallValidateViewport(
+ viewport, fn_name, ParameterName("pViewports[%i]", ParameterName::IndexVector{viewport_i}), commandBuffer);
+ }
+ }
+
+ return skip;
+}
+
+bool StatelessValidation::manual_PreCallValidateCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount,
+ const VkRect2D *pScissors) const {
+ bool skip = false;
+
+ if (!physical_device_features.multiViewport) {
+ if (scissorCount != 1) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdSetScissorWithCountEXT-scissorCount-03398",
+ "vkCmdSetScissorWithCountEXT: scissorCount (=%" PRIu32
+ ") must "
+ "be 1 when the multiViewport feature is disabled.",
+ scissorCount);
+ }
+ } else { // multiViewport enabled
+ if (scissorCount == 0) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdSetScissorWithCountEXT-scissorCount-03397",
+ "vkCmdSetScissorWithCountEXT: scissorCount (=%" PRIu32
+ ") must "
+ "be great than zero.",
+ scissorCount);
+ } else if (scissorCount > device_limits.maxViewports) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdSetScissorWithCountEXT-scissorCount-03397",
+ "vkCmdSetScissorWithCountEXT: scissorCount (=%" PRIu32
+ ") must "
+ "not be greater than VkPhysicalDeviceLimits::maxViewports (=%" PRIu32 ").",
+ scissorCount, device_limits.maxViewports);
+ }
+ }
+
+ if (pScissors) {
+ for (uint32_t scissor_i = 0; scissor_i < scissorCount; ++scissor_i) {
+ const auto &scissor = pScissors[scissor_i]; // will crash on invalid ptr
+
+ if (scissor.offset.x < 0) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdSetScissorWithCountEXT-x-03399",
+ "vkCmdSetScissor: pScissors[%" PRIu32 "].offset.x (=%" PRIi32 ") is negative.", scissor_i,
+ scissor.offset.x);
+ }
+
+ if (scissor.offset.y < 0) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdSetScissorWithCountEXT-x-03399",
+ "vkCmdSetScissor: pScissors[%" PRIu32 "].offset.y (=%" PRIi32 ") is negative.", scissor_i,
+ scissor.offset.y);
+ }
+
+ const int64_t x_sum = static_cast<int64_t>(scissor.offset.x) + static_cast<int64_t>(scissor.extent.width);
+ if (x_sum > INT32_MAX) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdSetScissorWithCountEXT-offset-03400",
+ "vkCmdSetScissor: offset.x + extent.width (=%" PRIi32 " + %" PRIu32 " = %" PRIi64
+ ") of pScissors[%" PRIu32 "] will overflow int32_t.",
+ scissor.offset.x, scissor.extent.width, x_sum, scissor_i);
+ }
+
+ const int64_t y_sum = static_cast<int64_t>(scissor.offset.y) + static_cast<int64_t>(scissor.extent.height);
+ if (y_sum > INT32_MAX) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdSetScissorWithCountEXT-offset-03401",
+ "vkCmdSetScissor: offset.y + extent.height (=%" PRIi32 " + %" PRIu32 " = %" PRIi64
+ ") of pScissors[%" PRIu32 "] will overflow int32_t.",
+ scissor.offset.y, scissor.extent.height, y_sum, scissor_i);
+ }
+ }
+ }
+
+ return skip;
+}
+
+bool StatelessValidation::manual_PreCallValidateCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding,
+ uint32_t bindingCount, const VkBuffer *pBuffers,
+ const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes,
+ const VkDeviceSize *pStrides) const {
+ bool skip = false;
+ if (firstBinding >= device_limits.maxVertexInputBindings) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdBindVertexBuffers2EXT-firstBinding-03355",
+ "vkCmdBindVertexBuffers2EXT() firstBinding (%u) must be less than maxVertexInputBindings (%u)",
+ firstBinding, device_limits.maxVertexInputBindings);
+ } else if ((firstBinding + bindingCount) > device_limits.maxVertexInputBindings) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdBindVertexBuffers2EXT-firstBinding-03356",
+ "vkCmdBindVertexBuffers2EXT() sum of firstBinding (%u) and bindingCount (%u) must be less than "
+ "maxVertexInputBindings (%u)",
+ firstBinding, bindingCount, device_limits.maxVertexInputBindings);
+ }
+
+ for (uint32_t i = 0; i < bindingCount; ++i) {
+ if (pBuffers[i] == VK_NULL_HANDLE) {
+ const auto *robustness2_features = lvl_find_in_chain<VkPhysicalDeviceRobustness2FeaturesEXT>(device_createinfo_pnext);
+ if (!(robustness2_features && robustness2_features->nullDescriptor)) {
+ skip |= LogError(commandBuffer, "VUID-vkCmdBindVertexBuffers2EXT-pBuffers-04111",
+ "vkCmdBindVertexBuffers2EXT() required parameter pBuffers[%d] specified as VK_NULL_HANDLE", i);
+ } else {
+ if (pOffsets[i] != 0) {
+ skip |=
+ LogError(commandBuffer, "VUID-vkCmdBindVertexBuffers2EXT-pBuffers-04112",
+ "vkCmdBindVertexBuffers2EXT() pBuffers[%d] is VK_NULL_HANDLE, but pOffsets[%d] is not 0", i, i);
+ }
+ }
+ }
+ if (pStrides) {
+ if (pStrides[i] > device_limits.maxVertexInputBindingStride) {
+ skip |=
+ LogError(commandBuffer, "VUID-vkCmdBindVertexBuffers2EXT-pStrides-03362",
+ "vkCmdBindVertexBuffers2EXT() pStrides[%d] (%u) must be less than maxVertexInputBindingStride (%u)", i,
+ pStrides[i], device_limits.maxVertexInputBindingStride);
+ }
+ }
+ }
+
+ return skip;
+}
diff --git a/layers/range_vector.h b/layers/range_vector.h
index 37de88e..eba0dd3 100644
--- a/layers/range_vector.h
+++ b/layers/range_vector.h
@@ -72,6 +72,8 @@
return *this;
}
+ inline range operator+(const index_type &offset) const { return range(begin + offset, end + offset); }
+
// for a reversible/transitive < operator compare first on begin and then end
// only less or begin is less or if end is less when begin is equal
bool operator<(const range &rhs) const {
@@ -111,6 +113,7 @@
range() : begin(), end() {}
range(const index_type &begin_, const index_type &end_) : begin(begin_), end(end_) {}
+ range(const range &other) : begin(other.begin), end(other.end) {}
};
template <typename Range>
@@ -472,6 +475,10 @@
friend range_map;
public:
+ const_iterator &operator=(const const_iterator &other) {
+ Base::operator=(other);
+ return *this;
+ }
const_iterator(const const_iterator &other) : Base(other){};
const_iterator(const iterator &it) : Base(ImplConstIterator(it.get_pos())) {}
const_iterator() : Base() {}
@@ -712,6 +719,7 @@
// At end()
IteratorImpl() : map_(nullptr), pos_(N) {}
+ IteratorImpl(const IteratorImpl &other) : map_(other.map_), pos_(other.pos_) {}
// Raw getters to allow for const_iterator conversion below
Map *get_map() const { return map_; }
@@ -1468,6 +1476,12 @@
return *this;
}
+ // For times when the application knows what it's done to the underlying map... (with assert in set_value)
+ cached_lower_bound_impl &invalidate(const iterator &hint, index_type index) {
+ set_value(index, hint);
+ return *this;
+ }
+
cached_lower_bound_impl &invalidate() { return invalidate(index_); }
// Allow a hint for a *valid* lower bound for current index
@@ -1495,6 +1509,9 @@
}
}
+ Map &map() { return *map_; }
+ const Map &map() const { return *map_; }
+
// Default constructed object reports valid (correctly) as false, but otherwise will fail (assert) under nearly any use.
cached_lower_bound_impl()
: map_(nullptr), end_(), pos_(index_, lower_bound_, valid_), index_(0), lower_bound_(), valid_(false) {}
@@ -1515,6 +1532,26 @@
return default_value;
}
+// Split a range into pieces bound by the interection of the interator's range and the supplied range
+template <typename Iterator, typename Map, typename Range>
+Iterator split(Iterator in, Map &map, const Range &range) {
+ assert(in != map.end()); // Not designed for use with invalid iterators...
+ const auto in_range = in->first;
+ const auto split_range = in_range & range;
+
+ if (split_range.empty()) return map.end();
+
+ auto pos = in;
+ if (split_range.begin != in_range.begin) {
+ pos = map.split(pos, split_range.begin, sparse_container::split_op_keep_both());
+ ++pos;
+ }
+ if (split_range.end != in_range.end) {
+ pos = map.split(pos, split_range.end, sparse_container::split_op_keep_both());
+ }
+ return pos;
+}
+
// Parallel iterator
// Traverse to range maps over the the same range, but without assumptions of aligned ranges.
// ++ increments to the next point where on of the two maps changes range, giving a range over which the two
@@ -1614,12 +1651,21 @@
seek(start);
return *this;
}
+
parallel_iterator &invalidate_A() {
const index_type index = range_.begin;
pos_A_.invalidate(static_cast<index_type_A>(index));
range_ = key_type(index, index + compute_delta());
return *this;
}
+
+ parallel_iterator &invalidate_A(const iterator_A &hint) {
+ const index_type index = range_.begin;
+ pos_A_.invalidate(hint, static_cast<index_type_A>(index));
+ range_ = key_type(index, index + compute_delta());
+ return *this;
+ }
+
parallel_iterator &invalidate_B() {
const index_type index = range_.begin;
pos_B_.invalidate(static_cast<index_type_B>(index));
@@ -1627,6 +1673,21 @@
return *this;
}
+ parallel_iterator &invalidate_B(const iterator_B &hint) {
+ const index_type index = range_.begin;
+ pos_B_.invalidate(hint, static_cast<index_type_B>(index));
+ range_ = key_type(index, index + compute_delta());
+ return *this;
+ }
+
+ parallel_iterator &trim_A() {
+ if (pos_A_->valid && (range_ != pos_A_->lower_bound->first)) {
+ split(pos_A_->lower_bound, pos_A_.map(), range_);
+ invalidate_A();
+ }
+ return *this;
+ }
+
// The return is const because we are sharing the internal state directly.
const value_type &operator*() const { return pos_; }
const value_type *operator->() const { return &pos_; }
diff --git a/layers/shader_validation.cpp b/layers/shader_validation.cpp
index 5a2d443..d4862e6 100644
--- a/layers/shader_validation.cpp
+++ b/layers/shader_validation.cpp
@@ -31,7 +31,7 @@
#include <unordered_map>
#include <vector>
-#include <SPIRV/spirv.hpp>
+#include <spirv/unified1/spirv.hpp>
#include "vk_loader_platform.h"
#include "vk_enum_string_helper.h"
#include "vk_layer_data.h"
@@ -833,7 +833,8 @@
return out;
}
-static bool IsWritableDescriptorType(SHADER_MODULE_STATE const *module, uint32_t type_id, bool is_storage_buffer) {
+static bool IsWritableDescriptorType(SHADER_MODULE_STATE const *module, const spirv_inst_iter &id_it, bool is_storage_buffer) {
+ uint32_t type_id = id_it.word(1);
auto type = module->get_def(type_id);
// Strip off any array or ptrs. Where we remove array levels, adjust the descriptor count for each dimension.
@@ -844,12 +845,57 @@
type = module->get_def(type.word(3)); // Pointee type
}
}
-
switch (type.opcode()) {
case spv::OpTypeImage: {
auto dim = type.word(3);
auto sampled = type.word(7);
- return sampled == 2 && dim != spv::DimSubpassData;
+ if (sampled == 2 && dim != spv::DimSubpassData) {
+ std::vector<unsigned> imagwrite_members;
+ std::unordered_map<unsigned, unsigned> load_members;
+ std::unordered_map<unsigned, unsigned> accesschain_members;
+ unsigned int id = id_it.word(2);
+
+ for (auto insn : *module) {
+ switch (insn.opcode()) {
+ case spv::OpImageWrite: {
+ imagwrite_members.emplace_back(insn.word(1)); // Load id
+ break;
+ }
+ case spv::OpLoad: {
+ // 2: Load id, 3: object id or AccessChain id
+ load_members.insert(std::make_pair(insn.word(2), insn.word(3)));
+ break;
+ }
+ case spv::OpAccessChain: {
+ // 2: AccessChain id, 3: object id
+ if (insn.word(3) == id) {
+ accesschain_members.insert(std::make_pair(insn.word(2), insn.word(3)));
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ if (imagwrite_members.empty() || load_members.empty()) {
+ return false;
+ }
+ for (auto load_id : imagwrite_members) {
+ auto load_it = load_members.find(load_id);
+ if (load_it == load_members.end()) {
+ continue;
+ }
+ if (load_it->second == id) {
+ return true;
+ }
+ auto accesschain_it = accesschain_members.find(load_it->second);
+ if (accesschain_it == accesschain_members.end()) {
+ continue;
+ }
+ return true;
+ }
+ }
+ return false;
}
case spv::OpTypeStruct: {
@@ -864,7 +910,44 @@
// A buffer is writable if it's either flavor of storage buffer, and has any member not decorated
// as nonwritable.
- return is_storage_buffer && nonwritable_members.size() != type.len() - 2;
+ if (is_storage_buffer && nonwritable_members.size() != type.len() - 2) {
+ std::vector<unsigned> store_members;
+ std::unordered_map<unsigned, unsigned> accesschain_members;
+ unsigned int id = id_it.word(2);
+
+ for (auto insn : *module) {
+ switch (insn.opcode()) {
+ case spv::OpStore:
+ case spv::OpAtomicStore: {
+ if (insn.word(1) == id) {
+ return true;
+ }
+ store_members.emplace_back(insn.word(1)); // object id or AccessChain id
+ break;
+ }
+ case spv::OpAccessChain: {
+ // 2: AccessChain id, 3: object id
+ if (insn.word(3) == id) {
+ accesschain_members.insert(std::make_pair(insn.word(2), insn.word(3)));
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ if (store_members.empty() || accesschain_members.empty()) {
+ return false;
+ }
+ for (auto oid : store_members) {
+ auto accesschain_it = accesschain_members.find(oid);
+ if (accesschain_it == accesschain_members.end()) {
+ continue;
+ }
+ return true;
+ }
+ }
+ return false;
}
}
@@ -889,18 +972,74 @@
interface_var v = {};
v.id = insn.word(2);
v.type_id = insn.word(1);
- out.emplace_back(std::make_pair(set, binding), v);
+ v.is_writable = false;
if (!(d.flags & decoration_set::nonwritable_bit) &&
- IsWritableDescriptorType(src, insn.word(1), insn.word(3) == spv::StorageClassStorageBuffer)) {
+ IsWritableDescriptorType(src, insn, insn.word(3) == spv::StorageClassStorageBuffer)) {
*has_writable_descriptor = true;
+ v.is_writable = true;
}
+ out.emplace_back(std::make_pair(set, binding), v);
}
}
return out;
}
+std::unordered_set<uint32_t> CollectWritableOutputLocationinFS(const SHADER_MODULE_STATE &module,
+ const VkPipelineShaderStageCreateInfo &stage_info) {
+ std::unordered_set<uint32_t> location_list;
+ if (stage_info.stage != VK_SHADER_STAGE_FRAGMENT_BIT) return location_list;
+ const auto entrypoint = FindEntrypoint(&module, stage_info.pName, stage_info.stage);
+ const auto outputs = CollectInterfaceByLocation(&module, entrypoint, spv::StorageClassOutput, false);
+ std::unordered_set<unsigned> store_members;
+ std::unordered_map<unsigned, unsigned> accesschain_members;
+
+ for (auto insn : module) {
+ switch (insn.opcode()) {
+ case spv::OpStore:
+ case spv::OpAtomicStore: {
+ store_members.insert(insn.word(1)); // object id or AccessChain id
+ break;
+ }
+ case spv::OpAccessChain: {
+ // 2: AccessChain id, 3: object id
+ if (insn.word(3)) accesschain_members.insert(std::make_pair(insn.word(2), insn.word(3)));
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ if (store_members.empty()) {
+ return location_list;
+ }
+ for (auto output : outputs) {
+ auto store_it = store_members.find(output.second.id);
+ if (store_it != store_members.end()) {
+ location_list.insert(output.first.first);
+ store_members.erase(store_it);
+ continue;
+ }
+ store_it = store_members.begin();
+ while (store_it != store_members.end()) {
+ auto accesschain_it = accesschain_members.find(*store_it);
+ if (accesschain_it == accesschain_members.end()) {
+ ++store_it;
+ continue;
+ }
+ if (accesschain_it->second == output.second.id) {
+ location_list.insert(output.first.first);
+ store_members.erase(store_it);
+ accesschain_members.erase(accesschain_it);
+ break;
+ }
+ ++store_it;
+ }
+ }
+ return location_list;
+}
+
bool CoreChecks::ValidateViConsistency(VkPipelineVertexInputStateCreateInfo const *vi) const {
// Walk the binding descriptions, which describe the step rate and stride of each vertex buffer. Each binding should
// be specified only once.
@@ -1267,8 +1406,9 @@
for (auto insn : *src) {
if (insn.opcode() == spv::OpMemberDecorate && insn.word(1) == type.word(1)) {
if (insn.word(3) == spv::DecorationOffset) {
- unsigned offset = insn.word(4);
- auto size = 4; // Bytes; TODO: calculate this based on the type
+ auto const member = insn.word(2);
+ auto const offset = insn.word(4);
+ auto const size = 4; // Bytes; TODO: calculate this based on the type
bool found_range = false;
for (auto const &range : *push_constant_ranges) {
@@ -1282,7 +1422,8 @@
if (!found_range) {
skip |= LogError(device, kVUID_Core_Shader_PushConstantOutOfRange,
- "Push constant range covering variable starting at offset %u not declared in layout", offset);
+ "Shader push-constant buffer member %u at offset %u is not declared in pipeline layout",
+ member, offset);
}
}
}
@@ -2910,13 +3051,7 @@
}
// Apply the specialization-constant values and revalidate the shader module.
- spv_target_env spirv_environment;
- if (api_version >= VK_API_VERSION_1_2)
- spirv_environment = SPV_ENV_VULKAN_1_2;
- else if (api_version >= VK_API_VERSION_1_1)
- spirv_environment = SPV_ENV_VULKAN_1_1;
- else
- spirv_environment = SPV_ENV_VULKAN_1_0;
+ spv_target_env spirv_environment = PickSpirvEnv(api_version, (device_extensions.vk_khr_spirv_1_4 != kNotEnabled));
spvtools::Optimizer optimizer(spirv_environment);
spvtools::MessageConsumer consumer = [&skip, &module, &pStage, this](spv_message_level_t level, const char *source,
const spv_position_t &position, const char *message) {
@@ -3239,6 +3374,30 @@
pipeline->raytracingPipelineCI.maxRecursionDepth,
phys_dev_ext_props.ray_tracing_propsKHR.maxRecursionDepth);
}
+ for (uint32_t i = 0; i < pipeline->raytracingPipelineCI.libraries.libraryCount; ++i) {
+ const PIPELINE_STATE *pLibrary_pipelinestate = GetPipelineState(pipeline->raytracingPipelineCI.libraries.pLibraries[i]);
+ if (pLibrary_pipelinestate->raytracingPipelineCI.maxRecursionDepth !=
+ pipeline->raytracingPipelineCI.maxRecursionDepth) {
+ skip |= LogError(
+ device, "VUID-VkRayTracingPipelineCreateInfoKHR-pLibraries-03467",
+ "vkCreateRayTracingPipelinesKHR: Each element (%d) of the pLibraries member of libraries must have been"
+ "created with the value of maxRecursionDepth (%d) equal to that in this pipeline (%d) .",
+ i, pLibrary_pipelinestate->raytracingPipelineCI.maxRecursionDepth,
+ pipeline->raytracingPipelineCI.maxRecursionDepth);
+ }
+ if (pLibrary_pipelinestate->raytracingPipelineCI.pLibraryInterface->maxAttributeSize !=
+ pipeline->raytracingPipelineCI.pLibraryInterface->maxAttributeSize ||
+ pLibrary_pipelinestate->raytracingPipelineCI.pLibraryInterface->maxPayloadSize !=
+ pipeline->raytracingPipelineCI.pLibraryInterface->maxPayloadSize ||
+ pLibrary_pipelinestate->raytracingPipelineCI.pLibraryInterface->maxCallableSize !=
+ pipeline->raytracingPipelineCI.pLibraryInterface->maxCallableSize) {
+ skip |=
+ LogError(device, "VUID-VkRayTracingPipelineCreateInfoKHR-pLibraries-03469",
+ "vkCreateRayTracingPipelinesKHR: Each element of the pLibraries member of libraries must have been "
+ "created with values of the maxPayloadSize,"
+ "maxAttributeSize, and maxCallableSize members of pLibraryInterface equal to those in this pipeline.");
+ }
+ }
} else {
if (pipeline->raytracingPipelineCI.maxRecursionDepth > phys_dev_ext_props.ray_tracing_propsNV.maxRecursionDepth) {
skip |= LogError(device, "VUID-VkRayTracingPipelineCreateInfoNV-maxRecursionDepth-03457", ": %d > %d",
@@ -3246,7 +3405,6 @@
phys_dev_ext_props.ray_tracing_propsNV.maxRecursionDepth);
}
}
-
const auto *stages = pipeline->raytracingPipelineCI.ptr()->pStages;
const auto *groups = pipeline->raytracingPipelineCI.ptr()->pGroups;
@@ -3344,7 +3502,7 @@
bool skip = false;
spv_result_t spv_valid = SPV_SUCCESS;
- if (disabled.shader_validation) {
+ if (disabled[shader_validation]) {
return false;
}
@@ -3364,16 +3522,7 @@
// Use SPIRV-Tools validator to try and catch any issues with the module itself. If specialization constants are present,
// the default values will be used during validation.
- spv_target_env spirv_environment = SPV_ENV_VULKAN_1_0;
- if (api_version >= VK_API_VERSION_1_2) {
- spirv_environment = SPV_ENV_VULKAN_1_2;
- } else if (api_version >= VK_API_VERSION_1_1) {
- if (device_extensions.vk_khr_spirv_1_4) {
- spirv_environment = SPV_ENV_VULKAN_1_1_SPIRV_1_4;
- } else {
- spirv_environment = SPV_ENV_VULKAN_1_1;
- }
- }
+ spv_target_env spirv_environment = PickSpirvEnv(api_version, (device_extensions.vk_khr_spirv_1_4 != kNotEnabled));
spv_context ctx = spvContextCreate(spirv_environment);
spv_const_binary_t binary{pCreateInfo->pCode, pCreateInfo->codeSize / sizeof(uint32_t)};
spv_diagnostic diag = nullptr;
@@ -3461,3 +3610,16 @@
}
return skip;
}
+
+spv_target_env PickSpirvEnv(uint32_t api_version, bool spirv_1_4) {
+ if (api_version >= VK_API_VERSION_1_2) {
+ return SPV_ENV_VULKAN_1_2;
+ } else if (api_version >= VK_API_VERSION_1_1) {
+ if (spirv_1_4) {
+ return SPV_ENV_VULKAN_1_1_SPIRV_1_4;
+ } else {
+ return SPV_ENV_VULKAN_1_1;
+ }
+ }
+ return SPV_ENV_VULKAN_1_0;
+}
diff --git a/layers/shader_validation.h b/layers/shader_validation.h
index 0514282..795ead2 100644
--- a/layers/shader_validation.h
+++ b/layers/shader_validation.h
@@ -28,7 +28,7 @@
#include <vector>
#include "vulkan/vulkan.h"
-#include <SPIRV/spirv.hpp>
+#include <spirv/unified1/spirv.hpp>
#include <generated/spirv_tools_commit_id.h>
#include "spirv-tools/optimizer.hpp"
#include "core_validation_types.h"
@@ -301,9 +301,15 @@
// Convert sha1_str from a hex string to binary. We only need VK_UUID_SIZE bytes of
// output, so pad with zeroes if the input string is shorter than that, and truncate
// if it's longer.
+#if defined(__GNUC__) && (__GNUC__ > 8)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstringop-truncation"
+#endif
char padded_sha1_str[2 * VK_UUID_SIZE + 1] = {}; // 2 hex digits == 1 byte
std::strncpy(padded_sha1_str, sha1_str, 2 * VK_UUID_SIZE);
-
+#if defined(__GNUC__) && (__GNUC__ > 8)
+#pragma GCC diagnostic pop
+#endif
for (uint32_t i = 0; i < VK_UUID_SIZE; ++i) {
const char byte_str[] = {padded_sha1_str[2 * i + 0], padded_sha1_str[2 * i + 1], '\0'};
uuid[i] = static_cast<uint8_t>(std::strtoul(byte_str, nullptr, 16));
@@ -327,6 +333,11 @@
std::vector<std::pair<descriptor_slot_t, interface_var>> CollectInterfaceByDescriptorSlot(
SHADER_MODULE_STATE const *src, std::unordered_set<uint32_t> const &accessible_ids, bool *has_writable_descriptor);
+std::unordered_set<uint32_t> CollectWritableOutputLocationinFS(const SHADER_MODULE_STATE &module,
+ const VkPipelineShaderStageCreateInfo &stage_info);
+
uint32_t DescriptorTypeToReqs(SHADER_MODULE_STATE const *module, uint32_t type_id);
+spv_target_env PickSpirvEnv(uint32_t api_version, bool spirv_1_4);
+
#endif // VULKAN_SHADER_VALIDATION_H
diff --git a/layers/state_tracker.cpp b/layers/state_tracker.cpp
index c77df20..4b026f5 100644
--- a/layers/state_tracker.cpp
+++ b/layers/state_tracker.cpp
@@ -44,6 +44,133 @@
using std::unordered_set;
using std::vector;
+const char *CommandTypeString(CMD_TYPE type) {
+ // Autogenerated as part of the vk_validation_error_message.h codegen
+ static const std::array<const char *, CMD_RANGE_SIZE> command_name_list = {{VUID_CMD_NAME_LIST}};
+ return command_name_list[type];
+}
+
+void ValidationStateTracker::InitDeviceValidationObject(bool add_obj, ValidationObject *inst_obj, ValidationObject *dev_obj) {
+ if (add_obj) {
+ instance_state = reinterpret_cast<ValidationStateTracker *>(GetValidationObject(inst_obj->object_dispatch, container_type));
+ // Call base class
+ ValidationObject::InitDeviceValidationObject(add_obj, inst_obj, dev_obj);
+ }
+}
+
+uint32_t ResolveRemainingLevels(const VkImageSubresourceRange *range, uint32_t mip_levels) {
+ // Return correct number of mip levels taking into account VK_REMAINING_MIP_LEVELS
+ uint32_t mip_level_count = range->levelCount;
+ if (range->levelCount == VK_REMAINING_MIP_LEVELS) {
+ mip_level_count = mip_levels - range->baseMipLevel;
+ }
+ return mip_level_count;
+}
+
+uint32_t ResolveRemainingLayers(const VkImageSubresourceRange *range, uint32_t layers) {
+ // Return correct number of layers taking into account VK_REMAINING_ARRAY_LAYERS
+ uint32_t array_layer_count = range->layerCount;
+ if (range->layerCount == VK_REMAINING_ARRAY_LAYERS) {
+ array_layer_count = layers - range->baseArrayLayer;
+ }
+ return array_layer_count;
+}
+
+VkImageSubresourceRange NormalizeSubresourceRange(const VkImageCreateInfo &image_create_info,
+ const VkImageSubresourceRange &range) {
+ VkImageSubresourceRange norm = range;
+ norm.levelCount = ResolveRemainingLevels(&range, image_create_info.mipLevels);
+
+ // Special case for 3D images with VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR flag bit, where <extent.depth> and
+ // <arrayLayers> can potentially alias.
+ uint32_t layer_limit = (0 != (image_create_info.flags & VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR))
+ ? image_create_info.extent.depth
+ : image_create_info.arrayLayers;
+ norm.layerCount = ResolveRemainingLayers(&range, layer_limit);
+
+ // For multiplanar formats, IMAGE_ASPECT_COLOR is equivalent to adding the aspect of the individual planes
+ VkImageAspectFlags &aspect_mask = norm.aspectMask;
+ if (FormatIsMultiplane(image_create_info.format)) {
+ if (aspect_mask & VK_IMAGE_ASPECT_COLOR_BIT) {
+ aspect_mask &= ~VK_IMAGE_ASPECT_COLOR_BIT;
+ aspect_mask |= (VK_IMAGE_ASPECT_PLANE_0_BIT | VK_IMAGE_ASPECT_PLANE_1_BIT);
+ if (FormatPlaneCount(image_create_info.format) > 2) {
+ aspect_mask |= VK_IMAGE_ASPECT_PLANE_2_BIT;
+ }
+ }
+ }
+ return norm;
+}
+
+VkImageSubresourceRange NormalizeSubresourceRange(const IMAGE_STATE &image_state, const VkImageSubresourceRange &range) {
+ const VkImageCreateInfo &image_create_info = image_state.createInfo;
+ return NormalizeSubresourceRange(image_create_info, range);
+}
+
+// NOTE: Beware the lifespan of the rp_begin when holding the return. If the rp_begin isn't a "safe" copy, "IMAGELESS"
+// attachments won't persist past the API entry point exit.
+std::pair<uint32_t, const VkImageView *> GetFramebufferAttachments(const VkRenderPassBeginInfo &rp_begin,
+ const FRAMEBUFFER_STATE &fb_state) {
+ const VkImageView *attachments = fb_state.createInfo.pAttachments;
+ uint32_t count = fb_state.createInfo.attachmentCount;
+ if (fb_state.createInfo.flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT) {
+ const auto *framebuffer_attachments = lvl_find_in_chain<VkRenderPassAttachmentBeginInfo>(rp_begin.pNext);
+ if (framebuffer_attachments) {
+ attachments = framebuffer_attachments->pAttachments;
+ count = framebuffer_attachments->attachmentCount;
+ }
+ }
+ return std::make_pair(count, attachments);
+}
+
+std::vector<const IMAGE_VIEW_STATE *> ValidationStateTracker::GetAttachmentViews(const VkRenderPassBeginInfo &rp_begin,
+ const FRAMEBUFFER_STATE &fb_state) const {
+ std::vector<const IMAGE_VIEW_STATE *> views;
+
+ const auto count_attachment = GetFramebufferAttachments(rp_begin, fb_state);
+ const auto attachment_count = count_attachment.first;
+ const auto *attachments = count_attachment.second;
+ views.resize(attachment_count, nullptr);
+ for (uint32_t i = 0; i < attachment_count; i++) {
+ if (attachments[i] != VK_NULL_HANDLE) {
+ views[i] = Get<IMAGE_VIEW_STATE>(attachments[i]);
+ }
+ }
+ return views;
+}
+
+std::vector<const IMAGE_VIEW_STATE *> ValidationStateTracker::GetCurrentAttachmentViews(const CMD_BUFFER_STATE &cb_state) const {
+ // Only valid *after* RecordBeginRenderPass and *before* RecordEndRenderpass as it relies on cb_state for the renderpass info.
+ std::vector<const IMAGE_VIEW_STATE *> views;
+
+ const auto *rp_state = cb_state.activeRenderPass.get();
+ if (!rp_state) return views;
+ const auto &rp_begin = *cb_state.activeRenderPassBeginInfo.ptr();
+ const auto *fb_state = Get<FRAMEBUFFER_STATE>(rp_begin.framebuffer);
+ if (!fb_state) return views;
+
+ return GetAttachmentViews(rp_begin, *fb_state);
+}
+
+PIPELINE_STATE *GetCurrentPipelineFromCommandBuffer(const CMD_BUFFER_STATE &cmd, VkPipelineBindPoint pipelineBindPoint) {
+ const auto last_bound_it = cmd.lastBound.find(pipelineBindPoint);
+ if (last_bound_it == cmd.lastBound.cend()) {
+ return nullptr;
+ }
+ return last_bound_it->second.pipeline_state;
+}
+
+void GetCurrentPipelineAndDesriptorSetsFromCommandBuffer(const CMD_BUFFER_STATE &cmd, VkPipelineBindPoint pipelineBindPoint,
+ const PIPELINE_STATE **rtn_pipe,
+ const std::vector<LAST_BOUND_STATE::PER_SET> **rtn_sets) {
+ const auto last_bound_it = cmd.lastBound.find(pipelineBindPoint);
+ if (last_bound_it == cmd.lastBound.cend()) {
+ return;
+ }
+ *rtn_pipe = last_bound_it->second.pipeline_state;
+ *rtn_sets = &(last_bound_it->second.per_set);
+}
+
#ifdef VK_USE_PLATFORM_ANDROID_KHR
// Android-specific validation that uses types defined only with VK_USE_PLATFORM_ANDROID_KHR
// This could also move into a seperate core_validation_android.cpp file... ?
@@ -51,20 +178,38 @@
void ValidationStateTracker::RecordCreateImageANDROID(const VkImageCreateInfo *create_info, IMAGE_STATE *is_node) {
const VkExternalMemoryImageCreateInfo *emici = lvl_find_in_chain<VkExternalMemoryImageCreateInfo>(create_info->pNext);
if (emici && (emici->handleTypes & VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)) {
- is_node->imported_ahb = true;
+ is_node->external_ahb = true;
}
const VkExternalFormatANDROID *ext_fmt_android = lvl_find_in_chain<VkExternalFormatANDROID>(create_info->pNext);
if (ext_fmt_android && (0 != ext_fmt_android->externalFormat)) {
is_node->has_ahb_format = true;
is_node->ahb_format = ext_fmt_android->externalFormat;
+ // VUID 01894 will catch if not found in map
+ auto it = ahb_ext_formats_map.find(ext_fmt_android->externalFormat);
+ if (it != ahb_ext_formats_map.end()) {
+ is_node->format_features = it->second;
+ }
+ }
+}
+
+void ValidationStateTracker::RecordCreateBufferANDROID(const VkBufferCreateInfo *create_info, BUFFER_STATE *bs_node) {
+ const VkExternalMemoryBufferCreateInfo *embci = lvl_find_in_chain<VkExternalMemoryBufferCreateInfo>(create_info->pNext);
+ if (embci && (embci->handleTypes & VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID)) {
+ bs_node->external_ahb = true;
}
}
void ValidationStateTracker::RecordCreateSamplerYcbcrConversionANDROID(const VkSamplerYcbcrConversionCreateInfo *create_info,
- VkSamplerYcbcrConversion ycbcr_conversion) {
+ VkSamplerYcbcrConversion ycbcr_conversion,
+ SAMPLER_YCBCR_CONVERSION_STATE *ycbcr_state) {
const VkExternalFormatANDROID *ext_format_android = lvl_find_in_chain<VkExternalFormatANDROID>(create_info->pNext);
if (ext_format_android && (0 != ext_format_android->externalFormat)) {
ycbcr_conversion_ahb_fmt_map.emplace(ycbcr_conversion, ext_format_android->externalFormat);
+ // VUID 01894 will catch if not found in map
+ auto it = ahb_ext_formats_map.find(ext_format_android->externalFormat);
+ if (it != ahb_ext_formats_map.end()) {
+ ycbcr_state->format_features = it->second;
+ }
}
};
@@ -72,12 +217,24 @@
ycbcr_conversion_ahb_fmt_map.erase(ycbcr_conversion);
};
+void ValidationStateTracker::PostCallRecordGetAndroidHardwareBufferPropertiesANDROID(
+ VkDevice device, const struct AHardwareBuffer *buffer, VkAndroidHardwareBufferPropertiesANDROID *pProperties, VkResult result) {
+ if (VK_SUCCESS != result) return;
+ auto ahb_format_props = lvl_find_in_chain<VkAndroidHardwareBufferFormatPropertiesANDROID>(pProperties->pNext);
+ if (ahb_format_props) {
+ ahb_ext_formats_map.insert({ahb_format_props->externalFormat, ahb_format_props->formatFeatures});
+ }
+}
+
#else
void ValidationStateTracker::RecordCreateImageANDROID(const VkImageCreateInfo *create_info, IMAGE_STATE *is_node) {}
+void ValidationStateTracker::RecordCreateBufferANDROID(const VkBufferCreateInfo *create_info, BUFFER_STATE *bs_node) {}
+
void ValidationStateTracker::RecordCreateSamplerYcbcrConversionANDROID(const VkSamplerYcbcrConversionCreateInfo *create_info,
- VkSamplerYcbcrConversion ycbcr_conversion){};
+ VkSamplerYcbcrConversion ycbcr_conversion,
+ SAMPLER_YCBCR_CONVERSION_STATE *ycbcr_state){};
void ValidationStateTracker::RecordDestroySamplerYcbcrConversionANDROID(VkSamplerYcbcrConversion ycbcr_conversion){};
@@ -92,10 +249,49 @@
return dsl;
}
+void AddImageStateProps(IMAGE_STATE &image_state, const VkDevice device, const VkPhysicalDevice physical_device) {
+ // Add feature support according to Image Format Features (vkspec.html#resources-image-format-features)
+ // if format is AHB external format then the features are already set
+ if (image_state.has_ahb_format == false) {
+ const VkImageTiling image_tiling = image_state.createInfo.tiling;
+ const VkFormat image_format = image_state.createInfo.format;
+ if (image_tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
+ VkImageDrmFormatModifierPropertiesEXT drm_format_properties = {
+ VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT, nullptr};
+ DispatchGetImageDrmFormatModifierPropertiesEXT(device, image_state.image, &drm_format_properties);
+
+ VkFormatProperties2 format_properties_2 = {VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2, nullptr};
+ VkDrmFormatModifierPropertiesListEXT drm_properties_list = {VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT,
+ nullptr};
+ format_properties_2.pNext = (void *)&drm_properties_list;
+ DispatchGetPhysicalDeviceFormatProperties2(physical_device, image_format, &format_properties_2);
+ std::vector<VkDrmFormatModifierPropertiesEXT> drm_properties;
+ drm_properties.resize(drm_properties_list.drmFormatModifierCount);
+ drm_properties_list.pDrmFormatModifierProperties = &drm_properties[0];
+ DispatchGetPhysicalDeviceFormatProperties2(physical_device, image_format, &format_properties_2);
+
+ for (uint32_t i = 0; i < drm_properties_list.drmFormatModifierCount; i++) {
+ if (drm_properties_list.pDrmFormatModifierProperties[i].drmFormatModifier ==
+ drm_format_properties.drmFormatModifier) {
+ image_state.format_features =
+ drm_properties_list.pDrmFormatModifierProperties[i].drmFormatModifierTilingFeatures;
+ break;
+ }
+ }
+ } else {
+ VkFormatProperties format_properties;
+ DispatchGetPhysicalDeviceFormatProperties(physical_device, image_format, &format_properties);
+ image_state.format_features = (image_tiling == VK_IMAGE_TILING_LINEAR) ? format_properties.linearTilingFeatures
+ : format_properties.optimalTilingFeatures;
+ }
+ }
+}
+
void ValidationStateTracker::PostCallRecordCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
const VkAllocationCallbacks *pAllocator, VkImage *pImage, VkResult result) {
if (VK_SUCCESS != result) return;
- auto is_node = std::make_shared<IMAGE_STATE>(*pImage, pCreateInfo);
+ auto is_node = std::make_shared<IMAGE_STATE>(device, *pImage, pCreateInfo);
+ is_node->disjoint = ((pCreateInfo->flags & VK_IMAGE_CREATE_DISJOINT_BIT) != 0);
if (device_extensions.vk_android_external_memory_android_hardware_buffer) {
RecordCreateImageANDROID(pCreateInfo, is_node.get());
}
@@ -104,17 +300,41 @@
is_node->create_from_swapchain = swapchain_info->swapchain;
}
- bool pre_fetch_memory_reqs = true;
-#ifdef VK_USE_PLATFORM_ANDROID_KHR
- if (is_node->external_format_android) {
- // Do not fetch requirements for external memory images
- pre_fetch_memory_reqs = false;
- }
-#endif
// Record the memory requirements in case they won't be queried
- if (pre_fetch_memory_reqs) {
- DispatchGetImageMemoryRequirements(device, *pImage, &is_node->requirements);
+ // External AHB memory can't be queried until after memory is bound
+ if (is_node->external_ahb == false) {
+ if (is_node->disjoint == false) {
+ DispatchGetImageMemoryRequirements(device, *pImage, &is_node->requirements);
+ } else {
+ uint32_t plane_count = FormatPlaneCount(pCreateInfo->format);
+ VkImagePlaneMemoryRequirementsInfo image_plane_req = {VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO, nullptr};
+ VkMemoryRequirements2 mem_reqs2 = {VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2, nullptr};
+ VkImageMemoryRequirementsInfo2 mem_req_info2 = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2};
+ mem_req_info2.pNext = &image_plane_req;
+ mem_req_info2.image = *pImage;
+
+ assert(plane_count != 0); // assumes each format has at least first plane
+ image_plane_req.planeAspect = VK_IMAGE_ASPECT_PLANE_0_BIT;
+ DispatchGetImageMemoryRequirements2(device, &mem_req_info2, &mem_reqs2);
+ is_node->plane0_requirements = mem_reqs2.memoryRequirements;
+
+ if (plane_count >= 2) {
+ image_plane_req.planeAspect = VK_IMAGE_ASPECT_PLANE_1_BIT;
+ DispatchGetImageMemoryRequirements2(device, &mem_req_info2, &mem_reqs2);
+ is_node->plane1_requirements = mem_reqs2.memoryRequirements;
+ }
+ if (plane_count >= 3) {
+ image_plane_req.planeAspect = VK_IMAGE_ASPECT_PLANE_2_BIT;
+ DispatchGetImageMemoryRequirements2(device, &mem_req_info2, &mem_reqs2);
+ is_node->plane2_requirements = mem_reqs2.memoryRequirements;
+ }
+ }
}
+
+ AddImageStateProps(*is_node, device, physical_device);
+
+ is_node->unprotected = ((pCreateInfo->flags & VK_IMAGE_CREATE_PROTECTED_BIT) == 0);
+
imageMap.insert(std::make_pair(*pImage, std::move(is_node)));
}
@@ -205,9 +425,14 @@
// TODO : This doesn't create deep copy of pQueueFamilyIndices so need to fix that if/when we want that data to be valid
auto buffer_state = std::make_shared<BUFFER_STATE>(*pBuffer, pCreateInfo);
+ if (device_extensions.vk_android_external_memory_android_hardware_buffer) {
+ RecordCreateBufferANDROID(pCreateInfo, buffer_state.get());
+ }
// Get a set of requirements in the case the app does not
DispatchGetBufferMemoryRequirements(device, *pBuffer, &buffer_state->requirements);
+ buffer_state->unprotected = ((pCreateInfo->flags & VK_BUFFER_CREATE_PROTECTED_BIT) == 0);
+
bufferMap.insert(std::make_pair(*pBuffer, std::move(buffer_state)));
}
@@ -224,7 +449,42 @@
VkResult result) {
if (result != VK_SUCCESS) return;
auto image_state = GetImageShared(pCreateInfo->image);
- imageViewMap[*pView] = std::make_shared<IMAGE_VIEW_STATE>(image_state, *pView, pCreateInfo);
+ auto image_view_state = std::make_shared<IMAGE_VIEW_STATE>(image_state, *pView, pCreateInfo);
+
+ // Add feature support according to Image View Format Features (vkspec.html#resources-image-view-format-features)
+ const VkImageTiling image_tiling = image_state->createInfo.tiling;
+ const VkFormat image_view_format = pCreateInfo->format;
+ if (image_state->has_ahb_format == true) {
+ // The ImageView uses same Image's format feature since they share same AHB
+ image_view_state->format_features = image_state->format_features;
+ } else if (image_tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
+ // Parameter validation should catch if this is used without VK_EXT_image_drm_format_modifier
+ assert(device_extensions.vk_ext_image_drm_format_modifier);
+ VkImageDrmFormatModifierPropertiesEXT drm_format_properties = {VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT,
+ nullptr};
+ DispatchGetImageDrmFormatModifierPropertiesEXT(device, image_state->image, &drm_format_properties);
+
+ VkFormatProperties2 format_properties_2 = {VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2, nullptr};
+ VkDrmFormatModifierPropertiesListEXT drm_properties_list = {VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT,
+ nullptr};
+ format_properties_2.pNext = (void *)&drm_properties_list;
+ DispatchGetPhysicalDeviceFormatProperties2(physical_device, image_view_format, &format_properties_2);
+
+ for (uint32_t i = 0; i < drm_properties_list.drmFormatModifierCount; i++) {
+ if (drm_properties_list.pDrmFormatModifierProperties[i].drmFormatModifier == drm_format_properties.drmFormatModifier) {
+ image_view_state->format_features |=
+ drm_properties_list.pDrmFormatModifierProperties[i].drmFormatModifierTilingFeatures;
+ break;
+ }
+ }
+ } else {
+ VkFormatProperties format_properties;
+ DispatchGetPhysicalDeviceFormatProperties(physical_device, image_view_format, &format_properties);
+ image_view_state->format_features = (image_tiling == VK_IMAGE_TILING_LINEAR) ? format_properties.linearTilingFeatures
+ : format_properties.optimalTilingFeatures;
+ }
+
+ imageViewMap.insert(std::make_pair(*pView, std::move(image_view_state)));
}
void ValidationStateTracker::PreCallRecordCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
@@ -308,17 +568,25 @@
}
// Get the image viewstate for a given framebuffer attachment
-IMAGE_VIEW_STATE *ValidationStateTracker::GetAttachmentImageViewState(FRAMEBUFFER_STATE *framebuffer, uint32_t index) {
- if (framebuffer->createInfo.flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR) return nullptr;
+IMAGE_VIEW_STATE *ValidationStateTracker::GetAttachmentImageViewState(CMD_BUFFER_STATE *cb, FRAMEBUFFER_STATE *framebuffer,
+ uint32_t index) {
+ if (framebuffer->createInfo.flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR) {
+ assert(index < cb->imagelessFramebufferAttachments.size());
+ return cb->imagelessFramebufferAttachments[index];
+ }
assert(framebuffer && (index < framebuffer->createInfo.attachmentCount));
const VkImageView &image_view = framebuffer->createInfo.pAttachments[index];
return GetImageViewState(image_view);
}
// Get the image viewstate for a given framebuffer attachment
-const IMAGE_VIEW_STATE *ValidationStateTracker::GetAttachmentImageViewState(const FRAMEBUFFER_STATE *framebuffer,
+const IMAGE_VIEW_STATE *ValidationStateTracker::GetAttachmentImageViewState(const CMD_BUFFER_STATE *cb,
+ const FRAMEBUFFER_STATE *framebuffer,
uint32_t index) const {
- if (framebuffer->createInfo.flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR) return nullptr;
+ if (framebuffer->createInfo.flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR) {
+ assert(index < cb->imagelessFramebufferAttachments.size());
+ return cb->imagelessFramebufferAttachments[index];
+ }
assert(framebuffer && (index < framebuffer->createInfo.attachmentCount));
const VkImageView &image_view = framebuffer->createInfo.pAttachments[index];
return GetImageViewState(image_view);
@@ -454,7 +722,8 @@
void ValidationStateTracker::AddMemObjInfo(void *object, const VkDeviceMemory mem, const VkMemoryAllocateInfo *pAllocateInfo) {
assert(object != NULL);
- memObjMap[mem] = std::make_shared<DEVICE_MEMORY_STATE>(object, mem, pAllocateInfo);
+ auto fake_address = fake_memory.Alloc(pAllocateInfo->allocationSize);
+ memObjMap[mem] = std::make_shared<DEVICE_MEMORY_STATE>(object, mem, pAllocateInfo, fake_address);
auto mem_info = memObjMap[mem].get();
auto dedicated = lvl_find_in_chain<VkMemoryDedicatedAllocateInfoKHR>(pAllocateInfo->pNext);
@@ -468,11 +737,43 @@
mem_info->is_export = true;
mem_info->export_handle_type_flags = export_info->handleTypes;
}
+
+ // Assumes validation already for only a single import operation in the pNext
+#ifdef VK_USE_PLATFORM_WIN32_KHR
+ auto win32_import = lvl_find_in_chain<VkImportMemoryWin32HandleInfoKHR>(pAllocateInfo->pNext);
+ if (win32_import) {
+ mem_info->is_import = true;
+ mem_info->import_handle_type_flags = win32_import->handleType;
+ }
+#endif
+ auto fd_import = lvl_find_in_chain<VkImportMemoryFdInfoKHR>(pAllocateInfo->pNext);
+ if (fd_import) {
+ mem_info->is_import = true;
+ mem_info->import_handle_type_flags = fd_import->handleType;
+ }
+ auto host_pointer_import = lvl_find_in_chain<VkImportMemoryHostPointerInfoEXT>(pAllocateInfo->pNext);
+ if (host_pointer_import) {
+ mem_info->is_import = true;
+ mem_info->import_handle_type_flags = host_pointer_import->handleType;
+ }
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
+ // AHB Import doesn't have handle in the pNext struct
+ // It should be assumed that all imported AHB can only have the same, single handleType
+ auto ahb_import = lvl_find_in_chain<VkImportAndroidHardwareBufferInfoANDROID>(pAllocateInfo->pNext);
+ if ((ahb_import) && (ahb_import->buffer != nullptr)) {
+ mem_info->is_import_ahb = true;
+ mem_info->is_import = true;
+ mem_info->import_handle_type_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
+ }
+#endif
+
+ const VkMemoryType memory_type = phys_dev_mem_props.memoryTypes[pAllocateInfo->memoryTypeIndex];
+ mem_info->unprotected = ((memory_type.propertyFlags & VK_MEMORY_PROPERTY_PROTECTED_BIT) == 0);
}
// Create binding link between given sampler and command buffer node
void ValidationStateTracker::AddCommandBufferBindingSampler(CMD_BUFFER_STATE *cb_node, SAMPLER_STATE *sampler_state) {
- if (disabled.command_buffer_state) {
+ if (disabled[command_buffer_state]) {
return;
}
AddCommandBufferBinding(sampler_state->cb_bindings,
@@ -481,7 +782,7 @@
// Create binding link between given image node and command buffer node
void ValidationStateTracker::AddCommandBufferBindingImage(CMD_BUFFER_STATE *cb_node, IMAGE_STATE *image_state) {
- if (disabled.command_buffer_state) {
+ if (disabled[command_buffer_state]) {
return;
}
// Skip validation if this image was created through WSI
@@ -501,7 +802,7 @@
// Create binding link between given image view node and its image with command buffer node
void ValidationStateTracker::AddCommandBufferBindingImageView(CMD_BUFFER_STATE *cb_node, IMAGE_VIEW_STATE *view_state) {
- if (disabled.command_buffer_state) {
+ if (disabled[command_buffer_state]) {
return;
}
// First add bindings for imageView
@@ -518,7 +819,7 @@
// Create binding link between given buffer node and command buffer node
void ValidationStateTracker::AddCommandBufferBindingBuffer(CMD_BUFFER_STATE *cb_node, BUFFER_STATE *buffer_state) {
- if (disabled.command_buffer_state) {
+ if (disabled[command_buffer_state]) {
return;
}
// First update cb binding for buffer
@@ -535,7 +836,7 @@
// Create binding link between given buffer view node and its buffer with command buffer node
void ValidationStateTracker::AddCommandBufferBindingBufferView(CMD_BUFFER_STATE *cb_node, BUFFER_VIEW_STATE *view_state) {
- if (disabled.command_buffer_state) {
+ if (disabled[command_buffer_state]) {
return;
}
// First add bindings for bufferView
@@ -552,7 +853,7 @@
// Create binding link between given acceleration structure and command buffer node
void ValidationStateTracker::AddCommandBufferBindingAccelerationStructure(CMD_BUFFER_STATE *cb_node,
ACCELERATION_STRUCTURE_STATE *as_state) {
- if (disabled.command_buffer_state) {
+ if (disabled[command_buffer_state]) {
return;
}
if (AddCommandBufferBinding(
@@ -648,7 +949,7 @@
return skip;
}
-void ValidationStateTracker::UpdateDrawState(CMD_BUFFER_STATE *cb_state, const VkPipelineBindPoint bind_point) {
+void ValidationStateTracker::UpdateDrawState(CMD_BUFFER_STATE *cb_state, CMD_TYPE cmd_type, const VkPipelineBindPoint bind_point) {
auto &state = cb_state->lastBound[bind_point];
PIPELINE_STATE *pPipe = state.pipeline_state;
if (VK_NULL_HANDLE != state.pipeline_layout) {
@@ -656,60 +957,59 @@
uint32_t setIndex = set_binding_pair.first;
// Pull the set node
cvdescriptorset::DescriptorSet *descriptor_set = state.per_set[setIndex].bound_descriptor_set;
- if (!descriptor_set->IsPushDescriptor()) {
- // For the "bindless" style resource usage with many descriptors, need to optimize command <-> descriptor binding
- // TODO: If recreating the reduced_map here shows up in profilinging, need to find a way of sharing with the
- // Validate pass. Though in the case of "many" descriptors, typically the descriptor count >> binding count
- cvdescriptorset::PrefilterBindRequestMap reduced_map(*descriptor_set, set_binding_pair.second);
- const auto &binding_req_map = reduced_map.FilteredMap(*cb_state, *pPipe);
+ // For the "bindless" style resource usage with many descriptors, need to optimize command <-> descriptor binding
- if (reduced_map.IsManyDescriptors()) {
- // Only update validate binding tags if we meet the "many" criteria in the Prefilter class
- descriptor_set->UpdateValidationCache(*cb_state, *pPipe, binding_req_map);
+ // TODO: If recreating the reduced_map here shows up in profilinging, need to find a way of sharing with the
+ // Validate pass. Though in the case of "many" descriptors, typically the descriptor count >> binding count
+ cvdescriptorset::PrefilterBindRequestMap reduced_map(*descriptor_set, set_binding_pair.second);
+ const auto &binding_req_map = reduced_map.FilteredMap(*cb_state, *pPipe);
+
+ if (reduced_map.IsManyDescriptors()) {
+ // Only update validate binding tags if we meet the "many" criteria in the Prefilter class
+ descriptor_set->UpdateValidationCache(*cb_state, *pPipe, binding_req_map);
+ }
+
+ // We can skip updating the state if "nothing" has changed since the last validation.
+ // See CoreChecks::ValidateCmdBufDrawState for more details.
+ bool descriptor_set_changed =
+ !reduced_map.IsManyDescriptors() ||
+ // Update if descriptor set (or contents) has changed
+ state.per_set[setIndex].validated_set != descriptor_set ||
+ state.per_set[setIndex].validated_set_change_count != descriptor_set->GetChangeCount() ||
+ (!disabled[image_layout_validation] &&
+ state.per_set[setIndex].validated_set_image_layout_change_count != cb_state->image_layout_change_count);
+ bool need_update = descriptor_set_changed ||
+ // Update if previous bindingReqMap doesn't include new bindingReqMap
+ !std::includes(state.per_set[setIndex].validated_set_binding_req_map.begin(),
+ state.per_set[setIndex].validated_set_binding_req_map.end(), binding_req_map.begin(),
+ binding_req_map.end());
+
+ if (need_update) {
+ // Bind this set and its active descriptor resources to the command buffer
+ if (!descriptor_set_changed && reduced_map.IsManyDescriptors()) {
+ // Only record the bindings that haven't already been recorded
+ BindingReqMap delta_reqs;
+ std::set_difference(binding_req_map.begin(), binding_req_map.end(),
+ state.per_set[setIndex].validated_set_binding_req_map.begin(),
+ state.per_set[setIndex].validated_set_binding_req_map.end(),
+ std::inserter(delta_reqs, delta_reqs.begin()));
+ descriptor_set->UpdateDrawState(this, cb_state, cmd_type, pPipe, delta_reqs);
+ } else {
+ descriptor_set->UpdateDrawState(this, cb_state, cmd_type, pPipe, binding_req_map);
}
- // We can skip updating the state if "nothing" has changed since the last validation.
- // See CoreChecks::ValidateCmdBufDrawState for more details.
- bool descriptor_set_changed =
- !reduced_map.IsManyDescriptors() ||
- // Update if descriptor set (or contents) has changed
- state.per_set[setIndex].validated_set != descriptor_set ||
- state.per_set[setIndex].validated_set_change_count != descriptor_set->GetChangeCount() ||
- (!disabled.image_layout_validation &&
- state.per_set[setIndex].validated_set_image_layout_change_count != cb_state->image_layout_change_count);
- bool need_update = descriptor_set_changed ||
- // Update if previous bindingReqMap doesn't include new bindingReqMap
- !std::includes(state.per_set[setIndex].validated_set_binding_req_map.begin(),
- state.per_set[setIndex].validated_set_binding_req_map.end(),
- binding_req_map.begin(), binding_req_map.end());
-
- if (need_update) {
- // Bind this set and its active descriptor resources to the command buffer
- if (!descriptor_set_changed && reduced_map.IsManyDescriptors()) {
- // Only record the bindings that haven't already been recorded
- BindingReqMap delta_reqs;
- std::set_difference(binding_req_map.begin(), binding_req_map.end(),
- state.per_set[setIndex].validated_set_binding_req_map.begin(),
- state.per_set[setIndex].validated_set_binding_req_map.end(),
- std::inserter(delta_reqs, delta_reqs.begin()));
- descriptor_set->UpdateDrawState(this, cb_state, pPipe, delta_reqs);
- } else {
- descriptor_set->UpdateDrawState(this, cb_state, pPipe, binding_req_map);
+ state.per_set[setIndex].validated_set = descriptor_set;
+ state.per_set[setIndex].validated_set_change_count = descriptor_set->GetChangeCount();
+ state.per_set[setIndex].validated_set_image_layout_change_count = cb_state->image_layout_change_count;
+ if (reduced_map.IsManyDescriptors()) {
+ // Check whether old == new before assigning, the equality check is much cheaper than
+ // freeing and reallocating the map.
+ if (state.per_set[setIndex].validated_set_binding_req_map != set_binding_pair.second) {
+ state.per_set[setIndex].validated_set_binding_req_map = set_binding_pair.second;
}
-
- state.per_set[setIndex].validated_set = descriptor_set;
- state.per_set[setIndex].validated_set_change_count = descriptor_set->GetChangeCount();
- state.per_set[setIndex].validated_set_image_layout_change_count = cb_state->image_layout_change_count;
- if (reduced_map.IsManyDescriptors()) {
- // Check whether old == new before assigning, the equality check is much cheaper than
- // freeing and reallocating the map.
- if (state.per_set[setIndex].validated_set_binding_req_map != set_binding_pair.second) {
- state.per_set[setIndex].validated_set_binding_req_map = set_binding_pair.second;
- }
- } else {
- state.per_set[setIndex].validated_set_binding_req_map = BindingReqMap();
- }
+ } else {
+ state.per_set[setIndex].validated_set_binding_req_map = BindingReqMap();
}
}
}
@@ -827,12 +1127,38 @@
return base_ptr;
}
+// Gets union of all features defined by Potential Format Features
+// except, does not handle the external format case for AHB as that only can be used for sampled images
+VkFormatFeatureFlags ValidationStateTracker::GetPotentialFormatFeatures(VkFormat format) const {
+ VkFormatFeatureFlags format_features = 0;
+
+ if (format != VK_FORMAT_UNDEFINED) {
+ VkFormatProperties format_properties;
+ DispatchGetPhysicalDeviceFormatProperties(physical_device, format, &format_properties);
+ format_features |= format_properties.linearTilingFeatures;
+ format_features |= format_properties.optimalTilingFeatures;
+ if (device_extensions.vk_ext_image_drm_format_modifier) {
+ // VK_KHR_get_physical_device_properties2 is required in this case
+ VkFormatProperties2 format_properties_2 = {VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2};
+ VkDrmFormatModifierPropertiesListEXT drm_properties_list = {VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT,
+ nullptr};
+ format_properties_2.pNext = (void *)&drm_properties_list;
+ DispatchGetPhysicalDeviceFormatProperties2(physical_device, format, &format_properties_2);
+ for (uint32_t i = 0; i < drm_properties_list.drmFormatModifierCount; i++) {
+ format_features |= drm_properties_list.pDrmFormatModifierProperties[i].drmFormatModifierTilingFeatures;
+ }
+ }
+ }
+
+ return format_features;
+}
+
// Tie the VulkanTypedHandle to the cmd buffer which includes:
// Add object_binding to cmd buffer
// Add cb_binding to object
bool ValidationStateTracker::AddCommandBufferBinding(small_unordered_map<CMD_BUFFER_STATE *, int, 8> &cb_bindings,
const VulkanTypedHandle &obj, CMD_BUFFER_STATE *cb_node) {
- if (disabled.command_buffer_state) {
+ if (disabled[command_buffer_state]) {
return false;
}
// Insert the cb_binding with a default 'index' of -1. Then push the obj into the object_bindings
@@ -873,7 +1199,10 @@
pCB->status = 0;
pCB->static_status = 0;
pCB->viewportMask = 0;
+ pCB->viewportWithCountMask = 0;
pCB->scissorMask = 0;
+ pCB->scissorWithCountMask = 0;
+ pCB->primitiveTopology = VK_PRIMITIVE_TOPOLOGY_MAX_ENUM;
for (auto &item : pCB->lastBound) {
item.second.reset();
@@ -915,8 +1244,7 @@
pCB->object_bindings.clear();
// Remove this cmdBuffer's reference from each FrameBuffer's CB ref list
for (auto framebuffer : pCB->framebuffers) {
- auto fb_state = GetFramebufferState(framebuffer);
- if (fb_state) fb_state->cb_bindings.erase(pCB);
+ framebuffer->cb_bindings.erase(pCB);
}
pCB->framebuffers.clear();
pCB->activeFramebuffer = VK_NULL_HANDLE;
@@ -932,6 +1260,8 @@
// Best practices info
pCB->small_indexed_draw_call_count = 0;
+
+ pCB->transform_feedback_active = false;
}
if (command_buffer_reset_callback) {
(*command_buffer_reset_callback)(cb);
@@ -975,7 +1305,15 @@
if (vulkan_12_features) {
state_tracker->enabled_features.core12 = *vulkan_12_features;
} else {
- // These structs are only allowed in pNext chain if there is no kPhysicalDeviceVulkan12Features
+ // Set Extension Feature Aliases to false as there is no struct to check
+ state_tracker->enabled_features.core12.drawIndirectCount = VK_FALSE;
+ state_tracker->enabled_features.core12.samplerMirrorClampToEdge = VK_FALSE;
+ state_tracker->enabled_features.core12.descriptorIndexing = VK_FALSE;
+ state_tracker->enabled_features.core12.samplerFilterMinmax = VK_FALSE;
+ state_tracker->enabled_features.core12.shaderOutputLayer = VK_FALSE;
+ state_tracker->enabled_features.core12.shaderOutputViewportIndex = VK_FALSE;
+
+ // These structs are only allowed in pNext chain if there is no VkPhysicalDeviceVulkan12Features
const auto *eight_bit_storage_features = lvl_find_in_chain<VkPhysicalDevice8BitStorageFeatures>(pCreateInfo->pNext);
if (eight_bit_storage_features) {
@@ -1172,11 +1510,7 @@
const auto *buffer_device_address_ext = lvl_find_in_chain<VkPhysicalDeviceBufferDeviceAddressFeaturesEXT>(pCreateInfo->pNext);
if (buffer_device_address_ext) {
- state_tracker->enabled_features.core12.bufferDeviceAddress = buffer_device_address_ext->bufferDeviceAddress;
- state_tracker->enabled_features.core12.bufferDeviceAddressCaptureReplay =
- buffer_device_address_ext->bufferDeviceAddressCaptureReplay;
- state_tracker->enabled_features.core12.bufferDeviceAddressMultiDevice =
- buffer_device_address_ext->bufferDeviceAddressMultiDevice;
+ state_tracker->enabled_features.buffer_device_address_ext = *buffer_device_address_ext;
}
const auto *cooperative_matrix_features = lvl_find_in_chain<VkPhysicalDeviceCooperativeMatrixFeaturesNV>(pCreateInfo->pNext);
@@ -1253,6 +1587,45 @@
state_tracker->enabled_features.ray_tracing_features = *ray_tracing_features;
}
+ const auto *robustness2_features = lvl_find_in_chain<VkPhysicalDeviceRobustness2FeaturesEXT>(pCreateInfo->pNext);
+ if (robustness2_features) {
+ state_tracker->enabled_features.robustness2_features = *robustness2_features;
+ }
+
+ const auto *fragment_density_map_features =
+ lvl_find_in_chain<VkPhysicalDeviceFragmentDensityMapFeaturesEXT>(pCreateInfo->pNext);
+ if (fragment_density_map_features) {
+ state_tracker->enabled_features.fragment_density_map_features = *fragment_density_map_features;
+ }
+
+ const auto *fragment_density_map_features2 =
+ lvl_find_in_chain<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT>(pCreateInfo->pNext);
+ if (fragment_density_map_features2) {
+ state_tracker->enabled_features.fragment_density_map2_features = *fragment_density_map_features2;
+ }
+
+ const auto *astc_decode_features = lvl_find_in_chain<VkPhysicalDeviceASTCDecodeFeaturesEXT>(pCreateInfo->pNext);
+ if (astc_decode_features) {
+ state_tracker->enabled_features.astc_decode_features = *astc_decode_features;
+ }
+
+ const auto *custom_border_color_features = lvl_find_in_chain<VkPhysicalDeviceCustomBorderColorFeaturesEXT>(pCreateInfo->pNext);
+ if (custom_border_color_features) {
+ state_tracker->enabled_features.custom_border_color_features = *custom_border_color_features;
+ }
+
+ const auto *pipeline_creation_cache_control_features =
+ lvl_find_in_chain<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT>(pCreateInfo->pNext);
+ if (pipeline_creation_cache_control_features) {
+ state_tracker->enabled_features.pipeline_creation_cache_control_features = *pipeline_creation_cache_control_features;
+ }
+
+ const auto *extended_dynamic_state_features =
+ lvl_find_in_chain<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>(pCreateInfo->pNext);
+ if (extended_dynamic_state_features) {
+ state_tracker->enabled_features.extended_dynamic_state_features = *extended_dynamic_state_features;
+ }
+
// Store physical device properties and physical device mem limits into CoreChecks structs
DispatchGetPhysicalDeviceMemoryProperties(gpu, &state_tracker->phys_dev_mem_props);
DispatchGetPhysicalDeviceProperties(gpu, &state_tracker->phys_dev_props);
@@ -1341,7 +1714,10 @@
GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_ray_tracing, &phys_dev_props->ray_tracing_propsKHR);
GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_texel_buffer_alignment, &phys_dev_props->texel_buffer_alignment_props);
GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_fragment_density_map, &phys_dev_props->fragment_density_map_props);
+ GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_fragment_density_map_2, &phys_dev_props->fragment_density_map2_props);
GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_khr_performance_query, &phys_dev_props->performance_query_props);
+ GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_sample_locations, &phys_dev_props->sample_locations_props);
+ GetPhysicalDeviceExtProperties(gpu, dev_ext.vk_ext_custom_border_color, &phys_dev_props->custom_border_color_props);
if (!state_tracker->device_extensions.vk_feature_version_1_2 && dev_ext.vk_khr_timeline_semaphore) {
VkPhysicalDeviceTimelineSemaphorePropertiesKHR timeline_semaphore_props;
@@ -1405,8 +1781,11 @@
// Store queue family data
if (pCreateInfo->pQueueCreateInfos != nullptr) {
for (uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; ++i) {
+ const VkDeviceQueueCreateInfo &queue_create_info = pCreateInfo->pQueueCreateInfos[i];
state_tracker->queue_family_index_map.insert(
- std::make_pair(pCreateInfo->pQueueCreateInfos[i].queueFamilyIndex, pCreateInfo->pQueueCreateInfos[i].queueCount));
+ std::make_pair(queue_create_info.queueFamilyIndex, queue_create_info.queueCount));
+ state_tracker->queue_family_create_flags_map.insert(
+ std::make_pair(queue_create_info.queueFamilyIndex, queue_create_info.flags));
}
}
}
@@ -1519,18 +1898,14 @@
}
}
QueryMap localQueryToStateMap;
+ VkQueryPool first_pool = VK_NULL_HANDLE;
for (auto &function : cb_node->queryUpdates) {
- function(nullptr, /*do_validate*/ false, &localQueryToStateMap);
+ function(nullptr, /*do_validate*/ false, first_pool, submission.perf_submit_pass, &localQueryToStateMap);
}
for (auto queryStatePair : localQueryToStateMap) {
if (queryStatePair.second == QUERYSTATE_ENDED) {
queryToStateMap[queryStatePair.first] = QUERYSTATE_AVAILABLE;
-
- const QUERY_POOL_STATE *qp_state = GetQueryPoolState(queryStatePair.first.pool);
- if (qp_state->createInfo.queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR)
- queryPassToStateMap[QueryObjectPass(queryStatePair.first, submission.perf_submit_pass)] =
- QUERYSTATE_AVAILABLE;
}
}
cb_node->in_use.fetch_sub(1);
@@ -1561,6 +1936,7 @@
void ValidationStateTracker::PostCallRecordQueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits,
VkFence fence, VkResult result) {
+ if (result != VK_SUCCESS) return;
uint64_t early_retire_seq = 0;
auto pQueue = GetQueueState(queue);
auto pFence = GetFenceState(fence);
@@ -1646,6 +2022,9 @@
}
}
}
+ const auto perf_submit = lvl_find_in_chain<VkPerformanceQuerySubmitInfoKHR>(submit->pNext);
+ uint32_t perf_pass = perf_submit ? perf_submit->counterPassIndex : 0;
+
for (uint32_t i = 0; i < submit->commandBufferCount; i++) {
auto cb_node = GetCBState(submit->pCommandBuffers[i]);
if (cb_node) {
@@ -1656,16 +2035,17 @@
}
IncrementResources(cb_node);
+ VkQueryPool first_pool = VK_NULL_HANDLE;
+ EventToStageMap localEventToStageMap;
QueryMap localQueryToStateMap;
for (auto &function : cb_node->queryUpdates) {
- function(nullptr, /*do_validate*/ false, &localQueryToStateMap);
+ function(nullptr, /*do_validate*/ false, first_pool, perf_pass, &localQueryToStateMap);
}
for (auto queryStatePair : localQueryToStateMap) {
queryToStateMap[queryStatePair.first] = queryStatePair.second;
}
- EventToStageMap localEventToStageMap;
for (auto &function : cb_node->eventUpdates) {
function(nullptr, /*do_validate*/ false, &localEventToStageMap);
}
@@ -1676,11 +2056,8 @@
}
}
- const auto perf_submit = lvl_find_in_chain<VkPerformanceQuerySubmitInfoKHR>(submit->pNext);
-
pQueue->submissions.emplace_back(cbs, semaphore_waits, semaphore_signals, semaphore_externals,
- submit_idx == submitCount - 1 ? fence : (VkFence)VK_NULL_HANDLE,
- perf_submit ? perf_submit->counterPassIndex : 0);
+ submit_idx == submitCount - 1 ? fence : (VkFence)VK_NULL_HANDLE, perf_pass);
}
if (early_retire_seq) {
@@ -1741,6 +2118,7 @@
InvalidateCommandBuffers(mem_info->cb_bindings, obj_struct);
RemoveAliasingImages(mem_info->bound_images);
mem_info->destroyed = true;
+ fake_memory.Free(mem_info->fake_base_address);
memObjMap.erase(mem);
}
@@ -1926,19 +2304,25 @@
if (pSemaphore) {
for (auto &pair : queueMap) {
QUEUE_STATE &queueState = pair.second;
+ uint64_t max_seq = 0;
for (const auto &submission : queueState.submissions) {
for (const auto &signalSemaphore : submission.signalSemaphores) {
if (signalSemaphore.semaphore == semaphore && signalSemaphore.payload <= until_payload) {
- RetireWorkOnQueue(&queueState, signalSemaphore.seq);
+ if (signalSemaphore.seq > max_seq) {
+ max_seq = signalSemaphore.seq;
+ }
}
}
}
+ if (max_seq) {
+ RetireWorkOnQueue(&queueState, max_seq);
+ }
}
}
}
-void ValidationStateTracker::PostCallRecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout,
- VkResult result) {
+void ValidationStateTracker::RecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout,
+ VkResult result) {
if (VK_SUCCESS != result) return;
for (uint32_t i = 0; i < pWaitInfo->semaphoreCount; i++) {
@@ -1946,6 +2330,16 @@
}
}
+void ValidationStateTracker::PostCallRecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo, uint64_t timeout,
+ VkResult result) {
+ RecordWaitSemaphores(device, pWaitInfo, timeout, result);
+}
+
+void ValidationStateTracker::PostCallRecordWaitSemaphoresKHR(VkDevice device, const VkSemaphoreWaitInfo *pWaitInfo,
+ uint64_t timeout, VkResult result) {
+ RecordWaitSemaphores(device, pWaitInfo, timeout, result);
+}
+
void ValidationStateTracker::PostCallRecordGetFenceStatus(VkDevice device, VkFence fence, VkResult result) {
if (VK_SUCCESS != result) return;
RetireFence(fence);
@@ -2021,11 +2415,8 @@
// Track the newly bound memory range with given memoryOffset
// Also scan any previous ranges, track aliased ranges with new range, and flag an error if a linear
// and non-linear range incorrectly overlap.
-// Return true if an error is flagged and the user callback returns "true", otherwise false
-// is_image indicates an image object, otherwise handle is for a buffer
-// is_linear indicates a buffer or linear image
void ValidationStateTracker::InsertMemoryRange(const VulkanTypedHandle &typed_handle, DEVICE_MEMORY_STATE *mem_info,
- VkDeviceSize memoryOffset, VkMemoryRequirements memRequirements, bool is_linear) {
+ VkDeviceSize memoryOffset) {
if (typed_handle.type == kVulkanObjectTypeImage) {
mem_info->bound_images.insert(typed_handle.Cast<VkImage>());
} else if (typed_handle.type == kVulkanObjectTypeBuffer) {
@@ -2038,19 +2429,17 @@
}
}
-void ValidationStateTracker::InsertImageMemoryRange(VkImage image, DEVICE_MEMORY_STATE *mem_info, VkDeviceSize mem_offset,
- VkMemoryRequirements mem_reqs, bool is_linear) {
- InsertMemoryRange(VulkanTypedHandle(image, kVulkanObjectTypeImage), mem_info, mem_offset, mem_reqs, is_linear);
+void ValidationStateTracker::InsertImageMemoryRange(VkImage image, DEVICE_MEMORY_STATE *mem_info, VkDeviceSize mem_offset) {
+ InsertMemoryRange(VulkanTypedHandle(image, kVulkanObjectTypeImage), mem_info, mem_offset);
}
-void ValidationStateTracker::InsertBufferMemoryRange(VkBuffer buffer, DEVICE_MEMORY_STATE *mem_info, VkDeviceSize mem_offset,
- const VkMemoryRequirements &mem_reqs) {
- InsertMemoryRange(VulkanTypedHandle(buffer, kVulkanObjectTypeBuffer), mem_info, mem_offset, mem_reqs, true);
+void ValidationStateTracker::InsertBufferMemoryRange(VkBuffer buffer, DEVICE_MEMORY_STATE *mem_info, VkDeviceSize mem_offset) {
+ InsertMemoryRange(VulkanTypedHandle(buffer, kVulkanObjectTypeBuffer), mem_info, mem_offset);
}
void ValidationStateTracker::InsertAccelerationStructureMemoryRange(VkAccelerationStructureNV as, DEVICE_MEMORY_STATE *mem_info,
- VkDeviceSize mem_offset, const VkMemoryRequirements &mem_reqs) {
- InsertMemoryRange(VulkanTypedHandle(as, kVulkanObjectTypeAccelerationStructureNV), mem_info, mem_offset, mem_reqs, true);
+ VkDeviceSize mem_offset) {
+ InsertMemoryRange(VulkanTypedHandle(as, kVulkanObjectTypeAccelerationStructureNV), mem_info, mem_offset);
}
// This function will remove the handle-to-index mapping from the appropriate map.
@@ -2085,7 +2474,7 @@
// Track bound memory range information
auto mem_info = GetDevMemState(mem);
if (mem_info) {
- InsertBufferMemoryRange(buffer, mem_info, memoryOffset, buffer_state->requirements);
+ InsertBufferMemoryRange(buffer, mem_info, memoryOffset);
}
// Track objects tied to memory
SetMemBinding(mem, buffer_state, memoryOffset, VulkanTypedHandle(buffer, kVulkanObjectTypeBuffer));
@@ -2112,53 +2501,66 @@
}
}
-void ValidationStateTracker::RecordGetBufferMemoryRequirementsState(VkBuffer buffer, VkMemoryRequirements *pMemoryRequirements) {
+void ValidationStateTracker::RecordGetBufferMemoryRequirementsState(VkBuffer buffer) {
BUFFER_STATE *buffer_state = GetBufferState(buffer);
if (buffer_state) {
- buffer_state->requirements = *pMemoryRequirements;
buffer_state->memory_requirements_checked = true;
}
}
void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements(VkDevice device, VkBuffer buffer,
VkMemoryRequirements *pMemoryRequirements) {
- RecordGetBufferMemoryRequirementsState(buffer, pMemoryRequirements);
+ RecordGetBufferMemoryRequirementsState(buffer);
}
void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements2(VkDevice device,
const VkBufferMemoryRequirementsInfo2KHR *pInfo,
VkMemoryRequirements2KHR *pMemoryRequirements) {
- RecordGetBufferMemoryRequirementsState(pInfo->buffer, &pMemoryRequirements->memoryRequirements);
+ RecordGetBufferMemoryRequirementsState(pInfo->buffer);
}
void ValidationStateTracker::PostCallRecordGetBufferMemoryRequirements2KHR(VkDevice device,
const VkBufferMemoryRequirementsInfo2KHR *pInfo,
VkMemoryRequirements2KHR *pMemoryRequirements) {
- RecordGetBufferMemoryRequirementsState(pInfo->buffer, &pMemoryRequirements->memoryRequirements);
+ RecordGetBufferMemoryRequirementsState(pInfo->buffer);
}
-void ValidationStateTracker::RecordGetImageMemoryRequiementsState(VkImage image, VkMemoryRequirements *pMemoryRequirements) {
+void ValidationStateTracker::RecordGetImageMemoryRequirementsState(VkImage image, const VkImageMemoryRequirementsInfo2 *pInfo) {
+ const VkImagePlaneMemoryRequirementsInfo *plane_info =
+ (pInfo == nullptr) ? nullptr : lvl_find_in_chain<VkImagePlaneMemoryRequirementsInfo>(pInfo->pNext);
IMAGE_STATE *image_state = GetImageState(image);
if (image_state) {
- image_state->requirements = *pMemoryRequirements;
- image_state->memory_requirements_checked = true;
+ if (plane_info != nullptr) {
+ // Multi-plane image
+ image_state->memory_requirements_checked = false; // Each image plane needs to be checked itself
+ if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_0_BIT) {
+ image_state->plane0_memory_requirements_checked = true;
+ } else if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_1_BIT) {
+ image_state->plane1_memory_requirements_checked = true;
+ } else if (plane_info->planeAspect == VK_IMAGE_ASPECT_PLANE_2_BIT) {
+ image_state->plane2_memory_requirements_checked = true;
+ }
+ } else {
+ // Single Plane image
+ image_state->memory_requirements_checked = true;
+ }
}
}
void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements(VkDevice device, VkImage image,
VkMemoryRequirements *pMemoryRequirements) {
- RecordGetImageMemoryRequiementsState(image, pMemoryRequirements);
+ RecordGetImageMemoryRequirementsState(image, nullptr);
}
void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements2(VkDevice device, const VkImageMemoryRequirementsInfo2 *pInfo,
VkMemoryRequirements2 *pMemoryRequirements) {
- RecordGetImageMemoryRequiementsState(pInfo->image, &pMemoryRequirements->memoryRequirements);
+ RecordGetImageMemoryRequirementsState(pInfo->image, pInfo);
}
void ValidationStateTracker::PostCallRecordGetImageMemoryRequirements2KHR(VkDevice device,
const VkImageMemoryRequirementsInfo2 *pInfo,
VkMemoryRequirements2 *pMemoryRequirements) {
- RecordGetImageMemoryRequiementsState(pInfo->image, &pMemoryRequirements->memoryRequirements);
+ RecordGetImageMemoryRequirementsState(pInfo->image, pInfo);
}
static void RecordGetImageSparseMemoryRequirementsState(IMAGE_STATE *image_state,
@@ -2239,8 +2641,14 @@
// Any bound cmd buffers are now invalid
if (sampler_state) {
InvalidateCommandBuffers(sampler_state->cb_bindings, obj_struct);
+
+ if (sampler_state->createInfo.borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT ||
+ sampler_state->createInfo.borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT) {
+ custom_border_color_sampler_count--;
+ }
+
+ sampler_state->destroyed = true;
}
- sampler_state->destroyed = true;
samplerMap.erase(sampler);
}
@@ -2275,6 +2683,11 @@
void ValidationStateTracker::FreeCommandBufferStates(COMMAND_POOL_STATE *pool_state, const uint32_t command_buffer_count,
const VkCommandBuffer *command_buffers) {
for (uint32_t i = 0; i < command_buffer_count; i++) {
+ // Allow any derived class to clean up command buffer state
+ if (command_buffer_free_callback) {
+ (*command_buffer_free_callback)(command_buffers[i]);
+ }
+
auto cb_state = GetCBState(command_buffers[i]);
// Remove references to command buffer's state and delete
if (cb_state) {
@@ -2305,6 +2718,7 @@
auto cmd_pool_state = std::make_shared<COMMAND_POOL_STATE>();
cmd_pool_state->createFlags = pCreateInfo->flags;
cmd_pool_state->queueFamilyIndex = pCreateInfo->queueFamilyIndex;
+ cmd_pool_state->unprotected = ((pCreateInfo->flags & VK_COMMAND_POOL_CREATE_PROTECTED_BIT) == 0);
commandPoolMap[*pCommandPool] = std::move(cmd_pool_state);
}
@@ -2589,6 +3003,8 @@
const VkAllocationCallbacks *pAllocator, VkSampler *pSampler,
VkResult result) {
samplerMap[*pSampler] = std::make_shared<SAMPLER_STATE>(pSampler, pCreateInfo);
+ if (pCreateInfo->borderColor == VK_BORDER_COLOR_INT_CUSTOM_EXT || pCreateInfo->borderColor == VK_BORDER_COLOR_FLOAT_CUSTOM_EXT)
+ custom_border_color_sampler_count++;
}
void ValidationStateTracker::PostCallRecordCreateDescriptorSetLayout(VkDevice device,
@@ -2760,8 +3176,8 @@
pPool->commandBuffers.insert(pCommandBuffer[i]);
auto pCB = std::make_shared<CMD_BUFFER_STATE>();
pCB->createInfo = *pCreateInfo;
- pCB->device = device;
pCB->command_pool = pPool;
+ pCB->unprotected = pPool->unprotected;
// Add command buffer to map
commandBufferMap[pCommandBuffer[i]] = std::move(pCB);
ResetCommandBufferState(pCommandBuffer[i]);
@@ -2777,7 +3193,7 @@
if (fb_state->createInfo.flags & VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR) return;
const uint32_t attachmentCount = fb_state->createInfo.attachmentCount;
for (uint32_t attachment = 0; attachment < attachmentCount; ++attachment) {
- auto view_state = GetAttachmentImageViewState(fb_state, attachment);
+ auto view_state = GetAttachmentImageViewState(cb_state, fb_state, attachment);
if (view_state) {
AddCommandBufferBindingImageView(cb_state, view_state);
}
@@ -2814,10 +3230,12 @@
// If we are a secondary command-buffer and inheriting. Update the items we should inherit.
if ((cb_state->createInfo.level != VK_COMMAND_BUFFER_LEVEL_PRIMARY) &&
(cb_state->beginInfo.flags & VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT)) {
- cb_state->activeRenderPass = GetRenderPassState(cb_state->beginInfo.pInheritanceInfo->renderPass);
+ cb_state->activeRenderPass = GetShared<RENDER_PASS_STATE>(cb_state->beginInfo.pInheritanceInfo->renderPass);
cb_state->activeSubpass = cb_state->beginInfo.pInheritanceInfo->subpass;
- cb_state->activeFramebuffer = cb_state->beginInfo.pInheritanceInfo->framebuffer;
- cb_state->framebuffers.insert(cb_state->beginInfo.pInheritanceInfo->framebuffer);
+ if (cb_state->beginInfo.pInheritanceInfo->framebuffer) {
+ cb_state->activeFramebuffer = GetShared<FRAMEBUFFER_STATE>(cb_state->beginInfo.pInheritanceInfo->framebuffer);
+ if (cb_state->activeFramebuffer) cb_state->framebuffers.insert(cb_state->activeFramebuffer);
+ }
}
}
@@ -2897,6 +3315,42 @@
case VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV:
flags &= ~CBSTATUS_VIEWPORT_W_SCALING_SET;
break;
+ case VK_DYNAMIC_STATE_CULL_MODE_EXT:
+ flags &= ~CBSTATUS_CULL_MODE_SET;
+ break;
+ case VK_DYNAMIC_STATE_FRONT_FACE_EXT:
+ flags &= ~CBSTATUS_FRONT_FACE_SET;
+ break;
+ case VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT:
+ flags &= ~CBSTATUS_PRIMITIVE_TOPOLOGY_SET;
+ break;
+ case VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT:
+ flags &= ~CBSTATUS_VIEWPORT_WITH_COUNT_SET;
+ break;
+ case VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT:
+ flags &= ~CBSTATUS_SCISSOR_WITH_COUNT_SET;
+ break;
+ case VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT:
+ flags &= ~CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET;
+ break;
+ case VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT:
+ flags &= ~CBSTATUS_DEPTH_TEST_ENABLE_SET;
+ break;
+ case VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT:
+ flags &= ~CBSTATUS_DEPTH_WRITE_ENABLE_SET;
+ break;
+ case VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT:
+ flags &= ~CBSTATUS_DEPTH_COMPARE_OP_SET;
+ break;
+ case VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT:
+ flags &= ~CBSTATUS_DEPTH_BOUNDS_TEST_ENABLE_SET;
+ break;
+ case VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT:
+ flags &= ~CBSTATUS_STENCIL_TEST_ENABLE_SET;
+ break;
+ case VK_DYNAMIC_STATE_STENCIL_OP_EXT:
+ flags &= ~CBSTATUS_STENCIL_OP_SET;
+ break;
default:
break;
}
@@ -2927,6 +3381,14 @@
}
}
}
+ // Check if sample location is enabled
+ if (pPipe->graphicsPipelineCI.pMultisampleState) {
+ const VkPipelineSampleLocationsStateCreateInfoEXT *sample_location_state =
+ lvl_find_in_chain<VkPipelineSampleLocationsStateCreateInfoEXT>(pPipe->graphicsPipelineCI.pMultisampleState->pNext);
+ if (sample_location_state != nullptr) {
+ pPipe->sample_location_enabled = sample_location_state->sampleLocationsEnable;
+ }
+ }
}
void ValidationStateTracker::PreCallRecordCmdBindPipeline(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
@@ -2951,6 +3413,7 @@
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
cb_state->viewportMask |= ((1u << viewportCount) - 1u) << firstViewport;
cb_state->status |= CBSTATUS_VIEWPORT_SET;
+ cb_state->static_status &= ~CBSTATUS_VIEWPORT_SET;
}
void ValidationStateTracker::PreCallRecordCmdSetExclusiveScissorNV(VkCommandBuffer commandBuffer, uint32_t firstExclusiveScissor,
@@ -2960,6 +3423,7 @@
// TODO: We don't have VUIDs for validating that all exclusive scissors have been set.
// cb_state->exclusiveScissorMask |= ((1u << exclusiveScissorCount) - 1u) << firstExclusiveScissor;
cb_state->status |= CBSTATUS_EXCLUSIVE_SCISSOR_SET;
+ cb_state->static_status &= ~CBSTATUS_EXCLUSIVE_SCISSOR_SET;
}
void ValidationStateTracker::PreCallRecordCmdBindShadingRateImageNV(VkCommandBuffer commandBuffer, VkImageView imageView,
@@ -2979,6 +3443,7 @@
// TODO: We don't have VUIDs for validating that all shading rate palettes have been set.
// cb_state->shadingRatePaletteMask |= ((1u << viewportCount) - 1u) << firstViewport;
cb_state->status |= CBSTATUS_SHADING_RATE_PALETTE_SET;
+ cb_state->static_status &= ~CBSTATUS_SHADING_RATE_PALETTE_SET;
}
void ValidationStateTracker::PostCallRecordCreateAccelerationStructureNV(VkDevice device,
@@ -3009,7 +3474,42 @@
update_memory_req_info.accelerationStructure = as_state->acceleration_structure;
DispatchGetAccelerationStructureMemoryRequirementsNV(device, &update_memory_req_info,
&as_state->update_scratch_memory_requirements);
+ as_state->allocator = pAllocator;
+ accelerationStructureMap[*pAccelerationStructure] = std::move(as_state);
+}
+void ValidationStateTracker::PostCallRecordCreateAccelerationStructureKHR(VkDevice device,
+ const VkAccelerationStructureCreateInfoKHR *pCreateInfo,
+ const VkAllocationCallbacks *pAllocator,
+ VkAccelerationStructureKHR *pAccelerationStructure,
+ VkResult result) {
+ if (VK_SUCCESS != result) return;
+ auto as_state = std::make_shared<ACCELERATION_STRUCTURE_STATE>(*pAccelerationStructure, pCreateInfo);
+
+ // Query the requirements in case the application doesn't (to avoid bind/validation time query)
+ VkAccelerationStructureMemoryRequirementsInfoKHR as_memory_requirements_info = {};
+ as_memory_requirements_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_KHR;
+ as_memory_requirements_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_KHR;
+ as_memory_requirements_info.buildType = VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR;
+ as_memory_requirements_info.accelerationStructure = as_state->acceleration_structure;
+ DispatchGetAccelerationStructureMemoryRequirementsKHR(device, &as_memory_requirements_info, &as_state->memory_requirements);
+
+ VkAccelerationStructureMemoryRequirementsInfoKHR scratch_memory_req_info = {};
+ scratch_memory_req_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_KHR;
+ scratch_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_BUILD_SCRATCH_KHR;
+ scratch_memory_req_info.buildType = VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR;
+ scratch_memory_req_info.accelerationStructure = as_state->acceleration_structure;
+ DispatchGetAccelerationStructureMemoryRequirementsKHR(device, &scratch_memory_req_info,
+ &as_state->build_scratch_memory_requirements);
+
+ VkAccelerationStructureMemoryRequirementsInfoKHR update_memory_req_info = {};
+ update_memory_req_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_KHR;
+ update_memory_req_info.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_UPDATE_SCRATCH_KHR;
+ update_memory_req_info.buildType = VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR;
+ update_memory_req_info.accelerationStructure = as_state->acceleration_structure;
+ DispatchGetAccelerationStructureMemoryRequirementsKHR(device, &update_memory_req_info,
+ &as_state->update_scratch_memory_requirements);
+ as_state->allocator = pAllocator;
accelerationStructureMap[*pAccelerationStructure] = std::move(as_state);
}
@@ -3030,32 +3530,43 @@
}
}
-void ValidationStateTracker::PostCallRecordBindAccelerationStructureMemoryNV(
- VkDevice device, uint32_t bindInfoCount, const VkBindAccelerationStructureMemoryInfoNV *pBindInfos, VkResult result) {
+void ValidationStateTracker::PostCallRecordBindAccelerationStructureMemoryCommon(
+ VkDevice device, uint32_t bindInfoCount, const VkBindAccelerationStructureMemoryInfoKHR *pBindInfos, VkResult result,
+ bool isNV) {
if (VK_SUCCESS != result) return;
for (uint32_t i = 0; i < bindInfoCount; i++) {
- const VkBindAccelerationStructureMemoryInfoNV &info = pBindInfos[i];
+ const VkBindAccelerationStructureMemoryInfoKHR &info = pBindInfos[i];
ACCELERATION_STRUCTURE_STATE *as_state = GetAccelerationStructureState(info.accelerationStructure);
if (as_state) {
// Track bound memory range information
auto mem_info = GetDevMemState(info.memory);
if (mem_info) {
- InsertAccelerationStructureMemoryRange(info.accelerationStructure, mem_info, info.memoryOffset,
- as_state->requirements);
+ InsertAccelerationStructureMemoryRange(info.accelerationStructure, mem_info, info.memoryOffset);
}
// Track objects tied to memory
SetMemBinding(info.memory, as_state, info.memoryOffset,
- VulkanTypedHandle(info.accelerationStructure, kVulkanObjectTypeAccelerationStructureNV));
+ VulkanTypedHandle(info.accelerationStructure, kVulkanObjectTypeAccelerationStructureKHR));
// GPU validation of top level acceleration structure building needs acceleration structure handles.
- if (enabled.gpu_validation) {
+ // XXX TODO: Query device address for KHR extension
+ if (enabled[gpu_validation] && isNV) {
DispatchGetAccelerationStructureHandleNV(device, info.accelerationStructure, 8, &as_state->opaque_handle);
}
}
}
}
+void ValidationStateTracker::PostCallRecordBindAccelerationStructureMemoryNV(
+ VkDevice device, uint32_t bindInfoCount, const VkBindAccelerationStructureMemoryInfoNV *pBindInfos, VkResult result) {
+ PostCallRecordBindAccelerationStructureMemoryCommon(device, bindInfoCount, pBindInfos, result, true);
+}
+
+void ValidationStateTracker::PostCallRecordBindAccelerationStructureMemoryKHR(
+ VkDevice device, uint32_t bindInfoCount, const VkBindAccelerationStructureMemoryInfoKHR *pBindInfos, VkResult result) {
+ PostCallRecordBindAccelerationStructureMemoryCommon(device, bindInfoCount, pBindInfos, result, false);
+}
+
void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructureNV(
VkCommandBuffer commandBuffer, const VkAccelerationStructureInfoNV *pInfo, VkBuffer instanceData, VkDeviceSize instanceOffset,
VkBool32 update, VkAccelerationStructureNV dst, VkAccelerationStructureNV src, VkBuffer scratch, VkDeviceSize scratchOffset) {
@@ -3094,13 +3605,13 @@
}
}
-void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureNV(VkDevice device,
- VkAccelerationStructureNV accelerationStructure,
- const VkAllocationCallbacks *pAllocator) {
+void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureKHR(VkDevice device,
+ VkAccelerationStructureKHR accelerationStructure,
+ const VkAllocationCallbacks *pAllocator) {
if (!accelerationStructure) return;
auto *as_state = GetAccelerationStructureState(accelerationStructure);
if (as_state) {
- const VulkanTypedHandle obj_struct(accelerationStructure, kVulkanObjectTypeAccelerationStructureNV);
+ const VulkanTypedHandle obj_struct(accelerationStructure, kVulkanObjectTypeAccelerationStructureKHR);
InvalidateCommandBuffers(as_state->cb_bindings, obj_struct);
for (auto mem_binding : as_state->GetBoundMemory()) {
RemoveAccelerationStructureMemoryRange(accelerationStructure, mem_binding);
@@ -3111,28 +3622,38 @@
}
}
+void ValidationStateTracker::PreCallRecordDestroyAccelerationStructureNV(VkDevice device,
+ VkAccelerationStructureNV accelerationStructure,
+ const VkAllocationCallbacks *pAllocator) {
+ PreCallRecordDestroyAccelerationStructureKHR(device, accelerationStructure, pAllocator);
+}
+
void ValidationStateTracker::PreCallRecordCmdSetViewportWScalingNV(VkCommandBuffer commandBuffer, uint32_t firstViewport,
uint32_t viewportCount,
const VkViewportWScalingNV *pViewportWScalings) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
cb_state->status |= CBSTATUS_VIEWPORT_W_SCALING_SET;
+ cb_state->static_status &= ~CBSTATUS_VIEWPORT_W_SCALING_SET;
}
void ValidationStateTracker::PreCallRecordCmdSetLineWidth(VkCommandBuffer commandBuffer, float lineWidth) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
cb_state->status |= CBSTATUS_LINE_WIDTH_SET;
+ cb_state->static_status &= ~CBSTATUS_LINE_WIDTH_SET;
}
void ValidationStateTracker::PreCallRecordCmdSetLineStippleEXT(VkCommandBuffer commandBuffer, uint32_t lineStippleFactor,
uint16_t lineStipplePattern) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
cb_state->status |= CBSTATUS_LINE_STIPPLE_SET;
+ cb_state->static_status &= ~CBSTATUS_LINE_STIPPLE_SET;
}
void ValidationStateTracker::PreCallRecordCmdSetDepthBias(VkCommandBuffer commandBuffer, float depthBiasConstantFactor,
float depthBiasClamp, float depthBiasSlopeFactor) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
cb_state->status |= CBSTATUS_DEPTH_BIAS_SET;
+ cb_state->static_status &= ~CBSTATUS_DEPTH_BIAS_SET;
}
void ValidationStateTracker::PreCallRecordCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount,
@@ -3140,35 +3661,41 @@
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
cb_state->scissorMask |= ((1u << scissorCount) - 1u) << firstScissor;
cb_state->status |= CBSTATUS_SCISSOR_SET;
+ cb_state->static_status &= ~CBSTATUS_SCISSOR_SET;
}
void ValidationStateTracker::PreCallRecordCmdSetBlendConstants(VkCommandBuffer commandBuffer, const float blendConstants[4]) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
cb_state->status |= CBSTATUS_BLEND_CONSTANTS_SET;
+ cb_state->static_status &= ~CBSTATUS_BLEND_CONSTANTS_SET;
}
void ValidationStateTracker::PreCallRecordCmdSetDepthBounds(VkCommandBuffer commandBuffer, float minDepthBounds,
float maxDepthBounds) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
cb_state->status |= CBSTATUS_DEPTH_BOUNDS_SET;
+ cb_state->static_status &= ~CBSTATUS_DEPTH_BOUNDS_SET;
}
void ValidationStateTracker::PreCallRecordCmdSetStencilCompareMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
uint32_t compareMask) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
cb_state->status |= CBSTATUS_STENCIL_READ_MASK_SET;
+ cb_state->static_status &= ~CBSTATUS_STENCIL_READ_MASK_SET;
}
void ValidationStateTracker::PreCallRecordCmdSetStencilWriteMask(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
uint32_t writeMask) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
cb_state->status |= CBSTATUS_STENCIL_WRITE_MASK_SET;
+ cb_state->static_status &= ~CBSTATUS_STENCIL_WRITE_MASK_SET;
}
void ValidationStateTracker::PreCallRecordCmdSetStencilReference(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
uint32_t reference) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
cb_state->status |= CBSTATUS_STENCIL_REFERENCE_SET;
+ cb_state->static_status &= ~CBSTATUS_STENCIL_REFERENCE_SET;
}
// Update pipeline_layout bind points applying the "Pipeline Layout Compatibility" rules.
@@ -3339,6 +3866,7 @@
auto cb_state = GetCBState(commandBuffer);
cb_state->status |= CBSTATUS_INDEX_BUFFER_BOUND;
+ cb_state->static_status &= ~CBSTATUS_INDEX_BUFFER_BOUND;
cb_state->index_buffer_binding.buffer = buffer;
cb_state->index_buffer_binding.size = buffer_state->createInfo.size;
cb_state->index_buffer_binding.offset = offset;
@@ -3361,8 +3889,12 @@
auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
vertex_buffer_binding.buffer = pBuffers[i];
vertex_buffer_binding.offset = pOffsets[i];
+ vertex_buffer_binding.size = VK_WHOLE_SIZE;
+ vertex_buffer_binding.stride = 0;
// Add binding for this vertex buffer to this commandbuffer
- AddCommandBufferBindingBuffer(cb_state, GetBufferState(pBuffers[i]));
+ if (pBuffers[i]) {
+ AddCommandBufferBindingBuffer(cb_state, GetBufferState(pBuffers[i]));
+ }
}
}
@@ -3440,39 +3972,35 @@
return false;
}
-bool ValidationStateTracker::SetQueryStateMulti(VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, QueryState value,
- QueryMap *localQueryToStateMap) {
+bool ValidationStateTracker::SetQueryStateMulti(VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, uint32_t perfPass,
+ QueryState value, QueryMap *localQueryToStateMap) {
for (uint32_t i = 0; i < queryCount; i++) {
- QueryObject object = {queryPool, firstQuery + i};
+ QueryObject object = QueryObject(QueryObject(queryPool, firstQuery + i), perfPass);
(*localQueryToStateMap)[object] = value;
}
return false;
}
-QueryState ValidationStateTracker::GetQueryState(const QueryMap *localQueryToStateMap, VkQueryPool queryPool,
- uint32_t queryIndex) const {
- QueryObject query = {queryPool, queryIndex};
+QueryState ValidationStateTracker::GetQueryState(const QueryMap *localQueryToStateMap, VkQueryPool queryPool, uint32_t queryIndex,
+ uint32_t perfPass) const {
+ QueryObject query = QueryObject(QueryObject(queryPool, queryIndex), perfPass);
- const std::array<const decltype(queryToStateMap) *, 2> map_list = {{localQueryToStateMap, &queryToStateMap}};
+ auto iter = localQueryToStateMap->find(query);
+ if (iter != localQueryToStateMap->end()) return iter->second;
- for (const auto map : map_list) {
- auto query_data = map->find(query);
- if (query_data != map->end()) {
- return query_data->second;
- }
- }
return QUERYSTATE_UNKNOWN;
}
void ValidationStateTracker::RecordCmdBeginQuery(CMD_BUFFER_STATE *cb_state, const QueryObject &query_obj) {
- if (disabled.query_validation) return;
+ if (disabled[query_validation]) return;
cb_state->activeQueries.insert(query_obj);
cb_state->startedQueries.insert(query_obj);
- cb_state->queryUpdates.emplace_back(
- [query_obj](const ValidationStateTracker *device_data, bool do_validate, QueryMap *localQueryToStateMap) {
- SetQueryState(query_obj, QUERYSTATE_RUNNING, localQueryToStateMap);
- return false;
- });
+ cb_state->queryUpdates.emplace_back([query_obj](const ValidationStateTracker *device_data, bool do_validate,
+ VkQueryPool &firstPerfQueryPool, uint32_t perfQueryPass,
+ QueryMap *localQueryToStateMap) {
+ SetQueryState(QueryObject(query_obj, perfQueryPass), QUERYSTATE_RUNNING, localQueryToStateMap);
+ return false;
+ });
auto pool_state = GetQueryPoolState(query_obj.pool);
AddCommandBufferBinding(pool_state->cb_bindings, VulkanTypedHandle(query_obj.pool, kVulkanObjectTypeQueryPool, pool_state),
cb_state);
@@ -3480,26 +4008,27 @@
void ValidationStateTracker::PostCallRecordCmdBeginQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot,
VkFlags flags) {
- if (disabled.query_validation) return;
+ if (disabled[query_validation]) return;
QueryObject query = {queryPool, slot};
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
RecordCmdBeginQuery(cb_state, query);
}
void ValidationStateTracker::RecordCmdEndQuery(CMD_BUFFER_STATE *cb_state, const QueryObject &query_obj) {
- if (disabled.query_validation) return;
+ if (disabled[query_validation]) return;
cb_state->activeQueries.erase(query_obj);
- cb_state->queryUpdates.emplace_back(
- [query_obj](const ValidationStateTracker *device_data, bool do_validate, QueryMap *localQueryToStateMap) {
- return SetQueryState(query_obj, QUERYSTATE_ENDED, localQueryToStateMap);
- });
+ cb_state->queryUpdates.emplace_back([query_obj](const ValidationStateTracker *device_data, bool do_validate,
+ VkQueryPool &firstPerfQueryPool, uint32_t perfQueryPass,
+ QueryMap *localQueryToStateMap) {
+ return SetQueryState(QueryObject(query_obj, perfQueryPass), QUERYSTATE_ENDED, localQueryToStateMap);
+ });
auto pool_state = GetQueryPoolState(query_obj.pool);
AddCommandBufferBinding(pool_state->cb_bindings, VulkanTypedHandle(query_obj.pool, kVulkanObjectTypeQueryPool, pool_state),
cb_state);
}
void ValidationStateTracker::PostCallRecordCmdEndQuery(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t slot) {
- if (disabled.query_validation) return;
+ if (disabled[query_validation]) return;
QueryObject query_obj = {queryPool, slot};
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
RecordCmdEndQuery(cb_state, query_obj);
@@ -3507,12 +4036,19 @@
void ValidationStateTracker::PostCallRecordCmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
uint32_t firstQuery, uint32_t queryCount) {
- if (disabled.query_validation) return;
+ if (disabled[query_validation]) return;
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ for (uint32_t slot = firstQuery; slot < (firstQuery + queryCount); slot++) {
+ QueryObject query = {queryPool, slot};
+ cb_state->resetQueries.insert(query);
+ }
+
cb_state->queryUpdates.emplace_back([queryPool, firstQuery, queryCount](const ValidationStateTracker *device_data,
- bool do_validate, QueryMap *localQueryToStateMap) {
- return SetQueryStateMulti(queryPool, firstQuery, queryCount, QUERYSTATE_RESET, localQueryToStateMap);
+ bool do_validate, VkQueryPool &firstPerfQueryPool,
+ uint32_t perfQueryPass,
+ QueryMap *localQueryToStateMap) {
+ return SetQueryStateMulti(queryPool, firstQuery, queryCount, perfQueryPass, QUERYSTATE_RESET, localQueryToStateMap);
});
auto pool_state = GetQueryPoolState(queryPool);
AddCommandBufferBinding(pool_state->cb_bindings, VulkanTypedHandle(queryPool, kVulkanObjectTypeQueryPool, pool_state),
@@ -3523,7 +4059,7 @@
uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer,
VkDeviceSize dstOffset, VkDeviceSize stride,
VkQueryResultFlags flags) {
- if (disabled.query_validation) return;
+ if (disabled[query_validation]) return;
auto cb_state = GetCBState(commandBuffer);
auto dst_buff_state = GetBufferState(dstBuffer);
AddCommandBufferBindingBuffer(cb_state, dst_buff_state);
@@ -3534,16 +4070,17 @@
void ValidationStateTracker::PostCallRecordCmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
VkQueryPool queryPool, uint32_t slot) {
- if (disabled.query_validation) return;
+ if (disabled[query_validation]) return;
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
auto pool_state = GetQueryPoolState(queryPool);
AddCommandBufferBinding(pool_state->cb_bindings, VulkanTypedHandle(queryPool, kVulkanObjectTypeQueryPool, pool_state),
cb_state);
QueryObject query = {queryPool, slot};
- cb_state->queryUpdates.emplace_back(
- [query](const ValidationStateTracker *device_data, bool do_validate, QueryMap *localQueryToStateMap) {
- return SetQueryState(query, QUERYSTATE_ENDED, localQueryToStateMap);
- });
+ cb_state->queryUpdates.emplace_back([query](const ValidationStateTracker *device_data, bool do_validate,
+ VkQueryPool &firstPerfQueryPool, uint32_t perfQueryPass,
+ QueryMap *localQueryToStateMap) {
+ return SetQueryState(QueryObject(query, perfQueryPass), QUERYSTATE_ENDED, localQueryToStateMap);
+ });
}
void ValidationStateTracker::PostCallRecordCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo *pCreateInfo,
@@ -3571,13 +4108,18 @@
subpass_to_node.resize(pCreateInfo->subpassCount);
auto &self_dependencies = render_pass->self_dependencies;
self_dependencies.resize(pCreateInfo->subpassCount);
+ auto &subpass_dependencies = render_pass->subpass_dependencies;
+ subpass_dependencies.resize(pCreateInfo->subpassCount);
for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
subpass_to_node[i].pass = i;
self_dependencies[i].clear();
+ subpass_dependencies[i].pass = i;
}
for (uint32_t i = 0; i < pCreateInfo->dependencyCount; ++i) {
const VkSubpassDependency2KHR &dependency = pCreateInfo->pDependencies[i];
+ const auto srcSubpass = dependency.srcSubpass;
+ const auto dstSubpass = dependency.dstSubpass;
if ((dependency.srcSubpass != VK_SUBPASS_EXTERNAL) && (dependency.dstSubpass != VK_SUBPASS_EXTERNAL)) {
if (dependency.srcSubpass == dependency.dstSubpass) {
self_dependencies[dependency.srcSubpass].push_back(i);
@@ -3586,13 +4128,74 @@
subpass_to_node[dependency.srcSubpass].next.push_back(dependency.dstSubpass);
}
}
+ if (srcSubpass == VK_SUBPASS_EXTERNAL) {
+ assert(dstSubpass != VK_SUBPASS_EXTERNAL); // this is invalid per VUID-VkSubpassDependency-srcSubpass-00865
+ subpass_dependencies[dstSubpass].barrier_from_external = &dependency;
+ } else if (dstSubpass == VK_SUBPASS_EXTERNAL) {
+ subpass_dependencies[srcSubpass].barrier_to_external = &dependency;
+ } else if (dependency.srcSubpass != dependency.dstSubpass) {
+ // ignore self dependencies in prev and next
+ subpass_dependencies[srcSubpass].next.emplace_back(&dependency, &subpass_dependencies[dstSubpass]);
+ subpass_dependencies[dstSubpass].prev.emplace_back(&dependency, &subpass_dependencies[srcSubpass]);
+ }
+ }
+
+ //
+ // Determine "asynchrononous" subpassess
+ // syncronization is only interested in asyncronous stages *earlier* that the current one... so we'll only look towards those.
+ // NOTE: This is O(N^3), which we could shrink to O(N^2logN) using sets instead of arrays, but given that N is likely to be
+ // small and the K for |= from the prev is must less than for set, we'll accept the brute force.
+ std::vector<std::vector<bool>> pass_depends(pCreateInfo->subpassCount);
+ for (uint32_t i = 1; i < pCreateInfo->subpassCount; ++i) {
+ auto &depends = pass_depends[i];
+ depends.resize(i);
+ auto &subpass_dep = subpass_dependencies[i];
+ for (const auto &prev : subpass_dep.prev) {
+ const auto prev_pass = prev.node->pass;
+ const auto &prev_depends = pass_depends[prev_pass];
+ for (uint32_t j = 0; j < prev_pass; j++) {
+ depends[j] = depends[j] | prev_depends[j];
+ }
+ depends[prev_pass] = true;
+ }
+ for (uint32_t pass = 0; pass < subpass_dep.pass; pass++) {
+ if (!depends[pass]) {
+ subpass_dep.async.push_back(pass);
+ }
+ }
}
}
-static void MarkAttachmentFirstUse(RENDER_PASS_STATE *render_pass, uint32_t index, bool is_read) {
- if (index == VK_ATTACHMENT_UNUSED) return;
+static VkSubpassDependency2 ImplicitDependencyFromExternal(uint32_t subpass) {
+ VkSubpassDependency2 from_external = {VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,
+ nullptr,
+ VK_SUBPASS_EXTERNAL,
+ subpass,
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
+ 0,
+ VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
+ 0,
+ 0};
+ return from_external;
+}
- if (!render_pass->attachment_first_read.count(index)) render_pass->attachment_first_read[index] = is_read;
+static VkSubpassDependency2 ImplicitDependencyToExternal(uint32_t subpass) {
+ VkSubpassDependency2 to_external = {VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,
+ nullptr,
+ subpass,
+ VK_SUBPASS_EXTERNAL,
+ VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
+ VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT,
+ VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT |
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
+ 0,
+ 0,
+ 0};
+ return to_external;
}
void ValidationStateTracker::RecordCreateRenderPassState(RenderPassCreateVersion rp_version,
@@ -3603,21 +4206,114 @@
RecordRenderPassDAG(RENDER_PASS_VERSION_1, create_info, render_pass.get());
- for (uint32_t i = 0; i < create_info->subpassCount; ++i) {
- const VkSubpassDescription2KHR &subpass = create_info->pSubpasses[i];
- for (uint32_t j = 0; j < subpass.colorAttachmentCount; ++j) {
- MarkAttachmentFirstUse(render_pass.get(), subpass.pColorAttachments[j].attachment, false);
+ struct AttachmentTracker { // This is really only of local interest, but a bit big for a lambda
+ RENDER_PASS_STATE *const rp;
+ std::vector<uint32_t> &first;
+ std::vector<bool> &first_is_transition;
+ std::vector<uint32_t> &last;
+ std::vector<std::vector<RENDER_PASS_STATE::AttachmentTransition>> &subpass_transitions;
+ std::unordered_map<uint32_t, bool> &first_read;
+ const uint32_t attachment_count;
+ std::vector<VkImageLayout> attachment_layout;
+ std::vector<std::vector<VkImageLayout>> subpass_attachment_layout;
+ AttachmentTracker(std::shared_ptr<RENDER_PASS_STATE> &render_pass)
+ : rp(render_pass.get()),
+ first(rp->attachment_first_subpass),
+ first_is_transition(rp->attachment_first_is_transition),
+ last(rp->attachment_last_subpass),
+ subpass_transitions(rp->subpass_transitions),
+ first_read(rp->attachment_first_read),
+ attachment_count(rp->createInfo.attachmentCount),
+ attachment_layout(),
+ subpass_attachment_layout() {
+ first.resize(attachment_count, VK_SUBPASS_EXTERNAL);
+ first_is_transition.resize(attachment_count, false);
+ last.resize(attachment_count, VK_SUBPASS_EXTERNAL);
+ subpass_transitions.resize(rp->createInfo.subpassCount + 1); // Add an extra for EndRenderPass
+ attachment_layout.reserve(attachment_count);
+ subpass_attachment_layout.resize(rp->createInfo.subpassCount);
+ for (auto &subpass_layouts : subpass_attachment_layout) {
+ subpass_layouts.resize(attachment_count, kInvalidLayout);
+ }
- // resolve attachments are considered to be written
- if (subpass.pResolveAttachments) {
- MarkAttachmentFirstUse(render_pass.get(), subpass.pResolveAttachments[j].attachment, false);
+ for (uint32_t j = 0; j < attachment_count; j++) {
+ attachment_layout.push_back(rp->createInfo.pAttachments[j].initialLayout);
}
}
- if (subpass.pDepthStencilAttachment) {
- MarkAttachmentFirstUse(render_pass.get(), subpass.pDepthStencilAttachment->attachment, false);
+
+ void Update(uint32_t subpass, const VkAttachmentReference2 *attach_ref, uint32_t count, bool is_read) {
+ if (nullptr == attach_ref) return;
+ for (uint32_t j = 0; j < count; ++j) {
+ const auto attachment = attach_ref[j].attachment;
+ if (attachment != VK_ATTACHMENT_UNUSED) {
+ const auto layout = attach_ref[j].layout;
+ // Take advantage of the fact that insert won't overwrite, so we'll only write the first time.
+ first_read.insert(std::make_pair(attachment, is_read));
+ if (first[attachment] == VK_SUBPASS_EXTERNAL) {
+ first[attachment] = subpass;
+ const auto initial_layout = rp->createInfo.pAttachments[attachment].initialLayout;
+ if (initial_layout != layout) {
+ subpass_transitions[subpass].emplace_back(VK_SUBPASS_EXTERNAL, attachment, initial_layout, layout);
+ first_is_transition[attachment] = true;
+ }
+ }
+ last[attachment] = subpass;
+
+ for (const auto &prev : rp->subpass_dependencies[subpass].prev) {
+ const auto prev_pass = prev.node->pass;
+ const auto prev_layout = subpass_attachment_layout[prev_pass][attachment];
+ if ((prev_layout != kInvalidLayout) && (prev_layout != layout)) {
+ subpass_transitions[subpass].emplace_back(prev_pass, attachment, prev_layout, layout);
+ }
+ }
+ attachment_layout[attachment] = layout;
+ }
+ }
}
- for (uint32_t j = 0; j < subpass.inputAttachmentCount; ++j) {
- MarkAttachmentFirstUse(render_pass.get(), subpass.pInputAttachments[j].attachment, true);
+ void FinalTransitions() {
+ auto &final_transitions = subpass_transitions[rp->createInfo.subpassCount];
+
+ for (uint32_t attachment = 0; attachment < attachment_count; ++attachment) {
+ const auto final_layout = rp->createInfo.pAttachments[attachment].finalLayout;
+ // Add final transitions for attachments that were used and change layout.
+ if ((last[attachment] != VK_SUBPASS_EXTERNAL) && final_layout != attachment_layout[attachment]) {
+ final_transitions.emplace_back(last[attachment], attachment, attachment_layout[attachment], final_layout);
+ }
+ }
+ }
+ };
+ AttachmentTracker attachment_tracker(render_pass);
+
+ for (uint32_t subpass_index = 0; subpass_index < create_info->subpassCount; ++subpass_index) {
+ const VkSubpassDescription2KHR &subpass = create_info->pSubpasses[subpass_index];
+ attachment_tracker.Update(subpass_index, subpass.pColorAttachments, subpass.colorAttachmentCount, false);
+ attachment_tracker.Update(subpass_index, subpass.pResolveAttachments, subpass.colorAttachmentCount, false);
+ attachment_tracker.Update(subpass_index, subpass.pDepthStencilAttachment, 1, false);
+ attachment_tracker.Update(subpass_index, subpass.pInputAttachments, subpass.inputAttachmentCount, true);
+ }
+ attachment_tracker.FinalTransitions();
+
+ // Add implicit dependencies
+ for (uint32_t attachment = 0; attachment < attachment_tracker.attachment_count; attachment++) {
+ const auto first_use = attachment_tracker.first[attachment];
+ if (first_use != VK_SUBPASS_EXTERNAL) {
+ auto &subpass_dep = render_pass->subpass_dependencies[first_use];
+ if (!subpass_dep.barrier_from_external) {
+ // Add implicit from barrier
+ subpass_dep.implicit_barrier_from_external.reset(
+ new VkSubpassDependency2(ImplicitDependencyFromExternal(first_use)));
+ subpass_dep.barrier_from_external = subpass_dep.implicit_barrier_from_external.get();
+ }
+ }
+
+ const auto last_use = attachment_tracker.last[attachment];
+ if (last_use != VK_SUBPASS_EXTERNAL) {
+ auto &subpass_dep = render_pass->subpass_dependencies[last_use];
+ if (!render_pass->subpass_dependencies[last_use].barrier_to_external) {
+ // Add implicit to barrier
+ subpass_dep.implicit_barrier_to_external.reset(new VkSubpassDependency2(ImplicitDependencyToExternal(last_use)));
+ subpass_dep.barrier_to_external = subpass_dep.implicit_barrier_to_external.get();
+ }
}
}
@@ -3661,22 +4357,22 @@
const VkRenderPassBeginInfo *pRenderPassBegin,
const VkSubpassContents contents) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
- auto render_pass_state = pRenderPassBegin ? GetRenderPassState(pRenderPassBegin->renderPass) : nullptr;
- auto framebuffer = pRenderPassBegin ? GetFramebufferState(pRenderPassBegin->framebuffer) : nullptr;
+ auto render_pass_state = pRenderPassBegin ? GetShared<RENDER_PASS_STATE>(pRenderPassBegin->renderPass) : nullptr;
+ auto framebuffer = pRenderPassBegin ? GetShared<FRAMEBUFFER_STATE>(pRenderPassBegin->framebuffer) : nullptr;
if (render_pass_state) {
- cb_state->activeFramebuffer = pRenderPassBegin->framebuffer;
+ cb_state->activeFramebuffer = framebuffer;
cb_state->activeRenderPass = render_pass_state;
cb_state->activeRenderPassBeginInfo = safe_VkRenderPassBeginInfo(pRenderPassBegin);
cb_state->activeSubpass = 0;
cb_state->activeSubpassContents = contents;
- cb_state->framebuffers.insert(pRenderPassBegin->framebuffer);
+ if (framebuffer) cb_state->framebuffers.insert(framebuffer);
// Connect this framebuffer and its children to this cmdBuffer
- AddFramebufferBinding(cb_state, framebuffer);
+ AddFramebufferBinding(cb_state, framebuffer.get());
// Connect this RP to cmdBuffer
- AddCommandBufferBinding(render_pass_state->cb_bindings,
- VulkanTypedHandle(render_pass_state->renderPass, kVulkanObjectTypeRenderPass, render_pass_state),
- cb_state);
+ AddCommandBufferBinding(
+ render_pass_state->cb_bindings,
+ VulkanTypedHandle(render_pass_state->renderPass, kVulkanObjectTypeRenderPass, render_pass_state.get()), cb_state);
auto chained_device_group_struct = lvl_find_in_chain<VkDeviceGroupRenderPassBeginInfo>(pRenderPassBegin->pNext);
if (chained_device_group_struct) {
@@ -3684,6 +4380,15 @@
} else {
cb_state->active_render_pass_device_mask = cb_state->initial_device_mask;
}
+
+ cb_state->imagelessFramebufferAttachments.clear();
+ auto attachment_info_struct = lvl_find_in_chain<VkRenderPassAttachmentBeginInfo>(pRenderPassBegin->pNext);
+ if (attachment_info_struct) {
+ for (uint32_t i = 0; i < attachment_info_struct->attachmentCount; i++) {
+ IMAGE_VIEW_STATE *img_view_state = GetImageViewState(attachment_info_struct->pAttachments[i]);
+ cb_state->imagelessFramebufferAttachments.push_back(img_view_state);
+ }
+ }
}
}
@@ -3699,6 +4404,23 @@
RecordCmdBeginRenderPassState(commandBuffer, pRenderPassBegin, pSubpassBeginInfo->contents);
}
+void ValidationStateTracker::PostCallRecordCmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
+ uint32_t counterBufferCount,
+ const VkBuffer *pCounterBuffers,
+ const VkDeviceSize *pCounterBufferOffsets) {
+ CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+
+ cb_state->transform_feedback_active = true;
+}
+
+void ValidationStateTracker::PostCallRecordCmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
+ uint32_t counterBufferCount, const VkBuffer *pCounterBuffers,
+ const VkDeviceSize *pCounterBufferOffsets) {
+ CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+
+ cb_state->transform_feedback_active = false;
+}
+
void ValidationStateTracker::PreCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer,
const VkRenderPassBeginInfo *pRenderPassBegin,
const VkSubpassBeginInfoKHR *pSubpassBeginInfo) {
@@ -3732,6 +4454,7 @@
cb_state->activeRenderPass = nullptr;
cb_state->activeSubpass = 0;
cb_state->activeFramebuffer = VK_NULL_HANDLE;
+ cb_state->imagelessFramebufferAttachments.clear();
}
void ValidationStateTracker::PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) {
@@ -3807,6 +4530,10 @@
void ValidationStateTracker::UpdateBindImageMemoryState(const VkBindImageMemoryInfo &bindInfo) {
IMAGE_STATE *image_state = GetImageState(bindInfo.image);
if (image_state) {
+ // An Android sepcial image cannot get VkSubresourceLayout until the image binds a memory.
+ // See: VUID-vkGetImageSubresourceLayout-image-01895
+ image_state->fragment_encoder =
+ std::unique_ptr<const subresource_adapter::ImageRangeEncoder>(new subresource_adapter::ImageRangeEncoder(*image_state));
const auto swapchain_info = lvl_find_in_chain<VkBindImageMemorySwapchainInfoKHR>(bindInfo.pNext);
if (swapchain_info) {
auto swapchain = GetSwapchainState(swapchain_info->swapchain);
@@ -3819,8 +4546,7 @@
// Track bound memory range information
auto mem_info = GetDevMemState(bindInfo.memory);
if (mem_info) {
- InsertImageMemoryRange(bindInfo.image, mem_info, bindInfo.memoryOffset, image_state->requirements,
- image_state->createInfo.tiling == VK_IMAGE_TILING_LINEAR);
+ InsertImageMemoryRange(bindInfo.image, mem_info, bindInfo.memoryOffset);
}
// Track objects tied to memory
@@ -4274,10 +5000,19 @@
}
#endif // VK_USE_PLATFORM_XLIB_KHR
+void ValidationStateTracker::PostCallRecordCreateHeadlessSurfaceEXT(VkInstance instance,
+ const VkHeadlessSurfaceCreateInfoEXT *pCreateInfo,
+ const VkAllocationCallbacks *pAllocator, VkSurfaceKHR *pSurface,
+ VkResult result) {
+ if (VK_SUCCESS != result) return;
+ RecordVulkanSurface(pSurface);
+}
+
void ValidationStateTracker::PostCallRecordGetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice,
VkPhysicalDeviceFeatures *pFeatures) {
auto physical_device_state = GetPhysicalDeviceState(physicalDevice);
physical_device_state->vkGetPhysicalDeviceFeaturesState = QUERY_DETAILS;
+ // Reset the features2 safe struct before setting up the features field.
physical_device_state->features2 = safe_VkPhysicalDeviceFeatures2();
physical_device_state->features2.features = *pFeatures;
}
@@ -4634,9 +5369,22 @@
void ValidationStateTracker::RecordCreateSamplerYcbcrConversionState(const VkSamplerYcbcrConversionCreateInfo *create_info,
VkSamplerYcbcrConversion ycbcr_conversion) {
+ auto ycbcr_state = std::make_shared<SAMPLER_YCBCR_CONVERSION_STATE>();
+
if (device_extensions.vk_android_external_memory_android_hardware_buffer) {
- RecordCreateSamplerYcbcrConversionANDROID(create_info, ycbcr_conversion);
+ RecordCreateSamplerYcbcrConversionANDROID(create_info, ycbcr_conversion, ycbcr_state.get());
}
+
+ const VkFormat conversion_format = create_info->format;
+
+ if (conversion_format != VK_FORMAT_UNDEFINED) {
+ // If format is VK_FORMAT_UNDEFINED, will be set by external AHB features
+ ycbcr_state->format_features = GetPotentialFormatFeatures(conversion_format);
+ }
+
+ ycbcr_state->chromaFilter = create_info->chromaFilter;
+ ycbcr_state->format = conversion_format;
+ samplerYcbcrConversionMap[ycbcr_conversion] = std::move(ycbcr_state);
}
void ValidationStateTracker::PostCallRecordCreateSamplerYcbcrConversion(VkDevice device,
@@ -4657,21 +5405,27 @@
RecordCreateSamplerYcbcrConversionState(pCreateInfo, *pYcbcrConversion);
}
+void ValidationStateTracker::RecordDestroySamplerYcbcrConversionState(VkSamplerYcbcrConversion ycbcr_conversion) {
+ if (device_extensions.vk_android_external_memory_android_hardware_buffer) {
+ RecordDestroySamplerYcbcrConversionANDROID(ycbcr_conversion);
+ }
+
+ auto ycbcr_state = GetSamplerYcbcrConversionState(ycbcr_conversion);
+ ycbcr_state->destroyed = true;
+ samplerYcbcrConversionMap.erase(ycbcr_conversion);
+}
+
void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversion(VkDevice device, VkSamplerYcbcrConversion ycbcrConversion,
const VkAllocationCallbacks *pAllocator) {
if (!ycbcrConversion) return;
- if (device_extensions.vk_android_external_memory_android_hardware_buffer) {
- RecordDestroySamplerYcbcrConversionANDROID(ycbcrConversion);
- }
+ RecordDestroySamplerYcbcrConversionState(ycbcrConversion);
}
void ValidationStateTracker::PostCallRecordDestroySamplerYcbcrConversionKHR(VkDevice device,
VkSamplerYcbcrConversion ycbcrConversion,
const VkAllocationCallbacks *pAllocator) {
if (!ycbcrConversion) return;
- if (device_extensions.vk_android_external_memory_android_hardware_buffer) {
- RecordDestroySamplerYcbcrConversionANDROID(ycbcrConversion);
- }
+ RecordDestroySamplerYcbcrConversionState(ycbcrConversion);
}
void ValidationStateTracker::RecordResetQueryPool(VkDevice device, VkQueryPool queryPool, uint32_t firstQuery,
@@ -4685,17 +5439,14 @@
// Reset the state of existing entries.
QueryObject query_obj{queryPool, 0};
- QueryObjectPass query_pass_obj{query_obj, 0};
const uint32_t max_query_count = std::min(queryCount, query_pool_state->createInfo.queryCount - firstQuery);
for (uint32_t i = 0; i < max_query_count; ++i) {
query_obj.query = firstQuery + i;
- auto query_it = queryToStateMap.find(query_obj);
- if (query_it != queryToStateMap.end()) query_it->second = QUERYSTATE_RESET;
+ queryToStateMap[query_obj] = QUERYSTATE_RESET;
if (query_pool_state->createInfo.queryType == VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR) {
for (uint32_t passIndex = 0; passIndex < query_pool_state->n_performance_passes; passIndex++) {
- query_pass_obj.perf_pass = passIndex;
- auto query_perf_it = queryPassToStateMap.find(query_pass_obj);
- if (query_perf_it != queryPassToStateMap.end()) query_perf_it->second = QUERYSTATE_RESET;
+ query_obj.perf_pass = passIndex;
+ queryToStateMap[query_obj] = QUERYSTATE_RESET;
}
}
}
@@ -4764,35 +5515,36 @@
}
// Generic function to handle state update for all CmdDraw* and CmdDispatch* type functions
-void ValidationStateTracker::UpdateStateCmdDrawDispatchType(CMD_BUFFER_STATE *cb_state, VkPipelineBindPoint bind_point) {
- UpdateDrawState(cb_state, bind_point);
+void ValidationStateTracker::UpdateStateCmdDrawDispatchType(CMD_BUFFER_STATE *cb_state, CMD_TYPE cmd_type,
+ VkPipelineBindPoint bind_point) {
+ UpdateDrawState(cb_state, cmd_type, bind_point);
cb_state->hasDispatchCmd = true;
}
// Generic function to handle state update for all CmdDraw* type functions
-void ValidationStateTracker::UpdateStateCmdDrawType(CMD_BUFFER_STATE *cb_state, VkPipelineBindPoint bind_point) {
- UpdateStateCmdDrawDispatchType(cb_state, bind_point);
+void ValidationStateTracker::UpdateStateCmdDrawType(CMD_BUFFER_STATE *cb_state, CMD_TYPE cmd_type, VkPipelineBindPoint bind_point) {
+ UpdateStateCmdDrawDispatchType(cb_state, cmd_type, bind_point);
cb_state->hasDrawCmd = true;
}
void ValidationStateTracker::PostCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
uint32_t firstVertex, uint32_t firstInstance) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
- UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
+ UpdateStateCmdDrawType(cb_state, CMD_DRAW, VK_PIPELINE_BIND_POINT_GRAPHICS);
}
void ValidationStateTracker::PostCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount,
uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
uint32_t firstInstance) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
- UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
+ UpdateStateCmdDrawType(cb_state, CMD_DRAWINDEXED, VK_PIPELINE_BIND_POINT_GRAPHICS);
}
void ValidationStateTracker::PostCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
uint32_t count, uint32_t stride) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
BUFFER_STATE *buffer_state = GetBufferState(buffer);
- UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
+ UpdateStateCmdDrawType(cb_state, CMD_DRAWINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
AddCommandBufferBindingBuffer(cb_state, buffer_state);
}
@@ -4800,19 +5552,19 @@
VkDeviceSize offset, uint32_t count, uint32_t stride) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
BUFFER_STATE *buffer_state = GetBufferState(buffer);
- UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
+ UpdateStateCmdDrawType(cb_state, CMD_DRAWINDEXEDINDIRECT, VK_PIPELINE_BIND_POINT_GRAPHICS);
AddCommandBufferBindingBuffer(cb_state, buffer_state);
}
void ValidationStateTracker::PostCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
- UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_COMPUTE);
+ UpdateStateCmdDrawDispatchType(cb_state, CMD_DISPATCH, VK_PIPELINE_BIND_POINT_COMPUTE);
}
void ValidationStateTracker::PostCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer,
VkDeviceSize offset) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
- UpdateStateCmdDrawDispatchType(cb_state, VK_PIPELINE_BIND_POINT_COMPUTE);
+ UpdateStateCmdDrawDispatchType(cb_state, CMD_DISPATCHINDIRECT, VK_PIPELINE_BIND_POINT_COMPUTE);
BUFFER_STATE *buffer_state = GetBufferState(buffer);
AddCommandBufferBindingBuffer(cb_state, buffer_state);
}
@@ -4823,7 +5575,7 @@
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
BUFFER_STATE *buffer_state = GetBufferState(buffer);
BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
- UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
+ UpdateStateCmdDrawType(cb_state, CMD_DRAWINDIRECTCOUNT, VK_PIPELINE_BIND_POINT_GRAPHICS);
AddCommandBufferBindingBuffer(cb_state, buffer_state);
AddCommandBufferBindingBuffer(cb_state, count_buffer_state);
}
@@ -4847,7 +5599,7 @@
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
BUFFER_STATE *buffer_state = GetBufferState(buffer);
BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
- UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
+ UpdateStateCmdDrawType(cb_state, CMD_DRAWINDEXEDINDIRECTCOUNT, VK_PIPELINE_BIND_POINT_GRAPHICS);
AddCommandBufferBindingBuffer(cb_state, buffer_state);
AddCommandBufferBindingBuffer(cb_state, count_buffer_state);
}
@@ -4869,13 +5621,13 @@
void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksNV(VkCommandBuffer commandBuffer, uint32_t taskCount,
uint32_t firstTask) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
- UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
+ UpdateStateCmdDrawType(cb_state, CMD_DRAWMESHTASKSNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
}
void ValidationStateTracker::PreCallRecordCmdDrawMeshTasksIndirectNV(VkCommandBuffer commandBuffer, VkBuffer buffer,
VkDeviceSize offset, uint32_t drawCount, uint32_t stride) {
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
- UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
+ UpdateStateCmdDrawType(cb_state, CMD_DRAWMESHTASKSINDIRECTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
BUFFER_STATE *buffer_state = GetBufferState(buffer);
if (buffer_state) {
AddCommandBufferBindingBuffer(cb_state, buffer_state);
@@ -4889,7 +5641,7 @@
CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
BUFFER_STATE *buffer_state = GetBufferState(buffer);
BUFFER_STATE *count_buffer_state = GetBufferState(countBuffer);
- UpdateStateCmdDrawType(cb_state, VK_PIPELINE_BIND_POINT_GRAPHICS);
+ UpdateStateCmdDrawType(cb_state, CMD_DRAWMESHTASKSINDIRECTCOUNTNV, VK_PIPELINE_BIND_POINT_GRAPHICS);
if (buffer_state) {
AddCommandBufferBindingBuffer(cb_state, buffer_state);
}
@@ -4905,7 +5657,7 @@
if (VK_SUCCESS != result) return;
create_shader_module_api_state *csm_state = reinterpret_cast<create_shader_module_api_state *>(csm_state_data);
- spv_target_env spirv_environment = ((api_version >= VK_API_VERSION_1_1) ? SPV_ENV_VULKAN_1_1 : SPV_ENV_VULKAN_1_0);
+ spv_target_env spirv_environment = PickSpirvEnv(api_version, (device_extensions.vk_khr_spirv_1_4 != kNotEnabled));
bool is_spirv = (pCreateInfo->pCode[0] == spv::MagicNumber);
auto new_shader_module = is_spirv ? std::make_shared<SHADER_MODULE_STATE>(pCreateInfo, *pShaderModule, spirv_environment,
csm_state->unique_shader_id)
@@ -4923,6 +5675,8 @@
auto entrypoint = FindEntrypoint(module, pStage->pName, pStage->stage);
if (entrypoint == module->end()) return;
+ stage_state->stage_flag = pStage->stage;
+
// Mark accessible ids
stage_state->accessible_ids = MarkAccessibleIds(module, entrypoint);
ProcessExecutionModes(module, entrypoint, pipeline);
@@ -4937,6 +5691,10 @@
reqs = descriptor_req(reqs | DescriptorTypeToReqs(module, use.second.type_id));
pipeline->max_active_slot = std::max(pipeline->max_active_slot, slot);
}
+
+ if (pStage->stage == VK_SHADER_STAGE_FRAGMENT_BIT) {
+ pipeline->fragmentShader_writable_output_location_list = CollectWritableOutputLocationinFS(*module, *pStage);
+ }
}
void ValidationStateTracker::ResetCommandBufferPushConstantDataIfIncompatible(CMD_BUFFER_STATE *cb_state, VkPipelineLayout layout) {
@@ -5004,7 +5762,7 @@
if (swapchain_state->createInfo.flags & VK_SWAPCHAIN_CREATE_MUTABLE_FORMAT_BIT_KHR)
image_ci.flags |= (VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT | VK_IMAGE_CREATE_EXTENDED_USAGE_BIT_KHR);
- imageMap[pSwapchainImages[i]] = std::make_shared<IMAGE_STATE>(pSwapchainImages[i], &image_ci);
+ imageMap[pSwapchainImages[i]] = std::make_shared<IMAGE_STATE>(device, pSwapchainImages[i], &image_ci);
auto &image_state = imageMap[pSwapchainImages[i]];
image_state->valid = false;
image_state->create_from_swapchain = swapchain;
@@ -5013,6 +5771,8 @@
image_state->is_swapchain_image = true;
swapchain_state->images[i].image = pSwapchainImages[i];
swapchain_state->images[i].bound_images.emplace(pSwapchainImages[i]);
+
+ AddImageStateProps(*image_state, device, physical_device);
}
}
@@ -5023,3 +5783,142 @@
swapchain_state->get_swapchain_image_count = *pSwapchainImageCount;
}
}
+
+void ValidationStateTracker::PostCallRecordCmdBuildAccelerationStructureKHR(
+ VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
+ const VkAccelerationStructureBuildOffsetInfoKHR *const *ppOffsetInfos) {
+ CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ if (cb_state == nullptr) {
+ return;
+ }
+ for (uint32_t i = 0; i < infoCount; ++i) {
+ ACCELERATION_STRUCTURE_STATE *dst_as_state = GetAccelerationStructureState(pInfos[i].dstAccelerationStructure);
+ ACCELERATION_STRUCTURE_STATE *src_as_state = GetAccelerationStructureState(pInfos[i].srcAccelerationStructure);
+ if (dst_as_state != nullptr) {
+ dst_as_state->built = true;
+ dst_as_state->build_info_khr.initialize(pInfos);
+ AddCommandBufferBindingAccelerationStructure(cb_state, dst_as_state);
+ }
+ if (src_as_state != nullptr) {
+ AddCommandBufferBindingAccelerationStructure(cb_state, src_as_state);
+ }
+ }
+ cb_state->hasBuildAccelerationStructureCmd = true;
+}
+
+void ValidationStateTracker::PostCallRecordCmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer,
+ const VkCopyAccelerationStructureInfoKHR *pInfo) {
+ CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ if (cb_state) {
+ ACCELERATION_STRUCTURE_STATE *src_as_state = GetAccelerationStructureState(pInfo->src);
+ ACCELERATION_STRUCTURE_STATE *dst_as_state = GetAccelerationStructureState(pInfo->dst);
+ if (dst_as_state != nullptr && src_as_state != nullptr) {
+ dst_as_state->built = true;
+ dst_as_state->build_info_khr = src_as_state->build_info_khr;
+ AddCommandBufferBindingAccelerationStructure(cb_state, dst_as_state);
+ AddCommandBufferBindingAccelerationStructure(cb_state, src_as_state);
+ }
+ }
+}
+
+void ValidationStateTracker::PreCallRecordCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode) {
+ CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ cb_state->status |= CBSTATUS_CULL_MODE_SET;
+ cb_state->static_status &= ~CBSTATUS_CULL_MODE_SET;
+}
+
+void ValidationStateTracker::PreCallRecordCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace) {
+ CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ cb_state->status |= CBSTATUS_FRONT_FACE_SET;
+ cb_state->static_status &= ~CBSTATUS_FRONT_FACE_SET;
+}
+
+void ValidationStateTracker::PreCallRecordCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer,
+ VkPrimitiveTopology primitiveTopology) {
+ CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ cb_state->primitiveTopology = primitiveTopology;
+ cb_state->status |= CBSTATUS_PRIMITIVE_TOPOLOGY_SET;
+ cb_state->static_status &= ~CBSTATUS_PRIMITIVE_TOPOLOGY_SET;
+}
+
+void ValidationStateTracker::PreCallRecordCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount,
+ const VkViewport *pViewports) {
+ CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ cb_state->viewportWithCountMask |= (1u << viewportCount) - 1u;
+ cb_state->status |= CBSTATUS_VIEWPORT_WITH_COUNT_SET;
+ cb_state->static_status &= ~CBSTATUS_VIEWPORT_WITH_COUNT_SET;
+}
+
+void ValidationStateTracker::PreCallRecordCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount,
+ const VkRect2D *pScissors) {
+ CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ cb_state->scissorWithCountMask |= (1u << scissorCount) - 1u;
+ cb_state->status |= CBSTATUS_SCISSOR_WITH_COUNT_SET;
+ cb_state->static_status &= ~CBSTATUS_SCISSOR_WITH_COUNT_SET;
+}
+
+void ValidationStateTracker::PreCallRecordCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding,
+ uint32_t bindingCount, const VkBuffer *pBuffers,
+ const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes,
+ const VkDeviceSize *pStrides) {
+ CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ if (pStrides) {
+ cb_state->status |= CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET;
+ cb_state->static_status &= ~CBSTATUS_VERTEX_INPUT_BINDING_STRIDE_SET;
+ }
+
+ uint32_t end = firstBinding + bindingCount;
+ if (cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.size() < end) {
+ cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings.resize(end);
+ }
+
+ for (uint32_t i = 0; i < bindingCount; ++i) {
+ auto &vertex_buffer_binding = cb_state->current_vertex_buffer_binding_info.vertex_buffer_bindings[i + firstBinding];
+ vertex_buffer_binding.buffer = pBuffers[i];
+ vertex_buffer_binding.offset = pOffsets[i];
+ vertex_buffer_binding.size = (pSizes) ? pSizes[i] : VK_WHOLE_SIZE;
+ vertex_buffer_binding.stride = (pStrides) ? pStrides[i] : 0;
+ // Add binding for this vertex buffer to this commandbuffer
+ if (pBuffers[i]) {
+ AddCommandBufferBindingBuffer(cb_state, GetBufferState(pBuffers[i]));
+ }
+ }
+}
+
+void ValidationStateTracker::PreCallRecordCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable) {
+ CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ cb_state->status |= CBSTATUS_DEPTH_TEST_ENABLE_SET;
+ cb_state->static_status &= ~CBSTATUS_DEPTH_TEST_ENABLE_SET;
+}
+
+void ValidationStateTracker::PreCallRecordCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable) {
+ CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ cb_state->status |= CBSTATUS_DEPTH_WRITE_ENABLE_SET;
+ cb_state->static_status &= ~CBSTATUS_DEPTH_WRITE_ENABLE_SET;
+}
+
+void ValidationStateTracker::PreCallRecordCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp) {
+ CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ cb_state->status |= CBSTATUS_DEPTH_COMPARE_OP_SET;
+ cb_state->static_status &= ~CBSTATUS_DEPTH_COMPARE_OP_SET;
+}
+
+void ValidationStateTracker::PreCallRecordCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer,
+ VkBool32 depthBoundsTestEnable) {
+ CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ cb_state->status |= CBSTATUS_DEPTH_BOUNDS_TEST_ENABLE_SET;
+ cb_state->static_status &= ~CBSTATUS_DEPTH_BOUNDS_TEST_ENABLE_SET;
+}
+void ValidationStateTracker::PreCallRecordCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable) {
+ CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ cb_state->status |= CBSTATUS_STENCIL_TEST_ENABLE_SET;
+ cb_state->static_status &= ~CBSTATUS_STENCIL_TEST_ENABLE_SET;
+}
+
+void ValidationStateTracker::PreCallRecordCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask,
+ VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp,
+ VkCompareOp compareOp) {
+ CMD_BUFFER_STATE *cb_state = GetCBState(commandBuffer);
+ cb_state->status |= CBSTATUS_STENCIL_OP_SET;
+ cb_state->static_status &= ~CBSTATUS_STENCIL_OP_SET;
+}
diff --git a/layers/state_tracker.h b/layers/state_tracker.h
index 004b633..a1cd210 100644
--- a/layers/state_tracker.h
+++ b/layers/state_tracker.h
@@ -23,6 +23,7 @@
*/
#pragma once
+#include "chassis.h"
#include "core_validation_error_enums.h"
#include "core_validation_types.h"
#include "descriptor_sets.h"
@@ -40,6 +41,17 @@
#include <deque>
#include <map>
+uint32_t ResolveRemainingLevels(const VkImageSubresourceRange* range, uint32_t mip_levels);
+uint32_t ResolveRemainingLayers(const VkImageSubresourceRange* range, uint32_t layers);
+VkImageSubresourceRange NormalizeSubresourceRange(const VkImageCreateInfo& image_create_info, const VkImageSubresourceRange& range);
+std::pair<uint32_t, const VkImageView*> GetFramebufferAttachments(const VkRenderPassBeginInfo& rp_begin,
+ const FRAMEBUFFER_STATE& fb_state);
+VkImageSubresourceRange NormalizeSubresourceRange(const IMAGE_STATE& image_state, const VkImageSubresourceRange& range);
+PIPELINE_STATE* GetCurrentPipelineFromCommandBuffer(const CMD_BUFFER_STATE& cmd, VkPipelineBindPoint pipelineBindPoint);
+void GetCurrentPipelineAndDesriptorSetsFromCommandBuffer(const CMD_BUFFER_STATE& cmd, VkPipelineBindPoint pipelineBindPoint,
+ const PIPELINE_STATE** rtn_pipe,
+ const std::vector<LAST_BOUND_STATE::PER_SET>** rtn_sets);
+
enum SyncScope {
kSyncScopeInternal,
kSyncScopeExternalTemporary,
@@ -94,6 +106,13 @@
uint32_t n_performance_passes = 0;
};
+class SAMPLER_YCBCR_CONVERSION_STATE : public BASE_NODE {
+ public:
+ VkFormatFeatureFlags format_features;
+ VkFormat format;
+ VkFilter chromaFilter;
+};
+
class QUEUE_FAMILY_PERF_COUNTERS {
public:
std::vector<VkPerformanceCounterKHR> counters;
@@ -232,6 +251,100 @@
extern std::shared_ptr<cvdescriptorset::DescriptorSetLayout const> GetDslFromPipelineLayout(
PIPELINE_LAYOUT_STATE const* layout_data, uint32_t set);
+// Returns the effective extent of an image subresource, adjusted for mip level and array depth.
+static inline VkExtent3D GetImageSubresourceExtent(const IMAGE_STATE* img, const VkImageSubresourceLayers* subresource) {
+ const uint32_t mip = subresource->mipLevel;
+
+ // Return zero extent if mip level doesn't exist
+ if (mip >= img->createInfo.mipLevels) {
+ return VkExtent3D{0, 0, 0};
+ }
+
+ // Don't allow mip adjustment to create 0 dim, but pass along a 0 if that's what subresource specified
+ VkExtent3D extent = img->createInfo.extent;
+
+ // If multi-plane, adjust per-plane extent
+ if (FormatIsMultiplane(img->createInfo.format)) {
+ VkExtent2D divisors = FindMultiplaneExtentDivisors(img->createInfo.format, subresource->aspectMask);
+ extent.width /= divisors.width;
+ extent.height /= divisors.height;
+ }
+
+ if (img->createInfo.flags & VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV) {
+ extent.width = (0 == extent.width ? 0 : std::max(2U, 1 + ((extent.width - 1) >> mip)));
+ extent.height = (0 == extent.height ? 0 : std::max(2U, 1 + ((extent.height - 1) >> mip)));
+ extent.depth = (0 == extent.depth ? 0 : std::max(2U, 1 + ((extent.depth - 1) >> mip)));
+ } else {
+ extent.width = (0 == extent.width ? 0 : std::max(1U, extent.width >> mip));
+ extent.height = (0 == extent.height ? 0 : std::max(1U, extent.height >> mip));
+ extent.depth = (0 == extent.depth ? 0 : std::max(1U, extent.depth >> mip));
+ }
+
+ // Image arrays have an effective z extent that isn't diminished by mip level
+ if (VK_IMAGE_TYPE_3D != img->createInfo.imageType) {
+ extent.depth = img->createInfo.arrayLayers;
+ }
+
+ return extent;
+}
+
+// For image copies between compressed/uncompressed formats, the extent is provided in source image texels
+// Destination image texel extents must be adjusted by block size for the dest validation checks
+static inline VkExtent3D GetAdjustedDestImageExtent(VkFormat src_format, VkFormat dst_format, VkExtent3D extent) {
+ VkExtent3D adjusted_extent = extent;
+ if ((FormatIsCompressed(src_format) || FormatIsSinglePlane_422(src_format)) &&
+ !(FormatIsCompressed(dst_format) || FormatIsSinglePlane_422(dst_format))) {
+ VkExtent3D block_size = FormatTexelBlockExtent(src_format);
+ adjusted_extent.width /= block_size.width;
+ adjusted_extent.height /= block_size.height;
+ adjusted_extent.depth /= block_size.depth;
+ } else if (!(FormatIsCompressed(src_format) || FormatIsSinglePlane_422(src_format)) &&
+ (FormatIsCompressed(dst_format) || FormatIsSinglePlane_422(dst_format))) {
+ VkExtent3D block_size = FormatTexelBlockExtent(dst_format);
+ adjusted_extent.width *= block_size.width;
+ adjusted_extent.height *= block_size.height;
+ adjusted_extent.depth *= block_size.depth;
+ }
+ return adjusted_extent;
+}
+
+// Test if the extent argument has any dimensions set to 0.
+static inline bool IsExtentSizeZero(const VkExtent3D* extent) {
+ return ((extent->width == 0) || (extent->height == 0) || (extent->depth == 0));
+}
+
+static inline VkDeviceSize GetBufferSizeFromCopyImage(const VkBufferImageCopy& region, VkFormat image_format) {
+ VkDeviceSize buffer_size = 0;
+ VkExtent3D copy_extent = region.imageExtent;
+ VkDeviceSize buffer_width = (0 == region.bufferRowLength ? copy_extent.width : region.bufferRowLength);
+ VkDeviceSize buffer_height = (0 == region.bufferImageHeight ? copy_extent.height : region.bufferImageHeight);
+ VkDeviceSize unit_size = FormatElementSize(image_format,
+ region.imageSubresource.aspectMask); // size (bytes) of texel or block
+
+ if (FormatIsCompressed(image_format) || FormatIsSinglePlane_422(image_format)) {
+ // Switch to texel block units, rounding up for any partially-used blocks
+ auto block_dim = FormatTexelBlockExtent(image_format);
+ buffer_width = (buffer_width + block_dim.width - 1) / block_dim.width;
+ buffer_height = (buffer_height + block_dim.height - 1) / block_dim.height;
+
+ copy_extent.width = (copy_extent.width + block_dim.width - 1) / block_dim.width;
+ copy_extent.height = (copy_extent.height + block_dim.height - 1) / block_dim.height;
+ copy_extent.depth = (copy_extent.depth + block_dim.depth - 1) / block_dim.depth;
+ }
+
+ // Either depth or layerCount may be greater than 1 (not both). This is the number of 'slices' to copy
+ uint32_t z_copies = std::max(copy_extent.depth, region.imageSubresource.layerCount);
+ if (IsExtentSizeZero(©_extent) || (0 == z_copies)) {
+ // TODO: Issue warning here? Already warned in ValidateImageBounds()...
+ } else {
+ // Calculate buffer offset of final copied byte, + 1.
+ buffer_size = (z_copies - 1) * buffer_height * buffer_width; // offset to slice
+ buffer_size += ((copy_extent.height - 1) * buffer_width) + copy_extent.width; // add row,col
+ buffer_size *= unit_size; // convert to bytes
+ }
+ return buffer_size;
+}
+
struct SHADER_MODULE_STATE;
class ValidationStateTracker : public ValidationObject {
@@ -243,8 +356,8 @@
std::unordered_set<VkQueue> queues; // All queues under given device
QueryMap queryToStateMap;
- QueryPassMap queryPassToStateMap;
unordered_map<VkSamplerYcbcrConversion, uint64_t> ycbcr_conversion_ahb_fmt_map;
+ unordered_map<uint64_t, VkFormatFeatureFlags> ahb_ext_formats_map;
// Traits for State function resolution. Specializations defined in the macro.
// NOTE: The Dummy argument allows for *partial* specialization at class scope, as full specialization at class scope
@@ -265,6 +378,9 @@
using MapType = unordered_map<HandleType, MappedType>;
};
+ // Override base class, we have some extra work to do here
+ void InitDeviceValidationObject(bool add_obj, ValidationObject* inst_obj, ValidationObject* dev_obj);
+
VALSTATETRACK_MAP_AND_TRAITS(VkRenderPass, RENDER_PASS_STATE, renderPassMap)
VALSTATETRACK_MAP_AND_TRAITS(VkDescriptorSetLayout, cvdescriptorset::DescriptorSetLayout, descriptorSetLayoutMap)
VALSTATETRACK_MAP_AND_TRAITS(VkSampler, SAMPLER_STATE, samplerMap)
@@ -286,6 +402,7 @@
VALSTATETRACK_MAP_AND_TRAITS(VkFence, FENCE_STATE, fenceMap)
VALSTATETRACK_MAP_AND_TRAITS(VkQueryPool, QUERY_POOL_STATE, queryPoolMap)
VALSTATETRACK_MAP_AND_TRAITS(VkSemaphore, SEMAPHORE_STATE, semaphoreMap)
+ VALSTATETRACK_MAP_AND_TRAITS(VkSamplerYcbcrConversion, SAMPLER_YCBCR_CONVERSION_STATE, samplerYcbcrConversionMap)
VALSTATETRACK_MAP_AND_TRAITS(VkAccelerationStructureNV, ACCELERATION_STRUCTURE_STATE, accelerationStructureMap)
VALSTATETRACK_MAP_AND_TRAITS_INSTANCE_SCOPE(VkSurfaceKHR, SURFACE_STATE, surface_map)
@@ -462,6 +579,12 @@
QUERY_POOL_STATE* GetQueryPoolState(VkQueryPool query_pool) { return Get<QUERY_POOL_STATE>(query_pool); }
const SEMAPHORE_STATE* GetSemaphoreState(VkSemaphore semaphore) const { return Get<SEMAPHORE_STATE>(semaphore); }
SEMAPHORE_STATE* GetSemaphoreState(VkSemaphore semaphore) { return Get<SEMAPHORE_STATE>(semaphore); }
+ const SAMPLER_YCBCR_CONVERSION_STATE* GetSamplerYcbcrConversionState(VkSamplerYcbcrConversion samplerYcbcrConversion) const {
+ return Get<SAMPLER_YCBCR_CONVERSION_STATE>(samplerYcbcrConversion);
+ }
+ SAMPLER_YCBCR_CONVERSION_STATE* GetSamplerYcbcrConversionState(VkSamplerYcbcrConversion samplerYcbcrConversion) {
+ return Get<SAMPLER_YCBCR_CONVERSION_STATE>(samplerYcbcrConversion);
+ }
const ACCELERATION_STRUCTURE_STATE* GetAccelerationStructureState(VkAccelerationStructureNV as) const {
return Get<ACCELERATION_STRUCTURE_STATE>(as);
}
@@ -472,8 +595,9 @@
SURFACE_STATE* GetSurfaceState(VkSurfaceKHR surface) { return Get<SURFACE_STATE>(surface); }
// Class Declarations for helper functions
- IMAGE_VIEW_STATE* GetAttachmentImageViewState(FRAMEBUFFER_STATE* framebuffer, uint32_t index);
- const IMAGE_VIEW_STATE* GetAttachmentImageViewState(const FRAMEBUFFER_STATE* framebuffer, uint32_t index) const;
+ IMAGE_VIEW_STATE* GetAttachmentImageViewState(CMD_BUFFER_STATE* cb, FRAMEBUFFER_STATE* framebuffer, uint32_t index);
+ const IMAGE_VIEW_STATE* GetAttachmentImageViewState(const CMD_BUFFER_STATE* cb, const FRAMEBUFFER_STATE* framebuffer,
+ uint32_t index) const;
const EVENT_STATE* GetEventState(VkEvent event) const;
EVENT_STATE* GetEventState(VkEvent event);
const QUEUE_STATE* GetQueueState(VkQueue queue) const;
@@ -494,6 +618,19 @@
PHYSICAL_DEVICE_STATE* GetPhysicalDeviceState();
const PHYSICAL_DEVICE_STATE* GetPhysicalDeviceState() const;
+ VkQueueFlags GetQueueFlags(const COMMAND_POOL_STATE& cp_state) const {
+ return GetPhysicalDeviceState()->queue_family_properties[cp_state.queueFamilyIndex].queueFlags;
+ }
+
+ VkQueueFlags GetQueueFlags(const CMD_BUFFER_STATE& cb_state) const {
+ VkQueueFlags queue_flags = 0;
+ auto pool = cb_state.command_pool.get();
+ if (pool) {
+ queue_flags = GetQueueFlags(*pool);
+ }
+ return queue_flags;
+ }
+
using CommandBufferResetCallback = std::function<void(VkCommandBuffer)>;
std::unique_ptr<CommandBufferResetCallback> command_buffer_reset_callback;
template <typename Fn>
@@ -501,6 +638,13 @@
command_buffer_reset_callback.reset(new CommandBufferResetCallback(std::forward<Fn>(fn)));
}
+ using CommandBufferFreeCallback = std::function<void(VkCommandBuffer)>;
+ std::unique_ptr<CommandBufferFreeCallback> command_buffer_free_callback;
+ template <typename Fn>
+ void SetCommandBufferFreeCallback(Fn&& fn) {
+ command_buffer_free_callback.reset(new CommandBufferFreeCallback(std::forward<Fn>(fn)));
+ }
+
using SetImageViewInitialLayoutCallback = std::function<void(CMD_BUFFER_STATE*, const IMAGE_VIEW_STATE&, VkImageLayout)>;
std::unique_ptr<SetImageViewInitialLayoutCallback> set_image_view_initial_layout_callback;
template <typename Fn>
@@ -612,9 +756,15 @@
void PostCallRecordSignalSemaphoreKHR(VkDevice device, const VkSemaphoreSignalInfoKHR* pSignalInfo, VkResult result);
// Create/Destroy/Bind
+ void PostCallRecordBindAccelerationStructureMemoryCommon(VkDevice device, uint32_t bindInfoCount,
+ const VkBindAccelerationStructureMemoryInfoKHR* pBindInfos,
+ VkResult result, bool isNV);
void PostCallRecordBindAccelerationStructureMemoryNV(VkDevice device, uint32_t bindInfoCount,
const VkBindAccelerationStructureMemoryInfoNV* pBindInfos,
VkResult result);
+ void PostCallRecordBindAccelerationStructureMemoryKHR(VkDevice device, uint32_t bindInfoCount,
+ const VkBindAccelerationStructureMemoryInfoKHR* pBindInfos,
+ VkResult result);
void PostCallRecordBindBufferMemory(VkDevice device, VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memoryOffset,
VkResult result);
void PostCallRecordBindBufferMemory2(VkDevice device, uint32_t bindInfoCount, const VkBindBufferMemoryInfoKHR* pBindInfos,
@@ -637,6 +787,13 @@
VkAccelerationStructureNV* pAccelerationStructure, VkResult result);
void PreCallRecordDestroyAccelerationStructureNV(VkDevice device, VkAccelerationStructureNV accelerationStructure,
const VkAllocationCallbacks* pAllocator);
+
+ void PostCallRecordCreateAccelerationStructureKHR(VkDevice device, const VkAccelerationStructureCreateInfoKHR* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkAccelerationStructureKHR* pAccelerationStructure, VkResult result);
+ void PreCallRecordDestroyAccelerationStructureKHR(VkDevice device, VkAccelerationStructureKHR accelerationStructure,
+ const VkAllocationCallbacks* pAllocator);
+
void PostCallRecordCreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator,
VkBuffer* pBuffer, VkResult result);
void PreCallRecordDestroyBuffer(VkDevice device, VkBuffer buffer, const VkAllocationCallbacks* pAllocator);
@@ -789,6 +946,7 @@
void PostCallRecordWaitForFences(VkDevice device, uint32_t fenceCount, const VkFence* pFences, VkBool32 waitAll,
uint64_t timeout, VkResult result);
void PostCallRecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo* pWaitInfo, uint64_t timeout, VkResult result);
+ void PostCallRecordWaitSemaphoresKHR(VkDevice device, const VkSemaphoreWaitInfo* pWaitInfo, uint64_t timeout, VkResult result);
void PostCallRecordAcquireProfilingLockKHR(VkDevice device, const VkAcquireProfilingLockInfoKHR* pInfo, VkResult result);
void PostCallRecordReleaseProfilingLockKHR(VkDevice device);
@@ -828,6 +986,12 @@
const VkSubpassBeginInfoKHR* pSubpassBeginInfo);
void PreCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo* pRenderPassBegin,
const VkSubpassBeginInfoKHR* pSubpassBeginInfo);
+ void PostCallRecordCmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
+ uint32_t counterBufferCount, const VkBuffer* pCounterBuffers,
+ const VkDeviceSize* pCounterBufferOffsets);
+ void PostCallRecordCmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
+ uint32_t counterBufferCount, const VkBuffer* pCounterBuffers,
+ const VkDeviceSize* pCounterBufferOffsets);
void PreCallRecordCmdBindDescriptorSets(VkCommandBuffer commandBuffer, VkPipelineBindPoint pipelineBindPoint,
VkPipelineLayout layout, uint32_t firstSet, uint32_t setCount,
const VkDescriptorSet* pDescriptorSets, uint32_t dynamicOffsetCount,
@@ -957,6 +1121,11 @@
VkQueryPool queryPool, uint32_t slot);
void PreCallRecordCmdSetViewportWScalingNV(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount,
const VkViewportWScalingNV* pViewportWScalings);
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
+ void PostCallRecordGetAndroidHardwareBufferPropertiesANDROID(VkDevice device, const struct AHardwareBuffer* buffer,
+ VkAndroidHardwareBufferPropertiesANDROID* pProperties,
+ VkResult result);
+#endif // VK_USE_PLATFORM_ANDROID_KHR
// WSI
void PostCallRecordAcquireNextImageKHR(VkDevice device, VkSwapchainKHR swapchain, uint64_t timeout, VkSemaphore semaphore,
@@ -1000,6 +1169,8 @@
void PostCallRecordCreateXlibSurfaceKHR(VkInstance instance, const VkXlibSurfaceCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface, VkResult result);
#endif // VK_USE_PLATFORM_XLIB_KHR
+ void PostCallRecordCreateHeadlessSurfaceEXT(VkInstance instance, const VkHeadlessSurfaceCreateInfoEXT* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator, VkSurfaceKHR* pSurface, VkResult result);
// State Utilty functions
bool AddCommandBufferMem(small_unordered_map<CMD_BUFFER_STATE*, int, 8>& cb_bindings, VkDeviceMemory obj,
@@ -1021,17 +1192,18 @@
void FreeCommandBufferStates(COMMAND_POOL_STATE* pool_state, const uint32_t command_buffer_count,
const VkCommandBuffer* command_buffers);
void FreeDescriptorSet(cvdescriptorset::DescriptorSet* descriptor_set);
+ std::vector<const IMAGE_VIEW_STATE*> GetAttachmentViews(const VkRenderPassBeginInfo& rp_begin,
+ const FRAMEBUFFER_STATE& fb_state) const;
+ std::vector<const IMAGE_VIEW_STATE*> GetCurrentAttachmentViews(const CMD_BUFFER_STATE& cb_state) const;
BASE_NODE* GetStateStructPtrFromObject(const VulkanTypedHandle& object_struct);
+ VkFormatFeatureFlags GetPotentialFormatFeatures(VkFormat format) const;
void IncrementBoundObjects(CMD_BUFFER_STATE const* cb_node);
void IncrementResources(CMD_BUFFER_STATE* cb_node);
void InsertAccelerationStructureMemoryRange(VkAccelerationStructureNV as, DEVICE_MEMORY_STATE* mem_info,
- VkDeviceSize mem_offset, const VkMemoryRequirements& mem_reqs);
- void InsertBufferMemoryRange(VkBuffer buffer, DEVICE_MEMORY_STATE* mem_info, VkDeviceSize mem_offset,
- const VkMemoryRequirements& mem_reqs);
- void InsertImageMemoryRange(VkImage image, DEVICE_MEMORY_STATE* mem_info, VkDeviceSize mem_offset,
- VkMemoryRequirements mem_reqs, bool is_linear);
- void InsertMemoryRange(const VulkanTypedHandle& typed_handle, DEVICE_MEMORY_STATE* mem_info, VkDeviceSize memoryOffset,
- VkMemoryRequirements memRequirements, bool is_linear);
+ VkDeviceSize mem_offset);
+ void InsertBufferMemoryRange(VkBuffer buffer, DEVICE_MEMORY_STATE* mem_info, VkDeviceSize mem_offset);
+ void InsertImageMemoryRange(VkImage image, DEVICE_MEMORY_STATE* mem_info, VkDeviceSize mem_offset);
+ void InsertMemoryRange(const VulkanTypedHandle& typed_handle, DEVICE_MEMORY_STATE* mem_info, VkDeviceSize memoryOffset);
void InvalidateCommandBuffers(small_unordered_map<CMD_BUFFER_STATE*, int, 8>& cb_nodes, const VulkanTypedHandle& obj,
bool unlink = true);
void InvalidateLinkedCommandBuffers(std::unordered_set<CMD_BUFFER_STATE*>& cb_nodes, const VulkanTypedHandle& obj);
@@ -1051,24 +1223,27 @@
uint32_t set, uint32_t descriptorWriteCount,
const VkWriteDescriptorSet* pDescriptorWrites);
void RecordCreateImageANDROID(const VkImageCreateInfo* create_info, IMAGE_STATE* is_node);
+ void RecordCreateBufferANDROID(const VkBufferCreateInfo* create_info, BUFFER_STATE* bs_node);
void RecordCreateRenderPassState(RenderPassCreateVersion rp_version, std::shared_ptr<RENDER_PASS_STATE>& render_pass,
VkRenderPass* pRenderPass);
void RecordCreateSamplerYcbcrConversionState(const VkSamplerYcbcrConversionCreateInfo* create_info,
VkSamplerYcbcrConversion ycbcr_conversion);
void RecordCreateSamplerYcbcrConversionANDROID(const VkSamplerYcbcrConversionCreateInfo* create_info,
- VkSamplerYcbcrConversion ycbcr_conversion);
+ VkSamplerYcbcrConversion ycbcr_conversion,
+ SAMPLER_YCBCR_CONVERSION_STATE* ycbcr_state);
void RecordCreateSwapchainState(VkResult result, const VkSwapchainCreateInfoKHR* pCreateInfo, VkSwapchainKHR* pSwapchain,
SURFACE_STATE* surface_state, SWAPCHAIN_NODE* old_swapchain_state);
+ void RecordDestroySamplerYcbcrConversionState(VkSamplerYcbcrConversion ycbcr_conversion);
void RecordDestroySamplerYcbcrConversionANDROID(VkSamplerYcbcrConversion ycbcr_conversion);
void RecordEnumeratePhysicalDeviceGroupsState(uint32_t* pPhysicalDeviceGroupCount,
VkPhysicalDeviceGroupPropertiesKHR* pPhysicalDeviceGroupProperties);
void RecordEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCounters(VkPhysicalDevice physicalDevice,
uint32_t queueFamilyIndex, uint32_t* pCounterCount,
VkPerformanceCounterKHR* pCounters);
- void RecordGetBufferMemoryRequirementsState(VkBuffer buffer, VkMemoryRequirements* pMemoryRequirements);
+ void RecordGetBufferMemoryRequirementsState(VkBuffer buffer);
void RecordGetDeviceQueueState(uint32_t queue_family_index, VkQueue queue);
void RecordGetExternalFenceState(VkFence fence, VkExternalFenceHandleTypeFlagBitsKHR handle_type);
- void RecordGetImageMemoryRequiementsState(VkImage image, VkMemoryRequirements* pMemoryRequirements);
+ void RecordGetImageMemoryRequirementsState(VkImage image, const VkImageMemoryRequirementsInfo2* pInfo);
void RecordImportSemaphoreState(VkSemaphore semaphore, VkExternalSemaphoreHandleTypeFlagBitsKHR handle_type,
VkSemaphoreImportFlagsKHR flags);
void RecordGetPhysicalDeviceDisplayPlanePropertiesState(VkPhysicalDevice physicalDevice, uint32_t* pPropertyCount,
@@ -1092,15 +1267,17 @@
void ResetCommandBufferState(const VkCommandBuffer cb);
void RetireFence(VkFence fence);
void RetireTimelineSemaphore(VkSemaphore semaphore, uint64_t until_payload);
+ void RecordWaitSemaphores(VkDevice device, const VkSemaphoreWaitInfo* pWaitInfo, uint64_t timeout, VkResult result);
void RetireWorkOnQueue(QUEUE_STATE* pQueue, uint64_t seq);
static bool SetEventStageMask(VkEvent event, VkPipelineStageFlags stageMask, EventToStageMap* localEventToStageMap);
void ResetCommandBufferPushConstantDataIfIncompatible(CMD_BUFFER_STATE* cb_state, VkPipelineLayout layout);
void SetMemBinding(VkDeviceMemory mem, BINDABLE* mem_binding, VkDeviceSize memory_offset,
const VulkanTypedHandle& typed_handle);
static bool SetQueryState(QueryObject object, QueryState value, QueryMap* localQueryToStateMap);
- static bool SetQueryStateMulti(VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, QueryState value,
- QueryMap* localQueryToStateMap);
- QueryState GetQueryState(const QueryMap* localQueryToStateMap, VkQueryPool queryPool, uint32_t queryIndex) const;
+ static bool SetQueryStateMulti(VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount, uint32_t perfPass,
+ QueryState value, QueryMap* localQueryToStateMap);
+ QueryState GetQueryState(const QueryMap* localQueryToStateMap, VkQueryPool queryPool, uint32_t queryIndex,
+ uint32_t perfPass) const;
bool SetSparseMemBinding(const VkDeviceMemory mem, const VkDeviceSize mem_offset, const VkDeviceSize mem_size,
const VulkanTypedHandle& typed_handle);
void UpdateBindBufferMemoryState(VkBuffer buffer, VkDeviceMemory mem, VkDeviceSize memoryOffset);
@@ -1109,10 +1286,33 @@
const PIPELINE_LAYOUT_STATE* pipeline_layout, uint32_t first_set, uint32_t set_count,
const VkDescriptorSet* pDescriptorSets, cvdescriptorset::DescriptorSet* push_descriptor_set,
uint32_t dynamic_offset_count, const uint32_t* p_dynamic_offsets);
- void UpdateStateCmdDrawDispatchType(CMD_BUFFER_STATE* cb_state, VkPipelineBindPoint bind_point);
- void UpdateStateCmdDrawType(CMD_BUFFER_STATE* cb_state, VkPipelineBindPoint bind_point);
- void UpdateDrawState(CMD_BUFFER_STATE* cb_state, const VkPipelineBindPoint bind_point);
+ void UpdateStateCmdDrawDispatchType(CMD_BUFFER_STATE* cb_state, CMD_TYPE cmd_type, VkPipelineBindPoint bind_point);
+ void UpdateStateCmdDrawType(CMD_BUFFER_STATE* cb_state, CMD_TYPE cmd_type, VkPipelineBindPoint bind_point);
+ void UpdateDrawState(CMD_BUFFER_STATE* cb_state, CMD_TYPE cmd_type, const VkPipelineBindPoint bind_point);
void UpdateAllocateDescriptorSetsData(const VkDescriptorSetAllocateInfo*, cvdescriptorset::AllocateDescriptorSetsData*) const;
+ void PostCallRecordCmdBuildAccelerationStructureKHR(VkCommandBuffer commandBuffer, uint32_t infoCount,
+ const VkAccelerationStructureBuildGeometryInfoKHR* pInfos,
+ const VkAccelerationStructureBuildOffsetInfoKHR* const* ppOffsetInfos);
+
+ void PostCallRecordCmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer,
+ const VkCopyAccelerationStructureInfoKHR* pInfo);
+
+ void PreCallRecordCmdSetCullModeEXT(VkCommandBuffer commandBuffer, VkCullModeFlags cullMode);
+ void PreCallRecordCmdSetFrontFaceEXT(VkCommandBuffer commandBuffer, VkFrontFace frontFace);
+ void PreCallRecordCmdSetPrimitiveTopologyEXT(VkCommandBuffer commandBuffer, VkPrimitiveTopology primitiveTopology);
+ void PreCallRecordCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount,
+ const VkViewport* pViewports);
+ void PreCallRecordCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount, const VkRect2D* pScissors);
+ void PreCallRecordCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
+ const VkBuffer* pBuffers, const VkDeviceSize* pOffsets, const VkDeviceSize* pSizes,
+ const VkDeviceSize* pStrides);
+ void PreCallRecordCmdSetDepthTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthTestEnable);
+ void PreCallRecordCmdSetDepthWriteEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthWriteEnable);
+ void PreCallRecordCmdSetDepthCompareOpEXT(VkCommandBuffer commandBuffer, VkCompareOp depthCompareOp);
+ void PreCallRecordCmdSetDepthBoundsTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 depthBoundsTestEnable);
+ void PreCallRecordCmdSetStencilTestEnableEXT(VkCommandBuffer commandBuffer, VkBool32 stencilTestEnable);
+ void PreCallRecordCmdSetStencilOpEXT(VkCommandBuffer commandBuffer, VkStencilFaceFlags faceMask, VkStencilOp failOp,
+ VkStencilOp passOp, VkStencilOp depthFailOp, VkCompareOp compareOp);
DeviceFeatures enabled_features = {};
// Device specific data
@@ -1121,6 +1321,7 @@
VkPhysicalDeviceVulkan11Properties phys_dev_props_core11 = {};
VkPhysicalDeviceVulkan12Properties phys_dev_props_core12 = {};
uint32_t physical_device_count;
+ uint32_t custom_border_color_sampler_count = 0;
// Device extension properties -- storing properties gathered from VkPhysicalDeviceProperties2KHR::pNext chain
struct DeviceExtensionProperties {
@@ -1132,16 +1333,20 @@
VkPhysicalDeviceCooperativeMatrixPropertiesNV cooperative_matrix_props;
VkPhysicalDeviceTransformFeedbackPropertiesEXT transform_feedback_props;
VkPhysicalDeviceRayTracingPropertiesNV ray_tracing_propsNV;
- VkPhysicalDeviceRayTracingPropertiesNV ray_tracing_propsKHR;
+ VkPhysicalDeviceRayTracingPropertiesKHR ray_tracing_propsKHR;
VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT texel_buffer_alignment_props;
VkPhysicalDeviceFragmentDensityMapPropertiesEXT fragment_density_map_props;
+ VkPhysicalDeviceFragmentDensityMap2PropertiesEXT fragment_density_map2_props;
VkPhysicalDevicePerformanceQueryPropertiesKHR performance_query_props;
+ VkPhysicalDeviceSampleLocationsPropertiesEXT sample_locations_props;
+ VkPhysicalDeviceCustomBorderColorPropertiesEXT custom_border_color_props;
};
DeviceExtensionProperties phys_dev_ext_props = {};
std::vector<VkCooperativeMatrixPropertiesNV> cooperative_matrix_properties;
// Map for queue family index to queue count
unordered_map<uint32_t, uint32_t> queue_family_index_map;
+ unordered_map<uint32_t, VkDeviceQueueCreateFlags> queue_family_create_flags_map;
bool performance_lock_acquired = false;
template <typename ExtProp>
@@ -1153,4 +1358,22 @@
DispatchGetPhysicalDeviceProperties2KHR(gpu, &prop2);
}
}
+
+ private:
+ // Simple base address allocator allow allow VkDeviceMemory allocations to appear to exist in a common address space.
+ // At 256GB allocated/sec ( > 8GB at 30Hz), will overflow in just over 2 years
+ class FakeAllocator {
+ public:
+ void Free(VkDeviceSize fake_address){}; // Define the interface just in case we ever need to be cleverer.
+ VkDeviceSize Alloc(VkDeviceSize size) {
+ const auto alloc = free_;
+ assert(std::numeric_limits<VkDeviceSize>::max() - size >= free_); // 776.722963 days later...
+ free_ = free_ + size;
+ return alloc;
+ }
+
+ private:
+ VkDeviceSize free_ = 0;
+ };
+ FakeAllocator fake_memory;
};
diff --git a/layers/stateless_validation.h b/layers/stateless_validation.h
index 3135475..6a880a5 100644
--- a/layers/stateless_validation.h
+++ b/layers/stateless_validation.h
@@ -51,7 +51,10 @@
extern const VkQueryControlFlags AllVkQueryControlFlagBits;
extern const VkImageUsageFlags AllVkImageUsageFlagBits;
extern const VkSampleCountFlags AllVkSampleCountFlagBits;
+extern const VkBuildAccelerationStructureFlagsNV AllVkBuildAccelerationStructureFlagBitsNV;
+extern const VkGeometryFlagsKHR AllVkGeometryFlagBitsKHR;
+extern const std::vector<VkGeometryTypeKHR> AllVkGeometryTypeKHREnums;
extern const std::vector<VkCompareOp> AllVkCompareOpEnums;
extern const std::vector<VkStencilOp> AllVkStencilOpEnums;
extern const std::vector<VkBlendFactor> AllVkBlendFactorEnums;
@@ -62,6 +65,7 @@
extern const std::vector<VkFormat> AllVkFormatEnums;
extern const std::vector<VkVertexInputRate> AllVkVertexInputRateEnums;
extern const std::vector<VkPrimitiveTopology> AllVkPrimitiveTopologyEnums;
+extern const std::vector<VkIndexType> AllVkIndexTypeEnums;
// String returned by string_VkStructureType for an unrecognized type.
const std::string UnsupportedStructureTypeString = "Unhandled VkStructureType";
@@ -111,7 +115,7 @@
std::unordered_map<VkRenderPass, SubpassesUsageStates> renderpasses_states;
// Constructor for stateles validation tracking
- StatelessValidation(): device_createinfo_pnext(nullptr) {}
+ StatelessValidation() : device_createinfo_pnext(nullptr) { container_type = LayerObjectTypeParameterValidation; }
~StatelessValidation() {
if (device_createinfo_pnext) {
FreePnextChain(device_createinfo_pnext);
@@ -798,7 +802,7 @@
// Check against the required list in the info
std::vector<const char *> missing;
- for (const auto &req : info.requires) {
+ for (const auto &req : info.requirements) {
if (!(extensions.*(req.enabled))) {
missing.push_back(req.name);
}
@@ -886,15 +890,17 @@
reinterpret_cast<VkAttachmentDescription2KHR const *>(&pCreateInfo->pAttachments[i])->pNext)
: 0;
- if (pCreateInfo->pAttachments[i].format == VK_FORMAT_UNDEFINED) {
+ const VkFormat attachment_format = pCreateInfo->pAttachments[i].format;
+ const VkImageLayout initial_layout = pCreateInfo->pAttachments[i].initialLayout;
+ const VkImageLayout final_layout = pCreateInfo->pAttachments[i].finalLayout;
+ if (attachment_format == VK_FORMAT_UNDEFINED) {
std::stringstream ss;
ss << (use_rp2 ? "vkCreateRenderPass2KHR" : "vkCreateRenderPass") << ": pCreateInfo->pAttachments[" << i
<< "].format is VK_FORMAT_UNDEFINED. ";
vuid = use_rp2 ? "VUID-VkAttachmentDescription2-format-parameter" : "VUID-VkAttachmentDescription-format-parameter";
skip |= LogWarning(device, vuid, "%s", ss.str().c_str());
}
- if (pCreateInfo->pAttachments[i].finalLayout == VK_IMAGE_LAYOUT_UNDEFINED ||
- pCreateInfo->pAttachments[i].finalLayout == VK_IMAGE_LAYOUT_PREINITIALIZED) {
+ if (final_layout == VK_IMAGE_LAYOUT_UNDEFINED || final_layout == VK_IMAGE_LAYOUT_PREINITIALIZED) {
vuid =
use_rp2 ? "VUID-VkAttachmentDescription2-finalLayout-03061" : "VUID-VkAttachmentDescription-finalLayout-00843";
skip |= LogError(device, vuid,
@@ -916,10 +922,10 @@
"VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR",
i);
}
- if (pCreateInfo->pAttachments[i].finalLayout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR ||
- pCreateInfo->pAttachments[i].finalLayout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR ||
- pCreateInfo->pAttachments[i].finalLayout == VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR ||
- pCreateInfo->pAttachments[i].finalLayout == VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR) {
+ if (final_layout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR ||
+ final_layout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR ||
+ final_layout == VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR ||
+ final_layout == VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR) {
vuid = use_rp2 ? "VUID-VkAttachmentDescription2-separateDepthStencilLayouts-03299"
: "VUID-VkAttachmentDescription-separateDepthStencilLayouts-03285";
skip |= LogError(
@@ -930,11 +936,11 @@
i);
}
}
- if (!FormatIsDepthOrStencil(pCreateInfo->pAttachments[i].format)) {
- if (pCreateInfo->pAttachments[i].initialLayout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR ||
- pCreateInfo->pAttachments[i].initialLayout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR ||
- pCreateInfo->pAttachments[i].initialLayout == VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR ||
- pCreateInfo->pAttachments[i].initialLayout == VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR) {
+ if (!FormatIsDepthOrStencil(attachment_format)) {
+ if (initial_layout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR ||
+ initial_layout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR ||
+ initial_layout == VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR ||
+ initial_layout == VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR) {
vuid = use_rp2 ? "VUID-VkAttachmentDescription2-format-03300" : "VUID-VkAttachmentDescription-format-03286";
skip |= LogError(
device, vuid,
@@ -943,10 +949,10 @@
"VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMA_KHRL",
i);
}
- if (pCreateInfo->pAttachments[i].finalLayout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR ||
- pCreateInfo->pAttachments[i].finalLayout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR ||
- pCreateInfo->pAttachments[i].finalLayout == VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR ||
- pCreateInfo->pAttachments[i].finalLayout == VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR) {
+ if (final_layout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR ||
+ final_layout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR ||
+ final_layout == VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR ||
+ final_layout == VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR) {
vuid = use_rp2 ? "VUID-VkAttachmentDescription2-format-03301" : "VUID-VkAttachmentDescription-format-03287";
skip |= LogError(
device, vuid,
@@ -955,27 +961,27 @@
"VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR",
i);
}
- } else if (FormatIsDepthAndStencil(pCreateInfo->pAttachments[i].format)) {
+ } else if (FormatIsDepthAndStencil(attachment_format)) {
if (use_rp2) {
if (!attachment_description_stencil_layout) {
- if (pCreateInfo->pAttachments[i].initialLayout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR ||
- pCreateInfo->pAttachments[i].initialLayout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR) {
+ if (initial_layout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR ||
+ initial_layout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR) {
skip |=
LogError(device, "VUID-VkAttachmentDescription2-format-03302",
"pCreateInfo->pNext must include an instance of VkAttachmentDescriptionStencilLayoutKHR");
}
- if (pCreateInfo->pAttachments[i].finalLayout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR ||
- pCreateInfo->pAttachments[i].finalLayout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR) {
+ if (final_layout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR ||
+ final_layout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR) {
skip |=
LogError(device, "VUID-VkAttachmentDescription2-format-03303",
"pCreateInfo->pNext must include an instance of VkAttachmentDescriptionStencilLayoutKHR");
}
}
} else {
- if (pCreateInfo->pAttachments[i].initialLayout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR ||
- pCreateInfo->pAttachments[i].initialLayout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR ||
- pCreateInfo->pAttachments[i].initialLayout == VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR ||
- pCreateInfo->pAttachments[i].initialLayout == VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR) {
+ if (initial_layout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR ||
+ initial_layout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR ||
+ initial_layout == VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR ||
+ initial_layout == VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR) {
skip |= LogError(
device, "VUID-VkAttachmentDescription-format-03288",
"pCreateInfo->pAttachments[%d].initialLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR, "
@@ -983,10 +989,10 @@
"VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR",
i);
}
- if (pCreateInfo->pAttachments[i].finalLayout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR ||
- pCreateInfo->pAttachments[i].finalLayout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR ||
- pCreateInfo->pAttachments[i].finalLayout == VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR ||
- pCreateInfo->pAttachments[i].finalLayout == VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR) {
+ if (final_layout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR ||
+ final_layout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR ||
+ final_layout == VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR ||
+ final_layout == VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR) {
skip |= LogError(
device, "VUID-VkAttachmentDescription-format-03289",
"pCreateInfo->pAttachments[%d].finalLayout must not be VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR, "
@@ -995,9 +1001,9 @@
i);
}
}
- } else if (FormatIsDepthOnly(pCreateInfo->pAttachments[i].format)) {
- if (pCreateInfo->pAttachments[i].initialLayout == VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR ||
- pCreateInfo->pAttachments[i].initialLayout == VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR) {
+ } else if (FormatIsDepthOnly(attachment_format)) {
+ if (initial_layout == VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR ||
+ initial_layout == VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR) {
vuid = use_rp2 ? "VUID-VkAttachmentDescription2-format-03304" : "VUID-VkAttachmentDescription-format-03290";
skip |= LogError(
device, vuid,
@@ -1005,8 +1011,8 @@
"VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR",
i);
}
- if (pCreateInfo->pAttachments[i].finalLayout == VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR ||
- pCreateInfo->pAttachments[i].finalLayout == VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR) {
+ if (final_layout == VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL_KHR ||
+ final_layout == VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR) {
vuid = use_rp2 ? "VUID-VkAttachmentDescription2-format-03305" : "VUID-VkAttachmentDescription-format-03291";
skip |= LogError(
device, vuid,
@@ -1014,9 +1020,9 @@
"VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL_KHR",
i);
}
- } else if (FormatIsStencilOnly(pCreateInfo->pAttachments[i].format)) {
- if (pCreateInfo->pAttachments[i].initialLayout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR ||
- pCreateInfo->pAttachments[i].initialLayout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR) {
+ } else if (FormatIsStencilOnly(attachment_format)) {
+ if (initial_layout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR ||
+ initial_layout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR) {
vuid = use_rp2 ? "VUID-VkAttachmentDescription2-format-03306" : "VUID-VkAttachmentDescription-format-03292";
skip |= LogError(
device, vuid,
@@ -1024,8 +1030,8 @@
"VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR",
i);
}
- if (pCreateInfo->pAttachments[i].finalLayout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR ||
- pCreateInfo->pAttachments[i].finalLayout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR) {
+ if (final_layout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL_KHR ||
+ final_layout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL_KHR) {
vuid = use_rp2 ? "VUID-VkAttachmentDescription2-format-03307" : "VUID-VkAttachmentDescription-format-03293";
skip |= LogError(
device, vuid,
@@ -1081,6 +1087,51 @@
"VK_IMAGE_LAYOUT_PREINITIALIZED.");
}
}
+
+ if (FormatIsDepthOrStencil(attachment_format)) {
+ if (initial_layout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) {
+ vuid = use_rp2 ? "VUID-VkAttachmentDescription2-format-03295" : "VUID-VkAttachmentDescription-format-03281";
+ skip |= LogError(device, vuid,
+ "pCreateInfo->pAttachments[%d].initialLayout must not be "
+ "VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL when using a Depth or Stencil format",
+ i);
+ }
+ if (final_layout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) {
+ vuid = use_rp2 ? "VUID-VkAttachmentDescription2-format-03297" : "VUID-VkAttachmentDescription-format-03283";
+ skip |= LogError(device, vuid,
+ "pCreateInfo->pAttachments[%d].finalLayout must not be "
+ "VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL when using a Depth or Stencil format",
+ i);
+ }
+ }
+ if (FormatIsColor(attachment_format)) {
+ if (initial_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL ||
+ initial_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL ||
+ initial_layout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL ||
+ initial_layout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL) {
+ vuid = use_rp2 ? "VUID-VkAttachmentDescription2-format-03294" : "VUID-VkAttachmentDescription-format-03280";
+ skip |= LogError(
+ device, vuid,
+ "pCreateInfo->pAttachments[%d].initialLayout must not be VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, "
+ "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, "
+ "VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, or "
+ "VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL when using a Color format",
+ i);
+ }
+ if (final_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL ||
+ final_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL ||
+ final_layout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL ||
+ final_layout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL) {
+ vuid = use_rp2 ? "VUID-VkAttachmentDescription2-format-03296" : "VUID-VkAttachmentDescription-format-03282";
+ skip |= LogError(
+ device, vuid,
+ "pCreateInfo->pAttachments[%d].finalLayout must not be VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, "
+ "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, "
+ "VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, or "
+ "VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL when using a Color format",
+ i);
+ }
+ }
}
for (uint32_t i = 0; i < pCreateInfo->subpassCount; ++i) {
@@ -1148,6 +1199,9 @@
bool validate_instance_extensions(const VkInstanceCreateInfo *pCreateInfo) const;
+ bool validate_validation_features(const VkInstanceCreateInfo *pCreateInfo,
+ const VkValidationFeaturesEXT *validation_features) const;
+
bool validate_api_version(uint32_t api_version, uint32_t effective_api_version) const;
bool validate_string(const char *apiName, const ParameterName &stringName, const std::string &vuid,
@@ -1168,10 +1222,14 @@
const char *func_name) const;
bool ValidateGeometryNV(const VkGeometryNV &geometry, VkAccelerationStructureNV object_handle, const char *func_name) const;
bool ValidateAccelerationStructureInfoNV(const VkAccelerationStructureInfoNV &info, VkAccelerationStructureNV object_handle,
- const char *func_nam) const;
+ const char *func_nam, bool is_cmd) const;
bool ValidateCreateSamplerYcbcrConversion(VkDevice device, const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
const VkAllocationCallbacks *pAllocator, VkSamplerYcbcrConversion *pYcbcrConversion,
const char *apiName) const;
+ bool ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkDeviceSize offset, VkDeviceSize countBufferOffset,
+ bool khr) const;
+ bool ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkDeviceSize offset, VkDeviceSize countBufferOffset,
+ bool khr) const;
bool OutputExtensionError(const std::string &api_name, const std::string &extension_name) const;
@@ -1201,6 +1259,9 @@
bool manual_PreCallValidateCreateImage(VkDevice device, const VkImageCreateInfo *pCreateInfo,
const VkAllocationCallbacks *pAllocator, VkImage *pImage) const;
+ bool manual_PreCallValidateCreateImageView(VkDevice device, const VkImageViewCreateInfo *pCreateInfo,
+ const VkAllocationCallbacks *pAllocator, VkImageView *pView) const;
+
bool manual_PreCallValidateViewport(const VkViewport &viewport, const char *fn_name, const ParameterName ¶meter_name,
VkCommandBuffer object) const;
@@ -1253,6 +1314,22 @@
bool manual_PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
uint32_t count, uint32_t stride) const;
+ bool manual_PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride) const;
+
+ bool manual_PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride) const;
+
+ bool manual_PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset,
+ uint32_t maxDrawCount, uint32_t stride) const;
+
+ bool manual_PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset,
+ uint32_t maxDrawCount, uint32_t stride) const;
+
bool manual_PreCallValidateCmdClearAttachments(VkCommandBuffer commandBuffer, uint32_t attachmentCount,
const VkClearAttachment *pAttachments, uint32_t rectCount,
const VkClearRect *pRects) const;
@@ -1392,10 +1469,23 @@
bool manual_PreCallValidateAcquireNextImage2KHR(VkDevice device, const VkAcquireNextImageInfoKHR *pAcquireInfo,
uint32_t *pImageIndex) const;
+ bool manual_PreCallValidateCmdBindTransformFeedbackBuffersEXT(VkCommandBuffer commandBuffer, uint32_t firstBinding,
+ uint32_t bindingCount, const VkBuffer *pBuffers,
+ const VkDeviceSize *pOffsets, const VkDeviceSize *pSizes) const;
+
+ bool manual_PreCallValidateCmdBeginTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
+ uint32_t counterBufferCount, const VkBuffer *pCounterBuffers,
+ const VkDeviceSize *pCounterBufferOffsets) const;
+
+ bool manual_PreCallValidateCmdEndTransformFeedbackEXT(VkCommandBuffer commandBuffer, uint32_t firstCounterBuffer,
+ uint32_t counterBufferCount, const VkBuffer *pCounterBuffers,
+ const VkDeviceSize *pCounterBufferOffsets) const;
+
bool manual_PreCallValidateCmdDrawIndirectByteCountEXT(VkCommandBuffer commandBuffer, uint32_t instanceCount,
uint32_t firstInstance, VkBuffer counterBuffer,
VkDeviceSize counterBufferOffset, uint32_t counterOffset,
uint32_t vertexStride) const;
+
bool manual_PreCallValidateCreateSamplerYcbcrConversion(VkDevice device, const VkSamplerYcbcrConversionCreateInfo *pCreateInfo,
const VkAllocationCallbacks *pAllocator,
VkSamplerYcbcrConversion *pYcbcrConversion) const;
@@ -1405,5 +1495,83 @@
VkSamplerYcbcrConversion *pYcbcrConversion) const;
bool manual_PreCallValidateImportSemaphoreFdKHR(VkDevice device,
const VkImportSemaphoreFdInfoKHR *pImportSemaphoreFdInfo) const;
+
+ bool manual_PreCallValidateCopyAccelerationStructureToMemoryKHR(VkDevice device,
+ const VkCopyAccelerationStructureToMemoryInfoKHR *pInfo) const;
+
+ bool manual_PreCallValidateCmdCopyAccelerationStructureToMemoryKHR(
+ VkCommandBuffer commandBuffer, const VkCopyAccelerationStructureToMemoryInfoKHR *pInfo) const;
+
+ bool manual_PreCallValidateCopyAccelerationStructureKHR(VkDevice device, const VkCopyAccelerationStructureInfoKHR *pInfo) const;
+
+ bool manual_PreCallValidateCmdCopyAccelerationStructureKHR(VkCommandBuffer commandBuffer,
+ const VkCopyAccelerationStructureInfoKHR *pInfo) const;
+ bool ValidateCopyAccelerationStructureInfoKHR(const VkCopyAccelerationStructureInfoKHR *pInfo, const char *api_name) const;
+ bool ValidateCopyMemoryToAccelerationStructureInfoKHR(const VkCopyMemoryToAccelerationStructureInfoKHR *pInfo,
+ const char *api_name, bool is_cmd = false) const;
+
+ bool manual_PreCallValidateCopyMemoryToAccelerationStructureKHR(VkDevice device,
+ const VkCopyMemoryToAccelerationStructureInfoKHR *pInfo) const;
+ bool manual_PreCallValidateCmdCopyMemoryToAccelerationStructureKHR(
+ VkCommandBuffer commandBuffer, const VkCopyMemoryToAccelerationStructureInfoKHR *pInfo) const;
+
+ bool manual_PreCallValidateCmdWriteAccelerationStructuresPropertiesKHR(
+ VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount,
+ const VkAccelerationStructureKHR *pAccelerationStructures, VkQueryType queryType, VkQueryPool queryPool,
+ uint32_t firstQuery) const;
+ bool manual_PreCallValidateWriteAccelerationStructuresPropertiesKHR(VkDevice device, uint32_t accelerationStructureCount,
+ const VkAccelerationStructureKHR *pAccelerationStructures,
+ VkQueryType queryType, size_t dataSize, void *pData,
+ size_t stride) const;
+ bool manual_PreCallValidateGetRayTracingCaptureReplayShaderGroupHandlesKHR(VkDevice device, VkPipeline pipeline,
+ uint32_t firstGroup, uint32_t groupCount,
+ size_t dataSize, void *pData) const;
+
+ bool manual_PreCallValidateCmdTraceRaysKHR(VkCommandBuffer commandBuffer,
+ const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
+ const VkStridedBufferRegionKHR *pMissShaderBindingTable,
+ const VkStridedBufferRegionKHR *pHitShaderBindingTable,
+ const VkStridedBufferRegionKHR *pCallableShaderBindingTable, uint32_t width,
+ uint32_t height, uint32_t depth) const;
+
+ bool manual_PreCallValidateCmdTraceRaysIndirectKHR(VkCommandBuffer commandBuffer,
+ const VkStridedBufferRegionKHR *pRaygenShaderBindingTable,
+ const VkStridedBufferRegionKHR *pMissShaderBindingTable,
+ const VkStridedBufferRegionKHR *pHitShaderBindingTable,
+ const VkStridedBufferRegionKHR *pCallableShaderBindingTable, VkBuffer buffer,
+ VkDeviceSize offset) const;
+
+ bool manual_PreCallValidateCmdTraceRaysNV(VkCommandBuffer commandBuffer, VkBuffer raygenShaderBindingTableBuffer,
+ VkDeviceSize raygenShaderBindingOffset, VkBuffer missShaderBindingTableBuffer,
+ VkDeviceSize missShaderBindingOffset, VkDeviceSize missShaderBindingStride,
+ VkBuffer hitShaderBindingTableBuffer, VkDeviceSize hitShaderBindingOffset,
+ VkDeviceSize hitShaderBindingStride, VkBuffer callableShaderBindingTableBuffer,
+ VkDeviceSize callableShaderBindingOffset, VkDeviceSize callableShaderBindingStride,
+ uint32_t width, uint32_t height, uint32_t depth) const;
+
+ bool manual_PreCallValidateCmdBuildAccelerationStructureIndirectKHR(VkCommandBuffer commandBuffer,
+ const VkAccelerationStructureBuildGeometryInfoKHR *pInfo,
+ VkBuffer indirectBuffer, VkDeviceSize indirectOffset,
+ uint32_t indirectStride) const;
+
+ bool manual_PreCallValidateGetDeviceAccelerationStructureCompatibilityKHR(
+ VkDevice device, const VkAccelerationStructureVersionKHR *version) const;
+
+ bool manual_PreCallValidateBuildAccelerationStructureKHR(
+ VkDevice device, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
+ const VkAccelerationStructureBuildOffsetInfoKHR *const *ppOffsetInfos) const;
+
+ bool manual_PreCallValidateCmdBuildAccelerationStructureKHR(
+ VkCommandBuffer commandBuffer, uint32_t infoCount, const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
+ const VkAccelerationStructureBuildOffsetInfoKHR *const *ppOffsetInfos) const;
+
+ bool manual_PreCallValidateCmdSetViewportWithCountEXT(VkCommandBuffer commandBuffer, uint32_t viewportCount,
+ const VkViewport *pViewports) const;
+ bool manual_PreCallValidateCmdSetScissorWithCountEXT(VkCommandBuffer commandBuffer, uint32_t scissorCount,
+ const VkRect2D *pScissors) const;
+ bool manual_PreCallValidateCmdBindVertexBuffers2EXT(VkCommandBuffer commandBuffer, uint32_t firstBinding, uint32_t bindingCount,
+ const VkBuffer *pBuffers, const VkDeviceSize *pOffsets,
+ const VkDeviceSize *pSizes, const VkDeviceSize *pStrides) const;
+
#include "parameter_validation.h"
}; // Class StatelessValidation
diff --git a/layers/subresource_adapter.cpp b/layers/subresource_adapter.cpp
index 530c438..7f0b414 100644
--- a/layers/subresource_adapter.cpp
+++ b/layers/subresource_adapter.cpp
@@ -20,6 +20,10 @@
*/
#include <cassert>
#include "subresource_adapter.h"
+#include "vk_format_utils.h"
+#include "state_tracker.h"
+#include "core_validation_types.h"
+#include <cmath>
namespace subresource_adapter {
Subresource::Subresource(const RangeEncoder& encoder, const VkImageSubresource& subres)
@@ -156,8 +160,8 @@
}
RangeEncoder::RangeEncoder(const VkImageSubresourceRange& full_range, const AspectParameters* param)
- : full_range_(full_range),
- limits_(param->AspectMask(), full_range.levelCount, full_range.layerCount, param->AspectCount()),
+ : limits_(param->AspectMask(), full_range.levelCount, full_range.layerCount, param->AspectCount()),
+ full_range_(full_range),
mip_size_(full_range.layerCount),
aspect_size_(mip_size_ * full_range.levelCount),
aspect_bits_(param->AspectBits()),
@@ -187,7 +191,9 @@
// the encoder) will span the levelCount mip levels as weill.
RangeGenerator::RangeGenerator(const RangeEncoder& encoder, const VkImageSubresourceRange& subres_range)
: encoder_(&encoder), isr_pos_(encoder, subres_range), pos_(), aspect_base_() {
- assert(IsValid(encoder, isr_pos_.Limits()));
+ assert((((isr_pos_.Limits()).aspectMask & (encoder.Limits()).aspectMask) == (isr_pos_.Limits()).aspectMask) &&
+ ((isr_pos_.Limits()).baseMipLevel + (isr_pos_.Limits()).levelCount <= (encoder.Limits()).mipLevel) &&
+ ((isr_pos_.Limits()).baseArrayLayer + (isr_pos_.Limits()).layerCount <= (encoder.Limits()).arrayLayer));
// To see if we have a full range special case, need to compare the subres_range against the *encoders* limits
const auto& limits = encoder.Limits();
@@ -261,6 +267,194 @@
return *this;
}
+ImageRangeEncoder::ImageRangeEncoder(const IMAGE_STATE& image)
+ : ImageRangeEncoder(image, AspectParameters::Get(image.full_range.aspectMask)) {}
+
+ImageRangeEncoder::ImageRangeEncoder(const IMAGE_STATE& image, const AspectParameters* param)
+ : RangeEncoder(image.full_range, param), image_(&image) {
+ if (image_->createInfo.extent.depth > 1) {
+ limits_.arrayLayer = image_->createInfo.extent.depth;
+ }
+ VkSubresourceLayout layout = {};
+ VkImageSubresource subres = {};
+ VkImageSubresourceLayers subres_layers = {limits_.aspectMask, 0, 0, limits_.arrayLayer};
+ linear_image = false;
+
+ // WORKAROUND for dev_sim and mock_icd not containing valid VkSubresourceLayout yet. Treat it as optimal image.
+ if (image_->createInfo.tiling != VK_IMAGE_TILING_OPTIMAL) {
+ subres = {static_cast<VkImageAspectFlags>(AspectBit(0)), 0, 0};
+ DispatchGetImageSubresourceLayout(image_->store_device_as_workaround, image_->image, &subres, &layout);
+ if (layout.size > 0) {
+ linear_image = true;
+ }
+ }
+
+ for (uint32_t mip_index = 0; mip_index < limits_.mipLevel; ++mip_index) {
+ subres_layers.mipLevel = mip_index;
+ subres.mipLevel = mip_index;
+ for (uint32_t aspect_index = 0; aspect_index < limits_.aspect_index; ++aspect_index) {
+ subres.aspectMask = static_cast<VkImageAspectFlags>(AspectBit(aspect_index));
+ subres_layers.aspectMask = subres.aspectMask;
+
+ auto subres_extent = GetImageSubresourceExtent(image_, &subres_layers);
+ subres_extents_.push_back(subres_extent);
+
+ if (mip_index == 0) {
+ texel_sizes_.push_back(FormatTexelSize(image.createInfo.format, subres.aspectMask));
+ }
+ if (linear_image) {
+ DispatchGetImageSubresourceLayout(image_->store_device_as_workaround, image_->image, &subres, &layout);
+ subres_layouts_.push_back(layout);
+ } else {
+ layout.offset += layout.size;
+ layout.rowPitch = static_cast<VkDeviceSize>(floor(subres_extent.width * texel_sizes_[aspect_index]));
+ layout.arrayPitch = layout.rowPitch * subres_extent.height;
+ layout.depthPitch = layout.arrayPitch;
+ layout.size = layout.arrayPitch * limits_.arrayLayer;
+ subres_layouts_.push_back(layout);
+ }
+ }
+ }
+}
+
+IndexType ImageRangeEncoder::Encode(const VkImageSubresource& subres, uint32_t layer, VkOffset3D offset) const {
+ const auto& subres_layout = SubresourceLayout(subres);
+ return static_cast<IndexType>(floor(layer * subres_layout.arrayPitch + offset.z * subres_layout.depthPitch +
+ offset.y * subres_layout.rowPitch +
+ offset.x * texel_sizes_[LowerBoundFromMask(subres.aspectMask)] + subres_layout.offset));
+}
+
+void ImageRangeEncoder::Decode(const VkImageSubresource& subres, const IndexType& encode, uint32_t& out_layer,
+ VkOffset3D& out_offset) const {
+ const auto& subres_layout = SubresourceLayout(subres);
+ IndexType decode = encode - subres_layout.offset;
+ out_layer = static_cast<uint32_t>(decode / subres_layout.arrayPitch);
+ decode -= (out_layer * subres_layout.arrayPitch);
+ out_offset.z = static_cast<int32_t>(decode / subres_layout.depthPitch);
+ decode -= (out_offset.z * subres_layout.depthPitch);
+ out_offset.y = static_cast<int32_t>(decode / subres_layout.rowPitch);
+ decode -= (out_offset.y * subres_layout.rowPitch);
+ out_offset.x = static_cast<int32_t>(decode / texel_sizes_[LowerBoundFromMask(subres.aspectMask)]);
+}
+
+const VkSubresourceLayout& ImageRangeEncoder::SubresourceLayout(const VkImageSubresource& subres) const {
+ uint32_t subres_layouts_index = subres.mipLevel * limits_.aspect_index + LowerBoundFromMask(subres.aspectMask);
+ return subres_layouts_[subres_layouts_index];
+}
+
+inline VkImageSubresourceRange GetRemaining(const VkImageSubresourceRange& full_range, VkImageSubresourceRange subres_range) {
+ if (subres_range.levelCount == VK_REMAINING_MIP_LEVELS) {
+ subres_range.levelCount = full_range.levelCount - subres_range.baseMipLevel;
+ }
+ if (subres_range.layerCount == VK_REMAINING_ARRAY_LAYERS) {
+ subres_range.layerCount = full_range.layerCount - subres_range.baseArrayLayer;
+ }
+ return subres_range;
+}
+
+ImageRangeGenerator::ImageRangeGenerator(const ImageRangeEncoder& encoder, const VkImageSubresourceRange& subres_range,
+ const VkOffset3D& offset, const VkExtent3D& extent)
+ : encoder_(&encoder), subres_range_(GetRemaining(encoder.FullRange(), subres_range)), offset_(offset), extent_(extent) {
+ assert(IsValid(*encoder_, subres_range_));
+ mip_level_index_ = 0;
+ aspect_index_ = encoder_->LowerBoundFromMask(subres_range_.aspectMask);
+ if ((offset_.z + extent_.depth) == 1) {
+ range_arraylayer_base_ = subres_range_.baseArrayLayer;
+ range_layer_count_ = subres_range_.layerCount;
+ } else {
+ range_arraylayer_base_ = offset_.z;
+ range_layer_count_ = extent_.depth;
+ }
+ SetPos();
+}
+
+void ImageRangeGenerator::SetPos() {
+ VkImageSubresource subres = {static_cast<VkImageAspectFlags>(encoder_->AspectBit(aspect_index_)),
+ subres_range_.baseMipLevel + mip_level_index_, subres_range_.baseArrayLayer};
+ subres_layout_ = &(encoder_->SubresourceLayout(subres));
+ const VkExtent3D& subres_extent = encoder_->SubresourceExtent(subres.mipLevel, aspect_index_);
+ Subresource limits = encoder_->Limits();
+
+ offset_y_count_ = static_cast<int32_t>((extent_.height > subres_extent.height) ? subres_extent.height : extent_.height);
+ layer_count_ = range_layer_count_;
+ mip_count_ = subres_range_.levelCount;
+ aspect_count_ = limits.aspect_index;
+ pos_.begin = encoder_->Encode(subres, subres_range_.baseArrayLayer, offset_);
+ pos_.end = pos_.begin;
+
+ if (offset_.x == 0 && extent_.width >= subres_extent.width) {
+ offset_y_count_ = 1;
+ if (offset_.y == 0 && extent_.height >= subres_extent.height) {
+ layer_count_ = 1;
+ if (range_arraylayer_base_ == 0 && range_layer_count_ == limits.arrayLayer) {
+ mip_count_ = 1;
+ if (subres_range_.baseMipLevel == 0 && subres_range_.levelCount == limits.mipLevel) {
+ for (uint32_t aspect_index = aspect_index_; aspect_index < aspect_count_;) {
+ subres.aspectMask = static_cast<VkImageAspectFlags>(encoder_->AspectBit(aspect_index));
+ for (uint32_t mip_index = 0; mip_index < limits.mipLevel; ++mip_index) {
+ subres.mipLevel = mip_index;
+ const VkSubresourceLayout& subres_layout = encoder_->SubresourceLayout(subres);
+ pos_.end += subres_layout.size;
+ }
+ aspect_index = encoder_->LowerBoundFromMask(subres_range_.aspectMask, aspect_index + 1);
+ }
+ aspect_count_ = 1;
+ } else {
+ for (uint32_t mip_index = mip_level_index_; mip_index < subres_range_.levelCount; ++mip_index) {
+ const VkSubresourceLayout& subres_layout = encoder_->SubresourceLayout(subres);
+ pos_.end += subres_layout.size;
+ subres.mipLevel++;
+ }
+ }
+ } else {
+ pos_.end += subres_layout_->arrayPitch * range_layer_count_;
+ }
+ } else {
+ pos_.end += (subres_layout_->rowPitch * offset_y_count_);
+ }
+ } else {
+ pos_.end += static_cast<IndexType>(floor(encoder_->TexelSize(aspect_index_) *
+ ((extent_.width > subres_extent.width) ? subres_extent.width : extent_.width)));
+ }
+ offset_layer_base_ = pos_;
+ offset_offset_y_base_ = pos_;
+ arrayLayer_index_ = 0;
+ offset_y_index_ = 0;
+}
+
+ImageRangeGenerator* ImageRangeGenerator::operator++() {
+ offset_y_index_++;
+
+ if (offset_y_index_ < offset_y_count_) {
+ offset_offset_y_base_ += subres_layout_->rowPitch;
+ pos_ = offset_offset_y_base_;
+ } else {
+ offset_y_index_ = 0;
+ arrayLayer_index_++;
+ if (arrayLayer_index_ < layer_count_) {
+ offset_layer_base_ += subres_layout_->arrayPitch;
+ offset_offset_y_base_ = offset_layer_base_;
+ pos_ = offset_layer_base_;
+ } else {
+ arrayLayer_index_ = 0;
+ mip_level_index_++;
+ if (mip_level_index_ < mip_count_) {
+ SetPos();
+ } else {
+ mip_level_index_ = 0;
+ aspect_index_ = encoder_->LowerBoundFromMask(subres_range_.aspectMask, aspect_index_ + 1);
+ if (aspect_index_ < aspect_count_) {
+ SetPos();
+ } else {
+ // End
+ pos_ = {0, 0};
+ }
+ }
+ }
+ }
+ return this;
+}
+
template <typename AspectTraits>
class AspectParametersImpl : public AspectParameters {
public:
diff --git a/layers/subresource_adapter.h b/layers/subresource_adapter.h
index 8a2bfef..0f3e7f1 100644
--- a/layers/subresource_adapter.h
+++ b/layers/subresource_adapter.h
@@ -25,6 +25,7 @@
#include <algorithm>
#include <array>
+#include <vector>
#include "range_vector.h"
#ifndef SPARSE_CONTAINER_UNIT_TEST
#include "vulkan/vulkan.h"
@@ -32,6 +33,8 @@
#include "vk_snippets.h"
#endif
+class IMAGE_STATE;
+
namespace subresource_adapter {
class RangeEncoder;
@@ -47,6 +50,7 @@
// Interface for aspect specific traits objects (now isolated in the cpp file)
class AspectParameters {
public:
+ virtual ~AspectParameters() {}
static const AspectParameters* Get(VkImageAspectFlags);
typedef uint32_t (*MaskIndexFunc)(VkImageAspectFlags);
virtual VkImageAspectFlags AspectMask() const = 0;
@@ -78,8 +82,8 @@
// The default constructor for default iterators
RangeEncoder()
- : full_range_(),
- limits_(),
+ : limits_(),
+ full_range_(),
mip_size_(0),
aspect_size_(0),
aspect_bits_(nullptr),
@@ -94,7 +98,8 @@
// Create the encoder suitable to the full range (aspect mask *must* be canonical)
RangeEncoder(const VkImageSubresourceRange& full_range)
: RangeEncoder(full_range, AspectParameters::Get(full_range.aspectMask)) {}
- RangeEncoder(const RangeEncoder& from);
+ RangeEncoder(const RangeEncoder& from) = default;
+ ;
inline bool InRange(const VkImageSubresource& subres) const {
bool in_range = (subres.mipLevel < limits_.mipLevel) && (subres.arrayLayer < limits_.arrayLayer) &&
@@ -220,9 +225,10 @@
uint32_t LowerBoundWithStartImpl2(VkImageAspectFlags aspect_mask, uint32_t start) const;
uint32_t LowerBoundWithStartImpl3(VkImageAspectFlags aspect_mask, uint32_t start) const;
+ Subresource limits_;
+
private:
VkImageSubresourceRange full_range_;
- Subresource limits_;
const size_t mip_size_;
const size_t aspect_size_;
const VkImageAspectFlagBits* const aspect_bits_;
@@ -287,7 +293,7 @@
// General purpose and slow, when we have no other information to update the generator
void Seek(IndexType index) {
// skip forward past discontinuities
- *static_cast<Subresource* const>(this) = encoder_->Decode(index);
+ *static_cast<Subresource*>(this) = encoder_->Decode(index);
}
const VkImageSubresource& operator*() const { return *this; }
@@ -324,6 +330,204 @@
uint32_t aspect_index_ = 0;
};
+class ImageRangeEncoder : public RangeEncoder {
+ public:
+ // The default constructor for default iterators
+ ImageRangeEncoder() : image_(nullptr) {}
+
+ ImageRangeEncoder(const IMAGE_STATE& image, const AspectParameters* param);
+ ImageRangeEncoder(const IMAGE_STATE& image);
+ ImageRangeEncoder(const ImageRangeEncoder& from) = default;
+
+ inline IndexType Encode(const VkImageSubresource& subres, uint32_t layer, VkOffset3D offset) const;
+ void Decode(const VkImageSubresource& subres, const IndexType& encode, uint32_t& out_layer, VkOffset3D& out_offset) const;
+
+ const VkSubresourceLayout& SubresourceLayout(const VkImageSubresource& subres) const;
+ inline const VkExtent3D& SubresourceExtent(int mip_level, int aspect_index_) const {
+ return subres_extents_[mip_level * limits_.aspect_index + aspect_index_];
+ }
+ inline const double& TexelSize(int aspect_index) const { return texel_sizes_[aspect_index]; }
+ inline bool IsLinearImage() const { return linear_image; }
+
+ private:
+ bool linear_image;
+ const IMAGE_STATE* image_;
+ std::vector<double> texel_sizes_;
+ std::vector<VkExtent3D> subres_extents_;
+ std::vector<VkSubresourceLayout> subres_layouts_;
+};
+
+class ImageRangeGenerator {
+ public:
+ ImageRangeGenerator() : encoder_(nullptr), subres_range_(), offset_(), extent_() {}
+ bool operator!=(const ImageRangeGenerator& rhs) { return (pos_ != rhs.pos_) || (&encoder_ != &rhs.encoder_); }
+ ImageRangeGenerator(const ImageRangeEncoder& encoder);
+ ImageRangeGenerator(const ImageRangeEncoder& encoder, const VkImageSubresourceRange& subres_range, const VkOffset3D& offset,
+ const VkExtent3D& extent);
+ inline const IndexRange& operator*() const { return pos_; }
+ inline const IndexRange* operator->() const { return &pos_; }
+ ImageRangeGenerator* operator++();
+ void SetPos();
+
+ private:
+ const ImageRangeEncoder* encoder_;
+ const VkImageSubresourceRange subres_range_;
+ const VkOffset3D offset_;
+ const VkExtent3D extent_;
+ uint32_t range_arraylayer_base_;
+ uint32_t range_layer_count_;
+
+ IndexRange pos_;
+ IndexRange offset_offset_y_base_;
+ IndexRange offset_layer_base_;
+ uint32_t offset_y_index_;
+ uint32_t offset_y_count_;
+ uint32_t aspect_count_ = 0;
+ uint32_t aspect_index_ = 0;
+
+ // It doesn't have offset_z. If the z > 1, it will be used in arrayLayer.
+ uint32_t arrayLayer_index_;
+ uint32_t layer_count_;
+ uint32_t mip_level_index_;
+ uint32_t mip_count_;
+ const VkSubresourceLayout* subres_layout_;
+};
+
+// Designed for use with RangeMap of MappedType
+template <typename Map>
+class ConstMapView {
+ public:
+ using KeyType = typename Map::key_type;
+ using MappedType = typename Map::mapped_type;
+ using MapValueType = typename Map::mapped_type;
+ using MapIterator = typename Map::const_iterator;
+ using CachedLowerBound = typename sparse_container::cached_lower_bound_impl<const Map>;
+
+ struct ValueType {
+ const VkImageSubresource& subresource;
+ MapIterator it;
+ ValueType(const VkImageSubresource& subresource_) : subresource(subresource_), it(){};
+ };
+ class ConstIterator {
+ public:
+ ConstIterator()
+ : view_(nullptr),
+ range_gen_(),
+ cached_it_(),
+ pos_(range_gen_.GetSubresource()),
+ current_index_(),
+ constant_value_bound_() {}
+ ConstIterator& operator++() {
+ Increment();
+ return *this;
+ }
+ const ValueType* operator->() const { return &pos_; }
+ const ValueType& operator*() const { return pos_; }
+ // Only for comparisons to end()
+ // Note: if a fully function == is needed, the AtEnd needs to be maintained, as end_iterator is a static.
+ bool AtEnd() const { return pos_.subresource.aspectMask == 0; }
+ bool operator==(const ConstIterator& other) const { return AtEnd() && other.AtEnd(); };
+ bool operator!=(const ConstIterator& other) const { return AtEnd() != other.AtEnd(); };
+
+ protected:
+ friend ConstMapView;
+ ConstIterator(const ConstMapView& view, const VkImageSubresourceRange& range)
+ : view_(&view),
+ range_gen_(view.GetEncoder(), range),
+ cached_it_(view.GetMap(), range_gen_->begin),
+ pos_(range_gen_.GetSubresource()),
+ current_index_(range_gen_->begin),
+ constant_value_bound_(current_index_) {
+ UpdateRangeAndValue();
+ }
+
+ void Increment() {
+ ++current_index_;
+ ++(range_gen_.GetSubresourceGenerator());
+ if (constant_value_bound_ <= current_index_) {
+ UpdateRangeAndValue();
+ }
+ }
+
+ void ForceEndCondition() { range_gen_.GetSubresource().aspectMask = 0; }
+
+ // Constant value range logice, subreource / lower bound position advance logic
+ // TODO: convert this piece into a template _impl function suitable for const and non-const view iterators
+ void UpdateRangeAndValue() {
+ bool not_found = true;
+ while (range_gen_->non_empty() && not_found) {
+ if (!cached_it_.includes(current_index_)) {
+ // The result of the seek can be invalid, valid, or end...
+ cached_it_.seek(current_index_);
+ }
+
+ if (cached_it_->lower_bound == view_->GetMap().end()) {
+ // We're past the end of mapped data. Set end condtion.
+ ForceEndCondition();
+ not_found = false;
+ } else {
+ // Search within the current range_ for a constant valid constant value interval
+ // The while condition allows the parallel iterator to advance constant value ranges as needed.
+ while (range_gen_->includes(current_index_) && not_found) {
+ if (cached_it_->valid) {
+ // Our position with in the map is valid so we can update our value
+ pos_.it = cached_it_->lower_bound;
+ constant_value_bound_ = std::min(cached_it_->lower_bound->first.end, range_gen_->end);
+ not_found = false;
+ } else {
+ // We're skipping this gap in Map, set the index to the exclusive end and look again
+ // Note that we ONLY need to Seek the Subresource generator on a skip condition.
+ current_index_ = std::min(cached_it_->lower_bound->first.begin, range_gen_->end);
+ constant_value_bound_ = current_index_;
+ // Move the subresource to the end of the skipped range
+ range_gen_.GetSubresourceGenerator().Seek(current_index_);
+ cached_it_.seek(current_index_);
+ }
+ }
+
+ if (not_found) {
+ // We need to advance the index range to search as the current cached_it_ lies outside it, and there's
+ // no easy way to seek RangeGen
+ // ++range_gen will update Subresource.
+ ++range_gen_;
+ current_index_ = range_gen_->begin;
+ }
+ }
+ }
+
+ if (range_gen_->empty()) {
+ ForceEndCondition();
+ }
+ }
+
+ private:
+ const ConstMapView* view_;
+ RangeGenerator range_gen_;
+ CachedLowerBound cached_it_;
+ ValueType pos_;
+ IndexType current_index_;
+ IndexType constant_value_bound_;
+ };
+
+ const Map& GetMap() const { return *map_; }
+ const RangeEncoder& GetEncoder() const { return *encoder_; }
+
+ inline ConstIterator Begin(const VkImageSubresourceRange& range) const { return ConstIterator(*this, range); }
+ inline const ConstIterator& End() const { return end_; }
+
+ // Enable range based for....
+ inline ConstIterator begin() const { return Begin(encoder_->FullRange()); }
+ inline const ConstIterator& end() const { return End(); }
+
+ ConstMapView() : map_(nullptr), encoder_(nullptr), end_() {}
+ ConstMapView(const Map& map, const RangeEncoder& encoder) : map_(&map), encoder_(&encoder), end_() {}
+
+ private:
+ const Map* map_;
+ const RangeEncoder* encoder_;
+ const ConstIterator end_;
+};
+
// double wrapped map variants.. to avoid needing to templatize on the range map type. The underlying maps are available for
// use in performance sensitive places that are *already* templatized (for example update_range_value).
// In STL style. Note that N must be < uint8_t max
@@ -389,16 +593,21 @@
}
IteratorImpl& operator=(const IteratorImpl& other) {
if (other.Tristate()) {
- // Tranisition to tristate
- *this = IteratorImpl();
- } else {
- if (other.SmallMode()) {
- small_it_ = other.small_it_;
- } else {
- big_it_ = other.big_it_;
+ // Transition to tristate
+ small_it_ = SmallIt();
+ big_it_ = BigIt();
+ } else if (other.SmallMode()) {
+ small_it_ = other.small_it_;
+ if (mode_ != other.mode_) {
+ big_it_ = BigIt();
}
- mode_ = other.mode_; // For transitions from Tristate.
+ } else {
+ big_it_ = other.big_it_;
+ if (mode_ != other.mode_) {
+ small_it_ = SmallIt();
+ }
}
+ mode_ = other.mode_;
return *this;
}
bool operator==(const IteratorImpl& other) const {
@@ -415,6 +624,10 @@
}
bool operator!=(const IteratorImpl& other) const { return !(*this == other); }
IteratorImpl() : small_it_(), big_it_(), mode_(BothRangeMapMode::kTristate) {}
+ IteratorImpl(const IteratorImpl& other)
+ : small_it_(other.SmallMode() ? other.small_it_ : SmallIt()),
+ big_it_(other.BigMode() ? other.big_it_ : BigIt()),
+ mode_(other.mode_){};
private:
IteratorImpl(BothRangeMapMode mode) : small_it_(), big_it_(), mode_(mode) {}
diff --git a/layers/synchronization_validation.cpp b/layers/synchronization_validation.cpp
new file mode 100644
index 0000000..c3397c3
--- /dev/null
+++ b/layers/synchronization_validation.cpp
@@ -0,0 +1,4003 @@
+/* Copyright (c) 2019-2020 The Khronos Group Inc.
+ * Copyright (c) 2019-2020 Valve Corporation
+ * Copyright (c) 2019-2020 LunarG, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Author: John Zulauf <jzulauf@lunarg.com>
+ */
+
+#include <limits>
+#include <vector>
+#include <memory>
+#include <bitset>
+#include "synchronization_validation.h"
+
+static const char *string_SyncHazardVUID(SyncHazard hazard) {
+ switch (hazard) {
+ case SyncHazard::NONE:
+ return "SYNC-HAZARD-NONE";
+ break;
+ case SyncHazard::READ_AFTER_WRITE:
+ return "SYNC-HAZARD-READ_AFTER_WRITE";
+ break;
+ case SyncHazard::WRITE_AFTER_READ:
+ return "SYNC-HAZARD-WRITE_AFTER_READ";
+ break;
+ case SyncHazard::WRITE_AFTER_WRITE:
+ return "SYNC-HAZARD-WRITE_AFTER_WRITE";
+ break;
+ case SyncHazard::READ_RACING_WRITE:
+ return "SYNC-HAZARD-READ-RACING-WRITE";
+ break;
+ case SyncHazard::WRITE_RACING_WRITE:
+ return "SYNC-HAZARD-WRITE-RACING-WRITE";
+ break;
+ case SyncHazard::WRITE_RACING_READ:
+ return "SYNC-HAZARD-WRITE-RACING-READ";
+ break;
+ default:
+ assert(0);
+ }
+ return "SYNC-HAZARD-INVALID";
+}
+
+static bool IsHazardVsRead(SyncHazard hazard) {
+ switch (hazard) {
+ case SyncHazard::NONE:
+ return false;
+ break;
+ case SyncHazard::READ_AFTER_WRITE:
+ return false;
+ break;
+ case SyncHazard::WRITE_AFTER_READ:
+ return true;
+ break;
+ case SyncHazard::WRITE_AFTER_WRITE:
+ return false;
+ break;
+ case SyncHazard::READ_RACING_WRITE:
+ return false;
+ break;
+ case SyncHazard::WRITE_RACING_WRITE:
+ return false;
+ break;
+ case SyncHazard::WRITE_RACING_READ:
+ return true;
+ break;
+ default:
+ assert(0);
+ }
+ return false;
+}
+
+static const char *string_SyncHazard(SyncHazard hazard) {
+ switch (hazard) {
+ case SyncHazard::NONE:
+ return "NONR";
+ break;
+ case SyncHazard::READ_AFTER_WRITE:
+ return "READ_AFTER_WRITE";
+ break;
+ case SyncHazard::WRITE_AFTER_READ:
+ return "WRITE_AFTER_READ";
+ break;
+ case SyncHazard::WRITE_AFTER_WRITE:
+ return "WRITE_AFTER_WRITE";
+ break;
+ case SyncHazard::READ_RACING_WRITE:
+ return "READ_RACING_WRITE";
+ break;
+ case SyncHazard::WRITE_RACING_WRITE:
+ return "WRITE_RACING_WRITE";
+ break;
+ case SyncHazard::WRITE_RACING_READ:
+ return "WRITE_RACING_READ";
+ break;
+ default:
+ assert(0);
+ }
+ return "INVALID HAZARD";
+}
+
+static const SyncStageAccessInfoType *SyncStageAccessInfoFromMask(SyncStageAccessFlags flags) {
+ // Return the info for the first bit found
+ const SyncStageAccessInfoType *info = nullptr;
+ uint32_t index = 0;
+ while (flags) {
+ if (flags & 0x1) {
+ flags = 0;
+ info = &syncStageAccessInfoByStageAccessIndex[index];
+ } else {
+ flags = flags >> 1;
+ index++;
+ }
+ }
+ return info;
+}
+
+static std::string string_SyncStageAccessFlags(SyncStageAccessFlags flags, const char *sep = "|") {
+ std::string out_str;
+ uint32_t index = 0;
+ if (0 == flags) {
+ out_str = "0";
+ }
+ while (flags) {
+ const auto &info = syncStageAccessInfoByStageAccessIndex[index];
+ if (flags & info.stage_access_bit) {
+ if (!out_str.empty()) {
+ out_str.append(sep);
+ }
+ out_str.append(info.name);
+ flags = flags & ~info.stage_access_bit;
+ }
+ index++;
+ assert(index < syncStageAccessInfoByStageAccessIndex.size());
+ }
+ if (out_str.length() == 0) {
+ out_str.append("Unhandled SyncStageAccess");
+ }
+ return out_str;
+}
+
+static std::string string_UsageTag(const HazardResult &hazard) {
+ const auto &tag = hazard.tag;
+ assert(hazard.usage_index < static_cast<SyncStageAccessIndex>(syncStageAccessInfoByStageAccessIndex.size()));
+ const auto &usage_info = syncStageAccessInfoByStageAccessIndex[hazard.usage_index];
+ std::stringstream out;
+ const auto *info = SyncStageAccessInfoFromMask(hazard.prior_access);
+ const char *stage_access_name = info ? info->name : "INVALID_STAGE_ACCESS";
+ out << "(usage: " << usage_info.name << ", prior_usage: " << stage_access_name;
+ if (IsHazardVsRead(hazard.hazard)) {
+ const auto barriers = hazard.access_state->GetReadBarriers(hazard.prior_access);
+ out << ", read_barriers: " << string_VkPipelineStageFlags(barriers);
+ } else {
+ SyncStageAccessFlags write_barrier = hazard.access_state->GetWriteBarriers();
+ out << ", write_barriers: " << string_SyncStageAccessFlags(write_barrier);
+ }
+
+ out << ", command: " << CommandTypeString(tag.command);
+ out << ", seq_no: " << (tag.index & 0xFFFFFFFF) << ", reset_no: " << (tag.index >> 32) << ")";
+ return out.str();
+}
+
+// NOTE: the attachement read flag is put *only* in the access scope and not in the exect scope, since the ordering
+// rules apply only to this specific access for this stage, and not the stage as a whole. The ordering detection
+// also reflects this special case for read hazard detection (using access instead of exec scope)
+static constexpr VkPipelineStageFlags kColorAttachmentExecScope = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
+static constexpr SyncStageAccessFlags kColorAttachmentAccessScope =
+ SyncStageAccessFlagBits::SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ_BIT |
+ SyncStageAccessFlagBits::SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT |
+ SyncStageAccessFlagBits::SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE_BIT |
+ SyncStageAccessFlagBits::SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ_BIT; // Note: this is intentionally not in the exec scope
+static constexpr VkPipelineStageFlags kDepthStencilAttachmentExecScope =
+ VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
+static constexpr SyncStageAccessFlags kDepthStencilAttachmentAccessScope =
+ SyncStageAccessFlagBits::SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
+ SyncStageAccessFlagBits::SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
+ SyncStageAccessFlagBits::SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
+ SyncStageAccessFlagBits::SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
+ SyncStageAccessFlagBits::SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ_BIT; // Note: this is intentionally not in the exec scope
+
+static constexpr SyncOrderingBarrier kColorAttachmentRasterOrder = {kColorAttachmentExecScope, kColorAttachmentAccessScope};
+static constexpr SyncOrderingBarrier kDepthStencilAttachmentRasterOrder = {kDepthStencilAttachmentExecScope,
+ kDepthStencilAttachmentAccessScope};
+static constexpr SyncOrderingBarrier kAttachmentRasterOrder = {kDepthStencilAttachmentExecScope | kColorAttachmentExecScope,
+ kDepthStencilAttachmentAccessScope | kColorAttachmentAccessScope};
+// Sometimes we have an internal access conflict, and we using the kCurrentCommandTag to set and detect in temporary/proxy contexts
+static const ResourceUsageTag kCurrentCommandTag(ResourceUsageTag::kMaxIndex, CMD_NONE);
+
+inline VkDeviceSize GetRealWholeSize(VkDeviceSize offset, VkDeviceSize size, VkDeviceSize whole_size) {
+ if (size == VK_WHOLE_SIZE) {
+ return (whole_size - offset);
+ }
+ return size;
+}
+
+template <typename T>
+static ResourceAccessRange MakeRange(const T &has_offset_and_size) {
+ return ResourceAccessRange(has_offset_and_size.offset, (has_offset_and_size.offset + has_offset_and_size.size));
+}
+
+static ResourceAccessRange MakeRange(VkDeviceSize start, VkDeviceSize size) { return ResourceAccessRange(start, (start + size)); }
+
+// Expand the pipeline stage without regard to whether the are valid w.r.t. queue or extension
+VkPipelineStageFlags ExpandPipelineStages(VkQueueFlags queue_flags, VkPipelineStageFlags stage_mask) {
+ VkPipelineStageFlags expanded = stage_mask;
+ if (VK_PIPELINE_STAGE_ALL_COMMANDS_BIT & stage_mask) {
+ expanded = expanded & ~VK_PIPELINE_STAGE_ALL_COMMANDS_BIT;
+ for (const auto &all_commands : syncAllCommandStagesByQueueFlags) {
+ if (all_commands.first & queue_flags) {
+ expanded |= all_commands.second;
+ }
+ }
+ }
+ if (VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT & stage_mask) {
+ expanded = expanded & ~VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT;
+ expanded |= syncAllCommandStagesByQueueFlags.at(VK_QUEUE_GRAPHICS_BIT) & ~VK_PIPELINE_STAGE_HOST_BIT;
+ }
+ return expanded;
+}
+
+VkPipelineStageFlags RelatedPipelineStages(VkPipelineStageFlags stage_mask,
+ std::map<VkPipelineStageFlagBits, VkPipelineStageFlags> &map) {
+ VkPipelineStageFlags unscanned = stage_mask;
+ VkPipelineStageFlags related = 0;
+ for (const auto &entry : map) {
+ const auto &stage = entry.first;
+ if (stage & unscanned) {
+ related = related | entry.second;
+ unscanned = unscanned & ~stage;
+ if (!unscanned) break;
+ }
+ }
+ return related;
+}
+
+VkPipelineStageFlags WithEarlierPipelineStages(VkPipelineStageFlags stage_mask) {
+ return stage_mask | RelatedPipelineStages(stage_mask, syncLogicallyEarlierStages);
+}
+
+VkPipelineStageFlags WithLaterPipelineStages(VkPipelineStageFlags stage_mask) {
+ return stage_mask | RelatedPipelineStages(stage_mask, syncLogicallyLaterStages);
+}
+
+static const ResourceAccessRange full_range(std::numeric_limits<VkDeviceSize>::min(), std::numeric_limits<VkDeviceSize>::max());
+
+void GetBufferRange(VkDeviceSize &range_start, VkDeviceSize &range_size, VkDeviceSize offset, VkDeviceSize buf_whole_size,
+ uint32_t first_index, uint32_t count, VkDeviceSize stride) {
+ range_start = offset + first_index * stride;
+ range_size = 0;
+ if (count == UINT32_MAX) {
+ range_size = buf_whole_size - range_start;
+ } else {
+ range_size = count * stride;
+ }
+}
+
+SyncStageAccessIndex GetSyncStageAccessIndexsByDescriptorSet(VkDescriptorType descriptor_type, const interface_var &descriptor_data,
+ VkShaderStageFlagBits stage_flag) {
+ if (descriptor_type == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT) {
+ assert(stage_flag == VK_SHADER_STAGE_FRAGMENT_BIT);
+ return SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ;
+ }
+ auto stage_access = syncStageAccessMaskByShaderStage.find(stage_flag);
+ if (stage_access == syncStageAccessMaskByShaderStage.end()) {
+ assert(0);
+ }
+ if (descriptor_type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER || descriptor_type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) {
+ return stage_access->second.uniform_read;
+ }
+
+ // If the desriptorSet is writable, we don't need to care SHADER_READ. SHADER_WRITE is enough.
+ // Because if write hazard happens, read hazard might or might not happen.
+ // But if write hazard doesn't happen, read hazard is impossible to happen.
+ if (descriptor_data.is_writable) {
+ return stage_access->second.shader_write;
+ }
+ return stage_access->second.shader_read;
+}
+
+bool IsImageLayoutDepthWritable(VkImageLayout image_layout) {
+ return (image_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL ||
+ image_layout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL ||
+ image_layout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL)
+ ? true
+ : false;
+}
+
+bool IsImageLayoutStencilWritable(VkImageLayout image_layout) {
+ return (image_layout == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL ||
+ image_layout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL ||
+ image_layout == VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL)
+ ? true
+ : false;
+}
+
+// Class AccessContext stores the state of accesses specific to a Command, Subpass, or Queue
+const std::array<AccessContext::AddressType, AccessContext::kAddressTypeCount> AccessContext::kAddressTypes = {
+ AccessContext::AddressType::kLinearAddress, AccessContext::AddressType::kIdealizedAddress};
+
+// Tranverse the attachment resolves for this a specific subpass, and do action() to them.
+// Used by both validation and record operations
+//
+// The signature for Action() reflect the needs of both uses.
+template <typename Action>
+void ResolveOperation(Action &action, const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area,
+ const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, uint32_t subpass) {
+ VkExtent3D extent = CastTo3D(render_area.extent);
+ VkOffset3D offset = CastTo3D(render_area.offset);
+ const auto &rp_ci = rp_state.createInfo;
+ const auto *attachment_ci = rp_ci.pAttachments;
+ const auto &subpass_ci = rp_ci.pSubpasses[subpass];
+
+ // Color resolves -- require an inuse color attachment and a matching inuse resolve attachment
+ const auto *color_attachments = subpass_ci.pColorAttachments;
+ const auto *color_resolve = subpass_ci.pResolveAttachments;
+ if (color_resolve && color_attachments) {
+ for (uint32_t i = 0; i < subpass_ci.colorAttachmentCount; i++) {
+ const auto &color_attach = color_attachments[i].attachment;
+ const auto &resolve_attach = subpass_ci.pResolveAttachments[i].attachment;
+ if ((color_attach != VK_ATTACHMENT_UNUSED) && (resolve_attach != VK_ATTACHMENT_UNUSED)) {
+ action("color", "resolve read", color_attach, resolve_attach, attachment_views[color_attach],
+ SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ, kColorAttachmentRasterOrder, offset, extent, 0);
+ action("color", "resolve write", color_attach, resolve_attach, attachment_views[resolve_attach],
+ SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE, kColorAttachmentRasterOrder, offset, extent, 0);
+ }
+ }
+ }
+
+ // Depth stencil resolve only if the extension is present
+ const auto ds_resolve = lvl_find_in_chain<VkSubpassDescriptionDepthStencilResolve>(subpass_ci.pNext);
+ if (ds_resolve && ds_resolve->pDepthStencilResolveAttachment &&
+ (ds_resolve->pDepthStencilResolveAttachment->attachment != VK_ATTACHMENT_UNUSED) && subpass_ci.pDepthStencilAttachment &&
+ (subpass_ci.pDepthStencilAttachment->attachment != VK_ATTACHMENT_UNUSED)) {
+ const auto src_at = subpass_ci.pDepthStencilAttachment->attachment;
+ const auto src_ci = attachment_ci[src_at];
+ // The formats are required to match so we can pick either
+ const bool resolve_depth = (ds_resolve->depthResolveMode != VK_RESOLVE_MODE_NONE) && FormatHasDepth(src_ci.format);
+ const bool resolve_stencil = (ds_resolve->stencilResolveMode != VK_RESOLVE_MODE_NONE) && FormatHasStencil(src_ci.format);
+ const auto dst_at = ds_resolve->pDepthStencilResolveAttachment->attachment;
+ VkImageAspectFlags aspect_mask = 0u;
+
+ // Figure out which aspects are actually touched during resolve operations
+ const char *aspect_string = nullptr;
+ if (resolve_depth && resolve_stencil) {
+ // Validate all aspects together
+ aspect_mask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
+ aspect_string = "depth/stencil";
+ } else if (resolve_depth) {
+ // Validate depth only
+ aspect_mask = VK_IMAGE_ASPECT_DEPTH_BIT;
+ aspect_string = "depth";
+ } else if (resolve_stencil) {
+ // Validate all stencil only
+ aspect_mask = VK_IMAGE_ASPECT_STENCIL_BIT;
+ aspect_string = "stencil";
+ }
+
+ if (aspect_mask) {
+ action(aspect_string, "resolve read", src_at, dst_at, attachment_views[src_at],
+ SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ, kDepthStencilAttachmentRasterOrder, offset, extent,
+ aspect_mask);
+ action(aspect_string, "resolve write", src_at, dst_at, attachment_views[dst_at],
+ SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE, kAttachmentRasterOrder, offset, extent, aspect_mask);
+ }
+ }
+}
+
+// Action for validating resolve operations
+class ValidateResolveAction {
+ public:
+ ValidateResolveAction(VkRenderPass render_pass, uint32_t subpass, const AccessContext &context, const SyncValidator &sync_state,
+ const char *func_name)
+ : render_pass_(render_pass),
+ subpass_(subpass),
+ context_(context),
+ sync_state_(sync_state),
+ func_name_(func_name),
+ skip_(false) {}
+ void operator()(const char *aspect_name, const char *attachment_name, uint32_t src_at, uint32_t dst_at,
+ const IMAGE_VIEW_STATE *view, SyncStageAccessIndex current_usage, const SyncOrderingBarrier &ordering,
+ const VkOffset3D &offset, const VkExtent3D &extent, VkImageAspectFlags aspect_mask) {
+ HazardResult hazard;
+ hazard = context_.DetectHazard(view, current_usage, ordering, offset, extent, aspect_mask);
+ if (hazard.hazard) {
+ skip_ |= sync_state_.LogError(render_pass_, string_SyncHazardVUID(hazard.hazard),
+ "%s: Hazard %s in subpass %" PRIu32 "during %s %s, from attachment %" PRIu32
+ " to resolve attachment %" PRIu32 ". Access info %s.",
+ func_name_, string_SyncHazard(hazard.hazard), subpass_, aspect_name, attachment_name,
+ src_at, dst_at, string_UsageTag(hazard).c_str());
+ }
+ }
+ // Providing a mechanism for the constructing caller to get the result of the validation
+ bool GetSkip() const { return skip_; }
+
+ private:
+ VkRenderPass render_pass_;
+ const uint32_t subpass_;
+ const AccessContext &context_;
+ const SyncValidator &sync_state_;
+ const char *func_name_;
+ bool skip_;
+};
+
+// Update action for resolve operations
+class UpdateStateResolveAction {
+ public:
+ UpdateStateResolveAction(AccessContext &context, const ResourceUsageTag &tag) : context_(context), tag_(tag) {}
+ void operator()(const char *aspect_name, const char *attachment_name, uint32_t src_at, uint32_t dst_at,
+ const IMAGE_VIEW_STATE *view, SyncStageAccessIndex current_usage, const SyncOrderingBarrier &ordering,
+ const VkOffset3D &offset, const VkExtent3D &extent, VkImageAspectFlags aspect_mask) {
+ // Ignores validation only arguments...
+ context_.UpdateAccessState(view, current_usage, offset, extent, aspect_mask, tag_);
+ }
+
+ private:
+ AccessContext &context_;
+ const ResourceUsageTag &tag_;
+};
+
+void HazardResult::Set(const ResourceAccessState *access_state_, SyncStageAccessIndex usage_index_, SyncHazard hazard_,
+ SyncStageAccessFlags prior_, const ResourceUsageTag &tag_) {
+ access_state = std::unique_ptr<const ResourceAccessState>(new ResourceAccessState(*access_state_));
+ usage_index = usage_index_;
+ hazard = hazard_;
+ prior_access = prior_;
+ tag = tag_;
+}
+
+AccessContext::AccessContext(uint32_t subpass, VkQueueFlags queue_flags,
+ const std::vector<SubpassDependencyGraphNode> &dependencies,
+ const std::vector<AccessContext> &contexts, const AccessContext *external_context) {
+ Reset();
+ const auto &subpass_dep = dependencies[subpass];
+ prev_.reserve(subpass_dep.prev.size());
+ prev_by_subpass_.resize(subpass, nullptr); // Can't be more prevs than the subpass we're on
+ for (const auto &prev_dep : subpass_dep.prev) {
+ assert(prev_dep.dependency);
+ const auto dep = *prev_dep.dependency;
+ prev_.emplace_back(const_cast<AccessContext *>(&contexts[dep.srcSubpass]), queue_flags, dep);
+ prev_by_subpass_[dep.srcSubpass] = &prev_.back();
+ }
+
+ async_.reserve(subpass_dep.async.size());
+ for (const auto async_subpass : subpass_dep.async) {
+ async_.emplace_back(const_cast<AccessContext *>(&contexts[async_subpass]));
+ }
+ if (subpass_dep.barrier_from_external) {
+ src_external_ = TrackBack(external_context, queue_flags, *subpass_dep.barrier_from_external);
+ } else {
+ src_external_ = TrackBack();
+ }
+ if (subpass_dep.barrier_to_external) {
+ dst_external_ = TrackBack(this, queue_flags, *subpass_dep.barrier_to_external);
+ } else {
+ dst_external_ = TrackBack();
+ }
+}
+
+template <typename Detector>
+HazardResult AccessContext::DetectPreviousHazard(AddressType type, const Detector &detector,
+ const ResourceAccessRange &range) const {
+ ResourceAccessRangeMap descent_map;
+ ResolvePreviousAccess(type, range, &descent_map, nullptr);
+
+ HazardResult hazard;
+ for (auto prev = descent_map.begin(); prev != descent_map.end() && !hazard.hazard; ++prev) {
+ hazard = detector.Detect(prev);
+ }
+ return hazard;
+}
+
+// A recursive range walker for hazard detection, first for the current context and the (DetectHazardRecur) to walk
+// the DAG of the contexts (for example subpasses)
+template <typename Detector>
+HazardResult AccessContext::DetectHazard(AddressType type, const Detector &detector, const ResourceAccessRange &range,
+ DetectOptions options) const {
+ HazardResult hazard;
+
+ if (static_cast<uint32_t>(options) & DetectOptions::kDetectAsync) {
+ // Async checks don't require recursive lookups, as the async lists are exhaustive for the top-level context
+ // so we'll check these first
+ for (const auto &async_context : async_) {
+ hazard = async_context->DetectAsyncHazard(type, detector, range);
+ if (hazard.hazard) return hazard;
+ }
+ }
+
+ const bool detect_prev = (static_cast<uint32_t>(options) & DetectOptions::kDetectPrevious) != 0;
+
+ const auto &accesses = GetAccessStateMap(type);
+ const auto from = accesses.lower_bound(range);
+ const auto to = accesses.upper_bound(range);
+ ResourceAccessRange gap = {range.begin, range.begin};
+
+ for (auto pos = from; pos != to; ++pos) {
+ // Cover any leading gap, or gap between entries
+ if (detect_prev) {
+ // TODO: After profiling we may want to change the descent logic such that we don't recur per gap...
+ // Cover any leading gap, or gap between entries
+ gap.end = pos->first.begin; // We know this begin is < range.end
+ if (gap.non_empty()) {
+ // Recur on all gaps
+ hazard = DetectPreviousHazard(type, detector, gap);
+ if (hazard.hazard) return hazard;
+ }
+ // Set up for the next gap. If pos..end is >= range.end, loop will exit, and trailing gap will be empty
+ gap.begin = pos->first.end;
+ }
+
+ hazard = detector.Detect(pos);
+ if (hazard.hazard) return hazard;
+ }
+
+ if (detect_prev) {
+ // Detect in the trailing empty as needed
+ gap.end = range.end;
+ if (gap.non_empty()) {
+ hazard = DetectPreviousHazard(type, detector, gap);
+ }
+ }
+
+ return hazard;
+}
+
+// A non recursive range walker for the asynchronous contexts (those we have no barriers with)
+template <typename Detector>
+HazardResult AccessContext::DetectAsyncHazard(AddressType type, const Detector &detector, const ResourceAccessRange &range) const {
+ auto &accesses = GetAccessStateMap(type);
+ const auto from = accesses.lower_bound(range);
+ const auto to = accesses.upper_bound(range);
+
+ HazardResult hazard;
+ for (auto pos = from; pos != to && !hazard.hazard; ++pos) {
+ hazard = detector.DetectAsync(pos);
+ }
+
+ return hazard;
+}
+
+// Returns the last resolved entry
+static void ResolveMapToEntry(ResourceAccessRangeMap *dest, ResourceAccessRangeMap::iterator entry,
+ ResourceAccessRangeMap::const_iterator first, ResourceAccessRangeMap::const_iterator last,
+ const SyncBarrier *barrier) {
+ auto at = entry;
+ for (auto pos = first; pos != last; ++pos) {
+ // Every member of the input iterator range must fit within the remaining portion of entry
+ assert(at->first.includes(pos->first));
+ assert(at != dest->end());
+ // Trim up at to the same size as the entry to resolve
+ at = sparse_container::split(at, *dest, pos->first);
+ auto access = pos->second;
+ if (barrier) {
+ access.ApplyBarrier(*barrier);
+ }
+ at->second.Resolve(access);
+ ++at; // Go to the remaining unused section of entry
+ }
+}
+
+void AccessContext::ResolveAccessRange(AddressType type, const ResourceAccessRange &range, const SyncBarrier *barrier,
+ ResourceAccessRangeMap *resolve_map, const ResourceAccessState *infill_state,
+ bool recur_to_infill) const {
+ if (!range.non_empty()) return;
+
+ ResourceRangeMergeIterator current(*resolve_map, GetAccessStateMap(type), range.begin);
+ while (current->range.non_empty() && range.includes(current->range.begin)) {
+ const auto current_range = current->range & range;
+ if (current->pos_B->valid) {
+ const auto &src_pos = current->pos_B->lower_bound;
+ auto access = src_pos->second;
+ if (barrier) {
+ access.ApplyBarrier(*barrier);
+ }
+ if (current->pos_A->valid) {
+ const auto trimmed = sparse_container::split(current->pos_A->lower_bound, *resolve_map, current_range);
+ trimmed->second.Resolve(access);
+ current.invalidate_A(trimmed);
+ } else {
+ auto inserted = resolve_map->insert(current->pos_A->lower_bound, std::make_pair(current_range, access));
+ current.invalidate_A(inserted); // Update the parallel iterator to point at the insert segment
+ }
+ } else {
+ // we have to descend to fill this gap
+ if (recur_to_infill) {
+ if (current->pos_A->valid) {
+ // Dest is valid, so we need to accumulate along the DAG and then resolve... in an N-to-1 resolve operation
+ ResourceAccessRangeMap gap_map;
+ ResolvePreviousAccess(type, current_range, &gap_map, infill_state);
+ ResolveMapToEntry(resolve_map, current->pos_A->lower_bound, gap_map.begin(), gap_map.end(), barrier);
+ } else {
+ // There isn't anything in dest in current)range, so we can accumulate directly into it.
+ ResolvePreviousAccess(type, current_range, resolve_map, infill_state);
+ if (barrier) {
+ // Need to apply the barrier to the accesses we accumulated, noting that we haven't updated current
+ for (auto pos = resolve_map->lower_bound(current_range); pos != current->pos_A->lower_bound; ++pos) {
+ pos->second.ApplyBarrier(*barrier);
+ }
+ }
+ }
+ // Given that there could be gaps we need to seek carefully to not repeatedly search the same gaps in the next
+ // iterator of the outer while.
+
+ // Set the parallel iterator to the end of this range s.t. ++ will move us to the next range whether or
+ // not the end of the range is a gap. For the seek to work, first we need to warn the parallel iterator
+ // we stepped on the dest map
+ const auto seek_to = current_range.end - 1; // The subtraction is safe as range can't be empty (loop condition)
+ current.invalidate_A(); // Changes current->range
+ current.seek(seek_to);
+ } else if (!current->pos_A->valid && infill_state) {
+ // If we didn't find anything in the current range, and we aren't reccuring... we infill if required
+ auto inserted = resolve_map->insert(current->pos_A->lower_bound, std::make_pair(current->range, *infill_state));
+ current.invalidate_A(inserted); // Update the parallel iterator to point at the correct segment after insert
+ }
+ }
+ ++current;
+ }
+
+ // Infill if range goes passed both the current and resolve map prior contents
+ if (recur_to_infill && (current->range.end < range.end)) {
+ ResourceAccessRange trailing_fill_range = {current->range.end, range.end};
+ ResourceAccessRangeMap gap_map;
+ const auto the_end = resolve_map->end();
+ ResolvePreviousAccess(type, trailing_fill_range, &gap_map, infill_state);
+ for (auto &access : gap_map) {
+ access.second.ApplyBarrier(*barrier);
+ resolve_map->insert(the_end, access);
+ }
+ }
+}
+
+void AccessContext::ResolvePreviousAccess(AddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
+ const ResourceAccessState *infill_state) const {
+ if ((prev_.size() == 0) && (src_external_.context == nullptr)) {
+ if (range.non_empty() && infill_state) {
+ descent_map->insert(std::make_pair(range, *infill_state));
+ }
+ } else {
+ // Look for something to fill the gap further along.
+ for (const auto &prev_dep : prev_) {
+ prev_dep.context->ResolveAccessRange(type, range, &prev_dep.barrier, descent_map, infill_state);
+ }
+
+ if (src_external_.context) {
+ src_external_.context->ResolveAccessRange(type, range, &src_external_.barrier, descent_map, infill_state);
+ }
+ }
+}
+
+AccessContext::AddressType AccessContext::ImageAddressType(const IMAGE_STATE &image) {
+ return (image.fragment_encoder->IsLinearImage()) ? AddressType::kLinearAddress : AddressType::kIdealizedAddress;
+}
+
+VkDeviceSize AccessContext::ResourceBaseAddress(const BINDABLE &bindable) {
+ return bindable.binding.offset + bindable.binding.mem_state->fake_base_address;
+}
+
+static bool SimpleBinding(const BINDABLE &bindable) { return !bindable.sparse && bindable.binding.mem_state; }
+
+static SyncStageAccessIndex ColorLoadUsage(VkAttachmentLoadOp load_op) {
+ const auto stage_access = (load_op == VK_ATTACHMENT_LOAD_OP_LOAD) ? SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_READ
+ : SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE;
+ return stage_access;
+}
+static SyncStageAccessIndex DepthStencilLoadUsage(VkAttachmentLoadOp load_op) {
+ const auto stage_access = (load_op == VK_ATTACHMENT_LOAD_OP_LOAD) ? SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_READ
+ : SYNC_EARLY_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE;
+ return stage_access;
+}
+
+// Caller must manage returned pointer
+static AccessContext *CreateStoreResolveProxyContext(const AccessContext &context, const RENDER_PASS_STATE &rp_state,
+ uint32_t subpass, const VkRect2D &render_area,
+ std::vector<const IMAGE_VIEW_STATE *> attachment_views) {
+ auto *proxy = new AccessContext(context);
+ proxy->UpdateAttachmentResolveAccess(rp_state, render_area, attachment_views, subpass, kCurrentCommandTag);
+ proxy->UpdateAttachmentStoreAccess(rp_state, render_area, attachment_views, subpass, kCurrentCommandTag);
+ return proxy;
+}
+
+void AccessContext::ResolvePreviousAccess(const IMAGE_STATE &image_state, const VkImageSubresourceRange &subresource_range_arg,
+ AddressType address_type, ResourceAccessRangeMap *descent_map,
+ const ResourceAccessState *infill_state) const {
+ if (!SimpleBinding(image_state)) return;
+
+ auto subresource_range = NormalizeSubresourceRange(image_state.createInfo, subresource_range_arg);
+ subresource_adapter::ImageRangeGenerator range_gen(*image_state.fragment_encoder.get(), subresource_range, {0, 0, 0},
+ image_state.createInfo.extent);
+ const auto base_address = ResourceBaseAddress(image_state);
+ for (; range_gen->non_empty(); ++range_gen) {
+ ResolvePreviousAccess(address_type, (*range_gen + base_address), descent_map, infill_state);
+ }
+}
+
+// Layout transitions are handled as if the were occuring in the beginning of the next subpass
+bool AccessContext::ValidateLayoutTransitions(const SyncValidator &sync_state, const RENDER_PASS_STATE &rp_state,
+ const VkRect2D &render_area, uint32_t subpass,
+ const std::vector<const IMAGE_VIEW_STATE *> &attachment_views,
+ const char *func_name) const {
+ bool skip = false;
+ // As validation methods are const and precede the record/update phase, for any tranistions from the immediately
+ // previous subpass, we have to validate them against a copy of the AccessContext, with resolve operations applied, as
+ // those affects have not been recorded yet.
+ //
+ // Note: we could be more efficient by tracking whether or not we actually *have* any changes (e.g. attachment resolve)
+ // to apply and only copy then, if this proves a hot spot.
+ std::unique_ptr<AccessContext> proxy_for_prev;
+ TrackBack proxy_track_back;
+
+ const auto &transitions = rp_state.subpass_transitions[subpass];
+ for (const auto &transition : transitions) {
+ const bool prev_needs_proxy = transition.prev_pass != VK_SUBPASS_EXTERNAL && (transition.prev_pass + 1 == subpass);
+
+ const auto *track_back = GetTrackBackFromSubpass(transition.prev_pass);
+ if (prev_needs_proxy) {
+ if (!proxy_for_prev) {
+ proxy_for_prev.reset(CreateStoreResolveProxyContext(*track_back->context, rp_state, transition.prev_pass,
+ render_area, attachment_views));
+ proxy_track_back = *track_back;
+ proxy_track_back.context = proxy_for_prev.get();
+ }
+ track_back = &proxy_track_back;
+ }
+ auto hazard = DetectSubpassTransitionHazard(*track_back, attachment_views[transition.attachment]);
+ if (hazard.hazard) {
+ skip |= sync_state.LogError(rp_state.renderPass, string_SyncHazardVUID(hazard.hazard),
+ "%s: Hazard %s in subpass %" PRIu32 " for attachment %" PRIu32
+ " image layout transition (old_layout: %s, new_layout: %s). Access info %s.",
+ func_name, string_SyncHazard(hazard.hazard), subpass, transition.attachment,
+ string_VkImageLayout(transition.old_layout), string_VkImageLayout(transition.new_layout),
+ string_UsageTag(hazard).c_str());
+ }
+ }
+ return skip;
+}
+
+bool AccessContext::ValidateLoadOperation(const SyncValidator &sync_state, const RENDER_PASS_STATE &rp_state,
+ const VkRect2D &render_area, uint32_t subpass,
+ const std::vector<const IMAGE_VIEW_STATE *> &attachment_views,
+ const char *func_name) const {
+ bool skip = false;
+ const auto *attachment_ci = rp_state.createInfo.pAttachments;
+ VkExtent3D extent = CastTo3D(render_area.extent);
+ VkOffset3D offset = CastTo3D(render_area.offset);
+ const auto external_access_scope = src_external_.barrier.dst_access_scope;
+
+ for (uint32_t i = 0; i < rp_state.createInfo.attachmentCount; i++) {
+ if (subpass == rp_state.attachment_first_subpass[i]) {
+ if (attachment_views[i] == nullptr) continue;
+ const IMAGE_VIEW_STATE &view = *attachment_views[i];
+ const IMAGE_STATE *image = view.image_state.get();
+ if (image == nullptr) continue;
+ const auto &ci = attachment_ci[i];
+ const bool is_transition = rp_state.attachment_first_is_transition[i];
+
+ // Need check in the following way
+ // 1) if the usage bit isn't in the dest_access_scope, and there is layout traniition for initial use, report hazard
+ // vs. transition
+ // 2) if there isn't a layout transition, we need to look at the external context with a "detect hazard" operation
+ // for each aspect loaded.
+
+ const bool has_depth = FormatHasDepth(ci.format);
+ const bool has_stencil = FormatHasStencil(ci.format);
+ const bool is_color = !(has_depth || has_stencil);
+
+ const SyncStageAccessIndex load_index = has_depth ? DepthStencilLoadUsage(ci.loadOp) : ColorLoadUsage(ci.loadOp);
+ const SyncStageAccessFlags load_mask = (has_depth || is_color) ? SyncStageAccess::Flags(load_index) : 0U;
+ const SyncStageAccessIndex stencil_load_index = has_stencil ? DepthStencilLoadUsage(ci.stencilLoadOp) : load_index;
+ const SyncStageAccessFlags stencil_mask = has_stencil ? SyncStageAccess::Flags(stencil_load_index) : 0U;
+
+ HazardResult hazard;
+ const char *aspect = nullptr;
+ if (is_transition) {
+ // For transition w
+ SyncHazard transition_hazard = SyncHazard::NONE;
+ bool checked_stencil = false;
+ if (load_mask) {
+ if ((load_mask & external_access_scope) != load_mask) {
+ transition_hazard =
+ SyncStageAccess::HasWrite(load_mask) ? SyncHazard::WRITE_AFTER_WRITE : SyncHazard::READ_AFTER_WRITE;
+ aspect = is_color ? "color" : "depth";
+ }
+ if (!transition_hazard && stencil_mask) {
+ if ((stencil_mask & external_access_scope) != stencil_mask) {
+ transition_hazard = SyncStageAccess::HasWrite(stencil_mask) ? SyncHazard::WRITE_AFTER_WRITE
+ : SyncHazard::READ_AFTER_WRITE;
+ aspect = "stencil";
+ checked_stencil = true;
+ }
+ }
+ }
+ if (transition_hazard) {
+ // Hazard vs. ILT
+ auto load_op_string = string_VkAttachmentLoadOp(checked_stencil ? ci.stencilLoadOp : ci.loadOp);
+ skip |=
+ sync_state.LogError(rp_state.renderPass, string_SyncHazardVUID(hazard.hazard),
+ "%s: Hazard %s vs. layout transition in subpass %" PRIu32 " for attachment %" PRIu32
+ " aspect %s during load with loadOp %s.",
+ func_name, string_SyncHazard(transition_hazard), subpass, i, aspect, load_op_string);
+ }
+ } else {
+ auto hazard_range = view.normalized_subresource_range;
+ bool checked_stencil = false;
+ if (is_color) {
+ hazard = DetectHazard(*image, load_index, view.normalized_subresource_range, offset, extent);
+ aspect = "color";
+ } else {
+ if (has_depth) {
+ hazard_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
+ hazard = DetectHazard(*image, load_index, hazard_range, offset, extent);
+ aspect = "depth";
+ }
+ if (!hazard.hazard && has_stencil) {
+ hazard_range.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
+ hazard = DetectHazard(*image, stencil_load_index, hazard_range, offset, extent);
+ aspect = "stencil";
+ checked_stencil = true;
+ }
+ }
+
+ if (hazard.hazard) {
+ auto load_op_string = string_VkAttachmentLoadOp(checked_stencil ? ci.stencilLoadOp : ci.loadOp);
+ skip |= sync_state.LogError(rp_state.renderPass, string_SyncHazardVUID(hazard.hazard),
+ "%s: Hazard %s in subpass %" PRIu32 " for attachment %" PRIu32
+ " aspect %s during load with loadOp %s. Access info %s.",
+ func_name, string_SyncHazard(hazard.hazard), subpass, i, aspect, load_op_string,
+ string_UsageTag(hazard).c_str());
+ }
+ }
+ }
+ }
+ return skip;
+}
+
+// Store operation validation can ignore resolve (before it) and layout tranistions after it. The first is ignored
+// because of the ordering guarantees w.r.t. sample access and that the resolve validation hasn't altered the state, because
+// store is part of the same Next/End operation.
+// The latter is handled in layout transistion validation directly
+bool AccessContext::ValidateStoreOperation(const SyncValidator &sync_state, const RENDER_PASS_STATE &rp_state,
+ const VkRect2D &render_area, uint32_t subpass,
+ const std::vector<const IMAGE_VIEW_STATE *> &attachment_views,
+ const char *func_name) const {
+ bool skip = false;
+ const auto *attachment_ci = rp_state.createInfo.pAttachments;
+ VkExtent3D extent = CastTo3D(render_area.extent);
+ VkOffset3D offset = CastTo3D(render_area.offset);
+
+ for (uint32_t i = 0; i < rp_state.createInfo.attachmentCount; i++) {
+ if (subpass == rp_state.attachment_last_subpass[i]) {
+ if (attachment_views[i] == nullptr) continue;
+ const IMAGE_VIEW_STATE &view = *attachment_views[i];
+ const IMAGE_STATE *image = view.image_state.get();
+ if (image == nullptr) continue;
+ const auto &ci = attachment_ci[i];
+
+ // The spec states that "don't care" is an operation with VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+ // so we assume that an implementation is *free* to write in that case, meaning that for correctness
+ // sake, we treat DONT_CARE as writing.
+ const bool has_depth = FormatHasDepth(ci.format);
+ const bool has_stencil = FormatHasStencil(ci.format);
+ const bool is_color = !(has_depth || has_stencil);
+ const bool store_op_stores = ci.storeOp != VK_ATTACHMENT_STORE_OP_NONE_QCOM;
+ if (!has_stencil && !store_op_stores) continue;
+
+ HazardResult hazard;
+ const char *aspect = nullptr;
+ bool checked_stencil = false;
+ if (is_color) {
+ hazard = DetectHazard(*image, SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE,
+ view.normalized_subresource_range, kAttachmentRasterOrder, offset, extent);
+ aspect = "color";
+ } else {
+ const bool stencil_op_stores = ci.stencilStoreOp != VK_ATTACHMENT_STORE_OP_NONE_QCOM;
+ auto hazard_range = view.normalized_subresource_range;
+ if (has_depth && store_op_stores) {
+ hazard_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
+ hazard = DetectHazard(*image, SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE, hazard_range,
+ kAttachmentRasterOrder, offset, extent);
+ aspect = "depth";
+ }
+ if (!hazard.hazard && has_stencil && stencil_op_stores) {
+ hazard_range.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
+ hazard = DetectHazard(*image, SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE, hazard_range,
+ kAttachmentRasterOrder, offset, extent);
+ aspect = "stencil";
+ checked_stencil = true;
+ }
+ }
+
+ if (hazard.hazard) {
+ const char *const op_type_string = checked_stencil ? "stencilStoreOp" : "storeOp";
+ const char *const store_op_string = string_VkAttachmentStoreOp(checked_stencil ? ci.stencilStoreOp : ci.storeOp);
+ skip |= sync_state.LogError(rp_state.renderPass, string_SyncHazardVUID(hazard.hazard),
+ "%s: Hazard %s in subpass %" PRIu32 " for attachment %" PRIu32
+ " %s aspect during store with %s %s. Access info %s",
+ func_name, string_SyncHazard(hazard.hazard), subpass, i, aspect, op_type_string,
+ store_op_string, string_UsageTag(hazard).c_str());
+ }
+ }
+ }
+ return skip;
+}
+
+bool AccessContext::ValidateResolveOperations(const SyncValidator &sync_state, const RENDER_PASS_STATE &rp_state,
+ const VkRect2D &render_area,
+ const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, const char *func_name,
+ uint32_t subpass) const {
+ ValidateResolveAction validate_action(rp_state.renderPass, subpass, *this, sync_state, func_name);
+ ResolveOperation(validate_action, rp_state, render_area, attachment_views, subpass);
+ return validate_action.GetSkip();
+}
+
+class HazardDetector {
+ SyncStageAccessIndex usage_index_;
+
+ public:
+ HazardResult Detect(const ResourceAccessRangeMap::const_iterator &pos) const { return pos->second.DetectHazard(usage_index_); }
+ HazardResult DetectAsync(const ResourceAccessRangeMap::const_iterator &pos) const {
+ return pos->second.DetectAsyncHazard(usage_index_);
+ }
+ HazardDetector(SyncStageAccessIndex usage) : usage_index_(usage) {}
+};
+
+class HazardDetectorWithOrdering {
+ const SyncStageAccessIndex usage_index_;
+ const SyncOrderingBarrier &ordering_;
+
+ public:
+ HazardResult Detect(const ResourceAccessRangeMap::const_iterator &pos) const {
+ return pos->second.DetectHazard(usage_index_, ordering_);
+ }
+ HazardResult DetectAsync(const ResourceAccessRangeMap::const_iterator &pos) const {
+ return pos->second.DetectAsyncHazard(usage_index_);
+ }
+ HazardDetectorWithOrdering(SyncStageAccessIndex usage, const SyncOrderingBarrier &ordering)
+ : usage_index_(usage), ordering_(ordering) {}
+};
+
+HazardResult AccessContext::DetectHazard(AddressType type, SyncStageAccessIndex usage_index,
+ const ResourceAccessRange &range) const {
+ HazardDetector detector(usage_index);
+ return DetectHazard(type, detector, range, DetectOptions::kDetectAll);
+}
+
+HazardResult AccessContext::DetectHazard(const BUFFER_STATE &buffer, SyncStageAccessIndex usage_index,
+ const ResourceAccessRange &range) const {
+ if (!SimpleBinding(buffer)) return HazardResult();
+ return DetectHazard(AddressType::kLinearAddress, usage_index, range + ResourceBaseAddress(buffer));
+}
+
+template <typename Detector>
+HazardResult AccessContext::DetectHazard(Detector &detector, const IMAGE_STATE &image,
+ const VkImageSubresourceRange &subresource_range, const VkOffset3D &offset,
+ const VkExtent3D &extent, DetectOptions options) const {
+ if (!SimpleBinding(image)) return HazardResult();
+ subresource_adapter::ImageRangeGenerator range_gen(*image.fragment_encoder.get(), subresource_range, offset, extent);
+ const auto address_type = ImageAddressType(image);
+ const auto base_address = ResourceBaseAddress(image);
+ for (; range_gen->non_empty(); ++range_gen) {
+ HazardResult hazard = DetectHazard(address_type, detector, (*range_gen + base_address), options);
+ if (hazard.hazard) return hazard;
+ }
+ return HazardResult();
+}
+
+HazardResult AccessContext::DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
+ const VkImageSubresourceLayers &subresource, const VkOffset3D &offset,
+ const VkExtent3D &extent) const {
+ VkImageSubresourceRange subresource_range = {subresource.aspectMask, subresource.mipLevel, 1, subresource.baseArrayLayer,
+ subresource.layerCount};
+ return DetectHazard(image, current_usage, subresource_range, offset, extent);
+}
+
+HazardResult AccessContext::DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
+ const VkImageSubresourceRange &subresource_range, const VkOffset3D &offset,
+ const VkExtent3D &extent) const {
+ HazardDetector detector(current_usage);
+ return DetectHazard(detector, image, subresource_range, offset, extent, DetectOptions::kDetectAll);
+}
+
+HazardResult AccessContext::DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
+ const VkImageSubresourceRange &subresource_range, const SyncOrderingBarrier &ordering,
+ const VkOffset3D &offset, const VkExtent3D &extent) const {
+ HazardDetectorWithOrdering detector(current_usage, ordering);
+ return DetectHazard(detector, image, subresource_range, offset, extent, DetectOptions::kDetectAll);
+}
+
+// Some common code for looking at attachments, if there's anything wrong, we return no hazard, core validation
+// should have reported the issue regarding an invalid attachment entry
+HazardResult AccessContext::DetectHazard(const IMAGE_VIEW_STATE *view, SyncStageAccessIndex current_usage,
+ const SyncOrderingBarrier &ordering, const VkOffset3D &offset, const VkExtent3D &extent,
+ VkImageAspectFlags aspect_mask) const {
+ if (view != nullptr) {
+ const IMAGE_STATE *image = view->image_state.get();
+ if (image != nullptr) {
+ auto *detect_range = &view->normalized_subresource_range;
+ VkImageSubresourceRange masked_range;
+ if (aspect_mask) { // If present and non-zero, restrict the normalized range to aspects present in aspect_mask
+ masked_range = view->normalized_subresource_range;
+ masked_range.aspectMask = aspect_mask & masked_range.aspectMask;
+ detect_range = &masked_range;
+ }
+
+ // NOTE: The range encoding code is not robust to invalid ranges, so we protect it from our change
+ if (detect_range->aspectMask) {
+ return DetectHazard(*image, current_usage, *detect_range, ordering, offset, extent);
+ }
+ }
+ }
+ return HazardResult();
+}
+class BarrierHazardDetector {
+ public:
+ BarrierHazardDetector(SyncStageAccessIndex usage_index, VkPipelineStageFlags src_exec_scope,
+ SyncStageAccessFlags src_access_scope)
+ : usage_index_(usage_index), src_exec_scope_(src_exec_scope), src_access_scope_(src_access_scope) {}
+
+ HazardResult Detect(const ResourceAccessRangeMap::const_iterator &pos) const {
+ return pos->second.DetectBarrierHazard(usage_index_, src_exec_scope_, src_access_scope_);
+ }
+ HazardResult DetectAsync(const ResourceAccessRangeMap::const_iterator &pos) const {
+ // Async barrier hazard detection can use the same path as the usage index is not IsRead, but is IsWrite
+ return pos->second.DetectAsyncHazard(usage_index_);
+ }
+
+ private:
+ SyncStageAccessIndex usage_index_;
+ VkPipelineStageFlags src_exec_scope_;
+ SyncStageAccessFlags src_access_scope_;
+};
+
+HazardResult AccessContext::DetectBarrierHazard(AddressType type, SyncStageAccessIndex current_usage,
+ VkPipelineStageFlags src_exec_scope, SyncStageAccessFlags src_access_scope,
+ const ResourceAccessRange &range, DetectOptions options) const {
+ BarrierHazardDetector detector(current_usage, src_exec_scope, src_access_scope);
+ return DetectHazard(type, detector, range, options);
+}
+
+HazardResult AccessContext::DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags src_exec_scope,
+ SyncStageAccessFlags src_access_scope,
+ const VkImageSubresourceRange &subresource_range,
+ DetectOptions options) const {
+ BarrierHazardDetector detector(SyncStageAccessIndex::SYNC_IMAGE_LAYOUT_TRANSITION, src_exec_scope, src_access_scope);
+ VkOffset3D zero_offset = {0, 0, 0};
+ return DetectHazard(detector, image, subresource_range, zero_offset, image.createInfo.extent, options);
+}
+
+HazardResult AccessContext::DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags src_exec_scope,
+ SyncStageAccessFlags src_stage_accesses,
+ const VkImageMemoryBarrier &barrier) const {
+ auto subresource_range = NormalizeSubresourceRange(image.createInfo, barrier.subresourceRange);
+ const auto src_access_scope = SyncStageAccess::AccessScope(src_stage_accesses, barrier.srcAccessMask);
+ return DetectImageBarrierHazard(image, src_exec_scope, src_access_scope, subresource_range, kDetectAll);
+}
+
+template <typename Flags, typename Map>
+SyncStageAccessFlags AccessScopeImpl(Flags flag_mask, const Map &map) {
+ SyncStageAccessFlags scope = 0;
+ for (const auto &bit_scope : map) {
+ if (flag_mask < bit_scope.first) break;
+
+ if (flag_mask & bit_scope.first) {
+ scope |= bit_scope.second;
+ }
+ }
+ return scope;
+}
+
+SyncStageAccessFlags SyncStageAccess::AccessScopeByStage(VkPipelineStageFlags stages) {
+ return AccessScopeImpl(stages, syncStageAccessMaskByStageBit);
+}
+
+SyncStageAccessFlags SyncStageAccess::AccessScopeByAccess(VkAccessFlags accesses) {
+ return AccessScopeImpl(accesses, syncStageAccessMaskByAccessBit);
+}
+
+// Getting from stage mask and access mask to stage/acess masks is something we need to be good at...
+SyncStageAccessFlags SyncStageAccess::AccessScope(VkPipelineStageFlags stages, VkAccessFlags accesses) {
+ // The access scope is the intersection of all stage/access types possible for the enabled stages and the enables
+ // accesses (after doing a couple factoring of common terms the union of stage/access intersections is the intersections
+ // of the union of all stage/access types for all the stages and the same unions for the access mask...
+ return AccessScopeByStage(stages) & AccessScopeByAccess(accesses);
+}
+
+template <typename Action>
+void UpdateMemoryAccessState(ResourceAccessRangeMap *accesses, const ResourceAccessRange &range, const Action &action) {
+ // TODO: Optimization for operations that do a pure overwrite (i.e. WRITE usages which rewrite the state, vs READ usages
+ // that do incrementalupdates
+ auto pos = accesses->lower_bound(range);
+ if (pos == accesses->end() || !pos->first.intersects(range)) {
+ // The range is empty, fill it with a default value.
+ pos = action.Infill(accesses, pos, range);
+ } else if (range.begin < pos->first.begin) {
+ // Leading empty space, infill
+ pos = action.Infill(accesses, pos, ResourceAccessRange(range.begin, pos->first.begin));
+ } else if (pos->first.begin < range.begin) {
+ // Trim the beginning if needed
+ pos = accesses->split(pos, range.begin, sparse_container::split_op_keep_both());
+ ++pos;
+ }
+
+ const auto the_end = accesses->end();
+ while ((pos != the_end) && pos->first.intersects(range)) {
+ if (pos->first.end > range.end) {
+ pos = accesses->split(pos, range.end, sparse_container::split_op_keep_both());
+ }
+
+ pos = action(accesses, pos);
+ if (pos == the_end) break;
+
+ auto next = pos;
+ ++next;
+ if ((pos->first.end < range.end) && (next != the_end) && !next->first.is_subsequent_to(pos->first)) {
+ // Need to infill if next is disjoint
+ VkDeviceSize limit = (next == the_end) ? range.end : std::min(range.end, next->first.begin);
+ ResourceAccessRange new_range(pos->first.end, limit);
+ next = action.Infill(accesses, next, new_range);
+ }
+ pos = next;
+ }
+}
+
+struct UpdateMemoryAccessStateFunctor {
+ using Iterator = ResourceAccessRangeMap::iterator;
+ Iterator Infill(ResourceAccessRangeMap *accesses, Iterator pos, ResourceAccessRange range) const {
+ // this is only called on gaps, and never returns a gap.
+ ResourceAccessState default_state;
+ context.ResolvePreviousAccess(type, range, accesses, &default_state);
+ return accesses->lower_bound(range);
+ }
+
+ Iterator operator()(ResourceAccessRangeMap *accesses, Iterator pos) const {
+ auto &access_state = pos->second;
+ access_state.Update(usage, tag);
+ return pos;
+ }
+
+ UpdateMemoryAccessStateFunctor(AccessContext::AddressType type_, const AccessContext &context_, SyncStageAccessIndex usage_,
+ const ResourceUsageTag &tag_)
+ : type(type_), context(context_), usage(usage_), tag(tag_) {}
+ const AccessContext::AddressType type;
+ const AccessContext &context;
+ const SyncStageAccessIndex usage;
+ const ResourceUsageTag &tag;
+};
+
+struct ApplyMemoryAccessBarrierFunctor {
+ using Iterator = ResourceAccessRangeMap::iterator;
+ inline Iterator Infill(ResourceAccessRangeMap *accesses, Iterator pos, ResourceAccessRange range) const { return pos; }
+
+ Iterator operator()(ResourceAccessRangeMap *accesses, Iterator pos) const {
+ auto &access_state = pos->second;
+ access_state.ApplyMemoryAccessBarrier(src_exec_scope, src_access_scope, dst_exec_scope, dst_access_scope);
+ return pos;
+ }
+
+ ApplyMemoryAccessBarrierFunctor(VkPipelineStageFlags src_exec_scope_, SyncStageAccessFlags src_access_scope_,
+ VkPipelineStageFlags dst_exec_scope_, SyncStageAccessFlags dst_access_scope_)
+ : src_exec_scope(src_exec_scope_),
+ src_access_scope(src_access_scope_),
+ dst_exec_scope(dst_exec_scope_),
+ dst_access_scope(dst_access_scope_) {}
+
+ VkPipelineStageFlags src_exec_scope;
+ SyncStageAccessFlags src_access_scope;
+ VkPipelineStageFlags dst_exec_scope;
+ SyncStageAccessFlags dst_access_scope;
+};
+
+struct ApplyGlobalBarrierFunctor {
+ using Iterator = ResourceAccessRangeMap::iterator;
+ inline Iterator Infill(ResourceAccessRangeMap *accesses, Iterator pos, ResourceAccessRange range) const { return pos; }
+
+ Iterator operator()(ResourceAccessRangeMap *accesses, Iterator pos) const {
+ auto &access_state = pos->second;
+ access_state.ApplyExecutionBarrier(src_exec_scope, dst_exec_scope);
+
+ for (const auto &functor : barrier_functor) {
+ functor(accesses, pos);
+ }
+ return pos;
+ }
+
+ ApplyGlobalBarrierFunctor(VkPipelineStageFlags src_exec_scope, VkPipelineStageFlags dst_exec_scope,
+ SyncStageAccessFlags src_stage_accesses, SyncStageAccessFlags dst_stage_accesses,
+ uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers)
+ : src_exec_scope(src_exec_scope), dst_exec_scope(dst_exec_scope) {
+ // Don't want to create this per tracked item, but don't want to loop through all tracked items per barrier...
+ barrier_functor.reserve(memoryBarrierCount);
+ for (uint32_t barrier_index = 0; barrier_index < memoryBarrierCount; barrier_index++) {
+ const auto &barrier = pMemoryBarriers[barrier_index];
+ barrier_functor.emplace_back(src_exec_scope, SyncStageAccess::AccessScope(src_stage_accesses, barrier.srcAccessMask),
+ dst_exec_scope, SyncStageAccess::AccessScope(dst_stage_accesses, barrier.dstAccessMask));
+ }
+ }
+
+ const VkPipelineStageFlags src_exec_scope;
+ const VkPipelineStageFlags dst_exec_scope;
+ std::vector<ApplyMemoryAccessBarrierFunctor> barrier_functor;
+};
+
+void AccessContext::UpdateAccessState(AddressType type, SyncStageAccessIndex current_usage, const ResourceAccessRange &range,
+ const ResourceUsageTag &tag) {
+ UpdateMemoryAccessStateFunctor action(type, *this, current_usage, tag);
+ UpdateMemoryAccessState(&GetAccessStateMap(type), range, action);
+}
+
+void AccessContext::UpdateAccessState(const BUFFER_STATE &buffer, SyncStageAccessIndex current_usage,
+ const ResourceAccessRange &range, const ResourceUsageTag &tag) {
+ if (!SimpleBinding(buffer)) return;
+ const auto base_address = ResourceBaseAddress(buffer);
+ UpdateAccessState(AddressType::kLinearAddress, current_usage, range + base_address, tag);
+}
+
+void AccessContext::UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
+ const VkImageSubresourceRange &subresource_range, const VkOffset3D &offset,
+ const VkExtent3D &extent, const ResourceUsageTag &tag) {
+ if (!SimpleBinding(image)) return;
+ subresource_adapter::ImageRangeGenerator range_gen(*image.fragment_encoder.get(), subresource_range, offset, extent);
+ const auto address_type = ImageAddressType(image);
+ const auto base_address = ResourceBaseAddress(image);
+ UpdateMemoryAccessStateFunctor action(address_type, *this, current_usage, tag);
+ for (; range_gen->non_empty(); ++range_gen) {
+ UpdateMemoryAccessState(&GetAccessStateMap(address_type), (*range_gen + base_address), action);
+ }
+}
+void AccessContext::UpdateAccessState(const IMAGE_VIEW_STATE *view, SyncStageAccessIndex current_usage, const VkOffset3D &offset,
+ const VkExtent3D &extent, VkImageAspectFlags aspect_mask, const ResourceUsageTag &tag) {
+ if (view != nullptr) {
+ const IMAGE_STATE *image = view->image_state.get();
+ if (image != nullptr) {
+ auto *update_range = &view->normalized_subresource_range;
+ VkImageSubresourceRange masked_range;
+ if (aspect_mask) { // If present and non-zero, restrict the normalized range to aspects present in aspect_mask
+ masked_range = view->normalized_subresource_range;
+ masked_range.aspectMask = aspect_mask & masked_range.aspectMask;
+ update_range = &masked_range;
+ }
+ UpdateAccessState(*image, current_usage, *update_range, offset, extent, tag);
+ }
+ }
+}
+
+void AccessContext::UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
+ const VkImageSubresourceLayers &subresource, const VkOffset3D &offset,
+ const VkExtent3D &extent, const ResourceUsageTag &tag) {
+ VkImageSubresourceRange subresource_range = {subresource.aspectMask, subresource.mipLevel, 1, subresource.baseArrayLayer,
+ subresource.layerCount};
+ UpdateAccessState(image, current_usage, subresource_range, offset, extent, tag);
+}
+
+template <typename Action>
+void AccessContext::UpdateMemoryAccess(const BUFFER_STATE &buffer, const ResourceAccessRange &range, const Action action) {
+ if (!SimpleBinding(buffer)) return;
+ const auto base_address = ResourceBaseAddress(buffer);
+ UpdateMemoryAccessState(&GetAccessStateMap(AddressType::kLinearAddress), (range + base_address), action);
+}
+
+template <typename Action>
+void AccessContext::UpdateMemoryAccess(const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
+ const Action action) {
+ if (!SimpleBinding(image)) return;
+ const auto address_type = ImageAddressType(image);
+ auto *accesses = &GetAccessStateMap(address_type);
+
+ subresource_adapter::ImageRangeGenerator range_gen(*image.fragment_encoder.get(), subresource_range, {0, 0, 0},
+ image.createInfo.extent);
+
+ const auto base_address = ResourceBaseAddress(image);
+ for (; range_gen->non_empty(); ++range_gen) {
+ UpdateMemoryAccessState(accesses, (*range_gen + base_address), action);
+ }
+}
+
+void AccessContext::UpdateAttachmentResolveAccess(const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area,
+ const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, uint32_t subpass,
+ const ResourceUsageTag &tag) {
+ UpdateStateResolveAction update(*this, tag);
+ ResolveOperation(update, rp_state, render_area, attachment_views, subpass);
+}
+
+void AccessContext::UpdateAttachmentStoreAccess(const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area,
+ const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, uint32_t subpass,
+ const ResourceUsageTag &tag) {
+ const auto *attachment_ci = rp_state.createInfo.pAttachments;
+ VkExtent3D extent = CastTo3D(render_area.extent);
+ VkOffset3D offset = CastTo3D(render_area.offset);
+
+ for (uint32_t i = 0; i < rp_state.createInfo.attachmentCount; i++) {
+ if (rp_state.attachment_last_subpass[i] == subpass) {
+ if (attachment_views[i] == nullptr) continue; // UNUSED
+ const auto &view = *attachment_views[i];
+ const IMAGE_STATE *image = view.image_state.get();
+ if (image == nullptr) continue;
+
+ const auto &ci = attachment_ci[i];
+ const bool has_depth = FormatHasDepth(ci.format);
+ const bool has_stencil = FormatHasStencil(ci.format);
+ const bool is_color = !(has_depth || has_stencil);
+ const bool store_op_stores = ci.storeOp != VK_ATTACHMENT_STORE_OP_NONE_QCOM;
+
+ if (is_color && store_op_stores) {
+ UpdateAccessState(*image, SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE, view.normalized_subresource_range,
+ offset, extent, tag);
+ } else {
+ auto update_range = view.normalized_subresource_range;
+ if (has_depth && store_op_stores) {
+ update_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
+ UpdateAccessState(*image, SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE, update_range, offset, extent,
+ tag);
+ }
+ const bool stencil_op_stores = ci.stencilStoreOp != VK_ATTACHMENT_STORE_OP_NONE_QCOM;
+ if (has_stencil && stencil_op_stores) {
+ update_range.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
+ UpdateAccessState(*image, SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE, update_range, offset, extent,
+ tag);
+ }
+ }
+ }
+ }
+}
+
+template <typename Action>
+void AccessContext::ApplyGlobalBarriers(const Action &barrier_action) {
+ // Note: Barriers do *not* cross context boundaries, applying to accessess within.... (at least for renderpass subpasses)
+ for (const auto address_type : kAddressTypes) {
+ UpdateMemoryAccessState(&GetAccessStateMap(address_type), full_range, barrier_action);
+ }
+}
+
+void AccessContext::ResolveChildContexts(const std::vector<AccessContext> &contexts) {
+ for (uint32_t subpass_index = 0; subpass_index < contexts.size(); subpass_index++) {
+ auto &context = contexts[subpass_index];
+ for (const auto address_type : kAddressTypes) {
+ context.ResolveAccessRange(address_type, full_range, &context.GetDstExternalTrackBack().barrier,
+ &GetAccessStateMap(address_type), nullptr, false);
+ }
+ }
+}
+
+void AccessContext::ApplyImageBarrier(const IMAGE_STATE &image, VkPipelineStageFlags src_exec_scope,
+ SyncStageAccessFlags src_access_scope, VkPipelineStageFlags dst_exec_scope,
+ SyncStageAccessFlags dst_access_scope, const VkImageSubresourceRange &subresource_range) {
+ const ApplyMemoryAccessBarrierFunctor barrier_action(src_exec_scope, src_access_scope, dst_exec_scope, dst_access_scope);
+ UpdateMemoryAccess(image, subresource_range, barrier_action);
+}
+
+// Note: ImageBarriers do not operate at offset/extent resolution, only at the whole subreources level
+void AccessContext::ApplyImageBarrier(const IMAGE_STATE &image, VkPipelineStageFlags src_exec_scope,
+ SyncStageAccessFlags src_access_scope, VkPipelineStageFlags dst_exec_scope,
+ SyncStageAccessFlags dst_access_scope, const VkImageSubresourceRange &subresource_range,
+ bool layout_transition, const ResourceUsageTag &tag) {
+ if (layout_transition) {
+ UpdateAccessState(image, SYNC_IMAGE_LAYOUT_TRANSITION, subresource_range, VkOffset3D{0, 0, 0}, image.createInfo.extent,
+ tag);
+ ApplyImageBarrier(image, src_exec_scope, SYNC_IMAGE_LAYOUT_TRANSITION_BIT, dst_exec_scope, dst_access_scope,
+ subresource_range);
+ } else {
+ ApplyImageBarrier(image, src_exec_scope, src_access_scope, dst_exec_scope, dst_access_scope, subresource_range);
+ }
+}
+
+// Note: ImageBarriers do not operate at offset/extent resolution, only at the whole subreources level
+void AccessContext::ApplyImageBarrier(const IMAGE_STATE &image, const SyncBarrier &barrier,
+ const VkImageSubresourceRange &subresource_range, bool layout_transition,
+ const ResourceUsageTag &tag) {
+ ApplyImageBarrier(image, barrier.src_exec_scope, barrier.src_access_scope, barrier.dst_exec_scope, barrier.dst_access_scope,
+ subresource_range, layout_transition, tag);
+}
+
+// Suitable only for *subpass* access contexts
+HazardResult AccessContext::DetectSubpassTransitionHazard(const TrackBack &track_back, const IMAGE_VIEW_STATE *attach_view) const {
+ if (!attach_view) return HazardResult();
+ const auto image_state = attach_view->image_state.get();
+ if (!image_state) return HazardResult();
+
+ // We should never ask for a transition from a context we don't have
+ assert(track_back.context);
+
+ // Do the detection against the specific prior context independent of other contexts. (Synchronous only)
+ auto hazard = track_back.context->DetectImageBarrierHazard(*image_state, track_back.barrier.src_exec_scope,
+ track_back.barrier.src_access_scope,
+ attach_view->normalized_subresource_range, kDetectPrevious);
+ if (!hazard.hazard) {
+ // The Async hazard check is against the current context's async set.
+ hazard = DetectImageBarrierHazard(*image_state, track_back.barrier.src_exec_scope, track_back.barrier.src_access_scope,
+ attach_view->normalized_subresource_range, kDetectAsync);
+ }
+ return hazard;
+}
+
+// Class CommandBufferAccessContext: Keep track of resource access state information for a specific command buffer
+bool CommandBufferAccessContext::ValidateBeginRenderPass(const RENDER_PASS_STATE &rp_state,
+
+ const VkRenderPassBeginInfo *pRenderPassBegin,
+ const VkSubpassBeginInfoKHR *pSubpassBeginInfo,
+ const char *func_name) const {
+ // Check if any of the layout transitions are hazardous.... but we don't have the renderpass context to work with, so we
+ bool skip = false;
+ uint32_t subpass = 0;
+ const auto &transitions = rp_state.subpass_transitions[subpass];
+ if (transitions.size()) {
+ const std::vector<AccessContext> empty_context_vector;
+ // Create context we can use to validate against...
+ AccessContext temp_context(subpass, queue_flags_, rp_state.subpass_dependencies, empty_context_vector,
+ const_cast<AccessContext *>(&cb_access_context_));
+
+ assert(pRenderPassBegin);
+ if (nullptr == pRenderPassBegin) return skip;
+
+ const auto fb_state = sync_state_->Get<FRAMEBUFFER_STATE>(pRenderPassBegin->framebuffer);
+ assert(fb_state);
+ if (nullptr == fb_state) return skip;
+
+ // Create a limited array of views (which we'll need to toss
+ std::vector<const IMAGE_VIEW_STATE *> views;
+ const auto count_attachment = GetFramebufferAttachments(*pRenderPassBegin, *fb_state);
+ const auto attachment_count = count_attachment.first;
+ const auto *attachments = count_attachment.second;
+ views.resize(attachment_count, nullptr);
+ for (const auto &transition : transitions) {
+ assert(transition.attachment < attachment_count);
+ views[transition.attachment] = sync_state_->Get<IMAGE_VIEW_STATE>(attachments[transition.attachment]);
+ }
+
+ skip |= temp_context.ValidateLayoutTransitions(*sync_state_, rp_state, pRenderPassBegin->renderArea, 0, views, func_name);
+ skip |= temp_context.ValidateLoadOperation(*sync_state_, rp_state, pRenderPassBegin->renderArea, 0, views, func_name);
+ }
+ return skip;
+}
+
+bool CommandBufferAccessContext::ValidateDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint,
+ const char *func_name) const {
+ bool skip = false;
+ const PIPELINE_STATE *pPipe = nullptr;
+ const std::vector<LAST_BOUND_STATE::PER_SET> *per_sets = nullptr;
+ GetCurrentPipelineAndDesriptorSetsFromCommandBuffer(*cb_state_.get(), pipelineBindPoint, &pPipe, &per_sets);
+ if (!pPipe || !per_sets) {
+ return skip;
+ }
+
+ using DescriptorClass = cvdescriptorset::DescriptorClass;
+ using BufferDescriptor = cvdescriptorset::BufferDescriptor;
+ using ImageDescriptor = cvdescriptorset::ImageDescriptor;
+ using ImageSamplerDescriptor = cvdescriptorset::ImageSamplerDescriptor;
+ using TexelDescriptor = cvdescriptorset::TexelDescriptor;
+
+ for (const auto &stage_state : pPipe->stage_state) {
+ if (stage_state.stage_flag == VK_SHADER_STAGE_FRAGMENT_BIT && pPipe->graphicsPipelineCI.pRasterizationState &&
+ pPipe->graphicsPipelineCI.pRasterizationState->rasterizerDiscardEnable)
+ continue;
+ for (const auto &set_binding : stage_state.descriptor_uses) {
+ cvdescriptorset::DescriptorSet *descriptor_set = (*per_sets)[set_binding.first.first].bound_descriptor_set;
+ cvdescriptorset::DescriptorSetLayout::ConstBindingIterator binding_it(descriptor_set->GetLayout().get(),
+ set_binding.first.second);
+ const auto descriptor_type = binding_it.GetType();
+ cvdescriptorset::IndexRange index_range = binding_it.GetGlobalIndexRange();
+ auto array_idx = 0;
+
+ if (binding_it.IsVariableDescriptorCount()) {
+ index_range.end = index_range.start + descriptor_set->GetVariableDescriptorCount();
+ }
+ SyncStageAccessIndex sync_index =
+ GetSyncStageAccessIndexsByDescriptorSet(descriptor_type, set_binding.second, stage_state.stage_flag);
+
+ for (uint32_t i = index_range.start; i < index_range.end; ++i, ++array_idx) {
+ uint32_t index = i - index_range.start;
+ const auto *descriptor = descriptor_set->GetDescriptorFromGlobalIndex(i);
+ switch (descriptor->GetClass()) {
+ case DescriptorClass::ImageSampler:
+ case DescriptorClass::Image: {
+ const IMAGE_VIEW_STATE *img_view_state = nullptr;
+ VkImageLayout image_layout;
+ if (descriptor->GetClass() == DescriptorClass::ImageSampler) {
+ const auto image_sampler_descriptor = static_cast<const ImageSamplerDescriptor *>(descriptor);
+ img_view_state = image_sampler_descriptor->GetImageViewState();
+ image_layout = image_sampler_descriptor->GetImageLayout();
+ } else {
+ const auto image_descriptor = static_cast<const ImageDescriptor *>(descriptor);
+ img_view_state = image_descriptor->GetImageViewState();
+ image_layout = image_descriptor->GetImageLayout();
+ }
+ if (!img_view_state) continue;
+ const IMAGE_STATE *img_state = img_view_state->image_state.get();
+ VkExtent3D extent = {};
+ VkOffset3D offset = {};
+ if (sync_index == SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ) {
+ extent = CastTo3D(cb_state_->activeRenderPassBeginInfo.renderArea.extent);
+ offset = CastTo3D(cb_state_->activeRenderPassBeginInfo.renderArea.offset);
+ } else {
+ extent = img_state->createInfo.extent;
+ }
+ HazardResult hazard;
+ const auto &subresource_range = img_view_state->normalized_subresource_range;
+ if (descriptor_type == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT) {
+ // Input attachments are subject to raster ordering rules
+ hazard = current_context_->DetectHazard(*img_state, sync_index, subresource_range,
+ kAttachmentRasterOrder, offset, extent);
+ } else {
+ hazard = current_context_->DetectHazard(*img_state, sync_index, subresource_range, offset, extent);
+ }
+ if (hazard.hazard && !sync_state_->SupressedBoundDescriptorWAW(hazard)) {
+ skip |= sync_state_->LogError(
+ img_view_state->image_view, string_SyncHazardVUID(hazard.hazard),
+ "%s: Hazard %s for %s, in %s, and %s, %s, type: %s, imageLayout: %s, binding #%" PRIu32
+ ", index %" PRIu32 ". Access info %s.",
+ func_name, string_SyncHazard(hazard.hazard),
+ sync_state_->report_data->FormatHandle(img_view_state->image_view).c_str(),
+ sync_state_->report_data->FormatHandle(cb_state_->commandBuffer).c_str(),
+ sync_state_->report_data->FormatHandle(pPipe->pipeline).c_str(),
+ sync_state_->report_data->FormatHandle(descriptor_set->GetSet()).c_str(),
+ string_VkDescriptorType(descriptor_type), string_VkImageLayout(image_layout),
+ set_binding.first.second, index, string_UsageTag(hazard).c_str());
+ }
+ break;
+ }
+ case DescriptorClass::TexelBuffer: {
+ auto buf_view_state = static_cast<const TexelDescriptor *>(descriptor)->GetBufferViewState();
+ if (!buf_view_state) continue;
+ const BUFFER_STATE *buf_state = buf_view_state->buffer_state.get();
+ ResourceAccessRange range =
+ MakeRange(buf_view_state->create_info.offset,
+ GetRealWholeSize(buf_view_state->create_info.offset, buf_view_state->create_info.range,
+ buf_state->createInfo.size));
+ auto hazard = current_context_->DetectHazard(*buf_state, sync_index, range);
+ if (hazard.hazard && !sync_state_->SupressedBoundDescriptorWAW(hazard)) {
+ skip |= sync_state_->LogError(
+ buf_view_state->buffer_view, string_SyncHazardVUID(hazard.hazard),
+ "%s: Hazard %s for %s in %s, %s, and %s, type: %s, binding #%d index %d. Access info %s.",
+ func_name, string_SyncHazard(hazard.hazard),
+ sync_state_->report_data->FormatHandle(buf_view_state->buffer_view).c_str(),
+ sync_state_->report_data->FormatHandle(cb_state_->commandBuffer).c_str(),
+ sync_state_->report_data->FormatHandle(pPipe->pipeline).c_str(),
+ sync_state_->report_data->FormatHandle(descriptor_set->GetSet()).c_str(),
+ string_VkDescriptorType(descriptor_type), set_binding.first.second, index,
+ string_UsageTag(hazard).c_str());
+ }
+ break;
+ }
+ case DescriptorClass::GeneralBuffer: {
+ const auto *buffer_descriptor = static_cast<const BufferDescriptor *>(descriptor);
+ auto buf_state = buffer_descriptor->GetBufferState();
+ if (!buf_state) continue;
+ ResourceAccessRange range = MakeRange(buffer_descriptor->GetOffset(), buffer_descriptor->GetRange());
+ auto hazard = current_context_->DetectHazard(*buf_state, sync_index, range);
+ if (hazard.hazard) {
+ skip |= sync_state_->LogError(
+ buf_state->buffer, string_SyncHazardVUID(hazard.hazard),
+ "%s: Hazard %s for %s in %s, %s, and %s, type: %s, binding #%d index %d. Access info %s.",
+ func_name, string_SyncHazard(hazard.hazard),
+ sync_state_->report_data->FormatHandle(buf_state->buffer).c_str(),
+ sync_state_->report_data->FormatHandle(cb_state_->commandBuffer).c_str(),
+ sync_state_->report_data->FormatHandle(pPipe->pipeline).c_str(),
+ sync_state_->report_data->FormatHandle(descriptor_set->GetSet()).c_str(),
+ string_VkDescriptorType(descriptor_type), set_binding.first.second, index,
+ string_UsageTag(hazard).c_str());
+ }
+ break;
+ }
+ // TODO: INLINE_UNIFORM_BLOCK_EXT, ACCELERATION_STRUCTURE_KHR
+ default:
+ break;
+ }
+ }
+ }
+ }
+ return skip;
+}
+
+void CommandBufferAccessContext::RecordDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint,
+ const ResourceUsageTag &tag) {
+ const PIPELINE_STATE *pPipe = nullptr;
+ const std::vector<LAST_BOUND_STATE::PER_SET> *per_sets = nullptr;
+ GetCurrentPipelineAndDesriptorSetsFromCommandBuffer(*cb_state_.get(), pipelineBindPoint, &pPipe, &per_sets);
+ if (!pPipe || !per_sets) {
+ return;
+ }
+
+ using DescriptorClass = cvdescriptorset::DescriptorClass;
+ using BufferDescriptor = cvdescriptorset::BufferDescriptor;
+ using ImageDescriptor = cvdescriptorset::ImageDescriptor;
+ using ImageSamplerDescriptor = cvdescriptorset::ImageSamplerDescriptor;
+ using TexelDescriptor = cvdescriptorset::TexelDescriptor;
+
+ for (const auto &stage_state : pPipe->stage_state) {
+ if (stage_state.stage_flag == VK_SHADER_STAGE_FRAGMENT_BIT && pPipe->graphicsPipelineCI.pRasterizationState &&
+ pPipe->graphicsPipelineCI.pRasterizationState->rasterizerDiscardEnable)
+ continue;
+ for (const auto &set_binding : stage_state.descriptor_uses) {
+ cvdescriptorset::DescriptorSet *descriptor_set = (*per_sets)[set_binding.first.first].bound_descriptor_set;
+ cvdescriptorset::DescriptorSetLayout::ConstBindingIterator binding_it(descriptor_set->GetLayout().get(),
+ set_binding.first.second);
+ const auto descriptor_type = binding_it.GetType();
+ cvdescriptorset::IndexRange index_range = binding_it.GetGlobalIndexRange();
+ auto array_idx = 0;
+
+ if (binding_it.IsVariableDescriptorCount()) {
+ index_range.end = index_range.start + descriptor_set->GetVariableDescriptorCount();
+ }
+ SyncStageAccessIndex sync_index =
+ GetSyncStageAccessIndexsByDescriptorSet(descriptor_type, set_binding.second, stage_state.stage_flag);
+
+ for (uint32_t i = index_range.start; i < index_range.end; ++i, ++array_idx) {
+ const auto *descriptor = descriptor_set->GetDescriptorFromGlobalIndex(i);
+ switch (descriptor->GetClass()) {
+ case DescriptorClass::ImageSampler:
+ case DescriptorClass::Image: {
+ const IMAGE_VIEW_STATE *img_view_state = nullptr;
+ if (descriptor->GetClass() == DescriptorClass::ImageSampler) {
+ img_view_state = static_cast<const ImageSamplerDescriptor *>(descriptor)->GetImageViewState();
+ } else {
+ img_view_state = static_cast<const ImageDescriptor *>(descriptor)->GetImageViewState();
+ }
+ if (!img_view_state) continue;
+ const IMAGE_STATE *img_state = img_view_state->image_state.get();
+ VkExtent3D extent = {};
+ VkOffset3D offset = {};
+ if (sync_index == SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ) {
+ extent = CastTo3D(cb_state_->activeRenderPassBeginInfo.renderArea.extent);
+ offset = CastTo3D(cb_state_->activeRenderPassBeginInfo.renderArea.offset);
+ } else {
+ extent = img_state->createInfo.extent;
+ }
+ current_context_->UpdateAccessState(*img_state, sync_index, img_view_state->normalized_subresource_range,
+ offset, extent, tag);
+ break;
+ }
+ case DescriptorClass::TexelBuffer: {
+ auto buf_view_state = static_cast<const TexelDescriptor *>(descriptor)->GetBufferViewState();
+ if (!buf_view_state) continue;
+ const BUFFER_STATE *buf_state = buf_view_state->buffer_state.get();
+ ResourceAccessRange range =
+ MakeRange(buf_view_state->create_info.offset, buf_view_state->create_info.range);
+ current_context_->UpdateAccessState(*buf_state, sync_index, range, tag);
+ break;
+ }
+ case DescriptorClass::GeneralBuffer: {
+ const auto *buffer_descriptor = static_cast<const BufferDescriptor *>(descriptor);
+ auto buf_state = buffer_descriptor->GetBufferState();
+ if (!buf_state) continue;
+ ResourceAccessRange range = MakeRange(buffer_descriptor->GetOffset(), buffer_descriptor->GetRange());
+ current_context_->UpdateAccessState(*buf_state, sync_index, range, tag);
+ break;
+ }
+ // TODO: INLINE_UNIFORM_BLOCK_EXT, ACCELERATION_STRUCTURE_KHR
+ default:
+ break;
+ }
+ }
+ }
+ }
+}
+
+bool CommandBufferAccessContext::ValidateDrawVertex(uint32_t vertexCount, uint32_t firstVertex, const char *func_name) const {
+ bool skip = false;
+ const auto *pPipe = GetCurrentPipelineFromCommandBuffer(*cb_state_.get(), VK_PIPELINE_BIND_POINT_GRAPHICS);
+ if (!pPipe) {
+ return skip;
+ }
+
+ const auto &binding_buffers = cb_state_->current_vertex_buffer_binding_info.vertex_buffer_bindings;
+ const auto &binding_buffers_size = binding_buffers.size();
+ const auto &binding_descriptions_size = pPipe->vertex_binding_descriptions_.size();
+
+ for (size_t i = 0; i < binding_descriptions_size; ++i) {
+ const auto &binding_description = pPipe->vertex_binding_descriptions_[i];
+ if (binding_description.binding < binding_buffers_size) {
+ const auto &binding_buffer = binding_buffers[binding_description.binding];
+ if (binding_buffer.buffer == VK_NULL_HANDLE) continue;
+
+ auto *buf_state = sync_state_->Get<BUFFER_STATE>(binding_buffer.buffer);
+ VkDeviceSize range_start = 0;
+ VkDeviceSize range_size = 0;
+ GetBufferRange(range_start, range_size, binding_buffer.offset, buf_state->createInfo.size, firstVertex, vertexCount,
+ binding_description.stride);
+ ResourceAccessRange range = MakeRange(range_start, range_size);
+ auto hazard = current_context_->DetectHazard(*buf_state, SYNC_VERTEX_INPUT_VERTEX_ATTRIBUTE_READ, range);
+ if (hazard.hazard) {
+ skip |= sync_state_->LogError(
+ buf_state->buffer, string_SyncHazardVUID(hazard.hazard), "%s: Hazard %s for vertex %s in %s. Access info %s.",
+ func_name, string_SyncHazard(hazard.hazard), sync_state_->report_data->FormatHandle(buf_state->buffer).c_str(),
+ sync_state_->report_data->FormatHandle(cb_state_->commandBuffer).c_str(), string_UsageTag(hazard).c_str());
+ }
+ }
+ }
+ return skip;
+}
+
+void CommandBufferAccessContext::RecordDrawVertex(uint32_t vertexCount, uint32_t firstVertex, const ResourceUsageTag &tag) {
+ const auto *pPipe = GetCurrentPipelineFromCommandBuffer(*cb_state_.get(), VK_PIPELINE_BIND_POINT_GRAPHICS);
+ if (!pPipe) {
+ return;
+ }
+ const auto &binding_buffers = cb_state_->current_vertex_buffer_binding_info.vertex_buffer_bindings;
+ const auto &binding_buffers_size = binding_buffers.size();
+ const auto &binding_descriptions_size = pPipe->vertex_binding_descriptions_.size();
+
+ for (size_t i = 0; i < binding_descriptions_size; ++i) {
+ const auto &binding_description = pPipe->vertex_binding_descriptions_[i];
+ if (binding_description.binding < binding_buffers_size) {
+ const auto &binding_buffer = binding_buffers[binding_description.binding];
+ if (binding_buffer.buffer == VK_NULL_HANDLE) continue;
+
+ auto *buf_state = sync_state_->Get<BUFFER_STATE>(binding_buffer.buffer);
+ VkDeviceSize range_start = 0;
+ VkDeviceSize range_size = 0;
+ GetBufferRange(range_start, range_size, binding_buffer.offset, buf_state->createInfo.size, firstVertex, vertexCount,
+ binding_description.stride);
+ ResourceAccessRange range = MakeRange(range_start, range_size);
+ current_context_->UpdateAccessState(*buf_state, SYNC_VERTEX_INPUT_VERTEX_ATTRIBUTE_READ, range, tag);
+ }
+ }
+}
+
+bool CommandBufferAccessContext::ValidateDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, const char *func_name) const {
+ bool skip = false;
+ if (cb_state_->index_buffer_binding.buffer == VK_NULL_HANDLE) return skip;
+
+ auto *index_buf_state = sync_state_->Get<BUFFER_STATE>(cb_state_->index_buffer_binding.buffer);
+ const auto index_size = GetIndexAlignment(cb_state_->index_buffer_binding.index_type);
+ VkDeviceSize range_start = 0;
+ VkDeviceSize range_size = 0;
+ GetBufferRange(range_start, range_size, cb_state_->index_buffer_binding.offset, index_buf_state->createInfo.size, firstIndex,
+ indexCount, index_size);
+ ResourceAccessRange range = MakeRange(range_start, range_size);
+ auto hazard = current_context_->DetectHazard(*index_buf_state, SYNC_VERTEX_INPUT_INDEX_READ, range);
+ if (hazard.hazard) {
+ skip |= sync_state_->LogError(
+ index_buf_state->buffer, string_SyncHazardVUID(hazard.hazard), "%s: Hazard %s for index %s in %s. Access info %s.",
+ func_name, string_SyncHazard(hazard.hazard), sync_state_->report_data->FormatHandle(index_buf_state->buffer).c_str(),
+ sync_state_->report_data->FormatHandle(cb_state_->commandBuffer).c_str(), string_UsageTag(hazard).c_str());
+ }
+
+ // TODO: For now, we detect the whole vertex buffer. Index buffer could be changed until SubmitQueue.
+ // We will detect more accurate range in the future.
+ skip |= ValidateDrawVertex(UINT32_MAX, 0, func_name);
+ return skip;
+}
+
+void CommandBufferAccessContext::RecordDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, const ResourceUsageTag &tag) {
+ if (cb_state_->index_buffer_binding.buffer == VK_NULL_HANDLE) return;
+
+ auto *index_buf_state = sync_state_->Get<BUFFER_STATE>(cb_state_->index_buffer_binding.buffer);
+ const auto index_size = GetIndexAlignment(cb_state_->index_buffer_binding.index_type);
+ VkDeviceSize range_start = 0;
+ VkDeviceSize range_size = 0;
+ GetBufferRange(range_start, range_size, cb_state_->index_buffer_binding.offset, index_buf_state->createInfo.size, firstIndex,
+ indexCount, index_size);
+ ResourceAccessRange range = MakeRange(range_start, range_size);
+ current_context_->UpdateAccessState(*index_buf_state, SYNC_VERTEX_INPUT_INDEX_READ, range, tag);
+
+ // TODO: For now, we detect the whole vertex buffer. Index buffer could be changed until SubmitQueue.
+ // We will detect more accurate range in the future.
+ RecordDrawVertex(UINT32_MAX, 0, tag);
+}
+
+bool CommandBufferAccessContext::ValidateDrawSubpassAttachment(const char *func_name) const {
+ bool skip = false;
+ if (!current_renderpass_context_) return skip;
+ skip |= current_renderpass_context_->ValidateDrawSubpassAttachment(*sync_state_, *cb_state_.get(),
+ cb_state_->activeRenderPassBeginInfo.renderArea, func_name);
+ return skip;
+}
+
+void CommandBufferAccessContext::RecordDrawSubpassAttachment(const ResourceUsageTag &tag) {
+ if (current_renderpass_context_)
+ current_renderpass_context_->RecordDrawSubpassAttachment(*cb_state_.get(), cb_state_->activeRenderPassBeginInfo.renderArea,
+ tag);
+}
+
+bool CommandBufferAccessContext::ValidateNextSubpass(const char *func_name) const {
+ bool skip = false;
+ if (!current_renderpass_context_) return skip;
+ skip |=
+ current_renderpass_context_->ValidateNextSubpass(*sync_state_, cb_state_->activeRenderPassBeginInfo.renderArea, func_name);
+
+ return skip;
+}
+
+bool CommandBufferAccessContext::ValidateEndRenderpass(const char *func_name) const {
+ // TODO: Things to add here.
+ // Validate Preserve attachments
+ bool skip = false;
+ if (!current_renderpass_context_) return skip;
+ skip |= current_renderpass_context_->ValidateEndRenderPass(*sync_state_, cb_state_->activeRenderPassBeginInfo.renderArea,
+ func_name);
+
+ return skip;
+}
+
+void CommandBufferAccessContext::RecordBeginRenderPass(const ResourceUsageTag &tag) {
+ assert(sync_state_);
+ if (!cb_state_) return;
+
+ // Create an access context the current renderpass.
+ render_pass_contexts_.emplace_back();
+ current_renderpass_context_ = &render_pass_contexts_.back();
+ current_renderpass_context_->RecordBeginRenderPass(*sync_state_, *cb_state_, &cb_access_context_, queue_flags_, tag);
+ current_context_ = ¤t_renderpass_context_->CurrentContext();
+}
+
+void CommandBufferAccessContext::RecordNextSubpass(const RENDER_PASS_STATE &rp_state, const ResourceUsageTag &tag) {
+ assert(current_renderpass_context_);
+ current_renderpass_context_->RecordNextSubpass(cb_state_->activeRenderPassBeginInfo.renderArea, tag);
+ current_context_ = ¤t_renderpass_context_->CurrentContext();
+}
+
+void CommandBufferAccessContext::RecordEndRenderPass(const RENDER_PASS_STATE &render_pass, const ResourceUsageTag &tag) {
+ assert(current_renderpass_context_);
+ if (!current_renderpass_context_) return;
+
+ current_renderpass_context_->RecordEndRenderPass(&cb_access_context_, cb_state_->activeRenderPassBeginInfo.renderArea, tag);
+ current_context_ = &cb_access_context_;
+ current_renderpass_context_ = nullptr;
+}
+
+bool RenderPassAccessContext::ValidateDrawSubpassAttachment(const SyncValidator &sync_state, const CMD_BUFFER_STATE &cmd,
+ const VkRect2D &render_area, const char *func_name) const {
+ bool skip = false;
+ const auto *pPipe = GetCurrentPipelineFromCommandBuffer(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS);
+ if (!pPipe ||
+ (pPipe->graphicsPipelineCI.pRasterizationState && pPipe->graphicsPipelineCI.pRasterizationState->rasterizerDiscardEnable)) {
+ return skip;
+ }
+ const auto &list = pPipe->fragmentShader_writable_output_location_list;
+ const auto &subpass = rp_state_->createInfo.pSubpasses[current_subpass_];
+ VkExtent3D extent = CastTo3D(render_area.extent);
+ VkOffset3D offset = CastTo3D(render_area.offset);
+
+ const auto ¤t_context = CurrentContext();
+ // Subpass's inputAttachment has been done in ValidateDispatchDrawDescriptorSet
+ if (subpass.pColorAttachments && subpass.colorAttachmentCount && !list.empty()) {
+ for (const auto location : list) {
+ if (location >= subpass.colorAttachmentCount || subpass.pColorAttachments[location].attachment == VK_ATTACHMENT_UNUSED)
+ continue;
+ const IMAGE_VIEW_STATE *img_view_state = attachment_views_[subpass.pColorAttachments[location].attachment];
+ HazardResult hazard = current_context.DetectHazard(img_view_state, SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE,
+ kColorAttachmentRasterOrder, offset, extent);
+ if (hazard.hazard) {
+ skip |= sync_state.LogError(img_view_state->image_view, string_SyncHazardVUID(hazard.hazard),
+ "%s: Hazard %s for %s in %s, Subpass #%d, and pColorAttachments #%d. Access info %s.",
+ func_name, string_SyncHazard(hazard.hazard),
+ sync_state.report_data->FormatHandle(img_view_state->image_view).c_str(),
+ sync_state.report_data->FormatHandle(cmd.commandBuffer).c_str(), cmd.activeSubpass,
+ location, string_UsageTag(hazard).c_str());
+ }
+ }
+ }
+
+ // PHASE1 TODO: Add layout based read/vs. write selection.
+ // PHASE1 TODO: Read operations for both depth and stencil are possible in the future.
+ if (pPipe->graphicsPipelineCI.pDepthStencilState && subpass.pDepthStencilAttachment &&
+ subpass.pDepthStencilAttachment->attachment != VK_ATTACHMENT_UNUSED) {
+ const IMAGE_VIEW_STATE *img_view_state = attachment_views_[subpass.pDepthStencilAttachment->attachment];
+ bool depth_write = false, stencil_write = false;
+
+ // PHASE1 TODO: These validation should be in core_checks.
+ if (!FormatIsStencilOnly(img_view_state->create_info.format) &&
+ pPipe->graphicsPipelineCI.pDepthStencilState->depthTestEnable &&
+ pPipe->graphicsPipelineCI.pDepthStencilState->depthWriteEnable &&
+ IsImageLayoutDepthWritable(subpass.pDepthStencilAttachment->layout)) {
+ depth_write = true;
+ }
+ // PHASE1 TODO: It needs to check if stencil is writable.
+ // If failOp, passOp, or depthFailOp are not KEEP, and writeMask isn't 0, it's writable.
+ // If depth test is disable, it's considered depth test passes, and then depthFailOp doesn't run.
+ // PHASE1 TODO: These validation should be in core_checks.
+ if (!FormatIsDepthOnly(img_view_state->create_info.format) &&
+ pPipe->graphicsPipelineCI.pDepthStencilState->stencilTestEnable &&
+ IsImageLayoutStencilWritable(subpass.pDepthStencilAttachment->layout)) {
+ stencil_write = true;
+ }
+
+ // PHASE1 TODO: Add EARLY stage detection based on ExecutionMode.
+ if (depth_write) {
+ HazardResult hazard =
+ current_context.DetectHazard(img_view_state, SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE,
+ kDepthStencilAttachmentRasterOrder, offset, extent, VK_IMAGE_ASPECT_DEPTH_BIT);
+ if (hazard.hazard) {
+ skip |= sync_state.LogError(
+ img_view_state->image_view, string_SyncHazardVUID(hazard.hazard),
+ "%s: Hazard %s for %s in %s, Subpass #%d, and depth part of pDepthStencilAttachment. Access info %s.",
+ func_name, string_SyncHazard(hazard.hazard),
+ sync_state.report_data->FormatHandle(img_view_state->image_view).c_str(),
+ sync_state.report_data->FormatHandle(cmd.commandBuffer).c_str(), cmd.activeSubpass,
+ string_UsageTag(hazard).c_str());
+ }
+ }
+ if (stencil_write) {
+ HazardResult hazard =
+ current_context.DetectHazard(img_view_state, SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE,
+ kDepthStencilAttachmentRasterOrder, offset, extent, VK_IMAGE_ASPECT_STENCIL_BIT);
+ if (hazard.hazard) {
+ skip |= sync_state.LogError(
+ img_view_state->image_view, string_SyncHazardVUID(hazard.hazard),
+ "%s: Hazard %s for %s in %s, Subpass #%d, and stencil part of pDepthStencilAttachment. Access info %s.",
+ func_name, string_SyncHazard(hazard.hazard),
+ sync_state.report_data->FormatHandle(img_view_state->image_view).c_str(),
+ sync_state.report_data->FormatHandle(cmd.commandBuffer).c_str(), cmd.activeSubpass,
+ string_UsageTag(hazard).c_str());
+ }
+ }
+ }
+ return skip;
+}
+
+void RenderPassAccessContext::RecordDrawSubpassAttachment(const CMD_BUFFER_STATE &cmd, const VkRect2D &render_area,
+ const ResourceUsageTag &tag) {
+ const auto *pPipe = GetCurrentPipelineFromCommandBuffer(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS);
+ if (!pPipe ||
+ (pPipe->graphicsPipelineCI.pRasterizationState && pPipe->graphicsPipelineCI.pRasterizationState->rasterizerDiscardEnable)) {
+ return;
+ }
+ const auto &list = pPipe->fragmentShader_writable_output_location_list;
+ const auto &subpass = rp_state_->createInfo.pSubpasses[current_subpass_];
+ VkExtent3D extent = CastTo3D(render_area.extent);
+ VkOffset3D offset = CastTo3D(render_area.offset);
+
+ auto ¤t_context = CurrentContext();
+ // Subpass's inputAttachment has been done in RecordDispatchDrawDescriptorSet
+ if (subpass.pColorAttachments && subpass.colorAttachmentCount && !list.empty()) {
+ for (const auto location : list) {
+ if (location >= subpass.colorAttachmentCount || subpass.pColorAttachments[location].attachment == VK_ATTACHMENT_UNUSED)
+ continue;
+ const IMAGE_VIEW_STATE *img_view_state = attachment_views_[subpass.pColorAttachments[location].attachment];
+ current_context.UpdateAccessState(img_view_state, SYNC_COLOR_ATTACHMENT_OUTPUT_COLOR_ATTACHMENT_WRITE, offset, extent,
+ 0, tag);
+ }
+ }
+
+ // PHASE1 TODO: Add layout based read/vs. write selection.
+ // PHASE1 TODO: Read operations for both depth and stencil are possible in the future.
+ if (pPipe->graphicsPipelineCI.pDepthStencilState && subpass.pDepthStencilAttachment &&
+ subpass.pDepthStencilAttachment->attachment != VK_ATTACHMENT_UNUSED) {
+ const IMAGE_VIEW_STATE *img_view_state = attachment_views_[subpass.pDepthStencilAttachment->attachment];
+ bool depth_write = false, stencil_write = false;
+
+ // PHASE1 TODO: These validation should be in core_checks.
+ if (!FormatIsStencilOnly(img_view_state->create_info.format) &&
+ pPipe->graphicsPipelineCI.pDepthStencilState->depthTestEnable &&
+ pPipe->graphicsPipelineCI.pDepthStencilState->depthWriteEnable &&
+ IsImageLayoutDepthWritable(subpass.pDepthStencilAttachment->layout)) {
+ depth_write = true;
+ }
+ // PHASE1 TODO: It needs to check if stencil is writable.
+ // If failOp, passOp, or depthFailOp are not KEEP, and writeMask isn't 0, it's writable.
+ // If depth test is disable, it's considered depth test passes, and then depthFailOp doesn't run.
+ // PHASE1 TODO: These validation should be in core_checks.
+ if (!FormatIsDepthOnly(img_view_state->create_info.format) &&
+ pPipe->graphicsPipelineCI.pDepthStencilState->stencilTestEnable &&
+ IsImageLayoutStencilWritable(subpass.pDepthStencilAttachment->layout)) {
+ stencil_write = true;
+ }
+
+ // PHASE1 TODO: Add EARLY stage detection based on ExecutionMode.
+ if (depth_write) {
+ current_context.UpdateAccessState(img_view_state, SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE, offset,
+ extent, VK_IMAGE_ASPECT_DEPTH_BIT, tag);
+ }
+ if (stencil_write) {
+ current_context.UpdateAccessState(img_view_state, SYNC_LATE_FRAGMENT_TESTS_DEPTH_STENCIL_ATTACHMENT_WRITE, offset,
+ extent, VK_IMAGE_ASPECT_STENCIL_BIT, tag);
+ }
+ }
+}
+
+bool RenderPassAccessContext::ValidateNextSubpass(const SyncValidator &sync_state, const VkRect2D &render_area,
+ const char *func_name) const {
+ // PHASE1 TODO: Add Validate Preserve attachments
+ bool skip = false;
+ skip |= CurrentContext().ValidateResolveOperations(sync_state, *rp_state_, render_area, attachment_views_, func_name,
+ current_subpass_);
+ skip |= CurrentContext().ValidateStoreOperation(sync_state, *rp_state_, render_area, current_subpass_, attachment_views_,
+ func_name);
+
+ const auto next_subpass = current_subpass_ + 1;
+ const auto &next_context = subpass_contexts_[next_subpass];
+ skip |= next_context.ValidateLayoutTransitions(sync_state, *rp_state_, render_area, next_subpass, attachment_views_, func_name);
+ skip |= next_context.ValidateLoadOperation(sync_state, *rp_state_, render_area, next_subpass, attachment_views_, func_name);
+ return skip;
+}
+bool RenderPassAccessContext::ValidateEndRenderPass(const SyncValidator &sync_state, const VkRect2D &render_area,
+ const char *func_name) const {
+ // PHASE1 TODO: Validate Preserve
+ bool skip = false;
+ skip |= CurrentContext().ValidateResolveOperations(sync_state, *rp_state_, render_area, attachment_views_, func_name,
+ current_subpass_);
+ skip |= CurrentContext().ValidateStoreOperation(sync_state, *rp_state_, render_area, current_subpass_, attachment_views_,
+ func_name);
+ skip |= ValidateFinalSubpassLayoutTransitions(sync_state, render_area, func_name);
+ return skip;
+}
+
+AccessContext *RenderPassAccessContext::CreateStoreResolveProxy(const VkRect2D &render_area) const {
+ return CreateStoreResolveProxyContext(CurrentContext(), *rp_state_, current_subpass_, render_area, attachment_views_);
+}
+
+bool RenderPassAccessContext::ValidateFinalSubpassLayoutTransitions(const SyncValidator &sync_state, const VkRect2D &render_area,
+ const char *func_name) const {
+ bool skip = false;
+
+ // As validation methods are const and precede the record/update phase, for any tranistions from the current (last)
+ // subpass, we have to validate them against a copy of the current AccessContext, with resolve operations applied.
+ // Note: we could be more efficient by tracking whether or not we actually *have* any changes (e.g. attachment resolve)
+ // to apply and only copy then, if this proves a hot spot.
+ std::unique_ptr<AccessContext> proxy_for_current;
+
+ // Validate the "finalLayout" transitions to external
+ // Get them from where there we're hidding in the extra entry.
+ const auto &final_transitions = rp_state_->subpass_transitions.back();
+ for (const auto &transition : final_transitions) {
+ const auto &attach_view = attachment_views_[transition.attachment];
+ const auto &trackback = subpass_contexts_[transition.prev_pass].GetDstExternalTrackBack();
+ assert(trackback.context); // Transitions are given implicit transitions if the StateTracker is working correctly
+ auto *context = trackback.context;
+
+ if (transition.prev_pass == current_subpass_) {
+ if (!proxy_for_current) {
+ // We haven't recorded resolve ofor the current_subpass, so we need to copy current and update it *as if*
+ proxy_for_current.reset(CreateStoreResolveProxy(render_area));
+ }
+ context = proxy_for_current.get();
+ }
+
+ auto hazard = context->DetectImageBarrierHazard(
+ *attach_view->image_state, trackback.barrier.src_exec_scope, trackback.barrier.src_access_scope,
+ attach_view->normalized_subresource_range, AccessContext::DetectOptions::kDetectPrevious);
+ if (hazard.hazard) {
+ skip |= sync_state.LogError(rp_state_->renderPass, string_SyncHazardVUID(hazard.hazard),
+ "%s: Hazard %s with last use subpass %" PRIu32 " for attachment %" PRIu32
+ " final image layout transition (old_layout: %s, new_layout: %s). Access info %s.",
+ func_name, string_SyncHazard(hazard.hazard), transition.prev_pass, transition.attachment,
+ string_VkImageLayout(transition.old_layout), string_VkImageLayout(transition.new_layout),
+ string_UsageTag(hazard).c_str());
+ }
+ }
+ return skip;
+}
+
+void RenderPassAccessContext::RecordLayoutTransitions(const ResourceUsageTag &tag) {
+ // Add layout transitions...
+ const auto &transitions = rp_state_->subpass_transitions[current_subpass_];
+ auto &subpass_context = subpass_contexts_[current_subpass_];
+ std::set<const IMAGE_VIEW_STATE *> view_seen;
+ for (const auto &transition : transitions) {
+ const auto attachment_view = attachment_views_[transition.attachment];
+ if (!attachment_view) continue;
+ const auto image = attachment_view->image_state.get();
+ if (!image) continue;
+
+ const auto *barrier = subpass_context.GetTrackBackFromSubpass(transition.prev_pass);
+ auto insert_pair = view_seen.insert(attachment_view);
+ if (insert_pair.second) {
+ // We haven't recorded the transistion yet, so treat this as a normal barrier with transistion.
+ subpass_context.ApplyImageBarrier(*image, barrier->barrier, attachment_view->normalized_subresource_range, true, tag);
+
+ } else {
+ // We've recorded the transition, but we need to added on the additional dest barriers, and rerecording the transition
+ // would clear out the prior barrier flags, so apply this as a *non* transition barrier
+ auto barrier_to_transition = barrier->barrier;
+ barrier_to_transition.src_access_scope |= SYNC_IMAGE_LAYOUT_TRANSITION_BIT;
+ subpass_context.ApplyImageBarrier(*image, barrier->barrier, attachment_view->normalized_subresource_range, false, tag);
+ }
+ }
+}
+
+void RenderPassAccessContext::RecordLoadOperations(const VkRect2D &render_area, const ResourceUsageTag &tag) {
+ const auto *attachment_ci = rp_state_->createInfo.pAttachments;
+ auto &subpass_context = subpass_contexts_[current_subpass_];
+ VkExtent3D extent = CastTo3D(render_area.extent);
+ VkOffset3D offset = CastTo3D(render_area.offset);
+
+ for (uint32_t i = 0; i < rp_state_->createInfo.attachmentCount; i++) {
+ if (rp_state_->attachment_first_subpass[i] == current_subpass_) {
+ if (attachment_views_[i] == nullptr) continue; // UNUSED
+ const auto &view = *attachment_views_[i];
+ const IMAGE_STATE *image = view.image_state.get();
+ if (image == nullptr) continue;
+
+ const auto &ci = attachment_ci[i];
+ const bool has_depth = FormatHasDepth(ci.format);
+ const bool has_stencil = FormatHasStencil(ci.format);
+ const bool is_color = !(has_depth || has_stencil);
+
+ if (is_color) {
+ subpass_context.UpdateAccessState(*image, ColorLoadUsage(ci.loadOp), view.normalized_subresource_range, offset,
+ extent, tag);
+ } else {
+ auto update_range = view.normalized_subresource_range;
+ if (has_depth) {
+ update_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
+ subpass_context.UpdateAccessState(*image, DepthStencilLoadUsage(ci.loadOp), update_range, offset, extent, tag);
+ }
+ if (has_stencil) {
+ update_range.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
+ subpass_context.UpdateAccessState(*image, DepthStencilLoadUsage(ci.stencilLoadOp), update_range, offset, extent,
+ tag);
+ }
+ }
+ }
+ }
+}
+
+void RenderPassAccessContext::RecordBeginRenderPass(const SyncValidator &state, const CMD_BUFFER_STATE &cb_state,
+ const AccessContext *external_context, VkQueueFlags queue_flags,
+ const ResourceUsageTag &tag) {
+ current_subpass_ = 0;
+ rp_state_ = cb_state.activeRenderPass.get();
+ subpass_contexts_.reserve(rp_state_->createInfo.subpassCount);
+ // Add this for all subpasses here so that they exsist during next subpass validation
+ for (uint32_t pass = 0; pass < rp_state_->createInfo.subpassCount; pass++) {
+ subpass_contexts_.emplace_back(pass, queue_flags, rp_state_->subpass_dependencies, subpass_contexts_, external_context);
+ }
+ attachment_views_ = state.GetCurrentAttachmentViews(cb_state);
+
+ RecordLayoutTransitions(tag);
+ RecordLoadOperations(cb_state.activeRenderPassBeginInfo.renderArea, tag);
+}
+
+void RenderPassAccessContext::RecordNextSubpass(const VkRect2D &render_area, const ResourceUsageTag &tag) {
+ // Resolves are against *prior* subpass context and thus *before* the subpass increment
+ CurrentContext().UpdateAttachmentResolveAccess(*rp_state_, render_area, attachment_views_, current_subpass_, tag);
+ CurrentContext().UpdateAttachmentStoreAccess(*rp_state_, render_area, attachment_views_, current_subpass_, tag);
+
+ current_subpass_++;
+ assert(current_subpass_ < subpass_contexts_.size());
+ RecordLayoutTransitions(tag);
+ RecordLoadOperations(render_area, tag);
+}
+
+void RenderPassAccessContext::RecordEndRenderPass(AccessContext *external_context, const VkRect2D &render_area,
+ const ResourceUsageTag &tag) {
+ // Add the resolve and store accesses
+ CurrentContext().UpdateAttachmentResolveAccess(*rp_state_, render_area, attachment_views_, current_subpass_, tag);
+ CurrentContext().UpdateAttachmentStoreAccess(*rp_state_, render_area, attachment_views_, current_subpass_, tag);
+
+ // Export the accesses from the renderpass...
+ external_context->ResolveChildContexts(subpass_contexts_);
+
+ // Add the "finalLayout" transitions to external
+ // Get them from where there we're hidding in the extra entry.
+ const auto &final_transitions = rp_state_->subpass_transitions.back();
+ for (const auto &transition : final_transitions) {
+ const auto &attachment = attachment_views_[transition.attachment];
+ const auto &last_trackback = subpass_contexts_[transition.prev_pass].GetDstExternalTrackBack();
+ assert(&subpass_contexts_[transition.prev_pass] == last_trackback.context);
+ external_context->ApplyImageBarrier(*attachment->image_state, last_trackback.barrier,
+ attachment->normalized_subresource_range, true, tag);
+ }
+}
+
+SyncBarrier::SyncBarrier(VkQueueFlags queue_flags, const VkSubpassDependency2 &barrier) {
+ const auto src_stage_mask = ExpandPipelineStages(queue_flags, barrier.srcStageMask);
+ src_exec_scope = WithEarlierPipelineStages(src_stage_mask);
+ src_access_scope = SyncStageAccess::AccessScope(src_stage_mask, barrier.srcAccessMask);
+ const auto dst_stage_mask = ExpandPipelineStages(queue_flags, barrier.dstStageMask);
+ dst_exec_scope = WithLaterPipelineStages(dst_stage_mask);
+ dst_access_scope = SyncStageAccess::AccessScope(dst_stage_mask, barrier.dstAccessMask);
+}
+
+void ResourceAccessState::ApplyBarrier(const SyncBarrier &barrier) {
+ ApplyExecutionBarrier(barrier.src_exec_scope, barrier.dst_exec_scope);
+ ApplyMemoryAccessBarrier(barrier.src_exec_scope, barrier.src_access_scope, barrier.dst_exec_scope, barrier.dst_access_scope);
+}
+
+HazardResult ResourceAccessState::DetectHazard(SyncStageAccessIndex usage_index) const {
+ HazardResult hazard;
+ auto usage = FlagBit(usage_index);
+ const auto usage_stage = PipelineStageBit(usage_index);
+ if (IsRead(usage)) {
+ // Only check reads vs. last_write if it doesn't happen-after any other read because either:
+ // * the previous reads are not hazards, and thus last_write must be visible and available to
+ // any reads that happen after.
+ // * the previous reads *are* hazards to last_write, have been reported, and if that hazard is fixed
+ // the current read will be also not be a hazard, thus reporting a hazard here adds no needed information.
+ if (((usage_stage & read_execution_barriers) == 0) && last_write && IsWriteHazard(usage)) {
+ hazard.Set(this, usage_index, READ_AFTER_WRITE, last_write, write_tag);
+ }
+ } else {
+ // Write operation:
+ // Check for read operations more recent than last_write (as setting last_write clears reads, that would be *any*
+ // If reads exists -- test only against them because either:
+ // * the reads were hazards, and we've reported the hazard, so just test the current write vs. the read operations
+ // * the read weren't hazards, and thus if the write is safe w.r.t. the reads, no hazard vs. last_write is possible if
+ // the current write happens after the reads, so just test the write against the reades
+ // Otherwise test against last_write
+ //
+ // Look for casus belli for WAR
+ if (last_read_count) {
+ for (uint32_t read_index = 0; read_index < last_read_count; read_index++) {
+ const auto &read_access = last_reads[read_index];
+ if (IsReadHazard(usage_stage, read_access)) {
+ hazard.Set(this, usage_index, WRITE_AFTER_READ, read_access.access, read_access.tag);
+ break;
+ }
+ }
+ } else if (input_attachment_barriers != kNoAttachmentRead) {
+ if (IsReadHazard(usage_stage, input_attachment_barriers)) {
+ hazard.Set(this, usage_index, WRITE_AFTER_READ, SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ, input_attachment_tag);
+ }
+ } else if (last_write && IsWriteHazard(usage)) {
+ // Write-After-Write check -- if we have a previous write to test against
+ hazard.Set(this, usage_index, WRITE_AFTER_WRITE, last_write, write_tag);
+ }
+ }
+ return hazard;
+}
+
+HazardResult ResourceAccessState::DetectHazard(SyncStageAccessIndex usage_index, const SyncOrderingBarrier &ordering) const {
+ // The ordering guarantees act as barriers to the last accesses, independent of synchronization operations
+ HazardResult hazard;
+ const auto usage = FlagBit(usage_index);
+ const auto usage_stage = PipelineStageBit(usage_index);
+ const bool write_is_ordered = (last_write & ordering.access_scope) == last_write; // Is true if no write, and that's good.
+ if (IsRead(usage)) {
+ if (!write_is_ordered) {
+ // Only check for RAW if the write is unordered, and there are no reads ordered before the current read since last_write
+ // See DetectHazard(SyncStagetAccessIndex) above for more details.
+ // We need to assemble the effect read_execution barriers from the union of the state barriers and the ordering rules
+ // Check to see if there are any reads ordered before usage, including ordering rules and barriers.
+ bool ordered_read = 0 != ((last_read_stages & ordering.exec_scope) | (read_execution_barriers & usage_stage));
+ // Noting the "special* encoding of the input attachment ordering rule (in access, but not exec)
+ if ((ordering.access_scope & SyncStageAccessFlagBits::SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ_BIT) &&
+ (input_attachment_barriers != kNoAttachmentRead)) {
+ ordered_read = true;
+ }
+
+ if (!ordered_read && IsWriteHazard(usage)) {
+ hazard.Set(this, usage_index, READ_AFTER_WRITE, last_write, write_tag);
+ }
+ }
+
+ } else {
+ // Only check for WAW if there are no reads since last_write
+ if (last_read_count) {
+ // Ignore ordered read stages (which represent frame-buffer local operations, except input attachment
+ const auto unordered_reads = last_read_stages & ~ordering.exec_scope;
+ // Look for any WAR hazards outside the ordered set of stages
+ for (uint32_t read_index = 0; read_index < last_read_count; read_index++) {
+ const auto &read_access = last_reads[read_index];
+ if ((read_access.stage & unordered_reads) && IsReadHazard(usage_stage, read_access)) {
+ hazard.Set(this, usage_index, WRITE_AFTER_READ, read_access.access, read_access.tag);
+ break;
+ }
+ }
+ } else if (input_attachment_barriers != kNoAttachmentRead) {
+ // This is special case code for the fragment shader input attachment, which unlike all other fragment shader operations
+ // is framebuffer local, and thus subject to raster ordering guarantees
+ if (0 == (ordering.access_scope & SyncStageAccessFlagBits::SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ_BIT)) {
+ // NOTE: Currently all ordering barriers include this bit, so this code may never be reached, but it's
+ // here s.t. if we need to change the ordering barrier/rules we needn't change the code.
+ hazard.Set(this, usage_index, WRITE_AFTER_READ, SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ, input_attachment_tag);
+ }
+ } else if (!write_is_ordered && IsWriteHazard(usage)) {
+ hazard.Set(this, usage_index, WRITE_AFTER_WRITE, last_write, write_tag);
+ }
+ }
+ return hazard;
+}
+
+// Asynchronous Hazards occur between subpasses with no connection through the DAG
+HazardResult ResourceAccessState::DetectAsyncHazard(SyncStageAccessIndex usage_index) const {
+ HazardResult hazard;
+ auto usage = FlagBit(usage_index);
+ if (IsRead(usage)) {
+ if (last_write != 0) {
+ hazard.Set(this, usage_index, READ_RACING_WRITE, last_write, write_tag);
+ }
+ } else {
+ if (last_write != 0) {
+ hazard.Set(this, usage_index, WRITE_RACING_WRITE, last_write, write_tag);
+ } else if (last_read_count > 0) {
+ hazard.Set(this, usage_index, WRITE_RACING_READ, last_reads[0].access, last_reads[0].tag);
+ } else if (input_attachment_barriers != kNoAttachmentRead) {
+ hazard.Set(this, usage_index, WRITE_RACING_READ, SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ, input_attachment_tag);
+ }
+ }
+ return hazard;
+}
+
+HazardResult ResourceAccessState::DetectBarrierHazard(SyncStageAccessIndex usage_index, VkPipelineStageFlags src_exec_scope,
+ SyncStageAccessFlags src_access_scope) const {
+ // Only supporting image layout transitions for now
+ assert(usage_index == SyncStageAccessIndex::SYNC_IMAGE_LAYOUT_TRANSITION);
+ HazardResult hazard;
+ // only test for WAW if there no intervening read operations.
+ // See DetectHazard(SyncStagetAccessIndex) above for more details.
+ if (last_read_count) {
+ // Look at the reads if any
+ for (uint32_t read_index = 0; read_index < last_read_count; read_index++) {
+ const auto &read_access = last_reads[read_index];
+ // If the read stage is not in the src sync sync
+ // *AND* not execution chained with an existing sync barrier (that's the or)
+ // then the barrier access is unsafe (R/W after R)
+ if ((src_exec_scope & (read_access.stage | read_access.barriers)) == 0) {
+ hazard.Set(this, usage_index, WRITE_AFTER_READ, read_access.access, read_access.tag);
+ break;
+ }
+ }
+ } else if (input_attachment_barriers != kNoAttachmentRead) {
+ // Same logic as read acces above for the special case of input attachment read
+ if ((src_exec_scope & (VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | input_attachment_barriers)) == 0) {
+ hazard.Set(this, usage_index, WRITE_AFTER_READ, SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ_BIT, input_attachment_tag);
+ }
+ } else if (last_write) {
+ // If the previous write is *not* in the 1st access scope
+ // *AND* the current barrier is not in the dependency chain
+ // *AND* the there is no prior memory barrier for the previous write in the dependency chain
+ // then the barrier access is unsafe (R/W after W)
+ if (((last_write & src_access_scope) == 0) && ((src_exec_scope & write_dependency_chain) == 0) && (write_barriers == 0)) {
+ // TODO: Do we need a difference hazard name for this?
+ hazard.Set(this, usage_index, WRITE_AFTER_WRITE, last_write, write_tag);
+ }
+ }
+
+ return hazard;
+}
+
+// The logic behind resolves is the same as update, we assume that earlier hazards have be reported, and that no
+// tranistive hazard can exists with a hazard between the earlier operations. Yes, an early hazard can mask that another
+// exists, but if you fix *that* hazard it either fixes or unmasks the subsequent ones.
+void ResourceAccessState::Resolve(const ResourceAccessState &other) {
+ if (write_tag.IsBefore(other.write_tag)) {
+ // If this is a later write, we've reported any exsiting hazard, and we can just overwrite as the more recent operation
+ *this = other;
+ } else if (!other.write_tag.IsBefore(write_tag)) {
+ // This is the *equals* case for write operations, we merged the write barriers and the read state (but without the
+ // dependency chaining logic or any stage expansion)
+ write_barriers |= other.write_barriers;
+
+ // Merge the read states
+ if (input_attachment_barriers == kNoAttachmentRead) {
+ // this doesn't have an input attachment read, so we'll take other, unconditionally (even if it's kNoAttachmentRead)
+ input_attachment_barriers = other.input_attachment_barriers;
+ input_attachment_tag = other.input_attachment_tag;
+ } else if (other.input_attachment_barriers != kNoAttachmentRead) {
+ // Both states have an input attachment read, pick the newest tag and merge barriers.
+ if (input_attachment_tag.IsBefore(other.input_attachment_tag)) {
+ input_attachment_tag = other.input_attachment_tag;
+ }
+ input_attachment_barriers |= other.input_attachment_barriers;
+ }
+ // The else clause is that only this has an attachment read and no merge is needed
+
+ for (uint32_t other_read_index = 0; other_read_index < other.last_read_count; other_read_index++) {
+ auto &other_read = other.last_reads[other_read_index];
+ if (last_read_stages & other_read.stage) {
+ // Merge in the barriers for read stages that exist in *both* this and other
+ // TODO: This is N^2 with stages... perhaps the ReadStates should be by stage index.
+ for (uint32_t my_read_index = 0; my_read_index < last_read_count; my_read_index++) {
+ auto &my_read = last_reads[my_read_index];
+ if (other_read.stage == my_read.stage) {
+ if (my_read.tag.IsBefore(other_read.tag)) {
+ my_read.tag = other_read.tag;
+ my_read.access = other_read.access;
+ }
+ my_read.barriers |= other_read.barriers;
+ break;
+ }
+ }
+ } else {
+ // The other read stage doesn't exist in this, so add it.
+ last_reads[last_read_count] = other_read;
+ last_read_count++;
+ last_read_stages |= other_read.stage;
+ }
+ }
+ read_execution_barriers |= other.read_execution_barriers;
+ } // the else clause would be that other write is before this write... in which case we supercede the other state and ignore
+ // it.
+}
+
+void ResourceAccessState::Update(SyncStageAccessIndex usage_index, const ResourceUsageTag &tag) {
+ // Move this logic in the ResourceStateTracker as methods, thereof (or we'll repeat it for every flavor of resource...
+ const auto usage_bit = FlagBit(usage_index);
+ if (usage_bit == SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ_BIT) {
+ // Input attachment requires special treatment for raster/load/store ordering guarantees
+ input_attachment_barriers = 0;
+ input_attachment_tag = tag;
+ } else if (IsRead(usage_index)) {
+ // Mulitple outstanding reads may be of interest and do dependency chains independently
+ // However, for purposes of barrier tracking, only one read per pipeline stage matters
+ const auto usage_stage = PipelineStageBit(usage_index);
+ if (usage_stage & last_read_stages) {
+ for (uint32_t read_index = 0; read_index < last_read_count; read_index++) {
+ ReadState &access = last_reads[read_index];
+ if (access.stage == usage_stage) {
+ access.access = usage_bit;
+ access.barriers = 0;
+ access.tag = tag;
+ break;
+ }
+ }
+ } else {
+ // We don't have this stage in the list yet...
+ assert(last_read_count < last_reads.size());
+ ReadState &access = last_reads[last_read_count++];
+ access.stage = usage_stage;
+ access.access = usage_bit;
+ access.barriers = 0;
+ access.tag = tag;
+ last_read_stages |= usage_stage;
+ }
+ } else {
+ // Assume write
+ // TODO determine what to do with READ-WRITE operations if any
+ // Clobber last read and all barriers... because all we have is DANGER, DANGER, WILL ROBINSON!!!
+ // if the last_reads/last_write were unsafe, we've reported them,
+ // in either case the prior access is irrelevant, we can overwrite them as *this* write is now after them
+ last_read_count = 0;
+ last_read_stages = 0;
+ read_execution_barriers = 0;
+
+ input_attachment_barriers = kNoAttachmentRead; // Denotes no outstanding input attachment read after the last write.
+ // NOTE: we don't reset the tag, as the equality check ignores it when kNoAttachmentRead is set.
+
+ write_barriers = 0;
+ write_dependency_chain = 0;
+ write_tag = tag;
+ last_write = usage_bit;
+ }
+}
+
+void ResourceAccessState::ApplyExecutionBarrier(VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask) {
+ // Execution Barriers only protect read operations
+ for (uint32_t read_index = 0; read_index < last_read_count; read_index++) {
+ ReadState &access = last_reads[read_index];
+ // The | implements the "dependency chain" logic for this access, as the barriers field stores the second sync scope
+ if (srcStageMask & (access.stage | access.barriers)) {
+ access.barriers |= dstStageMask;
+ read_execution_barriers |= dstStageMask;
+ }
+ }
+ if ((input_attachment_barriers != kNoAttachmentRead) &&
+ (srcStageMask & (VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | input_attachment_barriers))) {
+ input_attachment_barriers |= dstStageMask;
+ read_execution_barriers |= dstStageMask;
+ }
+ if (write_dependency_chain & srcStageMask) {
+ write_dependency_chain |= dstStageMask;
+ }
+}
+
+void ResourceAccessState::ApplyMemoryAccessBarrier(VkPipelineStageFlags src_exec_scope, SyncStageAccessFlags src_access_scope,
+ VkPipelineStageFlags dst_exec_scope, SyncStageAccessFlags dst_access_scope) {
+ // Assuming we've applied the execution side of this barrier, we update just the write
+ // The || implements the "dependency chain" logic for this barrier
+ if ((src_access_scope & last_write) || (write_dependency_chain & src_exec_scope)) {
+ write_barriers |= dst_access_scope;
+ write_dependency_chain |= dst_exec_scope;
+ }
+}
+
+// This should be just Bits or Index, but we don't have an invalid state for Index
+VkPipelineStageFlags ResourceAccessState::GetReadBarriers(SyncStageAccessFlags usage_bit) const {
+ VkPipelineStageFlags barriers = 0U;
+ if (usage_bit & SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ_BIT) {
+ barriers = input_attachment_barriers;
+ } else {
+ for (uint32_t read_index = 0; read_index < last_read_count; read_index++) {
+ const auto &read_access = last_reads[read_index];
+ if (read_access.access & usage_bit) {
+ barriers = read_access.barriers;
+ break;
+ }
+ }
+ }
+ return barriers;
+}
+
+void SyncValidator::ResetCommandBufferCallback(VkCommandBuffer command_buffer) {
+ auto *access_context = GetAccessContextNoInsert(command_buffer);
+ if (access_context) {
+ access_context->Reset();
+ }
+}
+
+void SyncValidator::FreeCommandBufferCallback(VkCommandBuffer command_buffer) {
+ auto access_found = cb_access_state.find(command_buffer);
+ if (access_found != cb_access_state.end()) {
+ access_found->second->Reset();
+ cb_access_state.erase(access_found);
+ }
+}
+
+void SyncValidator::ApplyGlobalBarriers(AccessContext *context, VkPipelineStageFlags srcStageMask,
+ VkPipelineStageFlags dstStageMask, SyncStageAccessFlags src_access_scope,
+ SyncStageAccessFlags dst_access_scope, uint32_t memoryBarrierCount,
+ const VkMemoryBarrier *pMemoryBarriers) {
+ // TODO: Implement this better (maybe some delayed/on-demand integration).
+ ApplyGlobalBarrierFunctor barriers_functor(srcStageMask, dstStageMask, src_access_scope, dst_access_scope, memoryBarrierCount,
+ pMemoryBarriers);
+ context->ApplyGlobalBarriers(barriers_functor);
+}
+
+void SyncValidator::ApplyBufferBarriers(AccessContext *context, VkPipelineStageFlags src_exec_scope,
+ SyncStageAccessFlags src_stage_accesses, VkPipelineStageFlags dst_exec_scope,
+ SyncStageAccessFlags dst_stage_accesses, uint32_t barrier_count,
+ const VkBufferMemoryBarrier *barriers) {
+ for (uint32_t index = 0; index < barrier_count; index++) {
+ auto barrier = barriers[index];
+ const auto *buffer = Get<BUFFER_STATE>(barrier.buffer);
+ if (!buffer) continue;
+ barrier.size = GetRealWholeSize(barrier.offset, barrier.size, buffer->createInfo.size);
+ ResourceAccessRange range = MakeRange(barrier);
+ const auto src_access_scope = AccessScope(src_stage_accesses, barrier.srcAccessMask);
+ const auto dst_access_scope = AccessScope(dst_stage_accesses, barrier.dstAccessMask);
+ const ApplyMemoryAccessBarrierFunctor update_action(src_exec_scope, src_access_scope, dst_exec_scope, dst_access_scope);
+ context->UpdateMemoryAccess(*buffer, range, update_action);
+ }
+}
+
+void SyncValidator::ApplyImageBarriers(AccessContext *context, VkPipelineStageFlags src_exec_scope,
+ SyncStageAccessFlags src_stage_accesses, VkPipelineStageFlags dst_exec_scope,
+ SyncStageAccessFlags dst_stage_accesses, uint32_t barrier_count,
+ const VkImageMemoryBarrier *barriers, const ResourceUsageTag &tag) {
+ for (uint32_t index = 0; index < barrier_count; index++) {
+ const auto &barrier = barriers[index];
+ const auto *image = Get<IMAGE_STATE>(barrier.image);
+ if (!image) continue;
+ auto subresource_range = NormalizeSubresourceRange(image->createInfo, barrier.subresourceRange);
+ bool layout_transition = barrier.oldLayout != barrier.newLayout;
+ const auto src_access_scope = AccessScope(src_stage_accesses, barrier.srcAccessMask);
+ const auto dst_access_scope = AccessScope(dst_stage_accesses, barrier.dstAccessMask);
+ context->ApplyImageBarrier(*image, src_exec_scope, src_access_scope, dst_exec_scope, dst_access_scope, subresource_range,
+ layout_transition, tag);
+ }
+}
+
+bool SyncValidator::PreCallValidateCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
+ uint32_t regionCount, const VkBufferCopy *pRegions) const {
+ bool skip = false;
+ const auto *cb_context = GetAccessContext(commandBuffer);
+ assert(cb_context);
+ if (!cb_context) return skip;
+ const auto *context = cb_context->GetCurrentAccessContext();
+
+ // If we have no previous accesses, we have no hazards
+ const auto *src_buffer = Get<BUFFER_STATE>(srcBuffer);
+ const auto *dst_buffer = Get<BUFFER_STATE>(dstBuffer);
+
+ for (uint32_t region = 0; region < regionCount; region++) {
+ const auto ©_region = pRegions[region];
+ if (src_buffer) {
+ ResourceAccessRange src_range = MakeRange(
+ copy_region.srcOffset, GetRealWholeSize(copy_region.srcOffset, copy_region.size, src_buffer->createInfo.size));
+ auto hazard = context->DetectHazard(*src_buffer, SYNC_TRANSFER_TRANSFER_READ, src_range);
+ if (hazard.hazard) {
+ // TODO -- add tag information to log msg when useful.
+ skip |= LogError(srcBuffer, string_SyncHazardVUID(hazard.hazard),
+ "vkCmdCopyBuffer: Hazard %s for srcBuffer %s, region %" PRIu32 ". Access info %s.",
+ string_SyncHazard(hazard.hazard), report_data->FormatHandle(srcBuffer).c_str(), region,
+ string_UsageTag(hazard).c_str());
+ }
+ }
+ if (dst_buffer && !skip) {
+ ResourceAccessRange dst_range = MakeRange(
+ copy_region.dstOffset, GetRealWholeSize(copy_region.dstOffset, copy_region.size, dst_buffer->createInfo.size));
+ auto hazard = context->DetectHazard(*dst_buffer, SYNC_TRANSFER_TRANSFER_WRITE, dst_range);
+ if (hazard.hazard) {
+ skip |= LogError(dstBuffer, string_SyncHazardVUID(hazard.hazard),
+ "vkCmdCopyBuffer: Hazard %s for dstBuffer %s, region %" PRIu32 ". Access info %s.",
+ string_SyncHazard(hazard.hazard), report_data->FormatHandle(dstBuffer).c_str(), region,
+ string_UsageTag(hazard).c_str());
+ }
+ }
+ if (skip) break;
+ }
+ return skip;
+}
+
+void SyncValidator::PreCallRecordCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer,
+ uint32_t regionCount, const VkBufferCopy *pRegions) {
+ auto *cb_context = GetAccessContext(commandBuffer);
+ assert(cb_context);
+ const auto tag = cb_context->NextCommandTag(CMD_COPYBUFFER);
+ auto *context = cb_context->GetCurrentAccessContext();
+
+ const auto *src_buffer = Get<BUFFER_STATE>(srcBuffer);
+ const auto *dst_buffer = Get<BUFFER_STATE>(dstBuffer);
+
+ for (uint32_t region = 0; region < regionCount; region++) {
+ const auto ©_region = pRegions[region];
+ if (src_buffer) {
+ ResourceAccessRange src_range = MakeRange(
+ copy_region.srcOffset, GetRealWholeSize(copy_region.srcOffset, copy_region.size, src_buffer->createInfo.size));
+ context->UpdateAccessState(*src_buffer, SYNC_TRANSFER_TRANSFER_READ, src_range, tag);
+ }
+ if (dst_buffer) {
+ ResourceAccessRange dst_range = MakeRange(
+ copy_region.dstOffset, GetRealWholeSize(copy_region.dstOffset, copy_region.size, dst_buffer->createInfo.size));
+ context->UpdateAccessState(*dst_buffer, SYNC_TRANSFER_TRANSFER_WRITE, dst_range, tag);
+ }
+ }
+}
+
+bool SyncValidator::PreCallValidateCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
+ VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
+ const VkImageCopy *pRegions) const {
+ bool skip = false;
+ const auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ if (!cb_access_context) return skip;
+
+ const auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+ if (!context) return skip;
+
+ const auto *src_image = Get<IMAGE_STATE>(srcImage);
+ const auto *dst_image = Get<IMAGE_STATE>(dstImage);
+ for (uint32_t region = 0; region < regionCount; region++) {
+ const auto ©_region = pRegions[region];
+ if (src_image) {
+ auto hazard = context->DetectHazard(*src_image, SYNC_TRANSFER_TRANSFER_READ, copy_region.srcSubresource,
+ copy_region.srcOffset, copy_region.extent);
+ if (hazard.hazard) {
+ skip |= LogError(srcImage, string_SyncHazardVUID(hazard.hazard),
+ "vkCmdCopyImage: Hazard %s for srcImage %s, region %" PRIu32 ". Access info %s.",
+ string_SyncHazard(hazard.hazard), report_data->FormatHandle(srcImage).c_str(), region,
+ string_UsageTag(hazard).c_str());
+ }
+ }
+
+ if (dst_image) {
+ VkExtent3D dst_copy_extent =
+ GetAdjustedDestImageExtent(src_image->createInfo.format, dst_image->createInfo.format, copy_region.extent);
+ auto hazard = context->DetectHazard(*dst_image, SYNC_TRANSFER_TRANSFER_WRITE, copy_region.dstSubresource,
+ copy_region.dstOffset, dst_copy_extent);
+ if (hazard.hazard) {
+ skip |= LogError(dstImage, string_SyncHazardVUID(hazard.hazard),
+ "vkCmdCopyImage: Hazard %s for dstImage %s, region %" PRIu32 ". Access info %s.",
+ string_SyncHazard(hazard.hazard), report_data->FormatHandle(dstImage).c_str(), region,
+ string_UsageTag(hazard).c_str());
+ }
+ if (skip) break;
+ }
+ }
+
+ return skip;
+}
+
+void SyncValidator::PreCallRecordCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
+ VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
+ const VkImageCopy *pRegions) {
+ auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ const auto tag = cb_access_context->NextCommandTag(CMD_COPYIMAGE);
+ auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+
+ auto *src_image = Get<IMAGE_STATE>(srcImage);
+ auto *dst_image = Get<IMAGE_STATE>(dstImage);
+
+ for (uint32_t region = 0; region < regionCount; region++) {
+ const auto ©_region = pRegions[region];
+ if (src_image) {
+ context->UpdateAccessState(*src_image, SYNC_TRANSFER_TRANSFER_READ, copy_region.srcSubresource, copy_region.srcOffset,
+ copy_region.extent, tag);
+ }
+ if (dst_image) {
+ VkExtent3D dst_copy_extent =
+ GetAdjustedDestImageExtent(src_image->createInfo.format, dst_image->createInfo.format, copy_region.extent);
+ context->UpdateAccessState(*dst_image, SYNC_TRANSFER_TRANSFER_WRITE, copy_region.dstSubresource, copy_region.dstOffset,
+ dst_copy_extent, tag);
+ }
+ }
+}
+
+bool SyncValidator::PreCallValidateCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
+ VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
+ uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
+ uint32_t bufferMemoryBarrierCount,
+ const VkBufferMemoryBarrier *pBufferMemoryBarriers,
+ uint32_t imageMemoryBarrierCount,
+ const VkImageMemoryBarrier *pImageMemoryBarriers) const {
+ bool skip = false;
+ const auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ if (!cb_access_context) return skip;
+
+ const auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+ if (!context) return skip;
+
+ const auto src_stage_mask = ExpandPipelineStages(cb_access_context->GetQueueFlags(), srcStageMask);
+ const auto src_exec_scope = WithEarlierPipelineStages(src_stage_mask);
+ auto src_stage_accesses = AccessScopeByStage(src_stage_mask);
+ // Validate Image Layout transitions
+ for (uint32_t index = 0; index < imageMemoryBarrierCount; index++) {
+ const auto &barrier = pImageMemoryBarriers[index];
+ if (barrier.newLayout == barrier.oldLayout) continue; // Only interested in layout transitions at this point.
+ const auto *image_state = Get<IMAGE_STATE>(barrier.image);
+ if (!image_state) continue;
+ const auto hazard = context->DetectImageBarrierHazard(*image_state, src_exec_scope, src_stage_accesses, barrier);
+ if (hazard.hazard) {
+ // PHASE1 TODO -- add tag information to log msg when useful.
+ skip |= LogError(barrier.image, string_SyncHazardVUID(hazard.hazard),
+ "vkCmdPipelineBarrier: Hazard %s for image barrier %" PRIu32 " %s. Access info %s.",
+ string_SyncHazard(hazard.hazard), index, report_data->FormatHandle(barrier.image).c_str(),
+ string_UsageTag(hazard).c_str());
+ }
+ }
+
+ return skip;
+}
+
+void SyncValidator::PreCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
+ VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
+ uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
+ uint32_t bufferMemoryBarrierCount,
+ const VkBufferMemoryBarrier *pBufferMemoryBarriers,
+ uint32_t imageMemoryBarrierCount,
+ const VkImageMemoryBarrier *pImageMemoryBarriers) {
+ auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ if (!cb_access_context) return;
+ const auto tag = cb_access_context->NextCommandTag(CMD_PIPELINEBARRIER);
+ auto access_context = cb_access_context->GetCurrentAccessContext();
+ assert(access_context);
+ if (!access_context) return;
+
+ const auto src_stage_mask = ExpandPipelineStages(cb_access_context->GetQueueFlags(), srcStageMask);
+ auto src_stage_accesses = AccessScopeByStage(src_stage_mask);
+ const auto dst_stage_mask = ExpandPipelineStages(cb_access_context->GetQueueFlags(), dstStageMask);
+ auto dst_stage_accesses = AccessScopeByStage(dst_stage_mask);
+ const auto src_exec_scope = WithEarlierPipelineStages(src_stage_mask);
+ const auto dst_exec_scope = WithLaterPipelineStages(dst_stage_mask);
+ ApplyBufferBarriers(access_context, src_exec_scope, src_stage_accesses, dst_exec_scope, dst_stage_accesses,
+ bufferMemoryBarrierCount, pBufferMemoryBarriers);
+ ApplyImageBarriers(access_context, src_exec_scope, src_stage_accesses, dst_exec_scope, dst_stage_accesses,
+ imageMemoryBarrierCount, pImageMemoryBarriers, tag);
+
+ // Apply these last in-case there operation is a superset of the other two and would clean them up...
+ ApplyGlobalBarriers(access_context, src_exec_scope, dst_exec_scope, src_stage_accesses, dst_stage_accesses, memoryBarrierCount,
+ pMemoryBarriers);
+}
+
+void SyncValidator::PostCallRecordCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo,
+ const VkAllocationCallbacks *pAllocator, VkDevice *pDevice, VkResult result) {
+ // The state tracker sets up the device state
+ StateTracker::PostCallRecordCreateDevice(gpu, pCreateInfo, pAllocator, pDevice, result);
+
+ // Add the callback hooks for the functions that are either broadly or deeply used and that the ValidationStateTracker
+ // refactor would be messier without.
+ // TODO: Find a good way to do this hooklessly.
+ ValidationObject *device_object = GetLayerDataPtr(get_dispatch_key(*pDevice), layer_data_map);
+ ValidationObject *validation_data = GetValidationObject(device_object->object_dispatch, LayerObjectTypeSyncValidation);
+ SyncValidator *sync_device_state = static_cast<SyncValidator *>(validation_data);
+
+ sync_device_state->SetCommandBufferResetCallback([sync_device_state](VkCommandBuffer command_buffer) -> void {
+ sync_device_state->ResetCommandBufferCallback(command_buffer);
+ });
+ sync_device_state->SetCommandBufferFreeCallback([sync_device_state](VkCommandBuffer command_buffer) -> void {
+ sync_device_state->FreeCommandBufferCallback(command_buffer);
+ });
+}
+
+bool SyncValidator::ValidateBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
+ const VkSubpassBeginInfoKHR *pSubpassBeginInfo, const char *func_name) const {
+ bool skip = false;
+ const auto rp_state = Get<RENDER_PASS_STATE>(pRenderPassBegin->renderPass);
+ auto cb_context = GetAccessContext(commandBuffer);
+
+ if (rp_state && cb_context) {
+ skip |= cb_context->ValidateBeginRenderPass(*rp_state, pRenderPassBegin, pSubpassBeginInfo, func_name);
+ }
+
+ return skip;
+}
+
+bool SyncValidator::PreCallValidateCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
+ VkSubpassContents contents) const {
+ bool skip = StateTracker::PreCallValidateCmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
+ auto subpass_begin_info = lvl_init_struct<VkSubpassBeginInfo>();
+ subpass_begin_info.contents = contents;
+ skip |= ValidateBeginRenderPass(commandBuffer, pRenderPassBegin, &subpass_begin_info, "vkCmdBeginRenderPass");
+ return skip;
+}
+
+bool SyncValidator::PreCallValidateCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
+ const VkSubpassBeginInfoKHR *pSubpassBeginInfo) const {
+ bool skip = StateTracker::PreCallValidateCmdBeginRenderPass2(commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
+ skip |= ValidateBeginRenderPass(commandBuffer, pRenderPassBegin, pSubpassBeginInfo, "vkCmdBeginRenderPass2");
+ return skip;
+}
+
+bool SyncValidator::PreCallValidateCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer,
+ const VkRenderPassBeginInfo *pRenderPassBegin,
+ const VkSubpassBeginInfoKHR *pSubpassBeginInfo) const {
+ bool skip = StateTracker::PreCallValidateCmdBeginRenderPass2KHR(commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
+ skip |= ValidateBeginRenderPass(commandBuffer, pRenderPassBegin, pSubpassBeginInfo, "vkCmdBeginRenderPass2KHR");
+ return skip;
+}
+
+void SyncValidator::PostCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo,
+ VkResult result) {
+ // The state tracker sets up the command buffer state
+ StateTracker::PostCallRecordBeginCommandBuffer(commandBuffer, pBeginInfo, result);
+
+ // Create/initialize the structure that trackers accesses at the command buffer scope.
+ auto cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ cb_access_context->Reset();
+}
+
+void SyncValidator::RecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
+ const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE command) {
+ auto cb_context = GetAccessContext(commandBuffer);
+ if (cb_context) {
+ cb_context->RecordBeginRenderPass(cb_context->NextCommandTag(command));
+ }
+}
+
+void SyncValidator::PostCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
+ VkSubpassContents contents) {
+ StateTracker::PostCallRecordCmdBeginRenderPass(commandBuffer, pRenderPassBegin, contents);
+ auto subpass_begin_info = lvl_init_struct<VkSubpassBeginInfo>();
+ subpass_begin_info.contents = contents;
+ RecordCmdBeginRenderPass(commandBuffer, pRenderPassBegin, &subpass_begin_info, CMD_BEGINRENDERPASS);
+}
+
+void SyncValidator::PostCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
+ const VkSubpassBeginInfo *pSubpassBeginInfo) {
+ StateTracker::PostCallRecordCmdBeginRenderPass2(commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
+ RecordCmdBeginRenderPass(commandBuffer, pRenderPassBegin, pSubpassBeginInfo, CMD_BEGINRENDERPASS2);
+}
+
+void SyncValidator::PostCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer,
+ const VkRenderPassBeginInfo *pRenderPassBegin,
+ const VkSubpassBeginInfo *pSubpassBeginInfo) {
+ StateTracker::PostCallRecordCmdBeginRenderPass2KHR(commandBuffer, pRenderPassBegin, pSubpassBeginInfo);
+ RecordCmdBeginRenderPass(commandBuffer, pRenderPassBegin, pSubpassBeginInfo, CMD_BEGINRENDERPASS2);
+}
+
+bool SyncValidator::ValidateCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfoKHR *pSubpassBeginInfo,
+ const VkSubpassEndInfoKHR *pSubpassEndInfo, const char *func_name) const {
+ bool skip = false;
+
+ auto cb_context = GetAccessContext(commandBuffer);
+ assert(cb_context);
+ auto cb_state = cb_context->GetCommandBufferState();
+ if (!cb_state) return skip;
+
+ auto rp_state = cb_state->activeRenderPass;
+ if (!rp_state) return skip;
+
+ skip |= cb_context->ValidateNextSubpass(func_name);
+
+ return skip;
+}
+
+bool SyncValidator::PreCallValidateCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) const {
+ bool skip = StateTracker::PreCallValidateCmdNextSubpass(commandBuffer, contents);
+ auto subpass_begin_info = lvl_init_struct<VkSubpassBeginInfo>();
+ subpass_begin_info.contents = contents;
+ skip |= ValidateCmdNextSubpass(commandBuffer, &subpass_begin_info, nullptr, "vkCmdNextSubpass");
+ return skip;
+}
+
+bool SyncValidator::PreCallValidateCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfoKHR *pSubpassBeginInfo,
+ const VkSubpassEndInfoKHR *pSubpassEndInfo) const {
+ bool skip = StateTracker::PreCallValidateCmdNextSubpass2KHR(commandBuffer, pSubpassBeginInfo, pSubpassEndInfo);
+ skip |= ValidateCmdNextSubpass(commandBuffer, pSubpassBeginInfo, pSubpassEndInfo, "vkCmdNextSubpass2KHR");
+ return skip;
+}
+
+bool SyncValidator::PreCallValidateCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
+ const VkSubpassEndInfo *pSubpassEndInfo) const {
+ bool skip = StateTracker::PreCallValidateCmdNextSubpass2(commandBuffer, pSubpassBeginInfo, pSubpassEndInfo);
+ skip |= ValidateCmdNextSubpass(commandBuffer, pSubpassBeginInfo, pSubpassEndInfo, "vkCmdNextSubpass2");
+ return skip;
+}
+
+void SyncValidator::RecordCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
+ const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE command) {
+ auto cb_context = GetAccessContext(commandBuffer);
+ assert(cb_context);
+ auto cb_state = cb_context->GetCommandBufferState();
+ if (!cb_state) return;
+
+ auto rp_state = cb_state->activeRenderPass;
+ if (!rp_state) return;
+
+ cb_context->RecordNextSubpass(*rp_state, cb_context->NextCommandTag(command));
+}
+
+void SyncValidator::PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) {
+ StateTracker::PostCallRecordCmdNextSubpass(commandBuffer, contents);
+ auto subpass_begin_info = lvl_init_struct<VkSubpassBeginInfo>();
+ subpass_begin_info.contents = contents;
+ RecordCmdNextSubpass(commandBuffer, &subpass_begin_info, nullptr, CMD_NEXTSUBPASS);
+}
+
+void SyncValidator::PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
+ const VkSubpassEndInfo *pSubpassEndInfo) {
+ StateTracker::PostCallRecordCmdNextSubpass2(commandBuffer, pSubpassBeginInfo, pSubpassEndInfo);
+ RecordCmdNextSubpass(commandBuffer, pSubpassBeginInfo, pSubpassEndInfo, CMD_NEXTSUBPASS2);
+}
+
+void SyncValidator::PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
+ const VkSubpassEndInfo *pSubpassEndInfo) {
+ StateTracker::PostCallRecordCmdNextSubpass2KHR(commandBuffer, pSubpassBeginInfo, pSubpassEndInfo);
+ RecordCmdNextSubpass(commandBuffer, pSubpassBeginInfo, pSubpassEndInfo, CMD_NEXTSUBPASS2);
+}
+
+bool SyncValidator::ValidateCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfoKHR *pSubpassEndInfo,
+ const char *func_name) const {
+ bool skip = false;
+
+ auto cb_context = GetAccessContext(commandBuffer);
+ assert(cb_context);
+ auto cb_state = cb_context->GetCommandBufferState();
+ if (!cb_state) return skip;
+
+ auto rp_state = cb_state->activeRenderPass;
+ if (!rp_state) return skip;
+
+ skip |= cb_context->ValidateEndRenderpass(func_name);
+ return skip;
+}
+
+bool SyncValidator::PreCallValidateCmdEndRenderPass(VkCommandBuffer commandBuffer) const {
+ bool skip = StateTracker::PreCallValidateCmdEndRenderPass(commandBuffer);
+ skip |= ValidateCmdEndRenderPass(commandBuffer, nullptr, "vkEndRenderPass");
+ return skip;
+}
+
+bool SyncValidator::PreCallValidateCmdEndRenderPass2(VkCommandBuffer commandBuffer,
+ const VkSubpassEndInfoKHR *pSubpassEndInfo) const {
+ bool skip = StateTracker::PreCallValidateCmdEndRenderPass2(commandBuffer, pSubpassEndInfo);
+ skip |= ValidateCmdEndRenderPass(commandBuffer, pSubpassEndInfo, "vkEndRenderPass2");
+ return skip;
+}
+
+bool SyncValidator::PreCallValidateCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer,
+ const VkSubpassEndInfoKHR *pSubpassEndInfo) const {
+ bool skip = StateTracker::PreCallValidateCmdEndRenderPass2KHR(commandBuffer, pSubpassEndInfo);
+ skip |= ValidateCmdEndRenderPass(commandBuffer, pSubpassEndInfo, "vkEndRenderPass2KHR");
+ return skip;
+}
+
+void SyncValidator::RecordCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo,
+ CMD_TYPE command) {
+ // Resolve the all subpass contexts to the command buffer contexts
+ auto cb_context = GetAccessContext(commandBuffer);
+ assert(cb_context);
+ auto cb_state = cb_context->GetCommandBufferState();
+ if (!cb_state) return;
+
+ const auto *rp_state = cb_state->activeRenderPass.get();
+ if (!rp_state) return;
+
+ cb_context->RecordEndRenderPass(*rp_state, cb_context->NextCommandTag(command));
+}
+
+// Simple heuristic rule to detect WAW operations representing algorithmically safe or increment
+// updates to a resource which do not conflict at the byte level.
+// TODO: Revisit this rule to see if it needs to be tighter or looser
+// TODO: Add programatic control over suppression heuristics
+bool SyncValidator::SupressedBoundDescriptorWAW(const HazardResult &hazard) const {
+ return (hazard.hazard == WRITE_AFTER_WRITE) && (FlagBit(hazard.usage_index) == hazard.prior_access);
+}
+
+void SyncValidator::PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer) {
+ RecordCmdEndRenderPass(commandBuffer, nullptr, CMD_ENDRENDERPASS);
+ StateTracker::PostCallRecordCmdEndRenderPass(commandBuffer);
+}
+
+void SyncValidator::PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) {
+ RecordCmdEndRenderPass(commandBuffer, pSubpassEndInfo, CMD_ENDRENDERPASS2);
+ StateTracker::PostCallRecordCmdEndRenderPass2(commandBuffer, pSubpassEndInfo);
+}
+
+void SyncValidator::PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo) {
+ RecordCmdEndRenderPass(commandBuffer, pSubpassEndInfo, CMD_ENDRENDERPASS2);
+ StateTracker::PostCallRecordCmdEndRenderPass2KHR(commandBuffer, pSubpassEndInfo);
+}
+
+bool SyncValidator::PreCallValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
+ VkImageLayout dstImageLayout, uint32_t regionCount,
+ const VkBufferImageCopy *pRegions) const {
+ bool skip = false;
+ const auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ if (!cb_access_context) return skip;
+
+ const auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+ if (!context) return skip;
+
+ const auto *src_buffer = Get<BUFFER_STATE>(srcBuffer);
+ const auto *dst_image = Get<IMAGE_STATE>(dstImage);
+
+ for (uint32_t region = 0; region < regionCount; region++) {
+ const auto ©_region = pRegions[region];
+ if (src_buffer) {
+ ResourceAccessRange src_range =
+ MakeRange(copy_region.bufferOffset, GetBufferSizeFromCopyImage(copy_region, dst_image->createInfo.format));
+ auto hazard = context->DetectHazard(*src_buffer, SYNC_TRANSFER_TRANSFER_READ, src_range);
+ if (hazard.hazard) {
+ // PHASE1 TODO -- add tag information to log msg when useful.
+ skip |= LogError(srcBuffer, string_SyncHazardVUID(hazard.hazard),
+ "vkCmdCopyBufferToImage: Hazard %s for srcBuffer %s, region %" PRIu32 ". Access info %s.",
+ string_SyncHazard(hazard.hazard), report_data->FormatHandle(srcBuffer).c_str(), region,
+ string_UsageTag(hazard).c_str());
+ }
+ }
+ if (dst_image) {
+ auto hazard = context->DetectHazard(*dst_image, SYNC_TRANSFER_TRANSFER_WRITE, copy_region.imageSubresource,
+ copy_region.imageOffset, copy_region.imageExtent);
+ if (hazard.hazard) {
+ skip |= LogError(dstImage, string_SyncHazardVUID(hazard.hazard),
+ "vkCmdCopyBufferToImage: Hazard %s for dstImage %s, region %" PRIu32 ". Access info %s.",
+ string_SyncHazard(hazard.hazard), report_data->FormatHandle(dstImage).c_str(), region,
+ string_UsageTag(hazard).c_str());
+ }
+ if (skip) break;
+ }
+ if (skip) break;
+ }
+ return skip;
+}
+
+void SyncValidator::PreCallRecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
+ VkImageLayout dstImageLayout, uint32_t regionCount,
+ const VkBufferImageCopy *pRegions) {
+ StateTracker::PreCallRecordCmdCopyBufferToImage(commandBuffer, srcBuffer, dstImage, dstImageLayout, regionCount, pRegions);
+ auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ const auto tag = cb_access_context->NextCommandTag(CMD_COPYBUFFERTOIMAGE);
+ auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+
+ const auto *src_buffer = Get<BUFFER_STATE>(srcBuffer);
+ const auto *dst_image = Get<IMAGE_STATE>(dstImage);
+
+ for (uint32_t region = 0; region < regionCount; region++) {
+ const auto ©_region = pRegions[region];
+ if (src_buffer) {
+ ResourceAccessRange src_range =
+ MakeRange(copy_region.bufferOffset, GetBufferSizeFromCopyImage(copy_region, dst_image->createInfo.format));
+ context->UpdateAccessState(*src_buffer, SYNC_TRANSFER_TRANSFER_READ, src_range, tag);
+ }
+ if (dst_image) {
+ context->UpdateAccessState(*dst_image, SYNC_TRANSFER_TRANSFER_WRITE, copy_region.imageSubresource,
+ copy_region.imageOffset, copy_region.imageExtent, tag);
+ }
+ }
+}
+
+bool SyncValidator::PreCallValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage,
+ VkImageLayout srcImageLayout, VkBuffer dstBuffer, uint32_t regionCount,
+ const VkBufferImageCopy *pRegions) const {
+ bool skip = false;
+ const auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ if (!cb_access_context) return skip;
+
+ const auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+ if (!context) return skip;
+
+ const auto *src_image = Get<IMAGE_STATE>(srcImage);
+ const auto *dst_buffer = Get<BUFFER_STATE>(dstBuffer);
+ const auto dst_mem = (dst_buffer && !dst_buffer->sparse) ? dst_buffer->binding.mem_state->mem : VK_NULL_HANDLE;
+ for (uint32_t region = 0; region < regionCount; region++) {
+ const auto ©_region = pRegions[region];
+ if (src_image) {
+ auto hazard = context->DetectHazard(*src_image, SYNC_TRANSFER_TRANSFER_READ, copy_region.imageSubresource,
+ copy_region.imageOffset, copy_region.imageExtent);
+ if (hazard.hazard) {
+ skip |= LogError(srcImage, string_SyncHazardVUID(hazard.hazard),
+ "vkCmdCopyImageToBuffer: Hazard %s for srcImage %s, region %" PRIu32 ". Access info %s.",
+ string_SyncHazard(hazard.hazard), report_data->FormatHandle(srcImage).c_str(), region,
+ string_UsageTag(hazard).c_str());
+ }
+ }
+ if (dst_mem) {
+ ResourceAccessRange dst_range =
+ MakeRange(copy_region.bufferOffset, GetBufferSizeFromCopyImage(copy_region, src_image->createInfo.format));
+ auto hazard = context->DetectHazard(*dst_buffer, SYNC_TRANSFER_TRANSFER_WRITE, dst_range);
+ if (hazard.hazard) {
+ skip |= LogError(dstBuffer, string_SyncHazardVUID(hazard.hazard),
+ "vkCmdCopyImageToBuffer: Hazard %s for dstBuffer %s, region %" PRIu32 ". Access info %s.",
+ string_SyncHazard(hazard.hazard), report_data->FormatHandle(dstBuffer).c_str(), region,
+ string_UsageTag(hazard).c_str());
+ }
+ }
+ if (skip) break;
+ }
+ return skip;
+}
+
+void SyncValidator::PreCallRecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
+ VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) {
+ StateTracker::PreCallRecordCmdCopyImageToBuffer(commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions);
+ auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ const auto tag = cb_access_context->NextCommandTag(CMD_COPYIMAGETOBUFFER);
+ auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+
+ const auto *src_image = Get<IMAGE_STATE>(srcImage);
+ auto *dst_buffer = Get<BUFFER_STATE>(dstBuffer);
+ const auto dst_mem = (dst_buffer && !dst_buffer->sparse) ? dst_buffer->binding.mem_state->mem : VK_NULL_HANDLE;
+ const VulkanTypedHandle dst_handle(dst_mem, kVulkanObjectTypeDeviceMemory);
+
+ for (uint32_t region = 0; region < regionCount; region++) {
+ const auto ©_region = pRegions[region];
+ if (src_image) {
+ context->UpdateAccessState(*src_image, SYNC_TRANSFER_TRANSFER_READ, copy_region.imageSubresource,
+ copy_region.imageOffset, copy_region.imageExtent, tag);
+ }
+ if (dst_buffer) {
+ ResourceAccessRange dst_range =
+ MakeRange(copy_region.bufferOffset, GetBufferSizeFromCopyImage(copy_region, src_image->createInfo.format));
+ context->UpdateAccessState(*dst_buffer, SYNC_TRANSFER_TRANSFER_WRITE, dst_range, tag);
+ }
+ }
+}
+
+bool SyncValidator::PreCallValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
+ VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
+ const VkImageBlit *pRegions, VkFilter filter) const {
+ bool skip = false;
+ const auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ if (!cb_access_context) return skip;
+
+ const auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+ if (!context) return skip;
+
+ const auto *src_image = Get<IMAGE_STATE>(srcImage);
+ const auto *dst_image = Get<IMAGE_STATE>(dstImage);
+
+ for (uint32_t region = 0; region < regionCount; region++) {
+ const auto &blit_region = pRegions[region];
+ if (src_image) {
+ VkOffset3D offset = {std::min(blit_region.srcOffsets[0].x, blit_region.srcOffsets[1].x),
+ std::min(blit_region.srcOffsets[0].y, blit_region.srcOffsets[1].y),
+ std::min(blit_region.srcOffsets[0].z, blit_region.srcOffsets[1].z)};
+ VkExtent3D extent = {static_cast<uint32_t>(abs(blit_region.srcOffsets[1].x - blit_region.srcOffsets[0].x)),
+ static_cast<uint32_t>(abs(blit_region.srcOffsets[1].y - blit_region.srcOffsets[0].y)),
+ static_cast<uint32_t>(abs(blit_region.srcOffsets[1].z - blit_region.srcOffsets[0].z))};
+ auto hazard =
+ context->DetectHazard(*src_image, SYNC_TRANSFER_TRANSFER_READ, blit_region.srcSubresource, offset, extent);
+ if (hazard.hazard) {
+ skip |= LogError(srcImage, string_SyncHazardVUID(hazard.hazard),
+ "vkCmdBlitImage: Hazard %s for srcImage %s, region %" PRIu32 ". Access info %s.",
+ string_SyncHazard(hazard.hazard), report_data->FormatHandle(srcImage).c_str(), region,
+ string_UsageTag(hazard).c_str());
+ }
+ }
+
+ if (dst_image) {
+ VkOffset3D offset = {std::min(blit_region.dstOffsets[0].x, blit_region.dstOffsets[1].x),
+ std::min(blit_region.dstOffsets[0].y, blit_region.dstOffsets[1].y),
+ std::min(blit_region.dstOffsets[0].z, blit_region.dstOffsets[1].z)};
+ VkExtent3D extent = {static_cast<uint32_t>(abs(blit_region.dstOffsets[1].x - blit_region.dstOffsets[0].x)),
+ static_cast<uint32_t>(abs(blit_region.dstOffsets[1].y - blit_region.dstOffsets[0].y)),
+ static_cast<uint32_t>(abs(blit_region.dstOffsets[1].z - blit_region.dstOffsets[0].z))};
+ auto hazard =
+ context->DetectHazard(*dst_image, SYNC_TRANSFER_TRANSFER_WRITE, blit_region.dstSubresource, offset, extent);
+ if (hazard.hazard) {
+ skip |= LogError(dstImage, string_SyncHazardVUID(hazard.hazard),
+ "vkCmdBlitImage: Hazard %s for dstImage %s, region %" PRIu32 ". Access info %s.",
+ string_SyncHazard(hazard.hazard), report_data->FormatHandle(dstImage).c_str(), region,
+ string_UsageTag(hazard).c_str());
+ }
+ if (skip) break;
+ }
+ }
+
+ return skip;
+}
+
+void SyncValidator::PreCallRecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
+ VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
+ const VkImageBlit *pRegions, VkFilter filter) {
+ StateTracker::PreCallRecordCmdBlitImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
+ pRegions, filter);
+ auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ const auto tag = cb_access_context->NextCommandTag(CMD_BLITIMAGE);
+ auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+
+ auto *src_image = Get<IMAGE_STATE>(srcImage);
+ auto *dst_image = Get<IMAGE_STATE>(dstImage);
+
+ for (uint32_t region = 0; region < regionCount; region++) {
+ const auto &blit_region = pRegions[region];
+ if (src_image) {
+ VkOffset3D offset = {std::min(blit_region.srcOffsets[0].x, blit_region.srcOffsets[1].x),
+ std::min(blit_region.srcOffsets[0].y, blit_region.srcOffsets[1].y),
+ std::min(blit_region.srcOffsets[0].z, blit_region.srcOffsets[1].z)};
+ VkExtent3D extent = {static_cast<uint32_t>(abs(blit_region.srcOffsets[1].x - blit_region.srcOffsets[0].x)),
+ static_cast<uint32_t>(abs(blit_region.srcOffsets[1].y - blit_region.srcOffsets[0].y)),
+ static_cast<uint32_t>(abs(blit_region.srcOffsets[1].z - blit_region.srcOffsets[0].z))};
+ context->UpdateAccessState(*src_image, SYNC_TRANSFER_TRANSFER_READ, blit_region.srcSubresource, offset, extent, tag);
+ }
+ if (dst_image) {
+ VkOffset3D offset = {std::min(blit_region.dstOffsets[0].x, blit_region.dstOffsets[1].x),
+ std::min(blit_region.dstOffsets[0].y, blit_region.dstOffsets[1].y),
+ std::min(blit_region.dstOffsets[0].z, blit_region.dstOffsets[1].z)};
+ VkExtent3D extent = {static_cast<uint32_t>(abs(blit_region.dstOffsets[1].x - blit_region.dstOffsets[0].x)),
+ static_cast<uint32_t>(abs(blit_region.dstOffsets[1].y - blit_region.dstOffsets[0].y)),
+ static_cast<uint32_t>(abs(blit_region.dstOffsets[1].z - blit_region.dstOffsets[0].z))};
+ context->UpdateAccessState(*dst_image, SYNC_TRANSFER_TRANSFER_WRITE, blit_region.dstSubresource, offset, extent, tag);
+ }
+ }
+}
+
+bool SyncValidator::ValidateIndirectBuffer(const AccessContext &context, VkCommandBuffer commandBuffer,
+ const VkDeviceSize struct_size, const VkBuffer buffer, const VkDeviceSize offset,
+ const uint32_t drawCount, const uint32_t stride, const char *function) const {
+ bool skip = false;
+ if (drawCount == 0) return skip;
+
+ const auto *buf_state = Get<BUFFER_STATE>(buffer);
+ VkDeviceSize size = struct_size;
+ if (drawCount == 1 || stride == size) {
+ if (drawCount > 1) size *= drawCount;
+ ResourceAccessRange range = MakeRange(offset, size);
+ auto hazard = context.DetectHazard(*buf_state, SYNC_DRAW_INDIRECT_INDIRECT_COMMAND_READ, range);
+ if (hazard.hazard) {
+ skip |= LogError(buf_state->buffer, string_SyncHazardVUID(hazard.hazard),
+ "%s: Hazard %s for indirect %s in %s. Access info %s.", function, string_SyncHazard(hazard.hazard),
+ report_data->FormatHandle(buffer).c_str(), report_data->FormatHandle(commandBuffer).c_str(),
+ string_UsageTag(hazard).c_str());
+ }
+ } else {
+ for (uint32_t i = 0; i < drawCount; ++i) {
+ ResourceAccessRange range = MakeRange(offset + i * stride, size);
+ auto hazard = context.DetectHazard(*buf_state, SYNC_DRAW_INDIRECT_INDIRECT_COMMAND_READ, range);
+ if (hazard.hazard) {
+ skip |= LogError(buf_state->buffer, string_SyncHazardVUID(hazard.hazard),
+ "%s: Hazard %s for indirect %s in %s. Access info %s.", function, string_SyncHazard(hazard.hazard),
+ report_data->FormatHandle(buffer).c_str(), report_data->FormatHandle(commandBuffer).c_str(),
+ string_UsageTag(hazard).c_str());
+ break;
+ }
+ }
+ }
+ return skip;
+}
+
+void SyncValidator::RecordIndirectBuffer(AccessContext &context, const ResourceUsageTag &tag, const VkDeviceSize struct_size,
+ const VkBuffer buffer, const VkDeviceSize offset, const uint32_t drawCount,
+ uint32_t stride) {
+ const auto *buf_state = Get<BUFFER_STATE>(buffer);
+ VkDeviceSize size = struct_size;
+ if (drawCount == 1 || stride == size) {
+ if (drawCount > 1) size *= drawCount;
+ ResourceAccessRange range = MakeRange(offset, size);
+ context.UpdateAccessState(*buf_state, SYNC_DRAW_INDIRECT_INDIRECT_COMMAND_READ, range, tag);
+ } else {
+ for (uint32_t i = 0; i < drawCount; ++i) {
+ ResourceAccessRange range = MakeRange(offset + i * stride, size);
+ context.UpdateAccessState(*buf_state, SYNC_DRAW_INDIRECT_INDIRECT_COMMAND_READ, range, tag);
+ }
+ }
+}
+
+bool SyncValidator::ValidateCountBuffer(const AccessContext &context, VkCommandBuffer commandBuffer, VkBuffer buffer,
+ VkDeviceSize offset, const char *function) const {
+ bool skip = false;
+
+ const auto *count_buf_state = Get<BUFFER_STATE>(buffer);
+ ResourceAccessRange range = MakeRange(offset, 4);
+ auto hazard = context.DetectHazard(*count_buf_state, SYNC_DRAW_INDIRECT_INDIRECT_COMMAND_READ, range);
+ if (hazard.hazard) {
+ skip |= LogError(count_buf_state->buffer, string_SyncHazardVUID(hazard.hazard),
+ "%s: Hazard %s for countBuffer %s in %s. Access info %s.", function, string_SyncHazard(hazard.hazard),
+ report_data->FormatHandle(buffer).c_str(), report_data->FormatHandle(commandBuffer).c_str(),
+ string_UsageTag(hazard).c_str());
+ }
+ return skip;
+}
+
+void SyncValidator::RecordCountBuffer(AccessContext &context, const ResourceUsageTag &tag, VkBuffer buffer, VkDeviceSize offset) {
+ const auto *count_buf_state = Get<BUFFER_STATE>(buffer);
+ ResourceAccessRange range = MakeRange(offset, 4);
+ context.UpdateAccessState(*count_buf_state, SYNC_DRAW_INDIRECT_INDIRECT_COMMAND_READ, range, tag);
+}
+
+bool SyncValidator::PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const {
+ bool skip = false;
+ const auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ if (!cb_access_context) return skip;
+
+ skip |= cb_access_context->ValidateDispatchDrawDescriptorSet(VK_PIPELINE_BIND_POINT_COMPUTE, "vkCmdDispatch");
+ return skip;
+}
+
+void SyncValidator::PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) {
+ StateTracker::PreCallRecordCmdDispatch(commandBuffer, x, y, z);
+ auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ const auto tag = cb_access_context->NextCommandTag(CMD_DISPATCH);
+
+ cb_access_context->RecordDispatchDrawDescriptorSet(VK_PIPELINE_BIND_POINT_COMPUTE, tag);
+}
+
+bool SyncValidator::PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const {
+ bool skip = false;
+ const auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ if (!cb_access_context) return skip;
+
+ const auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+ if (!context) return skip;
+
+ skip |= cb_access_context->ValidateDispatchDrawDescriptorSet(VK_PIPELINE_BIND_POINT_COMPUTE, "vkCmdDispatchIndirect");
+ skip |= ValidateIndirectBuffer(*context, commandBuffer, sizeof(VkDispatchIndirectCommand), buffer, offset, 1,
+ sizeof(VkDispatchIndirectCommand), "vkCmdDispatchIndirect");
+ return skip;
+}
+
+void SyncValidator::PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) {
+ StateTracker::PreCallRecordCmdDispatchIndirect(commandBuffer, buffer, offset);
+ auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ const auto tag = cb_access_context->NextCommandTag(CMD_DISPATCHINDIRECT);
+ auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+
+ cb_access_context->RecordDispatchDrawDescriptorSet(VK_PIPELINE_BIND_POINT_COMPUTE, tag);
+ RecordIndirectBuffer(*context, tag, sizeof(VkDispatchIndirectCommand), buffer, offset, 1, sizeof(VkDispatchIndirectCommand));
+}
+
+bool SyncValidator::PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
+ uint32_t firstVertex, uint32_t firstInstance) const {
+ bool skip = false;
+ const auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ if (!cb_access_context) return skip;
+
+ skip |= cb_access_context->ValidateDispatchDrawDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, "vkCmdDraw");
+ skip |= cb_access_context->ValidateDrawVertex(vertexCount, firstVertex, "vkCmdDraw");
+ skip |= cb_access_context->ValidateDrawSubpassAttachment("vkCmdDraw");
+ return skip;
+}
+
+void SyncValidator::PreCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount,
+ uint32_t firstVertex, uint32_t firstInstance) {
+ StateTracker::PreCallRecordCmdDraw(commandBuffer, vertexCount, instanceCount, firstVertex, firstInstance);
+ auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ const auto tag = cb_access_context->NextCommandTag(CMD_DRAW);
+
+ cb_access_context->RecordDispatchDrawDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, tag);
+ cb_access_context->RecordDrawVertex(vertexCount, firstVertex, tag);
+ cb_access_context->RecordDrawSubpassAttachment(tag);
+}
+
+bool SyncValidator::PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
+ uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const {
+ bool skip = false;
+ const auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ if (!cb_access_context) return skip;
+
+ skip |= cb_access_context->ValidateDispatchDrawDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, "vkCmdDrawIndexed");
+ skip |= cb_access_context->ValidateDrawVertexIndex(indexCount, firstIndex, "vkCmdDrawIndexed");
+ skip |= cb_access_context->ValidateDrawSubpassAttachment("vkCmdDrawIndexed");
+ return skip;
+}
+
+void SyncValidator::PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
+ uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) {
+ StateTracker::PreCallRecordCmdDrawIndexed(commandBuffer, indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
+ auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ const auto tag = cb_access_context->NextCommandTag(CMD_DRAWINDEXED);
+
+ cb_access_context->RecordDispatchDrawDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, tag);
+ cb_access_context->RecordDrawVertexIndex(indexCount, firstIndex, tag);
+ cb_access_context->RecordDrawSubpassAttachment(tag);
+}
+
+bool SyncValidator::PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ uint32_t drawCount, uint32_t stride) const {
+ bool skip = false;
+ if (drawCount == 0) return skip;
+
+ const auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ if (!cb_access_context) return skip;
+
+ const auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+ if (!context) return skip;
+
+ skip |= cb_access_context->ValidateDispatchDrawDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, "vkCmdDrawIndirect");
+ skip |= cb_access_context->ValidateDrawSubpassAttachment("vkCmdDrawIndirect");
+ skip |= ValidateIndirectBuffer(*context, commandBuffer, sizeof(VkDrawIndirectCommand), buffer, offset, drawCount, stride,
+ "vkCmdDrawIndirect");
+
+ // TODO: For now, we validate the whole vertex buffer. It might cause some false positive.
+ // VkDrawIndirectCommand buffer could be changed until SubmitQueue.
+ // We will validate the vertex buffer in SubmitQueue in the future.
+ skip |= cb_access_context->ValidateDrawVertex(UINT32_MAX, 0, "vkCmdDrawIndirect");
+ return skip;
+}
+
+void SyncValidator::PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ uint32_t drawCount, uint32_t stride) {
+ StateTracker::PreCallRecordCmdDrawIndirect(commandBuffer, buffer, offset, drawCount, stride);
+ if (drawCount == 0) return;
+ auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ const auto tag = cb_access_context->NextCommandTag(CMD_DRAWINDIRECT);
+ auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+
+ cb_access_context->RecordDispatchDrawDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, tag);
+ cb_access_context->RecordDrawSubpassAttachment(tag);
+ RecordIndirectBuffer(*context, tag, sizeof(VkDrawIndirectCommand), buffer, offset, drawCount, stride);
+
+ // TODO: For now, we record the whole vertex buffer. It might cause some false positive.
+ // VkDrawIndirectCommand buffer could be changed until SubmitQueue.
+ // We will record the vertex buffer in SubmitQueue in the future.
+ cb_access_context->RecordDrawVertex(UINT32_MAX, 0, tag);
+}
+
+bool SyncValidator::PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ uint32_t drawCount, uint32_t stride) const {
+ bool skip = false;
+ if (drawCount == 0) return skip;
+ const auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ if (!cb_access_context) return skip;
+
+ const auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+ if (!context) return skip;
+
+ skip |= cb_access_context->ValidateDispatchDrawDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, "vkCmdDrawIndexedIndirect");
+ skip |= cb_access_context->ValidateDrawSubpassAttachment("vkCmdDrawIndexedIndirect");
+ skip |= ValidateIndirectBuffer(*context, commandBuffer, sizeof(VkDrawIndexedIndirectCommand), buffer, offset, drawCount, stride,
+ "vkCmdDrawIndexedIndirect");
+
+ // TODO: For now, we validate the whole index and vertex buffer. It might cause some false positive.
+ // VkDrawIndexedIndirectCommand buffer could be changed until SubmitQueue.
+ // We will validate the index and vertex buffer in SubmitQueue in the future.
+ skip |= cb_access_context->ValidateDrawVertexIndex(UINT32_MAX, 0, "vkCmdDrawIndexedIndirect");
+ return skip;
+}
+
+void SyncValidator::PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ uint32_t drawCount, uint32_t stride) {
+ StateTracker::PreCallRecordCmdDrawIndexedIndirect(commandBuffer, buffer, offset, drawCount, stride);
+ auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ const auto tag = cb_access_context->NextCommandTag(CMD_DRAWINDEXEDINDIRECT);
+ auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+
+ cb_access_context->RecordDispatchDrawDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, tag);
+ cb_access_context->RecordDrawSubpassAttachment(tag);
+ RecordIndirectBuffer(*context, tag, sizeof(VkDrawIndexedIndirectCommand), buffer, offset, drawCount, stride);
+
+ // TODO: For now, we record the whole index and vertex buffer. It might cause some false positive.
+ // VkDrawIndexedIndirectCommand buffer could be changed until SubmitQueue.
+ // We will record the index and vertex buffer in SubmitQueue in the future.
+ cb_access_context->RecordDrawVertexIndex(UINT32_MAX, 0, tag);
+}
+
+bool SyncValidator::ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride, const char *function) const {
+ bool skip = false;
+ const auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ if (!cb_access_context) return skip;
+
+ const auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+ if (!context) return skip;
+
+ skip |= cb_access_context->ValidateDispatchDrawDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, function);
+ skip |= cb_access_context->ValidateDrawSubpassAttachment(function);
+ skip |= ValidateIndirectBuffer(*context, commandBuffer, sizeof(VkDrawIndirectCommand), buffer, offset, maxDrawCount, stride,
+ function);
+ skip |= ValidateCountBuffer(*context, commandBuffer, countBuffer, countBufferOffset, function);
+
+ // TODO: For now, we validate the whole vertex buffer. It might cause some false positive.
+ // VkDrawIndirectCommand buffer could be changed until SubmitQueue.
+ // We will validate the vertex buffer in SubmitQueue in the future.
+ skip |= cb_access_context->ValidateDrawVertex(UINT32_MAX, 0, function);
+ return skip;
+}
+
+bool SyncValidator::PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride) const {
+ return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
+ "vkCmdDrawIndirectCount");
+}
+
+void SyncValidator::PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride) {
+ StateTracker::PreCallRecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount,
+ stride);
+ auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ const auto tag = cb_access_context->NextCommandTag(CMD_DRAWINDIRECTCOUNT);
+ auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+
+ cb_access_context->RecordDispatchDrawDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, tag);
+ cb_access_context->RecordDrawSubpassAttachment(tag);
+ RecordIndirectBuffer(*context, tag, sizeof(VkDrawIndirectCommand), buffer, offset, 1, stride);
+ RecordCountBuffer(*context, tag, countBuffer, countBufferOffset);
+
+ // TODO: For now, we record the whole vertex buffer. It might cause some false positive.
+ // VkDrawIndirectCommand buffer could be changed until SubmitQueue.
+ // We will record the vertex buffer in SubmitQueue in the future.
+ cb_access_context->RecordDrawVertex(UINT32_MAX, 0, tag);
+}
+
+bool SyncValidator::PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset,
+ uint32_t maxDrawCount, uint32_t stride) const {
+ return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
+ "vkCmdDrawIndirectCountKHR");
+}
+
+void SyncValidator::PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset,
+ uint32_t maxDrawCount, uint32_t stride) {
+ StateTracker::PreCallRecordCmdDrawIndirectCountKHR(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount,
+ stride);
+ PreCallRecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+}
+
+bool SyncValidator::PreCallValidateCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset,
+ uint32_t maxDrawCount, uint32_t stride) const {
+ return ValidateCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
+ "vkCmdDrawIndirectCountAMD");
+}
+
+void SyncValidator::PreCallRecordCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset,
+ uint32_t maxDrawCount, uint32_t stride) {
+ StateTracker::PreCallRecordCmdDrawIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount,
+ stride);
+ PreCallRecordCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+}
+
+bool SyncValidator::ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride, const char *function) const {
+ bool skip = false;
+ const auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ if (!cb_access_context) return skip;
+
+ const auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+ if (!context) return skip;
+
+ skip |= cb_access_context->ValidateDispatchDrawDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, function);
+ skip |= cb_access_context->ValidateDrawSubpassAttachment(function);
+ skip |= ValidateIndirectBuffer(*context, commandBuffer, sizeof(VkDrawIndexedIndirectCommand), buffer, offset, maxDrawCount,
+ stride, function);
+ skip |= ValidateCountBuffer(*context, commandBuffer, countBuffer, countBufferOffset, function);
+
+ // TODO: For now, we validate the whole index and vertex buffer. It might cause some false positive.
+ // VkDrawIndexedIndirectCommand buffer could be changed until SubmitQueue.
+ // We will validate the index and vertex buffer in SubmitQueue in the future.
+ skip |= cb_access_context->ValidateDrawVertexIndex(UINT32_MAX, 0, function);
+ return skip;
+}
+
+bool SyncValidator::PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset,
+ uint32_t maxDrawCount, uint32_t stride) const {
+ return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
+ "vkCmdDrawIndexedIndirectCount");
+}
+
+void SyncValidator::PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset,
+ uint32_t maxDrawCount, uint32_t stride) {
+ StateTracker::PreCallRecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset,
+ maxDrawCount, stride);
+ auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ const auto tag = cb_access_context->NextCommandTag(CMD_DRAWINDEXEDINDIRECTCOUNT);
+ auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+
+ cb_access_context->RecordDispatchDrawDescriptorSet(VK_PIPELINE_BIND_POINT_GRAPHICS, tag);
+ cb_access_context->RecordDrawSubpassAttachment(tag);
+ RecordIndirectBuffer(*context, tag, sizeof(VkDrawIndexedIndirectCommand), buffer, offset, 1, stride);
+ RecordCountBuffer(*context, tag, countBuffer, countBufferOffset);
+
+ // TODO: For now, we record the whole index and vertex buffer. It might cause some false positive.
+ // VkDrawIndexedIndirectCommand buffer could be changed until SubmitQueue.
+ // We will update the index and vertex buffer in SubmitQueue in the future.
+ cb_access_context->RecordDrawVertexIndex(UINT32_MAX, 0, tag);
+}
+
+bool SyncValidator::PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer,
+ VkDeviceSize offset, VkBuffer countBuffer,
+ VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride) const {
+ return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
+ "vkCmdDrawIndexedIndirectCountKHR");
+}
+
+void SyncValidator::PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset,
+ uint32_t maxDrawCount, uint32_t stride) {
+ StateTracker::PreCallRecordCmdDrawIndexedIndirectCountKHR(commandBuffer, buffer, offset, countBuffer, countBufferOffset,
+ maxDrawCount, stride);
+ PreCallRecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+}
+
+bool SyncValidator::PreCallValidateCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer,
+ VkDeviceSize offset, VkBuffer countBuffer,
+ VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride) const {
+ return ValidateCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride,
+ "vkCmdDrawIndexedIndirectCountAMD");
+}
+
+void SyncValidator::PreCallRecordCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset,
+ uint32_t maxDrawCount, uint32_t stride) {
+ StateTracker::PreCallRecordCmdDrawIndexedIndirectCountAMD(commandBuffer, buffer, offset, countBuffer, countBufferOffset,
+ maxDrawCount, stride);
+ PreCallRecordCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+}
+
+bool SyncValidator::PreCallValidateCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
+ const VkClearColorValue *pColor, uint32_t rangeCount,
+ const VkImageSubresourceRange *pRanges) const {
+ bool skip = false;
+ const auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ if (!cb_access_context) return skip;
+
+ const auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+ if (!context) return skip;
+
+ const auto *image_state = Get<IMAGE_STATE>(image);
+
+ for (uint32_t index = 0; index < rangeCount; index++) {
+ const auto &range = pRanges[index];
+ if (image_state) {
+ auto hazard =
+ context->DetectHazard(*image_state, SYNC_TRANSFER_TRANSFER_WRITE, range, {0, 0, 0}, image_state->createInfo.extent);
+ if (hazard.hazard) {
+ skip |= LogError(image, string_SyncHazardVUID(hazard.hazard),
+ "vkCmdClearColorImage: Hazard %s for %s, range index %" PRIu32 ". Access info %s.",
+ string_SyncHazard(hazard.hazard), report_data->FormatHandle(image).c_str(), index,
+ string_UsageTag(hazard).c_str());
+ }
+ }
+ }
+ return skip;
+}
+
+void SyncValidator::PreCallRecordCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
+ const VkClearColorValue *pColor, uint32_t rangeCount,
+ const VkImageSubresourceRange *pRanges) {
+ StateTracker::PreCallRecordCmdClearColorImage(commandBuffer, image, imageLayout, pColor, rangeCount, pRanges);
+ auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ const auto tag = cb_access_context->NextCommandTag(CMD_CLEARCOLORIMAGE);
+ auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+
+ const auto *image_state = Get<IMAGE_STATE>(image);
+
+ for (uint32_t index = 0; index < rangeCount; index++) {
+ const auto &range = pRanges[index];
+ if (image_state) {
+ context->UpdateAccessState(*image_state, SYNC_TRANSFER_TRANSFER_WRITE, range, {0, 0, 0}, image_state->createInfo.extent,
+ tag);
+ }
+ }
+}
+
+bool SyncValidator::PreCallValidateCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image,
+ VkImageLayout imageLayout,
+ const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
+ const VkImageSubresourceRange *pRanges) const {
+ bool skip = false;
+ const auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ if (!cb_access_context) return skip;
+
+ const auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+ if (!context) return skip;
+
+ const auto *image_state = Get<IMAGE_STATE>(image);
+
+ for (uint32_t index = 0; index < rangeCount; index++) {
+ const auto &range = pRanges[index];
+ if (image_state) {
+ auto hazard =
+ context->DetectHazard(*image_state, SYNC_TRANSFER_TRANSFER_WRITE, range, {0, 0, 0}, image_state->createInfo.extent);
+ if (hazard.hazard) {
+ skip |= LogError(image, string_SyncHazardVUID(hazard.hazard),
+ "vkCmdClearDepthStencilImage: Hazard %s for %s, range index %" PRIu32 ". Access info %s.",
+ string_SyncHazard(hazard.hazard), report_data->FormatHandle(image).c_str(), index,
+ string_UsageTag(hazard).c_str());
+ }
+ }
+ }
+ return skip;
+}
+
+void SyncValidator::PreCallRecordCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
+ const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
+ const VkImageSubresourceRange *pRanges) {
+ StateTracker::PreCallRecordCmdClearDepthStencilImage(commandBuffer, image, imageLayout, pDepthStencil, rangeCount, pRanges);
+ auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ const auto tag = cb_access_context->NextCommandTag(CMD_CLEARDEPTHSTENCILIMAGE);
+ auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+
+ const auto *image_state = Get<IMAGE_STATE>(image);
+
+ for (uint32_t index = 0; index < rangeCount; index++) {
+ const auto &range = pRanges[index];
+ if (image_state) {
+ context->UpdateAccessState(*image_state, SYNC_TRANSFER_TRANSFER_WRITE, range, {0, 0, 0}, image_state->createInfo.extent,
+ tag);
+ }
+ }
+}
+
+bool SyncValidator::PreCallValidateCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool,
+ uint32_t firstQuery, uint32_t queryCount, VkBuffer dstBuffer,
+ VkDeviceSize dstOffset, VkDeviceSize stride,
+ VkQueryResultFlags flags) const {
+ bool skip = false;
+ const auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ if (!cb_access_context) return skip;
+
+ const auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+ if (!context) return skip;
+
+ const auto *dst_buffer = Get<BUFFER_STATE>(dstBuffer);
+
+ if (dst_buffer) {
+ ResourceAccessRange range = MakeRange(dstOffset, stride * queryCount);
+ auto hazard = context->DetectHazard(*dst_buffer, SYNC_TRANSFER_TRANSFER_WRITE, range);
+ if (hazard.hazard) {
+ skip |=
+ LogError(dstBuffer, string_SyncHazardVUID(hazard.hazard),
+ "vkCmdCopyQueryPoolResults: Hazard %s for dstBuffer %s. Access info %s.", string_SyncHazard(hazard.hazard),
+ report_data->FormatHandle(dstBuffer).c_str(), string_UsageTag(hazard).c_str());
+ }
+ }
+
+ // TODO:Track VkQueryPool
+ return skip;
+}
+
+void SyncValidator::PreCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
+ uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
+ VkDeviceSize stride, VkQueryResultFlags flags) {
+ StateTracker::PreCallRecordCmdCopyQueryPoolResults(commandBuffer, queryPool, firstQuery, queryCount, dstBuffer, dstOffset,
+ stride, flags);
+ auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ const auto tag = cb_access_context->NextCommandTag(CMD_COPYQUERYPOOLRESULTS);
+ auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+
+ const auto *dst_buffer = Get<BUFFER_STATE>(dstBuffer);
+
+ if (dst_buffer) {
+ ResourceAccessRange range = MakeRange(dstOffset, stride * queryCount);
+ context->UpdateAccessState(*dst_buffer, SYNC_TRANSFER_TRANSFER_WRITE, range, tag);
+ }
+
+ // TODO:Track VkQueryPool
+}
+
+bool SyncValidator::PreCallValidateCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
+ VkDeviceSize size, uint32_t data) const {
+ bool skip = false;
+ const auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ if (!cb_access_context) return skip;
+
+ const auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+ if (!context) return skip;
+
+ const auto *dst_buffer = Get<BUFFER_STATE>(dstBuffer);
+
+ if (dst_buffer) {
+ ResourceAccessRange range = MakeRange(dstOffset, size);
+ auto hazard = context->DetectHazard(*dst_buffer, SYNC_TRANSFER_TRANSFER_WRITE, range);
+ if (hazard.hazard) {
+ skip |= LogError(dstBuffer, string_SyncHazardVUID(hazard.hazard),
+ "vkCmdFillBuffer: Hazard %s for dstBuffer %s. Access info %s.", string_SyncHazard(hazard.hazard),
+ report_data->FormatHandle(dstBuffer).c_str(), string_UsageTag(hazard).c_str());
+ }
+ }
+ return skip;
+}
+
+void SyncValidator::PreCallRecordCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
+ VkDeviceSize size, uint32_t data) {
+ StateTracker::PreCallRecordCmdFillBuffer(commandBuffer, dstBuffer, dstOffset, size, data);
+ auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ const auto tag = cb_access_context->NextCommandTag(CMD_FILLBUFFER);
+ auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+
+ const auto *dst_buffer = Get<BUFFER_STATE>(dstBuffer);
+
+ if (dst_buffer) {
+ ResourceAccessRange range = MakeRange(dstOffset, size);
+ context->UpdateAccessState(*dst_buffer, SYNC_TRANSFER_TRANSFER_WRITE, range, tag);
+ }
+}
+
+bool SyncValidator::PreCallValidateCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
+ VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
+ const VkImageResolve *pRegions) const {
+ bool skip = false;
+ const auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ if (!cb_access_context) return skip;
+
+ const auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+ if (!context) return skip;
+
+ const auto *src_image = Get<IMAGE_STATE>(srcImage);
+ const auto *dst_image = Get<IMAGE_STATE>(dstImage);
+
+ for (uint32_t region = 0; region < regionCount; region++) {
+ const auto &resolve_region = pRegions[region];
+ if (src_image) {
+ auto hazard = context->DetectHazard(*src_image, SYNC_TRANSFER_TRANSFER_READ, resolve_region.srcSubresource,
+ resolve_region.srcOffset, resolve_region.extent);
+ if (hazard.hazard) {
+ skip |= LogError(srcImage, string_SyncHazardVUID(hazard.hazard),
+ "vkCmdResolveImage: Hazard %s for srcImage %s, region %" PRIu32 ". Access info %s.",
+ string_SyncHazard(hazard.hazard), report_data->FormatHandle(srcImage).c_str(), region,
+ string_UsageTag(hazard).c_str());
+ }
+ }
+
+ if (dst_image) {
+ auto hazard = context->DetectHazard(*dst_image, SYNC_TRANSFER_TRANSFER_WRITE, resolve_region.dstSubresource,
+ resolve_region.dstOffset, resolve_region.extent);
+ if (hazard.hazard) {
+ skip |= LogError(dstImage, string_SyncHazardVUID(hazard.hazard),
+ "vkCmdResolveImage: Hazard %s for dstImage %s, region %" PRIu32 ". Access info %s.",
+ string_SyncHazard(hazard.hazard), report_data->FormatHandle(dstImage).c_str(), region,
+ string_UsageTag(hazard).c_str());
+ }
+ if (skip) break;
+ }
+ }
+
+ return skip;
+}
+
+void SyncValidator::PreCallRecordCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
+ VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
+ const VkImageResolve *pRegions) {
+ StateTracker::PreCallRecordCmdResolveImage(commandBuffer, srcImage, srcImageLayout, dstImage, dstImageLayout, regionCount,
+ pRegions);
+ auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ const auto tag = cb_access_context->NextCommandTag(CMD_RESOLVEIMAGE);
+ auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+
+ auto *src_image = Get<IMAGE_STATE>(srcImage);
+ auto *dst_image = Get<IMAGE_STATE>(dstImage);
+
+ for (uint32_t region = 0; region < regionCount; region++) {
+ const auto &resolve_region = pRegions[region];
+ if (src_image) {
+ context->UpdateAccessState(*src_image, SYNC_TRANSFER_TRANSFER_READ, resolve_region.srcSubresource,
+ resolve_region.srcOffset, resolve_region.extent, tag);
+ }
+ if (dst_image) {
+ context->UpdateAccessState(*dst_image, SYNC_TRANSFER_TRANSFER_WRITE, resolve_region.dstSubresource,
+ resolve_region.dstOffset, resolve_region.extent, tag);
+ }
+ }
+}
+
+bool SyncValidator::PreCallValidateCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
+ VkDeviceSize dataSize, const void *pData) const {
+ bool skip = false;
+ const auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ if (!cb_access_context) return skip;
+
+ const auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+ if (!context) return skip;
+
+ const auto *dst_buffer = Get<BUFFER_STATE>(dstBuffer);
+
+ if (dst_buffer) {
+ ResourceAccessRange range = MakeRange(dstOffset, dataSize);
+ auto hazard = context->DetectHazard(*dst_buffer, SYNC_TRANSFER_TRANSFER_WRITE, range);
+ if (hazard.hazard) {
+ skip |= LogError(dstBuffer, string_SyncHazardVUID(hazard.hazard),
+ "vkCmdUpdateBuffer: Hazard %s for dstBuffer %s. Access info %s.", string_SyncHazard(hazard.hazard),
+ report_data->FormatHandle(dstBuffer).c_str(), string_UsageTag(hazard).c_str());
+ }
+ }
+ return skip;
+}
+
+void SyncValidator::PreCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
+ VkDeviceSize dataSize, const void *pData) {
+ StateTracker::PreCallRecordCmdUpdateBuffer(commandBuffer, dstBuffer, dstOffset, dataSize, pData);
+ auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ const auto tag = cb_access_context->NextCommandTag(CMD_UPDATEBUFFER);
+ auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+
+ const auto *dst_buffer = Get<BUFFER_STATE>(dstBuffer);
+
+ if (dst_buffer) {
+ ResourceAccessRange range = MakeRange(dstOffset, dataSize);
+ context->UpdateAccessState(*dst_buffer, SYNC_TRANSFER_TRANSFER_WRITE, range, tag);
+ }
+}
+
+bool SyncValidator::PreCallValidateCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
+ VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) const {
+ bool skip = false;
+ const auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ if (!cb_access_context) return skip;
+
+ const auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+ if (!context) return skip;
+
+ const auto *dst_buffer = Get<BUFFER_STATE>(dstBuffer);
+
+ if (dst_buffer) {
+ ResourceAccessRange range = MakeRange(dstOffset, 4);
+ auto hazard = context->DetectHazard(*dst_buffer, SYNC_TRANSFER_TRANSFER_WRITE, range);
+ if (hazard.hazard) {
+ skip |=
+ LogError(dstBuffer, string_SyncHazardVUID(hazard.hazard),
+ "vkCmdWriteBufferMarkerAMD: Hazard %s for dstBuffer %s. Access info %s.", string_SyncHazard(hazard.hazard),
+ report_data->FormatHandle(dstBuffer).c_str(), string_UsageTag(hazard).c_str());
+ }
+ }
+ return skip;
+}
+
+void SyncValidator::PreCallRecordCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
+ VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) {
+ StateTracker::PreCallRecordCmdWriteBufferMarkerAMD(commandBuffer, pipelineStage, dstBuffer, dstOffset, marker);
+ auto *cb_access_context = GetAccessContext(commandBuffer);
+ assert(cb_access_context);
+ const auto tag = cb_access_context->NextCommandTag(CMD_WRITEBUFFERMARKERAMD);
+ auto *context = cb_access_context->GetCurrentAccessContext();
+ assert(context);
+
+ const auto *dst_buffer = Get<BUFFER_STATE>(dstBuffer);
+
+ if (dst_buffer) {
+ ResourceAccessRange range = MakeRange(dstOffset, 4);
+ context->UpdateAccessState(*dst_buffer, SYNC_TRANSFER_TRANSFER_WRITE, range, tag);
+ }
+}
diff --git a/layers/synchronization_validation.h b/layers/synchronization_validation.h
new file mode 100644
index 0000000..b4889c3
--- /dev/null
+++ b/layers/synchronization_validation.h
@@ -0,0 +1,759 @@
+/*
+ * Copyright (c) 2019-2020 Valve Corporation
+ * Copyright (c) 2019-2020 LunarG, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Author: John Zulauf <jzulauf@lunarg.com>
+ */
+
+#pragma once
+
+#include <limits>
+#include <map>
+#include <memory>
+#include <unordered_map>
+#include <vulkan/vulkan.h>
+
+#include "synchronization_validation_types.h"
+#include "state_tracker.h"
+
+class SyncValidator;
+class ResourceAccessState;
+
+enum SyncHazard {
+ NONE = 0,
+ READ_AFTER_WRITE,
+ WRITE_AFTER_READ,
+ WRITE_AFTER_WRITE,
+ READ_RACING_WRITE,
+ WRITE_RACING_WRITE,
+ WRITE_RACING_READ,
+};
+
+// Useful Utilites for manipulating StageAccess parameters, suitable as base class to save typing
+struct SyncStageAccess {
+ static inline SyncStageAccessFlagBits FlagBit(SyncStageAccessIndex stage_access) {
+ return syncStageAccessInfoByStageAccessIndex[stage_access].stage_access_bit;
+ }
+ static inline SyncStageAccessFlags Flags(SyncStageAccessIndex stage_access) {
+ return static_cast<SyncStageAccessFlags>(FlagBit(stage_access));
+ }
+
+ static bool IsRead(SyncStageAccessFlagBits stage_access_bit) { return 0 != (stage_access_bit & syncStageAccessReadMask); }
+ static bool IsRead(SyncStageAccessIndex stage_access_index) { return IsRead(FlagBit(stage_access_index)); }
+
+ static bool IsWrite(SyncStageAccessFlagBits stage_access_bit) { return 0 != (stage_access_bit & syncStageAccessWriteMask); }
+ static bool HasWrite(SyncStageAccessFlags stage_access_mask) { return 0 != (stage_access_mask & syncStageAccessWriteMask); }
+ static bool IsWrite(SyncStageAccessIndex stage_access_index) { return IsWrite(FlagBit(stage_access_index)); }
+ static VkPipelineStageFlagBits PipelineStageBit(SyncStageAccessIndex stage_access_index) {
+ return syncStageAccessInfoByStageAccessIndex[stage_access_index].stage_mask;
+ }
+ static SyncStageAccessFlags AccessScopeByStage(VkPipelineStageFlags stages);
+ static SyncStageAccessFlags AccessScopeByAccess(VkAccessFlags access);
+ static SyncStageAccessFlags AccessScope(VkPipelineStageFlags stages, VkAccessFlags access);
+ static SyncStageAccessFlags AccessScope(SyncStageAccessFlags stage_scope, VkAccessFlags accesses) {
+ return stage_scope & AccessScopeByAccess(accesses);
+ }
+};
+
+struct ResourceUsageTag {
+ uint64_t index;
+ CMD_TYPE command;
+ const static uint64_t kMaxIndex = std::numeric_limits<uint64_t>::max();
+ ResourceUsageTag &operator++() {
+ index++;
+ return *this;
+ }
+ bool IsBefore(const ResourceUsageTag &rhs) const { return index < rhs.index; }
+ bool operator==(const ResourceUsageTag &rhs) const { return (index == rhs.index); }
+ bool operator!=(const ResourceUsageTag &rhs) const { return !(*this == rhs); }
+ ResourceUsageTag() : index(0), command(CMD_NONE) {}
+ ResourceUsageTag(uint64_t index_, CMD_TYPE command_) : index(index_), command(command_) {}
+};
+
+struct HazardResult {
+ std::unique_ptr<const ResourceAccessState> access_state;
+ SyncStageAccessIndex usage_index = std::numeric_limits<SyncStageAccessIndex>::max();
+ SyncHazard hazard = NONE;
+ SyncStageAccessFlags prior_access = 0U; // TODO -- change to a NONE enum in ...Bits
+ ResourceUsageTag tag = ResourceUsageTag();
+ void Set(const ResourceAccessState *access_state_, SyncStageAccessIndex usage_index_, SyncHazard hazard_,
+ SyncStageAccessFlags prior_, const ResourceUsageTag &tag_);
+};
+
+struct SyncBarrier {
+ VkPipelineStageFlags src_exec_scope;
+ SyncStageAccessFlags src_access_scope;
+ VkPipelineStageFlags dst_exec_scope;
+ SyncStageAccessFlags dst_access_scope;
+ SyncBarrier() = default;
+ SyncBarrier &operator=(const SyncBarrier &) = default;
+ SyncBarrier(VkQueueFlags gueue_flags, const VkSubpassDependency2 &sub_pass_barrier);
+};
+
+// To represent ordering guarantees such as rasterization and store
+struct SyncOrderingBarrier {
+ VkPipelineStageFlags exec_scope;
+ SyncStageAccessFlags access_scope;
+ SyncOrderingBarrier() = default;
+ SyncOrderingBarrier &operator=(const SyncOrderingBarrier &) = default;
+};
+
+class ResourceAccessState : public SyncStageAccess {
+ protected:
+ // Mutliple read operations can be simlutaneously (and independently) synchronized,
+ // given the only the second execution scope creates a dependency chain, we have to track each,
+ // but only up to one per pipeline stage (as another read from the *same* stage become more recent,
+ // and applicable one for hazard detection
+ struct ReadState {
+ VkPipelineStageFlagBits stage; // The stage of this read
+ SyncStageAccessFlags access; // TODO: Change to FlagBits when we have a None bit enum
+ VkPipelineStageFlags barriers; // all applicable barriered stages
+ ResourceUsageTag tag;
+ bool operator==(const ReadState &rhs) const {
+ bool same = (stage == rhs.stage) && (access == rhs.access) && (barriers == rhs.barriers) && (tag == rhs.tag);
+ return same;
+ }
+ bool operator!=(const ReadState &rhs) const { return !(*this == rhs); }
+ };
+
+ public:
+ HazardResult DetectHazard(SyncStageAccessIndex usage_index) const;
+ HazardResult DetectHazard(SyncStageAccessIndex usage_index, const SyncOrderingBarrier &ordering) const;
+
+ HazardResult DetectBarrierHazard(SyncStageAccessIndex usage_index, VkPipelineStageFlags source_exec_scope,
+ SyncStageAccessFlags source_access_scope) const;
+ HazardResult DetectAsyncHazard(SyncStageAccessIndex usage_index) const;
+
+ void Update(SyncStageAccessIndex usage_index, const ResourceUsageTag &tag);
+ void Resolve(const ResourceAccessState &other);
+ void ApplyBarrier(const SyncBarrier &barrier);
+ void ApplyExecutionBarrier(VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask);
+ void ApplyMemoryAccessBarrier(VkPipelineStageFlags src_stage_mask, SyncStageAccessFlags src_scope,
+ VkPipelineStageFlags dst_stage_mask, SyncStageAccessFlags dst_scope);
+
+ ResourceAccessState()
+ : write_barriers(~SyncStageAccessFlags(0)),
+ write_dependency_chain(0),
+ write_tag(),
+ last_write(0),
+ input_attachment_barriers(kNoAttachmentRead),
+ input_attachment_tag(),
+ last_read_count(0),
+ last_read_stages(0),
+ read_execution_barriers(0) {}
+
+ bool HasWriteOp() const { return last_write != 0; }
+ bool operator==(const ResourceAccessState &rhs) const {
+ bool same = (write_barriers == rhs.write_barriers) && (write_dependency_chain == rhs.write_dependency_chain) &&
+ (last_read_count == rhs.last_read_count) && (last_read_stages == rhs.last_read_stages) &&
+ (write_tag == rhs.write_tag) && (input_attachment_barriers == rhs.input_attachment_barriers) &&
+ ((input_attachment_barriers == kNoAttachmentRead) || input_attachment_tag == rhs.input_attachment_tag) &&
+ (read_execution_barriers == rhs.read_execution_barriers);
+ for (uint32_t i = 0; same && i < last_read_count; i++) {
+ same |= last_reads[i] == rhs.last_reads[i];
+ }
+ return same;
+ }
+ bool operator!=(const ResourceAccessState &rhs) const { return !(*this == rhs); }
+ VkPipelineStageFlags GetReadBarriers(SyncStageAccessFlags usage) const;
+ SyncStageAccessFlags GetWriteBarriers() const { return write_barriers; }
+
+ private:
+ static constexpr VkPipelineStageFlags kNoAttachmentRead = ~VkPipelineStageFlags(0);
+ bool IsWriteHazard(SyncStageAccessFlagBits usage) const { return 0 != (usage & ~write_barriers); }
+
+ static bool IsReadHazard(VkPipelineStageFlagBits stage, const VkPipelineStageFlags barriers) {
+ return 0 != (stage & ~barriers);
+ }
+ static bool IsReadHazard(VkPipelineStageFlags stage_mask, const VkPipelineStageFlags barriers) {
+ return stage_mask != (stage_mask & barriers);
+ }
+
+ bool IsReadHazard(VkPipelineStageFlagBits stage, const ReadState &read_access) const {
+ return IsReadHazard(stage, read_access.barriers);
+ }
+ bool IsReadHazard(VkPipelineStageFlags stage_mask, const ReadState &read_access) const {
+ return IsReadHazard(stage_mask, read_access.barriers);
+ }
+
+ // TODO: Add a NONE (zero) enum to SyncStageAccessFlagBits for input_attachment_read and last_write
+
+ // With reads, each must be "safe" relative to it's prior write, so we need only
+ // save the most recent write operation (as anything *transitively* unsafe would arleady
+ // be included
+ SyncStageAccessFlags write_barriers; // union of applicable barrier masks since last write
+ VkPipelineStageFlags write_dependency_chain; // intiially zero, but accumulating the dstStages of barriers if they chain.
+ ResourceUsageTag write_tag;
+ SyncStageAccessFlags last_write; // only the most recent write
+
+ // This is special as it's a framebuffer-local read from a framebuffer-global pipeline stage
+ // As the only possible state for the input attachment stage/access is SYNC_FRAGMENT_SHADER_INPUT_ATTACHMENT_READ_BIT,
+ // encode the presence with the barriers mask, ~0 denotes no pending input attachment. Zero -- is the no-barrier state,
+ // otherwise reflects the barrier/dependency chain information.
+ VkPipelineStageFlags input_attachment_barriers;
+ ResourceUsageTag input_attachment_tag;
+
+ uint32_t last_read_count;
+ VkPipelineStageFlags last_read_stages;
+ VkPipelineStageFlags read_execution_barriers;
+ static constexpr size_t kStageCount = 32; // TODO: The manual count was 28 real stages. Add stage count to codegen
+ std::array<ReadState, kStageCount> last_reads;
+};
+
+using ResourceAccessRangeMap = sparse_container::range_map<VkDeviceSize, ResourceAccessState>;
+using ResourceAccessRange = typename ResourceAccessRangeMap::key_type;
+using ResourceRangeMergeIterator = sparse_container::parallel_iterator<ResourceAccessRangeMap, const ResourceAccessRangeMap>;
+
+class AccessContext {
+ public:
+ enum AddressType : int { kLinearAddress = 0, kIdealizedAddress = 1, kMaxAddressType = 1 };
+ enum DetectOptions : uint32_t {
+ kDetectPrevious = 1U << 0,
+ kDetectAsync = 1U << 1,
+ kDetectAll = (kDetectPrevious | kDetectAsync)
+ };
+
+ struct TrackBack {
+ SyncBarrier barrier;
+ const AccessContext *context;
+ TrackBack(const AccessContext *context_, VkQueueFlags queue_flags_, const VkSubpassDependency2 &subpass_barrier_)
+ : barrier(queue_flags_, subpass_barrier_), context(context_) {}
+ TrackBack &operator=(const TrackBack &) = default;
+ TrackBack() = default;
+ };
+
+ HazardResult DetectHazard(const BUFFER_STATE &buffer, SyncStageAccessIndex usage_index, const ResourceAccessRange &range) const;
+ HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
+ const VkImageSubresourceLayers &subresource, const VkOffset3D &offset,
+ const VkExtent3D &extent) const;
+ template <typename Detector>
+ HazardResult DetectHazard(Detector &detector, const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range,
+ const VkOffset3D &offset, const VkExtent3D &extent, DetectOptions options) const;
+ HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
+ const VkImageSubresourceRange &subresource_range, const VkOffset3D &offset,
+ const VkExtent3D &extent) const;
+ HazardResult DetectHazard(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
+ const VkImageSubresourceRange &subresource_range, const SyncOrderingBarrier &ordering,
+ const VkOffset3D &offset, const VkExtent3D &extent) const;
+ HazardResult DetectHazard(const IMAGE_VIEW_STATE *view, SyncStageAccessIndex current_usage, const SyncOrderingBarrier &ordering,
+ const VkOffset3D &offset, const VkExtent3D &extent, VkImageAspectFlags aspect_mask = 0U) const;
+ HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags src_exec_scope,
+ SyncStageAccessFlags src_access_scope, const VkImageSubresourceRange &subresource_range,
+ DetectOptions options) const;
+ HazardResult DetectImageBarrierHazard(const IMAGE_STATE &image, VkPipelineStageFlags src_exec_scope,
+ SyncStageAccessFlags src_stage_accesses, const VkImageMemoryBarrier &barrier) const;
+ HazardResult DetectSubpassTransitionHazard(const TrackBack &track_back, const IMAGE_VIEW_STATE *attach_view) const;
+
+ const TrackBack &GetDstExternalTrackBack() const { return dst_external_; }
+ void Reset() {
+ prev_.clear();
+ prev_by_subpass_.clear();
+ async_.clear();
+ src_external_ = TrackBack();
+ for (auto &map : access_state_maps_) {
+ map.clear();
+ }
+ }
+ // TODO: See if returning the lower_bound would be useful from a performance POV -- look at the lower_bound overhead
+ // Would need to add a "hint" overload to parallel_iterator::invalidate_[AB] call, if so.
+ void ResolvePreviousAccess(AddressType type, const ResourceAccessRange &range, ResourceAccessRangeMap *descent_map,
+ const ResourceAccessState *infill_state) const;
+ void ResolvePreviousAccess(const IMAGE_STATE &image_state, const VkImageSubresourceRange &subresource_range,
+ AddressType address_type, ResourceAccessRangeMap *descent_map,
+ const ResourceAccessState *infill_state) const;
+ void ResolveAccessRange(AddressType type, const ResourceAccessRange &range, const SyncBarrier *barrier,
+ ResourceAccessRangeMap *resolve_map, const ResourceAccessState *infill_state,
+ bool recur_to_infill = true) const;
+ void UpdateAccessState(const BUFFER_STATE &buffer, SyncStageAccessIndex current_usage, const ResourceAccessRange &range,
+ const ResourceUsageTag &tag);
+ void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
+ const VkImageSubresourceRange &subresource_range, const VkOffset3D &offset, const VkExtent3D &extent,
+ const ResourceUsageTag &tag);
+ void UpdateAccessState(const IMAGE_VIEW_STATE *view, SyncStageAccessIndex current_usage, const VkOffset3D &offset,
+ const VkExtent3D &extent, VkImageAspectFlags aspect_mask, const ResourceUsageTag &tag);
+ void UpdateAccessState(const IMAGE_STATE &image, SyncStageAccessIndex current_usage,
+ const VkImageSubresourceLayers &subresource, const VkOffset3D &offset, const VkExtent3D &extent,
+ const ResourceUsageTag &tag);
+ void UpdateAttachmentResolveAccess(const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area,
+ const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, uint32_t subpass,
+ const ResourceUsageTag &tag);
+ void UpdateAttachmentStoreAccess(const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area,
+ const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, uint32_t subpass,
+ const ResourceUsageTag &tag);
+
+ void ResolveChildContexts(const std::vector<AccessContext> &contexts);
+
+ void ApplyImageBarrier(const IMAGE_STATE &image, VkPipelineStageFlags src_exec_scope, SyncStageAccessFlags src_access_scope,
+ VkPipelineStageFlags dst_exec_scope, SyncStageAccessFlags dst_accesse_scope,
+ const VkImageSubresourceRange &subresource_range);
+
+ void ApplyImageBarrier(const IMAGE_STATE &image, VkPipelineStageFlags src_exec_scope, SyncStageAccessFlags src_access_scope,
+ VkPipelineStageFlags dst_exec_scope, SyncStageAccessFlags dst_access_scope,
+ const VkImageSubresourceRange &subresource_range, bool layout_transition, const ResourceUsageTag &tag);
+ void ApplyImageBarrier(const IMAGE_STATE &image, const SyncBarrier &barrier, const VkImageSubresourceRange &subresource_range,
+ bool layout_transition, const ResourceUsageTag &tag);
+
+ template <typename Action>
+ void UpdateMemoryAccess(const BUFFER_STATE &buffer, const ResourceAccessRange &range, const Action action);
+ template <typename Action>
+ void UpdateMemoryAccess(const IMAGE_STATE &image, const VkImageSubresourceRange &subresource_range, const Action action);
+
+ template <typename Action>
+ void ApplyGlobalBarriers(const Action &barrier_action);
+
+ static AddressType ImageAddressType(const IMAGE_STATE &image);
+ static VkDeviceSize ResourceBaseAddress(const BINDABLE &bindable);
+
+ AccessContext(uint32_t subpass, VkQueueFlags queue_flags, const std::vector<SubpassDependencyGraphNode> &dependencies,
+ const std::vector<AccessContext> &contexts, const AccessContext *external_context);
+
+ AccessContext() { Reset(); }
+ AccessContext(const AccessContext ©_from) = default;
+
+ ResourceAccessRangeMap &GetAccessStateMap(AddressType type) { return access_state_maps_[type]; }
+ const ResourceAccessRangeMap &GetAccessStateMap(AddressType type) const { return access_state_maps_[type]; }
+ ResourceAccessRangeMap &GetLinearMap() { return GetAccessStateMap(AddressType::kLinearAddress); }
+ const ResourceAccessRangeMap &GetLinearMap() const { return GetAccessStateMap(AddressType::kLinearAddress); }
+ ResourceAccessRangeMap &GetIdealizedMap() { return GetAccessStateMap(AddressType::kIdealizedAddress); }
+ const ResourceAccessRangeMap &GetIdealizedMap() const { return GetAccessStateMap(AddressType::kIdealizedAddress); }
+ const TrackBack *GetTrackBackFromSubpass(uint32_t subpass) const {
+ if (subpass == VK_SUBPASS_EXTERNAL) {
+ return &src_external_;
+ } else {
+ assert(subpass < prev_by_subpass_.size());
+ return prev_by_subpass_[subpass];
+ }
+ }
+
+ bool ValidateLayoutTransitions(const SyncValidator &sync_state,
+
+ const RENDER_PASS_STATE &rp_state,
+
+ const VkRect2D &render_area,
+
+ uint32_t subpass, const std::vector<const IMAGE_VIEW_STATE *> &attachment_views,
+ const char *func_name) const;
+ bool ValidateLoadOperation(const SyncValidator &sync_state, const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area,
+ uint32_t subpass, const std::vector<const IMAGE_VIEW_STATE *> &attachment_views,
+ const char *func_name) const;
+ bool ValidateStoreOperation(const SyncValidator &sync_state, const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area,
+ uint32_t subpass, const std::vector<const IMAGE_VIEW_STATE *> &attachment_views,
+ const char *func_name) const;
+ bool ValidateResolveOperations(const SyncValidator &sync_state, const RENDER_PASS_STATE &rp_state, const VkRect2D &render_area,
+ const std::vector<const IMAGE_VIEW_STATE *> &attachment_views, const char *func_name,
+ uint32_t subpass) const;
+
+ private:
+ HazardResult DetectHazard(AddressType type, SyncStageAccessIndex usage_index, const ResourceAccessRange &range) const;
+ HazardResult DetectBarrierHazard(AddressType type, SyncStageAccessIndex current_usage, VkPipelineStageFlags src_exec_scope,
+ SyncStageAccessFlags src_access_scope, const ResourceAccessRange &range,
+ DetectOptions options) const;
+
+ template <typename Detector>
+ HazardResult DetectHazard(AddressType type, const Detector &detector, const ResourceAccessRange &range,
+ DetectOptions options) const;
+ template <typename Detector>
+ HazardResult DetectAsyncHazard(AddressType type, const Detector &detector, const ResourceAccessRange &range) const;
+ template <typename Detector>
+ HazardResult DetectPreviousHazard(AddressType type, const Detector &detector, const ResourceAccessRange &range) const;
+ void UpdateAccessState(AddressType type, SyncStageAccessIndex current_usage, const ResourceAccessRange &range,
+ const ResourceUsageTag &tag);
+ constexpr static int kAddressTypeCount = AddressType::kMaxAddressType + 1;
+ static const std::array<AddressType, kAddressTypeCount> kAddressTypes;
+ std::array<ResourceAccessRangeMap, kAddressTypeCount> access_state_maps_;
+ std::vector<TrackBack> prev_;
+ std::vector<TrackBack *> prev_by_subpass_;
+ std::vector<AccessContext *> async_;
+ TrackBack src_external_;
+ TrackBack dst_external_;
+};
+
+class RenderPassAccessContext {
+ public:
+ RenderPassAccessContext() : rp_state_(nullptr), current_subpass_(0) {}
+
+ bool ValidateDrawSubpassAttachment(const SyncValidator &sync_state, const CMD_BUFFER_STATE &cmd, const VkRect2D &render_area,
+ const char *func_name) const;
+ void RecordDrawSubpassAttachment(const CMD_BUFFER_STATE &cmd, const VkRect2D &render_area, const ResourceUsageTag &tag);
+ bool ValidateNextSubpass(const SyncValidator &sync_state, const VkRect2D &render_area, const char *command_name) const;
+ bool ValidateEndRenderPass(const SyncValidator &sync_state, const VkRect2D &render_area, const char *func_name) const;
+ bool ValidateFinalSubpassLayoutTransitions(const SyncValidator &sync_state, const VkRect2D &render_area,
+ const char *func_name) const;
+
+ void RecordLayoutTransitions(const ResourceUsageTag &tag);
+ void RecordLoadOperations(const VkRect2D &render_area, const ResourceUsageTag &tag);
+ void RecordBeginRenderPass(const SyncValidator &state, const CMD_BUFFER_STATE &cb_state, const AccessContext *external_context,
+ VkQueueFlags queue_flags, const ResourceUsageTag &tag);
+ void RecordNextSubpass(const VkRect2D &render_area, const ResourceUsageTag &tag);
+ void RecordEndRenderPass(AccessContext *external_context, const VkRect2D &render_area, const ResourceUsageTag &tag);
+
+ AccessContext &CurrentContext() { return subpass_contexts_[current_subpass_]; }
+ const AccessContext &CurrentContext() const { return subpass_contexts_[current_subpass_]; }
+ const std::vector<AccessContext> &GetContexts() const { return subpass_contexts_; }
+ uint32_t GetCurrentSubpass() const { return current_subpass_; }
+ const RENDER_PASS_STATE *GetRenderPassState() const { return rp_state_; }
+ AccessContext *CreateStoreResolveProxy(const VkRect2D &render_area) const;
+
+ private:
+ const RENDER_PASS_STATE *rp_state_;
+ uint32_t current_subpass_;
+ std::vector<AccessContext> subpass_contexts_;
+ std::vector<const IMAGE_VIEW_STATE *> attachment_views_;
+};
+
+class CommandBufferAccessContext {
+ public:
+ CommandBufferAccessContext()
+ : command_number_(0),
+ reset_count_(0),
+ render_pass_contexts_(),
+ cb_access_context_(),
+ current_context_(&cb_access_context_),
+ current_renderpass_context_(),
+ cb_state_(),
+ queue_flags_() {}
+ CommandBufferAccessContext(SyncValidator &sync_validator, std::shared_ptr<CMD_BUFFER_STATE> &cb_state, VkQueueFlags queue_flags)
+ : CommandBufferAccessContext() {
+ cb_state_ = cb_state;
+ sync_state_ = &sync_validator;
+ queue_flags_ = queue_flags;
+ }
+
+ void Reset() {
+ command_number_ = 0;
+ reset_count_++;
+ cb_access_context_.Reset();
+ render_pass_contexts_.clear();
+ current_context_ = &cb_access_context_;
+ current_renderpass_context_ = nullptr;
+ }
+
+ AccessContext *GetCurrentAccessContext() { return current_context_; }
+ const AccessContext *GetCurrentAccessContext() const { return current_context_; }
+ void RecordBeginRenderPass(const ResourceUsageTag &tag);
+ bool ValidateBeginRenderPass(const RENDER_PASS_STATE &render_pass, const VkRenderPassBeginInfo *pRenderPassBegin,
+ const VkSubpassBeginInfoKHR *pSubpassBeginInfo, const char *func_name) const;
+ bool ValidateDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, const char *func_name) const;
+ void RecordDispatchDrawDescriptorSet(VkPipelineBindPoint pipelineBindPoint, const ResourceUsageTag &tag);
+ bool ValidateDrawVertex(uint32_t vertexCount, uint32_t firstVertex, const char *func_name) const;
+ void RecordDrawVertex(uint32_t vertexCount, uint32_t firstVertex, const ResourceUsageTag &tag);
+ bool ValidateDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, const char *func_name) const;
+ void RecordDrawVertexIndex(uint32_t indexCount, uint32_t firstIndex, const ResourceUsageTag &tag);
+ bool ValidateDrawSubpassAttachment(const char *func_name) const;
+ void RecordDrawSubpassAttachment(const ResourceUsageTag &tag);
+ bool ValidateNextSubpass(const char *func_name) const;
+ bool ValidateEndRenderpass(const char *func_name) const;
+ void RecordNextSubpass(const RENDER_PASS_STATE &render_pass, const ResourceUsageTag &tag);
+ void RecordEndRenderPass(const RENDER_PASS_STATE &render_pass, const ResourceUsageTag &tag);
+ CMD_BUFFER_STATE *GetCommandBufferState() { return cb_state_.get(); }
+ const CMD_BUFFER_STATE *GetCommandBufferState() const { return cb_state_.get(); }
+ VkQueueFlags GetQueueFlags() const { return queue_flags_; }
+ inline ResourceUsageTag NextCommandTag(CMD_TYPE command) {
+ // TODO: add command encoding to ResourceUsageTag.
+ // What else we what to include. Do we want some sort of "parent" or global sequence number
+ command_number_++;
+ const auto index = (static_cast<uint64_t>(reset_count_) << 32) | command_number_;
+ ResourceUsageTag next(index, command);
+ return next;
+ }
+
+ private:
+ uint32_t command_number_;
+ uint32_t reset_count_;
+ std::vector<RenderPassAccessContext> render_pass_contexts_;
+ AccessContext cb_access_context_;
+ AccessContext *current_context_;
+ RenderPassAccessContext *current_renderpass_context_;
+ std::shared_ptr<CMD_BUFFER_STATE> cb_state_;
+ SyncValidator *sync_state_;
+
+ VkQueueFlags queue_flags_;
+};
+
+class SyncValidator : public ValidationStateTracker, public SyncStageAccess {
+ public:
+ SyncValidator() { container_type = LayerObjectTypeSyncValidation; }
+ using StateTracker = ValidationStateTracker;
+
+ using StateTracker::AccessorTraitsTypes;
+ std::unordered_map<VkCommandBuffer, std::unique_ptr<CommandBufferAccessContext>> cb_access_state;
+ CommandBufferAccessContext *GetAccessContextImpl(VkCommandBuffer command_buffer, bool do_insert) {
+ auto found_it = cb_access_state.find(command_buffer);
+ if (found_it == cb_access_state.end()) {
+ if (!do_insert) return nullptr;
+ // If we don't have one, make it.
+ auto cb_state = GetShared<CMD_BUFFER_STATE>(command_buffer);
+ assert(cb_state.get());
+ auto queue_flags = GetQueueFlags(*cb_state);
+ std::unique_ptr<CommandBufferAccessContext> context(new CommandBufferAccessContext(*this, cb_state, queue_flags));
+ auto insert_pair = cb_access_state.insert(std::make_pair(command_buffer, std::move(context)));
+ found_it = insert_pair.first;
+ }
+ return found_it->second.get();
+ }
+ CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer) {
+ return GetAccessContextImpl(command_buffer, true); // true -> do_insert on not found
+ }
+ CommandBufferAccessContext *GetAccessContextNoInsert(VkCommandBuffer command_buffer) {
+ return GetAccessContextImpl(command_buffer, false); // false -> don't do_insert on not found
+ }
+
+ const CommandBufferAccessContext *GetAccessContext(VkCommandBuffer command_buffer) const {
+ const auto found_it = cb_access_state.find(command_buffer);
+ if (found_it == cb_access_state.end()) {
+ return nullptr;
+ }
+ return found_it->second.get();
+ }
+
+ void ApplyGlobalBarriers(AccessContext *context, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
+ SyncStageAccessFlags src_stage_scope, SyncStageAccessFlags dst_stage_scope,
+ uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers);
+ void ApplyBufferBarriers(AccessContext *context, VkPipelineStageFlags src_stage_mask, SyncStageAccessFlags src_stage_scope,
+ VkPipelineStageFlags dst_stage_mask, SyncStageAccessFlags dst_stage_scope, uint32_t barrier_count,
+ const VkBufferMemoryBarrier *barriers);
+ void ApplyImageBarriers(AccessContext *context, VkPipelineStageFlags src_stage_mask, SyncStageAccessFlags src_stage_scope,
+ VkPipelineStageFlags dst_stage_mask, SyncStageAccessFlags dst_stage_scope, uint32_t barrier_count,
+ const VkImageMemoryBarrier *barriers, const ResourceUsageTag &tag);
+
+ void ResetCommandBufferCallback(VkCommandBuffer command_buffer);
+ void FreeCommandBufferCallback(VkCommandBuffer command_buffer);
+ void RecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
+ const VkSubpassBeginInfo *pSubpassBeginInfo, CMD_TYPE command);
+ void RecordCmdNextSubpass(VkCommandBuffer commandBuffer,
+
+ const VkSubpassBeginInfo *pSubpassBeginInfo, const VkSubpassEndInfo *pSubpassEndInfo,
+ CMD_TYPE command);
+ void RecordCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo, CMD_TYPE command);
+ bool SupressedBoundDescriptorWAW(const HazardResult &hazard) const;
+
+ void PostCallRecordCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo,
+ const VkAllocationCallbacks *pAllocator, VkDevice *pDevice, VkResult result);
+
+ bool ValidateBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
+ const VkSubpassBeginInfoKHR *pSubpassBeginInfo, const char *func_name) const;
+
+ bool PreCallValidateCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
+ VkSubpassContents contents) const;
+
+ bool PreCallValidateCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
+ const VkSubpassBeginInfoKHR *pSubpassBeginInfo) const;
+
+ bool PreCallValidateCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
+ const VkSubpassBeginInfoKHR *pSubpassBeginInfo) const;
+
+ bool PreCallValidateCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
+ const VkBufferCopy *pRegions) const;
+
+ void PreCallRecordCmdCopyBuffer(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkBuffer dstBuffer, uint32_t regionCount,
+ const VkBufferCopy *pRegions);
+
+ bool PreCallValidateCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
+ VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
+ const VkImageCopy *pRegions) const;
+
+ void PreCallRecordCmdCopyImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
+ VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageCopy *pRegions);
+
+ bool PreCallValidateCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
+ VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
+ uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
+ uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
+ uint32_t imageMemoryBarrierCount,
+ const VkImageMemoryBarrier *pImageMemoryBarriers) const;
+
+ void PreCallRecordCmdPipelineBarrier(VkCommandBuffer commandBuffer, VkPipelineStageFlags srcStageMask,
+ VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags,
+ uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
+ uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
+ uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers);
+
+ void PostCallRecordBeginCommandBuffer(VkCommandBuffer commandBuffer, const VkCommandBufferBeginInfo *pBeginInfo,
+ VkResult result);
+
+ void PostCallRecordCmdBeginRenderPass(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
+ VkSubpassContents contents);
+ void PostCallRecordCmdBeginRenderPass2(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
+ const VkSubpassBeginInfo *pSubpassBeginInfo);
+ void PostCallRecordCmdBeginRenderPass2KHR(VkCommandBuffer commandBuffer, const VkRenderPassBeginInfo *pRenderPassBegin,
+ const VkSubpassBeginInfo *pSubpassBeginInfo);
+
+ bool ValidateCmdNextSubpass(VkCommandBuffer commandBuffer, const VkSubpassBeginInfoKHR *pSubpassBeginInfo,
+ const VkSubpassEndInfoKHR *pSubpassEndInfo, const char *func_name) const;
+ bool PreCallValidateCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents) const;
+ bool PreCallValidateCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfoKHR *pSubpassBeginInfo,
+ const VkSubpassEndInfoKHR *pSubpassEndInfo) const;
+ bool PreCallValidateCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfoKHR *pSubpassBeginInfo,
+ const VkSubpassEndInfoKHR *pSubpassEndInfo) const;
+
+ void PostCallRecordCmdNextSubpass(VkCommandBuffer commandBuffer, VkSubpassContents contents);
+ void PostCallRecordCmdNextSubpass2(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
+ const VkSubpassEndInfo *pSubpassEndInfo);
+ void PostCallRecordCmdNextSubpass2KHR(VkCommandBuffer commandBuffer, const VkSubpassBeginInfo *pSubpassBeginInfo,
+ const VkSubpassEndInfo *pSubpassEndInfo);
+
+ bool ValidateCmdEndRenderPass(VkCommandBuffer commandBuffer, const VkSubpassEndInfoKHR *pSubpassEndInfo,
+ const char *func_name) const;
+ bool PreCallValidateCmdEndRenderPass(VkCommandBuffer commandBuffer) const;
+ bool PreCallValidateCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfoKHR *pSubpassEndInfo) const;
+ bool PreCallValidateCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfoKHR *pSubpassEndInfo) const;
+
+ void PostCallRecordCmdEndRenderPass(VkCommandBuffer commandBuffer);
+ void PostCallRecordCmdEndRenderPass2(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo);
+ void PostCallRecordCmdEndRenderPass2KHR(VkCommandBuffer commandBuffer, const VkSubpassEndInfo *pSubpassEndInfo);
+ bool PreCallValidateCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
+ VkImageLayout dstImageLayout, uint32_t regionCount,
+ const VkBufferImageCopy *pRegions) const;
+
+ void PreCallRecordCmdCopyBufferToImage(VkCommandBuffer commandBuffer, VkBuffer srcBuffer, VkImage dstImage,
+ VkImageLayout dstImageLayout, uint32_t regionCount, const VkBufferImageCopy *pRegions);
+
+ bool PreCallValidateCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
+ VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) const;
+
+ void PreCallRecordCmdCopyImageToBuffer(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
+ VkBuffer dstBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions);
+
+ bool PreCallValidateCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
+ VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
+ const VkImageBlit *pRegions, VkFilter filter) const;
+
+ void PreCallRecordCmdBlitImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout, VkImage dstImage,
+ VkImageLayout dstImageLayout, uint32_t regionCount, const VkImageBlit *pRegions,
+ VkFilter filter);
+
+ bool ValidateIndirectBuffer(const AccessContext &context, VkCommandBuffer commandBuffer, const VkDeviceSize struct_size,
+ const VkBuffer buffer, const VkDeviceSize offset, const uint32_t drawCount, const uint32_t stride,
+ const char *function) const;
+ void RecordIndirectBuffer(AccessContext &context, const ResourceUsageTag &tag, const VkDeviceSize struct_size,
+ const VkBuffer buffer, const VkDeviceSize offset, const uint32_t drawCount, uint32_t stride);
+
+ bool ValidateCountBuffer(const AccessContext &context, VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ const char *function) const;
+ void RecordCountBuffer(AccessContext &context, const ResourceUsageTag &tag, VkBuffer buffer, VkDeviceSize offset);
+
+ bool PreCallValidateCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z) const;
+ void PreCallRecordCmdDispatch(VkCommandBuffer commandBuffer, uint32_t x, uint32_t y, uint32_t z);
+
+ bool PreCallValidateCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset) const;
+ void PreCallRecordCmdDispatchIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset);
+
+ bool PreCallValidateCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
+ uint32_t firstInstance) const;
+ void PreCallRecordCmdDraw(VkCommandBuffer commandBuffer, uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex,
+ uint32_t firstInstance);
+
+ bool PreCallValidateCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
+ uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance) const;
+ void PreCallRecordCmdDrawIndexed(VkCommandBuffer commandBuffer, uint32_t indexCount, uint32_t instanceCount,
+ uint32_t firstIndex, int32_t vertexOffset, uint32_t firstInstance);
+
+ bool PreCallValidateCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
+ uint32_t stride) const;
+ void PreCallRecordCmdDrawIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount,
+ uint32_t stride);
+
+ bool PreCallValidateCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ uint32_t drawCount, uint32_t stride) const;
+ void PreCallRecordCmdDrawIndexedIndirect(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ uint32_t drawCount, uint32_t stride);
+
+ bool ValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer,
+ VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride,
+ const char *function) const;
+ bool PreCallValidateCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride) const;
+ void PreCallRecordCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride);
+ bool PreCallValidateCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride) const;
+ void PreCallRecordCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride);
+ bool PreCallValidateCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride) const;
+ void PreCallRecordCmdDrawIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride);
+
+ bool ValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride, const char *function) const;
+ bool PreCallValidateCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride) const;
+ void PreCallRecordCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride);
+ bool PreCallValidateCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride) const;
+ void PreCallRecordCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride);
+ bool PreCallValidateCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride) const;
+ void PreCallRecordCmdDrawIndexedIndirectCountAMD(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset,
+ VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount,
+ uint32_t stride);
+
+ bool PreCallValidateCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
+ const VkClearColorValue *pColor, uint32_t rangeCount,
+ const VkImageSubresourceRange *pRanges) const;
+ void PreCallRecordCmdClearColorImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
+ const VkClearColorValue *pColor, uint32_t rangeCount,
+ const VkImageSubresourceRange *pRanges);
+
+ bool PreCallValidateCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
+ const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
+ const VkImageSubresourceRange *pRanges) const;
+ void PreCallRecordCmdClearDepthStencilImage(VkCommandBuffer commandBuffer, VkImage image, VkImageLayout imageLayout,
+ const VkClearDepthStencilValue *pDepthStencil, uint32_t rangeCount,
+ const VkImageSubresourceRange *pRanges);
+
+ bool PreCallValidateCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
+ uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset,
+ VkDeviceSize stride, VkQueryResultFlags flags) const;
+ void PreCallRecordCmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery,
+ uint32_t queryCount, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride,
+ VkQueryResultFlags flags);
+
+ bool PreCallValidateCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
+ uint32_t data) const;
+ void PreCallRecordCmdFillBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize size,
+ uint32_t data);
+
+ bool PreCallValidateCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
+ VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
+ const VkImageResolve *pRegions) const;
+ void PreCallRecordCmdResolveImage(VkCommandBuffer commandBuffer, VkImage srcImage, VkImageLayout srcImageLayout,
+ VkImage dstImage, VkImageLayout dstImageLayout, uint32_t regionCount,
+ const VkImageResolve *pRegions);
+
+ bool PreCallValidateCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
+ VkDeviceSize dataSize, const void *pData) const;
+ void PreCallRecordCmdUpdateBuffer(VkCommandBuffer commandBuffer, VkBuffer dstBuffer, VkDeviceSize dstOffset,
+ VkDeviceSize dataSize, const void *pData);
+
+ bool PreCallValidateCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
+ VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker) const;
+ void PreCallRecordCmdWriteBufferMarkerAMD(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pipelineStage,
+ VkBuffer dstBuffer, VkDeviceSize dstOffset, uint32_t marker);
+};
diff --git a/layers/vk_format_utils.cpp b/layers/vk_format_utils.cpp
index 8c3ddd0..62bce0e 100644
--- a/layers/vk_format_utils.cpp
+++ b/layers/vk_format_utils.cpp
@@ -198,32 +198,46 @@
{VK_FORMAT_EAC_R11G11_SNORM_BLOCK, {16, 2, VK_FORMAT_COMPATIBILITY_CLASS_EAC_RG_BIT}},
{VK_FORMAT_ASTC_4x4_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_4X4_BIT}},
{VK_FORMAT_ASTC_4x4_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_4X4_BIT}},
+ {VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_4X4_BIT}},
{VK_FORMAT_ASTC_5x4_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X4_BIT}},
{VK_FORMAT_ASTC_5x4_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X4_BIT}},
+ {VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X4_BIT}},
{VK_FORMAT_ASTC_5x5_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X5_BIT}},
{VK_FORMAT_ASTC_5x5_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X5_BIT}},
+ {VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_5X5_BIT}},
{VK_FORMAT_ASTC_6x5_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X5_BIT}},
{VK_FORMAT_ASTC_6x5_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X5_BIT}},
+ {VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X5_BIT}},
{VK_FORMAT_ASTC_6x6_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X6_BIT}},
{VK_FORMAT_ASTC_6x6_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X6_BIT}},
+ {VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_6X6_BIT}},
{VK_FORMAT_ASTC_8x5_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X5_BIT}},
{VK_FORMAT_ASTC_8x5_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X5_BIT}},
+ {VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X5_BIT}},
{VK_FORMAT_ASTC_8x6_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X6_BIT}},
{VK_FORMAT_ASTC_8x6_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X6_BIT}},
+ {VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X6_BIT}},
{VK_FORMAT_ASTC_8x8_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X8_BIT}},
{VK_FORMAT_ASTC_8x8_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X8_BIT}},
+ {VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_8X8_BIT}},
{VK_FORMAT_ASTC_10x5_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X5_BIT}},
{VK_FORMAT_ASTC_10x5_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X5_BIT}},
+ {VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X5_BIT}},
{VK_FORMAT_ASTC_10x6_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X6_BIT}},
{VK_FORMAT_ASTC_10x6_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X6_BIT}},
+ {VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X6_BIT}},
{VK_FORMAT_ASTC_10x8_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X8_BIT}},
{VK_FORMAT_ASTC_10x8_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X8_BIT}},
+ {VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X8_BIT}},
{VK_FORMAT_ASTC_10x10_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X10_BIT}},
{VK_FORMAT_ASTC_10x10_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X10_BIT}},
+ {VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_10X10_BIT}},
{VK_FORMAT_ASTC_12x10_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X10_BIT}},
{VK_FORMAT_ASTC_12x10_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X10_BIT}},
+ {VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X10_BIT}},
{VK_FORMAT_ASTC_12x12_UNORM_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X12_BIT}},
{VK_FORMAT_ASTC_12x12_SRGB_BLOCK, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X12_BIT}},
+ {VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT, {16, 4, VK_FORMAT_COMPATIBILITY_CLASS_ASTC_12X12_BIT}},
{VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC1_2BPP_BIT}},
{VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC1_4BPP_BIT}},
{VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG, {8, 4, VK_FORMAT_COMPATIBILITY_CLASS_PVRTC2_2BPP_BIT}},
@@ -302,7 +316,12 @@
return found;
}
-// Return true if format is an ASTC compressed texture format
+// Return true if format is either a LDR or HDR ASTC compressed textyre format
+VK_LAYER_EXPORT bool FormatIsCompressed_ASTC(VkFormat format) {
+ return (FormatIsCompressed_ASTC_LDR(format) || FormatIsCompressed_ASTC_HDR(format));
+}
+
+// Return true if format is an LDR ASTC compressed texture format
VK_LAYER_EXPORT bool FormatIsCompressed_ASTC_LDR(VkFormat format) {
bool found = false;
@@ -343,6 +362,33 @@
return found;
}
+// Return true if format is an HDR ASTC compressed texture format
+VK_LAYER_EXPORT bool FormatIsCompressed_ASTC_HDR(VkFormat format) {
+ bool found = false;
+
+ switch (format) {
+ case VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT:
+ case VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT:
+ case VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT:
+ case VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT:
+ case VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT:
+ case VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT:
+ case VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT:
+ case VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT:
+ case VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT:
+ case VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT:
+ case VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT:
+ case VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT:
+ case VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT:
+ case VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT:
+ found = true;
+ break;
+ default:
+ break;
+ }
+ return found;
+}
+
// Return true if format is a BC compressed texture format
VK_LAYER_EXPORT bool FormatIsCompressed_BC(VkFormat format) {
bool found = false;
@@ -416,7 +462,7 @@
// Return true if format is compressed
VK_LAYER_EXPORT bool FormatIsCompressed(VkFormat format) {
- return (FormatIsCompressed_ASTC_LDR(format) || FormatIsCompressed_BC(format) || FormatIsCompressed_ETC2_EAC(format) ||
+ return (FormatIsCompressed_ASTC(format) || FormatIsCompressed_BC(format) || FormatIsCompressed_ETC2_EAC(format) ||
FormatIsCompressed_PVRTC(format));
}
// Return true if format is packed
@@ -656,6 +702,36 @@
case VK_FORMAT_B8G8R8_UNORM:
case VK_FORMAT_B8G8R8A8_UNORM:
case VK_FORMAT_A2R10G10B10_UNORM_PACK32:
+ case VK_FORMAT_G8B8G8R8_422_UNORM:
+ case VK_FORMAT_B8G8R8G8_422_UNORM:
+ case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
+ case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
+ case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM:
+ case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM:
+ case VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM:
+ case VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16:
+ case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16:
+ case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16:
+ case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16:
+ case VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16:
+ case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16:
+ case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16:
+ case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16:
+ case VK_FORMAT_G16B16G16R16_422_UNORM:
+ case VK_FORMAT_B16G16R16G16_422_UNORM:
+ case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM:
+ case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM:
+ case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM:
+ case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM:
+ case VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM:
is_unorm = true;
break;
default:
@@ -896,6 +972,13 @@
return is_sscaled;
}
+// Types from "Interpretation of Numeric Format" table
+VK_LAYER_EXPORT bool FormatIsSampledInt(VkFormat format) { return FormatIsInt(format); }
+VK_LAYER_EXPORT bool FormatIsSampledFloat(VkFormat format) {
+ return (FormatIsUNorm(format) || FormatIsSNorm(format) || FormatIsUScaled(format) || FormatIsSScaled(format) ||
+ FormatIsFloat(format) || FormatIsSRGB(format));
+}
+
// Return texel block sizes for all formats
// Uncompressed formats return {1, 1, 1}
// Compressed formats return the compression block extents
@@ -931,58 +1014,72 @@
case VK_FORMAT_EAC_R11G11_SNORM_BLOCK:
case VK_FORMAT_ASTC_4x4_UNORM_BLOCK:
case VK_FORMAT_ASTC_4x4_SRGB_BLOCK:
+ case VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT:
block_size = {4, 4, 1};
break;
case VK_FORMAT_ASTC_5x4_UNORM_BLOCK:
case VK_FORMAT_ASTC_5x4_SRGB_BLOCK:
+ case VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT:
block_size = {5, 4, 1};
break;
case VK_FORMAT_ASTC_5x5_UNORM_BLOCK:
case VK_FORMAT_ASTC_5x5_SRGB_BLOCK:
+ case VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT:
block_size = {5, 5, 1};
break;
case VK_FORMAT_ASTC_6x5_UNORM_BLOCK:
case VK_FORMAT_ASTC_6x5_SRGB_BLOCK:
+ case VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT:
block_size = {6, 5, 1};
break;
case VK_FORMAT_ASTC_6x6_UNORM_BLOCK:
case VK_FORMAT_ASTC_6x6_SRGB_BLOCK:
+ case VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT:
block_size = {6, 6, 1};
break;
case VK_FORMAT_ASTC_8x5_UNORM_BLOCK:
case VK_FORMAT_ASTC_8x5_SRGB_BLOCK:
+ case VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT:
block_size = {8, 5, 1};
break;
case VK_FORMAT_ASTC_8x6_UNORM_BLOCK:
case VK_FORMAT_ASTC_8x6_SRGB_BLOCK:
+ case VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT:
block_size = {8, 6, 1};
break;
case VK_FORMAT_ASTC_8x8_UNORM_BLOCK:
case VK_FORMAT_ASTC_8x8_SRGB_BLOCK:
+ case VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT:
block_size = {8, 8, 1};
break;
case VK_FORMAT_ASTC_10x5_UNORM_BLOCK:
case VK_FORMAT_ASTC_10x5_SRGB_BLOCK:
+ case VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT:
block_size = {10, 5, 1};
break;
case VK_FORMAT_ASTC_10x6_UNORM_BLOCK:
case VK_FORMAT_ASTC_10x6_SRGB_BLOCK:
+ case VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT:
block_size = {10, 6, 1};
break;
case VK_FORMAT_ASTC_10x8_UNORM_BLOCK:
case VK_FORMAT_ASTC_10x8_SRGB_BLOCK:
+ case VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT:
block_size = {10, 8, 1};
break;
case VK_FORMAT_ASTC_10x10_UNORM_BLOCK:
case VK_FORMAT_ASTC_10x10_SRGB_BLOCK:
+ case VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT:
block_size = {10, 10, 1};
break;
case VK_FORMAT_ASTC_12x10_UNORM_BLOCK:
case VK_FORMAT_ASTC_12x10_SRGB_BLOCK:
+ case VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT:
block_size = {12, 10, 1};
break;
case VK_FORMAT_ASTC_12x12_UNORM_BLOCK:
case VK_FORMAT_ASTC_12x12_SRGB_BLOCK:
+ case VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT:
block_size = {12, 12, 1};
break;
case VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG:
@@ -1167,6 +1264,9 @@
case VK_FORMAT_D16_UNORM_S8_UINT:
format = VK_FORMAT_D16_UNORM;
break;
+ case VK_FORMAT_D24_UNORM_S8_UINT:
+ return 3;
+ break;
case VK_FORMAT_D32_SFLOAT_S8_UINT:
format = VK_FORMAT_D32_SFLOAT;
break;
@@ -1186,8 +1286,8 @@
// Return the size in bytes of one texel of given foramt
// For compressed or multi-plane, this may be a fractional number
-VK_LAYER_EXPORT double FormatTexelSize(VkFormat format) {
- double texel_size = static_cast<double>(FormatElementSize(format));
+VK_LAYER_EXPORT double FormatTexelSize(VkFormat format, VkImageAspectFlags aspectMask) {
+ double texel_size = static_cast<double>(FormatElementSize(format, aspectMask));
VkExtent3D block_extent = FormatTexelBlockExtent(format);
uint32_t texels_per_block = block_extent.width * block_extent.height * block_extent.depth;
if (1 < texels_per_block) {
@@ -1404,3 +1504,77 @@
auto it = vk_formats_requiring_ycbcr_conversion.find(format);
return (it != vk_formats_requiring_ycbcr_conversion.end());
}
+
+VK_LAYER_EXPORT bool FormatIsXChromaSubsampled(VkFormat format) {
+ bool is_x_chroma_subsampled = false;
+
+ switch (format) {
+ case VK_FORMAT_G8B8G8R8_422_UNORM:
+ case VK_FORMAT_B8G8R8G8_422_UNORM:
+ case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
+ case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
+ case VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM:
+ case VK_FORMAT_G8_B8R8_2PLANE_422_UNORM:
+ case VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16:
+ case VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16:
+ case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16:
+ case VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16:
+ case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16:
+ case VK_FORMAT_G16B16G16R16_422_UNORM:
+ case VK_FORMAT_B16G16R16G16_422_UNORM:
+ case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM:
+ case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM:
+ case VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM:
+ case VK_FORMAT_G16_B16R16_2PLANE_422_UNORM:
+ is_x_chroma_subsampled = true;
+ break;
+ default:
+ break;
+ }
+
+ return is_x_chroma_subsampled;
+}
+
+VK_LAYER_EXPORT bool FormatIsYChromaSubsampled(VkFormat format) {
+ bool is_y_chroma_subsampled = false;
+
+ switch (format) {
+ case VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM:
+ case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM:
+ case VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16:
+ case VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM:
+ case VK_FORMAT_G16_B16R16_2PLANE_420_UNORM:
+ is_y_chroma_subsampled = true;
+ break;
+
+ default:
+ break;
+ }
+
+ return is_y_chroma_subsampled;
+}
+
+VK_LAYER_EXPORT VkDeviceSize GetIndexAlignment(VkIndexType indexType) {
+ switch (indexType) {
+ case VK_INDEX_TYPE_UINT16:
+ return 2;
+ case VK_INDEX_TYPE_UINT32:
+ return 4;
+ case VK_INDEX_TYPE_UINT8_EXT:
+ return 1;
+ default:
+ // Not a real index type. Express no alignment requirement here; we expect upper layer
+ // to have already picked up on the enum being nonsense.
+ return 1;
+ }
+}
diff --git a/layers/vk_format_utils.h b/layers/vk_format_utils.h
index 4656055..a702f0f 100644
--- a/layers/vk_format_utils.h
+++ b/layers/vk_format_utils.h
@@ -1,6 +1,6 @@
-/* Copyright (c) 2015-2019 The Khronos Group Inc.
- * Copyright (c) 2015-2019 Valve Corporation
- * Copyright (c) 2015-2019 LunarG, Inc.
+/* Copyright (c) 2015-2020 The Khronos Group Inc.
+ * Copyright (c) 2015-2020 Valve Corporation
+ * Copyright (c) 2015-2020 LunarG, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -142,7 +142,9 @@
VK_LAYER_EXPORT bool FormatIsDepthOnly(VkFormat format);
VK_LAYER_EXPORT bool FormatIsStencilOnly(VkFormat format);
VK_LAYER_EXPORT bool FormatIsCompressed_ETC2_EAC(VkFormat format);
+VK_LAYER_EXPORT bool FormatIsCompressed_ASTC(VkFormat format);
VK_LAYER_EXPORT bool FormatIsCompressed_ASTC_LDR(VkFormat format);
+VK_LAYER_EXPORT bool FormatIsCompressed_ASTC_HDR(VkFormat format);
VK_LAYER_EXPORT bool FormatIsCompressed_BC(VkFormat format);
VK_LAYER_EXPORT bool FormatIsCompressed_PVRTC(VkFormat format);
VK_LAYER_EXPORT bool FormatIsSinglePlane_422(VkFormat format);
@@ -156,11 +158,16 @@
VK_LAYER_EXPORT bool FormatIsSRGB(VkFormat format);
VK_LAYER_EXPORT bool FormatIsUScaled(VkFormat format);
VK_LAYER_EXPORT bool FormatIsSScaled(VkFormat format);
+VK_LAYER_EXPORT bool FormatIsSampledInt(VkFormat format);
+VK_LAYER_EXPORT bool FormatIsSampledFloat(VkFormat format);
VK_LAYER_EXPORT bool FormatIsCompressed(VkFormat format);
VK_LAYER_EXPORT bool FormatIsPacked(VkFormat format);
VK_LAYER_EXPORT bool FormatElementIsTexel(VkFormat format);
VK_LAYER_EXPORT bool FormatSizesAreEqual(VkFormat srcFormat, VkFormat dstFormat, uint32_t region_count, const VkImageCopy *regions);
VK_LAYER_EXPORT bool FormatRequiresYcbcrConversion(VkFormat format);
+VK_LAYER_EXPORT bool FormatIsXChromaSubsampled(VkFormat format);
+VK_LAYER_EXPORT bool FormatIsYChromaSubsampled(VkFormat format);
+VK_LAYER_EXPORT VkDeviceSize GetIndexAlignment(VkIndexType indexType);
VK_LAYER_EXPORT uint32_t FormatDepthSize(VkFormat format);
VK_LAYER_EXPORT VkFormatNumericalType FormatDepthNumericalType(VkFormat format);
@@ -170,7 +177,7 @@
VK_LAYER_EXPORT uint32_t FormatChannelCount(VkFormat format);
VK_LAYER_EXPORT VkExtent3D FormatTexelBlockExtent(VkFormat format);
VK_LAYER_EXPORT uint32_t FormatElementSize(VkFormat format, VkImageAspectFlags aspectMask = VK_IMAGE_ASPECT_COLOR_BIT);
-VK_LAYER_EXPORT double FormatTexelSize(VkFormat format);
+VK_LAYER_EXPORT double FormatTexelSize(VkFormat format, VkImageAspectFlags aspectMask = VK_IMAGE_ASPECT_COLOR_BIT);
VK_LAYER_EXPORT VkFormatCompatibilityClass FormatCompatibilityClass(VkFormat format);
VK_LAYER_EXPORT VkDeviceSize SafeModulo(VkDeviceSize dividend, VkDeviceSize divisor);
VK_LAYER_EXPORT VkDeviceSize SafeDivision(VkDeviceSize dividend, VkDeviceSize divisor);
diff --git a/layers/vk_layer_config.cpp b/layers/vk_layer_config.cpp
index cacfd6a..ffd38ae 100644
--- a/layers/vk_layer_config.cpp
+++ b/layers/vk_layer_config.cpp
@@ -40,6 +40,11 @@
#if defined(_WIN32)
#include <windows.h>
+#include <direct.h>
+#define GetCurrentDir _getcwd
+#else
+#include <unistd.h>
+#define GetCurrentDir getcwd
#endif
using std::string;
@@ -52,6 +57,7 @@
const char *GetOption(const string &option);
void SetOption(const string &option, const string &value);
string vk_layer_disables_env_var;
+ SettingsFileInfo settings_info{};
private:
bool file_is_parsed_;
@@ -88,6 +94,8 @@
return layer_config.vk_layer_disables_env_var.c_str();
}
+VK_LAYER_EXPORT const SettingsFileInfo *GetLayerSettingsFileInfo() { return &layer_config.settings_info; }
+
// If option is NULL or stdout, return stdout, otherwise try to open option
// as a filename. If successful, return file handle, otherwise stdout
VK_LAYER_EXPORT FILE *getLayerLogOutput(const char *option, const char *layer_name) {
@@ -188,6 +196,7 @@
struct stat info;
#if defined(WIN32)
+ // Look for VkConfig-specific settings location specified in the windows registry
HKEY hive;
LSTATUS err = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Khronos\\Vulkan\\Settings", 0, KEY_READ, &hive);
if (err == ERROR_SUCCESS) {
@@ -207,12 +216,15 @@
// Use this file
RegCloseKey(hive);
+ settings_info.source = kVkConfig;
+ settings_info.location = name;
return name;
}
RegCloseKey(hive);
}
#else
+ // Look for VkConfig-specific settings location specified in a specific spot in the linux settings store
string search_path = GetEnvironment("XDG_DATA_HOME");
if (search_path == "") {
search_path = GetEnvironment("HOME");
@@ -220,47 +232,62 @@
search_path += "/.local/share";
}
}
-
// Use the vk_layer_settings.txt file from here, if it is present
if (search_path != "") {
string home_file = search_path + "/vulkan/settings.d/vk_layer_settings.txt";
if (stat(home_file.c_str(), &info) == 0) {
if (info.st_mode & S_IFREG) {
+ settings_info.source = kVkConfig;
+ settings_info.location = home_file;
return home_file;
}
}
}
#endif
-
+ // Look for an enviornment variable override for the settings file location
string env_path = GetEnvironment("VK_LAYER_SETTINGS_PATH");
// If the path exists use it, else use vk_layer_settings
if (stat(env_path.c_str(), &info) == 0) {
- // If this is a directory, look for vk_layer_settings within the directory
+ // If this is a directory, append settings file name
if (info.st_mode & S_IFDIR) {
- return env_path + "/vk_layer_settings.txt";
+ env_path.append("/vk_layer_settings.txt");
}
+ settings_info.source = kEnvVar;
+ settings_info.location = env_path;
return env_path;
}
+
+ // Default -- use the current working directory for the settings file location
+ settings_info.source = kLocal;
+ char buff[512];
+ auto buf_ptr = GetCurrentDir(buff, 512);
+ if (buf_ptr) {
+ settings_info.location = buf_ptr;
+ settings_info.location.append("\\vk_layer_settings.txt");
+ }
return "vk_layer_settings.txt";
}
void ConfigFile::ParseFile(const char *filename) {
file_is_parsed_ = true;
- // extract option = value pairs from a file
+ // Extract option = value pairs from a file
std::ifstream file(filename);
- for (string line; std::getline(file, line);) {
- // discard comments, which start with '#'
- const auto comments_pos = line.find_first_of('#');
- if (comments_pos != string::npos) line.erase(comments_pos);
+ if (file.good()) {
+ settings_info.file_found = true;
+ for (string line; std::getline(file, line);) {
+ // discard comments, which start with '#'
+ const auto comments_pos = line.find_first_of('#');
+ if (comments_pos != string::npos) line.erase(comments_pos);
- const auto value_pos = line.find_first_of('=');
- if (value_pos != string::npos) {
- const string option = string_trim(line.substr(0, value_pos));
- const string value = string_trim(line.substr(value_pos + 1));
- value_map_[option] = value;
+ const auto value_pos = line.find_first_of('=');
+ if (value_pos != string::npos) {
+ const string option = string_trim(line.substr(0, value_pos));
+ const string value = string_trim(line.substr(value_pos + 1));
+ value_map_[option] = value;
+ }
}
}
}
diff --git a/layers/vk_layer_config.h b/layers/vk_layer_config.h
index 74cf4fa..2cd6809 100644
--- a/layers/vk_layer_config.h
+++ b/layers/vk_layer_config.h
@@ -31,6 +31,18 @@
#endif
typedef enum {
+ kVkConfig,
+ kEnvVar,
+ kLocal,
+} SettingsFileSource;
+
+typedef struct SettingsFileInfo {
+ bool file_found = false;
+ std::string location{};
+ SettingsFileSource source = kLocal;
+} SettingsFileInfo;
+
+typedef enum {
kInformationBit = 0x00000001,
kWarningBit = 0x00000002,
kPerformanceWarningBit = 0x00000004,
@@ -75,6 +87,7 @@
VK_LAYER_EXPORT const char *getLayerOption(const char *option);
VK_LAYER_EXPORT const char *GetLayerEnvVar(const char *option);
+VK_LAYER_EXPORT const SettingsFileInfo *GetLayerSettingsFileInfo();
VK_LAYER_EXPORT FILE *getLayerLogOutput(const char *option, const char *layer_name);
VK_LAYER_EXPORT VkFlags GetLayerOptionFlags(std::string option, std::unordered_map<std::string, VkFlags> const &enum_data,
diff --git a/layers/vk_layer_logging.h b/layers/vk_layer_logging.h
index be04bc6..437ad13 100644
--- a/layers/vk_layer_logging.h
+++ b/layers/vk_layer_logging.h
@@ -187,8 +187,6 @@
}
};
-static inline int string_sprintf(std::string *output, const char *fmt, ...);
-
typedef struct _debug_report_data {
std::vector<VkLayerDbgFunctionState> debug_callback_list;
VkDebugUtilsMessageSeverityFlagsEXT active_severities{0};
@@ -199,9 +197,12 @@
std::unordered_map<uint64_t, std::string> debugUtilsObjectNameMap;
std::unordered_map<VkQueue, std::unique_ptr<LoggingLabelState>> debugUtilsQueueLabels;
std::unordered_map<VkCommandBuffer, std::unique_ptr<LoggingLabelState>> debugUtilsCmdBufLabels;
+ std::vector<uint32_t> filter_message_ids{};
// This mutex is defined as mutable since the normal usage for a debug report object is as 'const'. The mutable keyword allows
// the layers to continue this pattern, but also allows them to use/change this specific member for synchronization purposes.
mutable std::mutex debug_output_mutex;
+ int32_t duplicate_message_limit = 0;
+ mutable std::unordered_map<uint32_t, int32_t> duplicate_message_count_map{};
const void *instance_pnext_chain{};
void DebugReportSetUtilsObjectName(const VkDebugUtilsObjectNameInfoEXT *pNameInfo) {
@@ -246,9 +247,9 @@
handle_name = DebugReportGetMarkerObjectName(handle);
}
- std::string ret;
- string_sprintf(&ret, "%s 0x%" PRIxLEAST64 "[%s]", handle_type_name, handle, handle_name.c_str());
- return ret;
+ std::ostringstream str;
+ str << handle_type_name << " 0x" << std::hex << handle << "[" << handle_name.c_str() << "]";
+ return str.str();
}
std::string FormatHandle(const VulkanTypedHandle &handle) const {
@@ -335,6 +336,22 @@
callbacks.clear();
}
+// Returns TRUE if the number of times this message has been logged is over the set limit
+static inline bool UpdateLogMsgCounts(const debug_report_data *debug_data, int32_t vuid_hash) {
+ auto vuid_count_it = debug_data->duplicate_message_count_map.find(vuid_hash);
+ if (vuid_count_it == debug_data->duplicate_message_count_map.end()) {
+ debug_data->duplicate_message_count_map.insert({vuid_hash, 1});
+ return false;
+ } else {
+ if (vuid_count_it->second >= debug_data->duplicate_message_limit) {
+ return true;
+ } else {
+ vuid_count_it->second++;
+ return false;
+ }
+ }
+}
+
static inline bool debug_log_msg(const debug_report_data *debug_data, VkFlags msg_flags, const LogObjectList &objects,
const char *layer_prefix, const char *message, const char *text_vuid) {
bool bail = false;
@@ -385,10 +402,14 @@
}
}
- size_t location = 0;
+ int32_t location = 0;
if (text_vuid != nullptr) {
// Hash for vuid text
location = XXH32(text_vuid, strlen(text_vuid), 8);
+ if ((debug_data->duplicate_message_limit > 0) && UpdateLogMsgCounts(debug_data, location)) {
+ // Count for this particular message is over the limit, ignore it
+ return false;
+ }
}
VkDebugUtilsMessengerCallbackDataEXT callback_data;
@@ -468,23 +489,19 @@
return bail;
}
-static inline void DebugAnnotFlagsToReportFlags(VkDebugUtilsMessageSeverityFlagBitsEXT da_severity,
- VkDebugUtilsMessageTypeFlagsEXT da_type, VkDebugReportFlagsEXT *dr_flags) {
- *dr_flags = 0;
-
- if ((da_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) != 0) {
- *dr_flags |= VK_DEBUG_REPORT_ERROR_BIT_EXT;
- } else if ((da_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) != 0) {
- if ((da_type & VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT) != 0) {
- *dr_flags |= VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT;
- } else {
- *dr_flags |= VK_DEBUG_REPORT_WARNING_BIT_EXT;
- }
- } else if ((da_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT) != 0) {
- *dr_flags |= VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
- } else if ((da_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT) != 0) {
- *dr_flags |= VK_DEBUG_REPORT_DEBUG_BIT_EXT;
+static inline VkDebugReportFlagsEXT DebugAnnotFlagsToReportFlags(VkDebugUtilsMessageSeverityFlagBitsEXT da_severity,
+ VkDebugUtilsMessageTypeFlagsEXT da_type) {
+ if (da_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) return VK_DEBUG_REPORT_ERROR_BIT_EXT;
+ if (da_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) {
+ if (da_type & VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT)
+ return VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT;
+ else
+ return VK_DEBUG_REPORT_WARNING_BIT_EXT;
}
+ if (da_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT) return VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
+ if (da_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT) return VK_DEBUG_REPORT_DEBUG_BIT_EXT;
+
+ return 0;
}
static inline LogMessageTypeFlags DebugAnnotFlagsToMsgTypeFlags(VkDebugUtilsMessageSeverityFlagBitsEXT da_severity,
@@ -615,25 +632,6 @@
}
}
-#ifndef WIN32
-static inline int string_sprintf(std::string *output, const char *fmt, ...) __attribute__((format(printf, 2, 3)));
-#endif
-static inline int string_sprintf(std::string *output, const char *fmt, ...) {
- std::string &formatted = *output;
- va_list argptr;
- va_start(argptr, fmt);
- int reserve = vsnprintf(nullptr, 0, fmt, argptr);
- va_end(argptr);
- formatted.reserve(reserve + 1); // Set the storage length long enough to hold the output + null
- formatted.resize(reserve); // Set the *logical* length to be what vsprintf will write
- va_start(argptr, fmt);
- int result = vsnprintf((char *)formatted.data(), formatted.capacity(), fmt, argptr);
- va_end(argptr);
- assert(result == reserve);
- assert((formatted.size() == strlen(formatted.c_str())));
- return result;
-}
-
#ifdef WIN32
static inline int vasprintf(char **strp, char const *fmt, va_list ap) {
*strp = nullptr;
@@ -653,22 +651,62 @@
const std::string &vuid_text, char *err_msg) {
std::string str_plus_spec_text(err_msg ? err_msg : "Allocation failure");
+ // If message is in filter list, bail out very early
+ size_t message_id = XXH32(vuid_text.c_str(), strlen(vuid_text.c_str()), 8);
+ if (std::find(debug_data->filter_message_ids.begin(), debug_data->filter_message_ids.end(),
+ static_cast<uint32_t>(message_id)) != debug_data->filter_message_ids.end())
+ return false;
+
// Append the spec error text to the error message, unless it's an UNASSIGNED or UNDEFINED vuid
- if ((vuid_text.find("UNASSIGNED-") == std::string::npos) && (vuid_text.find(kVUIDUndefined) == std::string::npos)) {
+ if ((vuid_text.find("UNASSIGNED-") == std::string::npos) && (vuid_text.find(kVUIDUndefined) == std::string::npos) &&
+ (vuid_text.rfind("SYNC-", 0) == std::string::npos)) {
// Linear search makes no assumptions about the layout of the string table. This is not fast, but it does not need to be at
// this point in the error reporting path
uint32_t num_vuids = sizeof(vuid_spec_text) / sizeof(vuid_spec_text_pair);
const char *spec_text = nullptr;
+ std::string spec_type;
for (uint32_t i = 0; i < num_vuids; i++) {
if (0 == strcmp(vuid_text.c_str(), vuid_spec_text[i].vuid)) {
spec_text = vuid_spec_text[i].spec_text;
+ spec_type = vuid_spec_text[i].url_id;
break;
}
}
+ // Construct and append the specification text and link to the appropriate version of the spec
if (nullptr != spec_text) {
- str_plus_spec_text += " The Vulkan spec states: ";
- str_plus_spec_text += spec_text;
+ std::string spec_link = "https://www.khronos.org/registry/vulkan/specs/_MAGIC_KHRONOS_SPEC_TYPE_/html/vkspec.html";
+#ifdef ANNOTATED_SPEC_LINK
+ spec_link = ANNOTATED_SPEC_LINK;
+#endif
+ static std::string kAtToken = "_MAGIC_ANNOTATED_SPEC_TYPE_";
+ static std::string kKtToken = "_MAGIC_KHRONOS_SPEC_TYPE_";
+ static std::string kVeToken = "_MAGIC_VERSION_ID_";
+ auto Replace = [](std::string &dest_string, const std::string &to_replace, const std::string &replace_with) {
+ if (dest_string.find(to_replace) != std::string::npos) {
+ dest_string.replace(dest_string.find(to_replace), to_replace.size(), replace_with);
+ }
+ };
+
+ str_plus_spec_text.append(" The Vulkan spec states: ");
+ str_plus_spec_text.append(spec_text);
+ if (0 == spec_type.compare("default")) {
+ str_plus_spec_text.append(" (https://github.com/KhronosGroup/Vulkan-Docs/search?q=)");
+ } else {
+ str_plus_spec_text.append(" (");
+ str_plus_spec_text.append(spec_link);
+ std::string major_version = std::to_string(VK_VERSION_MAJOR(VK_HEADER_VERSION_COMPLETE));
+ std::string minor_version = std::to_string(VK_VERSION_MINOR(VK_HEADER_VERSION_COMPLETE));
+ std::string patch_version = std::to_string(VK_VERSION_PATCH(VK_HEADER_VERSION_COMPLETE));
+ std::string header_version = major_version + "." + minor_version + "." + patch_version;
+ std::string annotated_spec_type = major_version + "." + minor_version + "-extensions";
+ Replace(str_plus_spec_text, kKtToken, spec_type);
+ Replace(str_plus_spec_text, kAtToken, annotated_spec_type);
+ Replace(str_plus_spec_text, kVeToken, header_version);
+ str_plus_spec_text.append("#"); // CMake hates hashes
+ }
+ str_plus_spec_text.append(vuid_text);
+ str_plus_spec_text.append(")");
}
}
diff --git a/layers/vk_layer_settings.txt b/layers/vk_layer_settings.txt
index 211f6ee..8760d5b 100644
--- a/layers/vk_layer_settings.txt
+++ b/layers/vk_layer_settings.txt
@@ -45,6 +45,23 @@
# debug - For layer development. Report messages for debugging layer
# behavior.
#
+# MESSAGE_ID_FILTER:
+# ==================
+# <LayerIdentifier>.message_id_filter: This is a comma-delineated list of VUIDs
+# or VUID identifers which are to be IGNORED by the layers. These can be in
+# any combination of the normal VUID string form,
+# "VUID-vkCmdPipelineBarrier-image-02635",
+# or the hexadecimal or decimal representation of the VUID id returned from
+# a validation message, for example:
+# 0xdf3391a2 or 3744698786.
+#
+# DUPLICATE_MESSAGE_LIMIT:
+# =======================
+# <LayerIdentifier>.duplicate_message_limit: This is an unsigned integer
+# which signifies the limit for the number of times any validation
+# message can be output by the layers. Any non-zero value will be respected,
+# and the default is no limit.
+#
# LOG_FILENAME:
# =============
# <LayerIdentifier>.log_filename : output filename. Can be relative to
@@ -53,7 +70,7 @@
# is used by default.
#
# DISABLES:
-# =============
+# =========
# <LayerIdentifier>.disables : comma separated list of feature/flag/disable enums
# These can include VkValidationFeatureDisableEXT flags defined in the Vulkan
# specification, or ValidationCheckDisables enums defined in chassis.h.
@@ -76,7 +93,7 @@
# This may not always be necessary late in a development cycle.
#
# ENABLES:
-# =============
+# ========
# <LayerIdentifier>.enables : comma separated list of feature enable enums
# These can include VkValidationFeatureEnableEXT flags defined in the Vulkan
# specification, where their effects are described. The most useful
@@ -85,7 +102,19 @@
# shader validation in khronos validation layers
# VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT - enables best practices warning
# validation
+# VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT - enables processing of
+# debug printf instructions in shaders and sending debug strings to the debug callback
#
+# CUSTOM_STYPE_LIST:
+# ==================
+# <LayerIdentifier>.custom_stype_list: This is a comma-delineated list of uin32_t
+# value-pairs describing custom structure types. Unrecognized structures encountered
+# in wrapped pNext chains are typically removed. Specifying the sType value and size
+# in bytes in this list will allow the layers to properly preserve the containing
+# pNext chain. Multiple structs can be specified. For instance, in the following
+# example, two custom structs are declared, the first in decimal and the second in
+# hexadecimal:
+# khronos_validation.custom_stype_list=1100297000,32,0x478b1428,0x20
# VK_LAYER_KHRONOS_validation Settings
@@ -93,6 +122,15 @@
khronos_validation.report_flags = error,warn,perf
khronos_validation.log_filename = stdout
+# Example entry showing how to filter specific VUIDs from layer output
+#khronos_validation.message_id_filter = 3744698786,0xdf3391a2,"VUID-vkCmdPipelineBarrier-image-02635"
+
+# Example entry showing how to declare custom non-Vulkan structure types
+#khronos_validation.custom_stype_list=1100297000,32,0x478b1428,0x20
+
+# Example entry showing how to limit the number of repeated validation messages
+#khronos_validation.duplicate_message_limit = 25
+
# Example entry showing how to disable threading checks and validation at DestroyPipeline time
#khronos_validation.disables = VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT,VALIDATION_CHECK_DISABLE_DESTROY_PIPELINE
@@ -102,4 +140,7 @@
# Example entry showing how to Enable Best Practices Validation
#khronos_validation.enables = VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT
+# Example entry showing how to enable Debug Printf messages
+#khronos_validation.enables = VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT
+
################################################################################
diff --git a/layers/vk_layer_settings_ext.h b/layers/vk_layer_settings_ext.h
new file mode 100644
index 0000000..ad20ef4
--- /dev/null
+++ b/layers/vk_layer_settings_ext.h
@@ -0,0 +1,161 @@
+/* Copyright (c) 2020 The Khronos Group Inc.
+ * Copyright (c) 2020 Valve Corporation
+ * Copyright (c) 2020 LunarG, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Author: Mark Lobodzinski <mark@lunarg.com>
+ * Author: Mike Schuchardt <mikes@lunarg.com>
+ */
+
+#pragma once
+#include "vulkan/vulkan.h"
+
+// VK_EXT_layer_settings
+//
+// Name String
+// VK_EXT_layer_settings
+//
+// Extension Type
+// Instance extension
+//
+// Revision
+// 1
+//
+// Extension and Version Dependencies
+// Requires Vulkan 1.0
+//
+// Contact
+// Mark Lobodzinski mark-lunarg
+//
+// Description
+// This extension provides the VkLayerSettingsEXT struct that can be included in the pNext chain of the
+// VkInstanceCreateInfo structure passed as the pCreateInfo parameter of vkCreateInstance
+// The structure contains an array of VkLayerSettingValueEXT structures that define layer specific settings
+// The extension also provides the vkEnumerateInstanceLayerSettingsEXT and vkEnumerateInstanceLayerSettingOptionEXT
+// commands, useful for enumerating all layer settings and their possible values, respectively.
+//
+// Note
+// The VK_EXT_layer_settings extension subsumes all the functionality provided in the [VK_EXT_validation_flags] extension
+// and the [VK_EXT_validation_features] extension.
+//
+// New Commands
+// vkEnumerateInstanceLayerSettingsEXT
+// vkEnumerateInstanceLayerSettingOptionEXT
+//
+// New Structures
+// array_int32
+// array_int64
+// array_float
+// array_bool
+// array_char
+// VkLayerSettingValueEXT
+// VkLayerSettingDescriptionEXT
+// VkLayerSettingOptionEXT
+// Extending VkInstanceCreateInfo :
+// VkLayerSettingsEXT
+//
+// New Unions
+// VkLayerSettingValueDataEXT
+//
+// New Enums
+// VkLayerSettingValueTypeEXT
+
+#define VK_EXT_layer_settings 1
+#define VK_EXT_LAYER_SETTINGS_SPEC_VERSION 1
+#define VK_EXT_LAYER_SETTINGS_EXTENSION_NAME "VK_EXT_layer_settings"
+
+// These stype values were selected to prevent interference with Vulkan spec definitions
+static const uint32_t VK_STRUCTURE_TYPE_INSTANCE_LAYER_SETTINGS_EXT = 3000300003;
+
+typedef enum VkLayerSettingValueTypeEXT {
+ VK_LAYER_SETTING_VALUE_TYPE_UINT32_EXT,
+ VK_LAYER_SETTING_VALUE_TYPE_UINT32_ARRAY_EXT,
+ VK_LAYER_SETTING_VALUE_TYPE_UINT64_EXT,
+ VK_LAYER_SETTING_VALUE_TYPE_UINT64_ARRAY_EXT,
+ VK_LAYER_SETTING_VALUE_TYPE_FLOAT_EXT,
+ VK_LAYER_SETTING_VALUE_TYPE_FLOAT_ARRAY_EXT,
+ VK_LAYER_SETTING_VALUE_TYPE_BOOL_EXT,
+ VK_LAYER_SETTING_VALUE_TYPE_BOOL_ARRAY_EXT,
+ VK_LAYER_SETTING_VALUE_TYPE_STRING_ARRAY_EXT,
+} VkLayerSettingValueTypeEXT;
+
+typedef struct array_int32 {
+ uint32_t* pInt32Array;
+ uint32_t count;
+} array_int32;
+
+typedef struct array_int64 {
+ uint64_t* pInt64Array;
+ uint32_t count;
+} array_int64;
+
+typedef struct array_float {
+ float* pFloatArray;
+ uint32_t count;
+} array_float;
+
+typedef struct array_bool {
+ bool* pBoolArray;
+ uint32_t count;
+} array_bool;
+
+typedef struct array_char {
+ const char* pCharArray;
+ uint32_t count;
+} array_char;
+
+typedef union VkLayerSettingValueDataEXT {
+ uint32_t value32;
+ array_int32 arrayInt32;
+ uint64_t value64;
+ array_int64 arrayInt64;
+ float valueFloat;
+ array_float arrayFloat;
+ VkBool32 valueBool;
+ array_bool arrayBool;
+ array_char arrayString;
+} VkLayerSettingValueDataEXT;
+
+typedef struct VkLayerSettingValueEXT {
+ char name[VK_MAX_EXTENSION_NAME_SIZE];
+ VkLayerSettingValueTypeEXT type;
+ VkLayerSettingValueDataEXT data;
+} VkLayerSettingValueEXT;
+
+typedef struct VkLayerSettingsEXT {
+ VkStructureType sType;
+ void* pNext;
+ uint32_t settingCount;
+ VkLayerSettingValueEXT* pSettings;
+} VkLayerSettingsEXT;
+
+typedef struct VkLayerSettingDescriptionEXT {
+ char name[VK_MAX_EXTENSION_NAME_SIZE];
+ VkLayerSettingValueTypeEXT type;
+ char description[VK_MAX_DESCRIPTION_SIZE];
+ VkLayerSettingValueDataEXT currentValue;
+ uint32_t parent;
+ VkLayerSettingValueDataEXT parentState;
+} VkLayerSettingDescriptionEXT;
+
+typedef struct VkLayerSettingOptionEXT {
+ char optionName[VK_MAX_EXTENSION_NAME_SIZE];
+ char description[VK_MAX_DESCRIPTION_SIZE];
+} VkLayerSettingOptionEXT;
+
+VkResult vkEnumerateInstanceLayerSettingsEXT(const char* pLayerName, uint32_t* pSettingCount,
+ VkLayerSettingDescriptionEXT* pSettings);
+
+VkResult vkEnumerateInstanceLayerSettingOptionEXT(const char* pLayerName, const char* pSettingName, uint32_t* pSettingOptionCount,
+ VkLayerSettingOptionEXT* pSettingOptions);
diff --git a/layers/vk_layer_utils.h b/layers/vk_layer_utils.h
index f2e615d..7771b75 100644
--- a/layers/vk_layer_utils.h
+++ b/layers/vk_layer_utils.h
@@ -1,6 +1,6 @@
-/* Copyright (c) 2015-2017, 2019 The Khronos Group Inc.
- * Copyright (c) 2015-2017, 2019 Valve Corporation
- * Copyright (c) 2015-2017, 2019 LunarG, Inc.
+/* Copyright (c) 2015-2017, 2019-2020 The Khronos Group Inc.
+ * Copyright (c) 2015-2017, 2019-2020 Valve Corporation
+ * Copyright (c) 2015-2017, 2019-2020 LunarG, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -43,6 +43,16 @@
#define STRINGIFY_HELPER(s) #s
#ifdef __cplusplus
+static inline VkExtent3D CastTo3D(const VkExtent2D &d2) {
+ VkExtent3D d3 = {d2.width, d2.height, 1};
+ return d3;
+}
+
+static inline VkOffset3D CastTo3D(const VkOffset2D &d2) {
+ VkOffset3D d3 = {d2.x, d2.y, 0};
+ return d3;
+}
+
// Traits objects to allow string_join to operate on collections of const char *
template <typename String>
struct StringJoinSizeTrait {
@@ -131,6 +141,47 @@
static inline bool IsPowerOfTwo(unsigned x) { return x && !(x & (x - 1)); }
+static inline uint32_t SampleCountSize(VkSampleCountFlagBits sample_count) {
+ uint32_t size = 0;
+ switch (sample_count) {
+ case VK_SAMPLE_COUNT_1_BIT:
+ size = 1;
+ break;
+ case VK_SAMPLE_COUNT_2_BIT:
+ size = 2;
+ break;
+ case VK_SAMPLE_COUNT_4_BIT:
+ size = 4;
+ break;
+ case VK_SAMPLE_COUNT_8_BIT:
+ size = 8;
+ break;
+ case VK_SAMPLE_COUNT_16_BIT:
+ size = 16;
+ break;
+ case VK_SAMPLE_COUNT_32_BIT:
+ size = 32;
+ break;
+ case VK_SAMPLE_COUNT_64_BIT:
+ size = 64;
+ break;
+ default:
+ size = 0;
+ }
+ return size;
+}
+
+static inline bool IsIdentitySwizzle(VkComponentMapping components) {
+ // clang-format off
+ return (
+ ((components.r == VK_COMPONENT_SWIZZLE_IDENTITY) || (components.r == VK_COMPONENT_SWIZZLE_R)) &&
+ ((components.g == VK_COMPONENT_SWIZZLE_IDENTITY) || (components.g == VK_COMPONENT_SWIZZLE_G)) &&
+ ((components.b == VK_COMPONENT_SWIZZLE_IDENTITY) || (components.b == VK_COMPONENT_SWIZZLE_B)) &&
+ ((components.a == VK_COMPONENT_SWIZZLE_IDENTITY) || (components.a == VK_COMPONENT_SWIZZLE_A))
+ );
+ // clang-format on
+}
+
extern "C" {
#endif
@@ -168,8 +219,9 @@
}
#endif
-// shared_mutex support added in MSVC 2015 update 2
-#if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023918 && NTDDI_VERSION > NTDDI_WIN10_RS2
+// Minimum Visual Studio 2015 Update 2, or libc++ with C++17
+#if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023918 && NTDDI_VERSION > NTDDI_WIN10_RS2 && \
+ (!defined(_LIBCPP_VERSION) || __cplusplus >= 201703)
#include <shared_mutex>
#endif
@@ -183,7 +235,8 @@
class ReadWriteLock {
private:
-#if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023918 && NTDDI_VERSION > NTDDI_WIN10_RS2
+#if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023918 && NTDDI_VERSION > NTDDI_WIN10_RS2 && \
+ (!defined(_LIBCPP_VERSION) || __cplusplus >= 201703)
typedef std::shared_mutex lock_t;
#else
typedef std::mutex lock_t;
@@ -193,7 +246,8 @@
void lock() NO_THREAD_SAFETY_ANALYSIS { m_lock.lock(); }
void unlock() NO_THREAD_SAFETY_ANALYSIS { m_lock.unlock(); }
bool try_lock() { return m_lock.try_lock(); }
-#if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023918 && NTDDI_VERSION > NTDDI_WIN10_RS2
+#if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023918 && NTDDI_VERSION > NTDDI_WIN10_RS2 && \
+ (!defined(_LIBCPP_VERSION) || __cplusplus >= 201703)
void lock_shared() { m_lock.lock_shared(); }
bool try_lock_shared() { return m_lock.try_lock_shared(); }
void unlock_shared() { m_lock.unlock_shared(); }
@@ -206,7 +260,8 @@
lock_t m_lock;
};
-#if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023918 && NTDDI_VERSION > NTDDI_WIN10_RS2
+#if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023918 && NTDDI_VERSION > NTDDI_WIN10_RS2 && \
+ (!defined(_LIBCPP_VERSION) || __cplusplus >= 201703)
typedef std::shared_lock<ReadWriteLock> read_lock_guard_t;
typedef std::unique_lock<ReadWriteLock> write_lock_guard_t;
#else
diff --git a/layers/vk_mem_alloc.h b/layers/vk_mem_alloc.h
index 2c13549..dcf5bc2 100644
--- a/layers/vk_mem_alloc.h
+++ b/layers/vk_mem_alloc.h
@@ -3136,8 +3136,8 @@
#endif
#ifndef VMA_USE_STL_SHARED_MUTEX
- // Minimum Visual Studio 2015 Update 2
- #if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023918 && NTDDI_VERSION > NTDDI_WIN10_RS2
+ // Minimum Visual Studio 2015 Update 2, or libc++ with C++17
+ #if defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 190023918 && NTDDI_VERSION > NTDDI_WIN10_RS2 && (!defined(_LIBCPP_VERSION) || __cplusplus >= 201703)
#define VMA_USE_STL_SHARED_MUTEX 1
#endif
#endif
diff --git a/scripts/best_practices_generator.py b/scripts/best_practices_generator.py
index fa1e80e..c0f2331 100644
--- a/scripts/best_practices_generator.py
+++ b/scripts/best_practices_generator.py
@@ -32,6 +32,7 @@
conventions = None,
filename = None,
directory = '.',
+ genpath = None,
apiname = None,
profile = None,
versions = '.*',
@@ -52,9 +53,20 @@
indentFuncPointer = False,
alignFuncParam = 0,
expandEnumerants = True):
- GeneratorOptions.__init__(self, conventions, filename, directory, apiname, profile,
- versions, emitversions, defaultExtensions,
- addExtensions, removeExtensions, emitExtensions, sortProcedure)
+ GeneratorOptions.__init__(self,
+ conventions = conventions,
+ filename = filename,
+ directory = directory,
+ genpath = genpath,
+ apiname = apiname,
+ profile = profile,
+ versions = versions,
+ emitversions = emitversions,
+ defaultExtensions = defaultExtensions,
+ addExtensions = addExtensions,
+ removeExtensions = removeExtensions,
+ emitExtensions = emitExtensions,
+ sortProcedure = sortProcedure)
self.prefixText = prefixText
self.genFuncPointers = genFuncPointers
self.protectFile = protectFile
@@ -76,13 +88,13 @@
OutputGenerator.__init__(self, errFile, warnFile, diagFile)
# Commands which are not autogenerated but still intercepted
self.no_autogen_list = [
- 'vkQueueBindSparse',
- 'vkAllocateMemory',
+ 'vkEnumerateInstanceVersion',
'vkCreateValidationCacheEXT',
'vkDestroyValidationCacheEXT',
'vkMergeValidationCachesEXT',
'vkGetValidationCacheDataEXT',
]
+ # Commands that require an extra parameter for state sharing between validate/record steps
self.extra_parameter_list = [
"vkCreateShaderModule",
"vkCreateGraphicsPipelines",
@@ -91,6 +103,14 @@
"vkCreateRayTracingPipelinesNV",
"vkCreateRayTracingPipelinesKHR",
]
+ # Commands that have a manually written post-call-record step which needs to be called from the autogen'd fcn
+ self.manual_postcallrecord_list = [
+ 'vkAllocateDescriptorSets',
+ 'vkAllocateMemory',
+ 'vkQueuePresentKHR',
+ 'vkQueueBindSparse',
+ 'vkCreateGraphicsPipelines',
+ ]
self.extension_info = dict()
#
@@ -161,8 +181,6 @@
self.otwrite('both', '\n')
ext_deprecation_data = 'const std::unordered_map<std::string, DeprecationData> deprecated_extensions = {\n'
for ext in sorted(self.extension_info):
- if "VK_EXT_debug_report" in ext:
- ext_deprecation_data += '// ADD BACK AFTER LAYER TESTS SWITCH TO DEBUG_UTILS! '
ext_data = self.extension_info[ext]
ext_deprecation_data += ' {"%s", {kExt%s, "%s"}},\n' % (ext, ext_data[0], ext_data[1])
ext_deprecation_data += '};\n'
@@ -219,7 +237,7 @@
if cmdname in self.extra_parameter_list:
pre_decl = pre_decl.replace(')', ',\n void* state_data)')
pre_decl = pre_decl.replace(')', ') {\n')
- pre_decl = 'void BestPractices::PostCallRecord' + pre_decl
+ pre_decl = 'void BestPractices::PostCallRecord' + pre_decl[2:]
type = cdecl.split(' ')[1]
if type == 'VkResult':
error_codes = cmdinfo.elem.attrib.get('errorcodes')
@@ -244,6 +262,8 @@
params_text += 'state_data, '
params_text = params_text[:-2] + ');\n'
intercept += ' ValidationStateTracker::PostCallRecord'+cmdname[2:] + '(' + params_text
+ if cmdname in self.manual_postcallrecord_list:
+ intercept += ' ManualPostCallRecord'+cmdname[2:] + '(' + params_text
intercept += ' if (result != VK_SUCCESS) {\n'
if error_codes is not None:
intercept += ' static const std::vector<VkResult> error_codes = {%s};\n' % error_codes
diff --git a/scripts/command_counter_generator.py b/scripts/command_counter_generator.py
index f2bdb6c..dcb3ccf 100644
--- a/scripts/command_counter_generator.py
+++ b/scripts/command_counter_generator.py
@@ -33,6 +33,7 @@
conventions = None,
filename = None,
directory = '.',
+ genpath = None,
apiname = None,
profile = None,
versions = '.*',
@@ -50,9 +51,20 @@
alignFuncParam = 0,
expandEnumerants = True,
lvt_file_type = ''):
- GeneratorOptions.__init__(self, conventions, filename, directory, apiname, profile,
- versions, emitversions, defaultExtensions,
- addExtensions, removeExtensions, emitExtensions, sortProcedure)
+ GeneratorOptions.__init__(self,
+ conventions = conventions,
+ filename = filename,
+ directory = directory,
+ genpath = genpath,
+ apiname = apiname,
+ profile = profile,
+ versions = versions,
+ emitversions = emitversions,
+ defaultExtensions = defaultExtensions,
+ addExtensions = addExtensions,
+ removeExtensions = removeExtensions,
+ emitExtensions = emitExtensions,
+ sortProcedure = sortProcedure)
self.prefixText = prefixText
self.genFuncPointers = genFuncPointers
self.prefixText = None
diff --git a/scripts/common_codegen.py b/scripts/common_codegen.py
index 3a7d66d..51c8344 100644
--- a/scripts/common_codegen.py
+++ b/scripts/common_codegen.py
@@ -60,6 +60,7 @@
'xlib' : 'VK_USE_PLATFORM_XLIB_KHR',
'xlib_xrandr' : 'VK_USE_PLATFORM_XLIB_XRANDR_EXT',
'provisional' : 'VK_ENABLE_BETA_EXTENSIONS',
+ 'directfb' : 'VK_USE_PLATFORM_DIRECTFB_EXT',
}
#
@@ -155,4 +156,3 @@
# helper to define paths relative to the repo root
def repo_relative(path):
return os.path.abspath(os.path.join(os.path.dirname(__file__), '..', path))
-
diff --git a/scripts/dispatch_table_helper_generator.py b/scripts/dispatch_table_helper_generator.py
index d0727af..9166bd4 100644
--- a/scripts/dispatch_table_helper_generator.py
+++ b/scripts/dispatch_table_helper_generator.py
@@ -32,6 +32,7 @@
conventions = None,
filename = None,
directory = '.',
+ genpath = None,
apiname = None,
profile = None,
versions = '.*',
@@ -48,9 +49,20 @@
apientryp = '',
alignFuncParam = 0,
expandEnumerants = True):
- GeneratorOptions.__init__(self, conventions, filename, directory, apiname, profile,
- versions, emitversions, defaultExtensions,
- addExtensions, removeExtensions, emitExtensions, sortProcedure)
+ GeneratorOptions.__init__(self,
+ conventions = conventions,
+ filename = filename,
+ directory = directory,
+ genpath = genpath,
+ apiname = apiname,
+ profile = profile,
+ versions = versions,
+ emitversions = emitversions,
+ defaultExtensions = defaultExtensions,
+ addExtensions = addExtensions,
+ removeExtensions = removeExtensions,
+ emitExtensions = emitExtensions,
+ sortProcedure = sortProcedure)
self.prefixText = prefixText
self.genFuncPointers = genFuncPointers
self.prefixText = None
diff --git a/scripts/external_revision_generator.py b/scripts/external_revision_generator.py
index e19ccd5..e863dde 100644
--- a/scripts/external_revision_generator.py
+++ b/scripts/external_revision_generator.py
@@ -28,7 +28,7 @@
def generate(symbol_name, commit_id, output_header_file):
# Write commit ID to output header file
- with open(output_header_file, "w") as header_file:
+ with open(output_header_file, "w", newline='\n') as header_file:
# File Comment
file_comment = '// *** THIS FILE IS GENERATED - DO NOT EDIT ***\n'
file_comment += '// See external_revision_generator.py for modifications\n'
diff --git a/scripts/generate_source.py b/scripts/generate_source.py
index 3ca0b1c..a55b4b4 100755
--- a/scripts/generate_source.py
+++ b/scripts/generate_source.py
@@ -51,6 +51,7 @@
"object_tracker.h",
"parameter_validation.cpp",
"parameter_validation.h",
+ "synchronization_validation_types.h",
"thread_safety.cpp",
"thread_safety.h",
"vk_dispatch_table_helper.h",
diff --git a/scripts/helper_file_generator.py b/scripts/helper_file_generator.py
index 68e3f7c..15004d3 100644
--- a/scripts/helper_file_generator.py
+++ b/scripts/helper_file_generator.py
@@ -26,6 +26,7 @@
from generator import *
from collections import namedtuple
from common_codegen import *
+import sync_val_gen
#
# HelperFileOutputGeneratorOptions - subclass of GeneratorOptions.
@@ -34,6 +35,7 @@
conventions = None,
filename = None,
directory = '.',
+ genpath = None,
apiname = None,
profile = None,
versions = '.*',
@@ -54,9 +56,20 @@
library_name = '',
expandEnumerants = True,
helper_file_type = ''):
- GeneratorOptions.__init__(self, conventions, filename, directory, apiname, profile,
- versions, emitversions, defaultExtensions,
- addExtensions, removeExtensions, emitExtensions, sortProcedure)
+ GeneratorOptions.__init__(self,
+ conventions = conventions,
+ filename = filename,
+ directory = directory,
+ genpath = genpath,
+ apiname = apiname,
+ profile = profile,
+ versions = versions,
+ emitversions = emitversions,
+ defaultExtensions = defaultExtensions,
+ addExtensions = addExtensions,
+ removeExtensions = removeExtensions,
+ emitExtensions = emitExtensions,
+ sortProcedure = sortProcedure)
self.prefixText = prefixText
self.genFuncPointers = genFuncPointers
self.protectFile = protectFile
@@ -87,6 +100,7 @@
self.object_type_aliases = [] # Aliases to handles types (for handles that were extensions)
self.debug_report_object_types = [] # Handy copy of debug_report_object_type enum data
self.core_object_types = [] # Handy copy of core_object_type enum data
+ self.sync_enum = dict() # Handy copy of synchronization enum data
self.device_extension_info = dict() # Dict of device extension name defines and ifdef values
self.instance_extension_info = dict() # Dict of instance extension name defines and ifdef values
self.structextends_list = [] # List of structs which extend another struct via pNext
@@ -220,6 +234,12 @@
if elem.get('alias') is None: # TODO: Strangely the "alias" fn parameter does not work
item_name = elem.get('name')
self.core_object_types.append(item_name)
+ elif self.helper_file_type == 'synchronization_helper_header':
+ if groupName in sync_val_gen.sync_enum_types:
+ self.sync_enum[groupName] = []
+ for elem in groupElem.findall('enum'):
+ if elem.get('supported') != 'disabled':
+ self.sync_enum[groupName].append(elem)
#
# Called for each type -- if the type is a struct/union, grab the metadata
@@ -418,7 +438,7 @@
def GenerateEnumStringHelperHeader(self):
enum_string_helper_header = '\n'
enum_string_helper_header += '#pragma once\n'
- enum_string_helper_header += '#ifdef _WIN32\n'
+ enum_string_helper_header += '#ifdef _MSC_VER\n'
enum_string_helper_header += '#pragma warning( disable : 4065 )\n'
enum_string_helper_header += '#endif\n'
enum_string_helper_header += '\n'
@@ -441,6 +461,7 @@
safe_struct_helper_header = '\n'
safe_struct_helper_header += '#pragma once\n'
safe_struct_helper_header += '#include <vulkan/vulkan.h>\n'
+ safe_struct_helper_header += '#include <stdlib.h>\n'
safe_struct_helper_header += '\n'
safe_struct_helper_header += 'void *SafePnextCopy(const void *pNext);\n'
safe_struct_helper_header += 'void FreePnextChain(const void *pNext);\n'
@@ -651,9 +672,9 @@
' };',
' typedef std::vector<%s> %s;' % (req_type, req_vec_type),
' struct %s {' % info_type,
- ' %s(ExtEnabled %s::* state_, const %s requires_): state(state_), requires(requires_) {}' % ( info_type, struct_type, req_vec_type),
+ ' %s(ExtEnabled %s::* state_, const %s requirements_): state(state_), requirements(requirements_) {}' % ( info_type, struct_type, req_vec_type),
' ExtEnabled %s::* state;' % struct_type,
- ' %s requires;' % req_vec_type,
+ ' %s requirements;' % req_vec_type,
' };',
'',
' typedef std::unordered_map<std::string,%s> %s;' % (info_type, info_map_type),
@@ -987,7 +1008,7 @@
build_pnext_proc += 'void *SafePnextCopy(const void *pNext) {\n'
build_pnext_proc += ' if (!pNext) return nullptr;\n'
build_pnext_proc += '\n'
- build_pnext_proc += ' void *safe_pNext;\n'
+ build_pnext_proc += ' void *safe_pNext{};\n'
build_pnext_proc += ' const VkBaseOutStructure *header = reinterpret_cast<const VkBaseOutStructure *>(pNext);\n'
build_pnext_proc += '\n'
build_pnext_proc += ' switch (header->sType) {\n'
@@ -1051,16 +1072,41 @@
free_pnext_proc += '#endif // %s\n' % ifdef
build_pnext_proc += ' default: // Encountered an unknown sType -- skip (do not copy) this entry in the chain\n'
- build_pnext_proc += ' safe_pNext = SafePnextCopy(header->pNext);\n'
+ build_pnext_proc += ' // If sType is in custom list, construct blind copy\n'
+ build_pnext_proc += ' for (auto item : custom_stype_info) {\n'
+ build_pnext_proc += ' if (item.first == header->sType) {\n'
+ build_pnext_proc += ' safe_pNext = malloc(item.second);\n'
+ build_pnext_proc += ' memcpy(safe_pNext, header, item.second);\n'
+ build_pnext_proc += ' // Deep copy the rest of the pNext chain\n'
+ build_pnext_proc += ' VkBaseOutStructure *custom_struct = reinterpret_cast<VkBaseOutStructure *>(safe_pNext);\n'
+ build_pnext_proc += ' if (custom_struct->pNext) {\n'
+ build_pnext_proc += ' custom_struct->pNext = reinterpret_cast<VkBaseOutStructure *>(SafePnextCopy(custom_struct->pNext));\n'
+ build_pnext_proc += ' }\n'
+ build_pnext_proc += ' }\n'
+ build_pnext_proc += ' }\n'
+ build_pnext_proc += ' if (!safe_pNext) {\n'
+ build_pnext_proc += ' safe_pNext = SafePnextCopy(header->pNext);\n'
+ build_pnext_proc += ' }\n'
build_pnext_proc += ' break;\n'
build_pnext_proc += ' }\n'
build_pnext_proc += '\n'
build_pnext_proc += ' return safe_pNext;\n'
build_pnext_proc += '}\n'
- free_pnext_proc += ' default: // Encountered an unknown sType -- panic, there should be none such in safe chain\n'
- free_pnext_proc += ' assert(false);\n'
- free_pnext_proc += ' FreePnextChain(header->pNext);\n'
+ free_pnext_proc += ' default: // Encountered an unknown sType\n'
+ free_pnext_proc += ' // If sType is in custom list, free custom struct memory and clean up\n'
+ free_pnext_proc += ' for (auto item : custom_stype_info) {\n'
+ free_pnext_proc += ' if (item.first == header->sType) {\n'
+ free_pnext_proc += ' if (header->pNext) {\n'
+ free_pnext_proc += ' FreePnextChain(header->pNext);\n'
+ free_pnext_proc += ' }\n'
+ free_pnext_proc += ' free(const_cast<void *>(pNext));\n'
+ free_pnext_proc += ' pNext = nullptr;\n'
+ free_pnext_proc += ' }\n'
+ free_pnext_proc += ' }\n'
+ free_pnext_proc += ' if (pNext) {\n'
+ free_pnext_proc += ' FreePnextChain(header->pNext);\n'
+ free_pnext_proc += ' }\n'
free_pnext_proc += ' break;\n'
free_pnext_proc += ' }\n'
free_pnext_proc += '}\n'
@@ -1088,9 +1134,12 @@
safe_struct_helper_source += '#include <string.h>\n'
safe_struct_helper_source += '#include <cassert>\n'
safe_struct_helper_source += '#include <cstring>\n'
+ safe_struct_helper_source += '#include <vector>\n'
safe_struct_helper_source += '\n'
safe_struct_helper_source += '#include <vulkan/vk_layer.h>\n'
safe_struct_helper_source += '\n'
+ safe_struct_helper_source += 'extern std::vector<std::pair<uint32_t, uint32_t>> custom_stype_info;\n'
+ safe_struct_helper_source += '\n'
safe_struct_helper_source += self.GenerateSafeStructSource()
safe_struct_helper_source += self.build_safe_struct_utility_funcs()
@@ -1435,7 +1484,13 @@
decorated_length = member.len
for other_member in item.members:
decorated_length = re.sub(r'\b({})\b'.format(other_member.name), r'in_struct->\1', decorated_length)
- construct_txt += ' if (in_struct->%s) {\n' % member.name
+ concurrent_clause = ''
+ sharing_mode_name = 's'
+ if member.name == 'pQueueFamilyIndices':
+ if item.name == 'VkSwapchainCreateInfoKHR':
+ sharing_mode_name = 'imageS'
+ concurrent_clause = '(in_struct->%sharingMode == VK_SHARING_MODE_CONCURRENT) && ' % sharing_mode_name
+ construct_txt += ' if (%sin_struct->%s) {\n' % (concurrent_clause, member.name)
construct_txt += ' %s = new %s[%s];\n' % (member.name, m_type, decorated_length)
construct_txt += ' memcpy ((void *)%s, (void *)in_struct->%s, sizeof(%s)*%s);\n' % (member.name, member.name, m_type, decorated_length)
construct_txt += ' }\n'
@@ -1628,6 +1683,11 @@
return "\n".join(code)
#
+ # Generate the type map
+ def GenerateSyncHelperHeader(self):
+ return sync_val_gen.GenSyncTypeHelper(self)
+
+ #
# Create a helper file and return it as a string
def OutputDestFile(self):
if self.helper_file_type == 'enum_string_header':
@@ -1642,5 +1702,7 @@
return self.GenerateExtensionHelperHeader()
elif self.helper_file_type == 'typemap_helper_header':
return self.GenerateTypeMapHelperHeader()
+ elif self.helper_file_type == 'synchronization_helper_header':
+ return self.GenerateSyncHelperHeader()
else:
return 'Bad Helper File Generator Option %s' % self.helper_file_type
diff --git a/scripts/known_good.json b/scripts/known_good.json
index 182a62d..1d93283 100755
--- a/scripts/known_good.json
+++ b/scripts/known_good.json
@@ -6,7 +6,7 @@
"sub_dir" : "glslang",
"build_dir" : "glslang/build",
"install_dir" : "glslang/build/install",
- "commit" : "e157435c1e777aa1052f446dafed162b4a722e03",
+ "commit" : "3ee5f2f1d3316e228916788b300d786bb574d337",
"prebuild" : [
"python update_glslang_sources.py"
],
@@ -15,16 +15,25 @@
]
},
{
- "name" : "Vulkan-Headers",
- "url" : "https://github.com/KhronosGroup/Vulkan-Headers.git",
- "sub_dir" : "Vulkan-Headers",
- "build_dir" : "Vulkan-Headers/build",
- "install_dir" : "Vulkan-Headers/build/install",
- "commit" : "v1.2.135"
+ "name": "Vulkan-Headers",
+ "url": "https://github.com/KhronosGroup/Vulkan-Headers.git",
+ "sub_dir": "Vulkan-Headers",
+ "build_dir": "Vulkan-Headers/build",
+ "install_dir": "Vulkan-Headers/build/install",
+ "commit": "v1.2.148"
+ },
+ {
+ "name": "SPIRV-Headers",
+ "url": "https://github.com/KhronosGroup/SPIRV-Headers.git",
+ "sub_dir": "SPIRV-Headers",
+ "build_dir": "SPIRV-Headers/build",
+ "install_dir": "SPIRV-Headers/build/install",
+ "commit": "master"
}
],
"install_names" : {
"glslang" : "GLSLANG_INSTALL_DIR",
- "Vulkan-Headers" : "VULKAN_HEADERS_INSTALL_DIR"
- }
+ "Vulkan-Headers" : "VULKAN_HEADERS_INSTALL_DIR",
+ "SPIRV-Headers" : "SPIRV_HEADERS_INSTALL_DIR"
+ }
}
diff --git a/scripts/layer_chassis_dispatch_generator.py b/scripts/layer_chassis_dispatch_generator.py
index 6809354..2cd4fba 100644
--- a/scripts/layer_chassis_dispatch_generator.py
+++ b/scripts/layer_chassis_dispatch_generator.py
@@ -64,6 +64,7 @@
conventions = None,
filename = None,
directory = '.',
+ genpath = None,
apiname = None,
profile = None,
versions = '.*',
@@ -84,9 +85,20 @@
indentFuncPointer = False,
alignFuncParam = 0,
expandEnumerants = True):
- GeneratorOptions.__init__(self, conventions, filename, directory, apiname, profile,
- versions, emitversions, defaultExtensions,
- addExtensions, removeExtensions, emitExtensions, sortProcedure)
+ GeneratorOptions.__init__(self,
+ conventions = conventions,
+ filename = filename,
+ directory = directory,
+ genpath = genpath,
+ apiname = apiname,
+ profile = profile,
+ versions = versions,
+ emitversions = emitversions,
+ defaultExtensions = defaultExtensions,
+ addExtensions = addExtensions,
+ removeExtensions = removeExtensions,
+ emitExtensions = emitExtensions,
+ sortProcedure = sortProcedure)
self.prefixText = prefixText
self.genFuncPointers = genFuncPointers
self.protectFile = protectFile
@@ -1133,9 +1145,7 @@
write('#include "chassis.h"', file=self.outFile)
write('#include "layer_chassis_dispatch.h"', file=self.outFile)
write('#include "vk_layer_utils.h"', file=self.outFile)
- self.newline()
- write('// This intentionally includes a cpp file', file=self.outFile)
- write('#include "vk_safe_struct.cpp"', file=self.outFile)
+ write('#include "vk_safe_struct.h"', file=self.outFile)
self.newline()
write('ReadWriteLock dispatch_lock;', file=self.outFile)
self.newline()
diff --git a/scripts/layer_chassis_generator.py b/scripts/layer_chassis_generator.py
index 7873766..b3ba5e5 100644
--- a/scripts/layer_chassis_generator.py
+++ b/scripts/layer_chassis_generator.py
@@ -65,6 +65,7 @@
conventions = None,
filename = None,
directory = '.',
+ genpath = None,
apiname = None,
profile = None,
versions = '.*',
@@ -86,9 +87,20 @@
alignFuncParam = 0,
helper_file_type = '',
expandEnumerants = True):
- GeneratorOptions.__init__(self, conventions, filename, directory, apiname, profile,
- versions, emitversions, defaultExtensions,
- addExtensions, removeExtensions, emitExtensions, sortProcedure)
+ GeneratorOptions.__init__(self,
+ conventions = conventions,
+ filename = filename,
+ directory = directory,
+ genpath = genpath,
+ apiname = apiname,
+ profile = profile,
+ versions = versions,
+ emitversions = emitversions,
+ defaultExtensions = defaultExtensions,
+ addExtensions = addExtensions,
+ removeExtensions = removeExtensions,
+ emitExtensions = emitExtensions,
+ sortProcedure = sortProcedure)
self.prefixText = prefixText
self.genFuncPointers = genFuncPointers
self.protectFile = protectFile
@@ -212,6 +224,7 @@
#include "vk_loader_platform.h"
#include "vulkan/vulkan.h"
+#include "vk_layer_settings_ext.h"
#include "vk_layer_config.h"
#include "vk_layer_data.h"
#include "vk_layer_logging.h"
@@ -263,6 +276,8 @@
LayerObjectTypeBestPractices, // Instance or device best practices layer object
LayerObjectTypeGpuAssisted, // Instance or device gpu assisted validation layer object
LayerObjectTypeDebugPrintf, // Instance or device shader debug printf layer object
+ LayerObjectTypeCommandCounter, // Command Counter validation object, child of corechecks
+ LayerObjectTypeSyncValidation, // Instance or device synchronization validation layer object
LayerObjectTypeMaxEnum, // Max enum count
};
@@ -297,38 +312,42 @@
typedef enum VkValidationFeatureEnable {
VK_VALIDATION_FEATURE_ENABLE_SHADER_DEBUG_PRINTF,
+ VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION,
} VkValidationFeatureEnable;
-// CHECK_DISABLED struct is a container for bools that can block validation checks from being performed.
-// These bools are all "false" by default meaning that all checks are enabled. Enum values can be specified
-// via the vk_layer_setting.txt config file or at CreateInstance time via the VK_EXT_validation_features extension
-// that can selectively disable checks.
-struct CHECK_DISABLED {
- bool command_buffer_state; // Skip command buffer state validation
- bool object_in_use; // Skip all object in_use checking
- bool idle_descriptor_set; // Skip check to verify that descriptor set is not in-use
- bool push_constant_range; // Skip push constant range checks
- bool query_validation; // Disable all core validation query-related checks
- bool image_layout_validation; // Disable image layout validation
- bool object_tracking; // Disable object lifetime validation
- bool core_checks; // Disable core validation checks
- bool thread_safety; // Disable thread safety validation
- bool stateless_checks; // Disable stateless validation checks
- bool handle_wrapping; // Disable unique handles/handle wrapping
- bool shader_validation; // Skip validation for shaders
+// CHECK_DISABLED and CHECK_ENABLED vectors are containers for bools that can opt in or out of specific classes of validation
+// checks. Enum values can be specified via the vk_layer_settings.txt config file or at CreateInstance time via the
+// VK_EXT_validation_features extension that can selectively disable or enable checks.
+typedef enum DisableFlags {
+ command_buffer_state,
+ object_in_use,
+ idle_descriptor_set,
+ push_constant_range,
+ query_validation,
+ image_layout_validation,
+ object_tracking,
+ core_checks,
+ thread_safety,
+ stateless_checks,
+ handle_wrapping,
+ shader_validation,
+ // Insert new disables above this line
+ kMaxDisableFlags,
+} DisableFlags;
- void SetAll(bool value) { std::fill(&command_buffer_state, &shader_validation + 1, value); }
-};
+typedef enum EnableFlags {
+ gpu_validation,
+ gpu_validation_reserve_binding_slot,
+ best_practices,
+ vendor_specific_arm,
+ debug_printf,
+ sync_validation,
+ // Insert new enables above this line
+ kMaxEnableFlags,
+} EnableFlags;
-struct CHECK_ENABLED {
- bool gpu_validation;
- bool gpu_validation_reserve_binding_slot;
- bool best_practices;
- bool vendor_specific_arm; // Vendor-specific validation for Arm platforms
- bool debug_printf;
-
- void SetAllVendorSpecific(bool value) { std::fill(&vendor_specific_arm, &vendor_specific_arm + 1, value); }
-};
+typedef std::array<bool, kMaxDisableFlags> CHECK_DISABLED;
+typedef std::array<bool, kMaxEnableFlags> CHECK_ENABLED;
// Layer chassis validation object base class definition
class ValidationObject {
@@ -367,6 +386,38 @@
return write_lock_guard_t(validation_object_mutex);
}
+ void RegisterValidationObject(bool vo_enabled, uint32_t instance_api_version,
+ debug_report_data* instance_report_data, std::vector<ValidationObject*> &dispatch_list) {
+ if (vo_enabled) {
+ api_version = instance_api_version;
+ report_data = instance_report_data;
+ dispatch_list.emplace_back(this);
+ }
+ }
+
+ void FinalizeInstanceValidationObject(ValidationObject *framework) {
+ instance_dispatch_table = framework->instance_dispatch_table;
+ enabled = framework->enabled;
+ disabled = framework->disabled;
+ }
+
+ virtual void InitDeviceValidationObject(bool add_obj, ValidationObject *inst_obj, ValidationObject *dev_obj) {
+ if (add_obj) {
+ dev_obj->object_dispatch.emplace_back(this);
+ device = dev_obj->device;
+ physical_device = dev_obj->physical_device;
+ instance = inst_obj->instance;
+ report_data = inst_obj->report_data;
+ device_dispatch_table = dev_obj->device_dispatch_table;
+ api_version = dev_obj->api_version;
+ disabled = inst_obj->disabled;
+ enabled = inst_obj->enabled;
+ instance_dispatch_table = inst_obj->instance_dispatch_table;
+ instance_extensions = inst_obj->instance_extensions;
+ device_extensions = dev_obj->device_extensions;
+ }
+ }
+
ValidationObject* GetValidationObject(std::vector<ValidationObject*>& object_dispatch, LayerObjectTypeId object_type) {
for (auto validation_object : object_dispatch) {
if (validation_object->container_type == object_type) {
@@ -612,6 +663,7 @@
#define VALIDATION_ERROR_MAP_IMPL
#include "chassis.h"
+#include "layer_options.h"
#include "layer_chassis_dispatch.h"
small_unordered_map<void*, ValidationObject*, 2> layer_data_map;
@@ -630,13 +682,16 @@
// Include layer validation object definitions
#include "best_practices_validation.h"
#include "core_validation.h"
-#include "command_counter.h"
#include "gpu_validation.h"
#include "object_lifetime_validation.h"
#include "debug_printf.h"
#include "stateless_validation.h"
+#include "synchronization_validation.h"
#include "thread_safety.h"
+// Global list of sType,size identifiers
+std::vector<std::pair<uint32_t, uint32_t>> custom_stype_info{};
+
namespace vulkan_layer_chassis {
using std::unordered_map;
@@ -694,234 +749,64 @@
}
}
-
-// Process validation features, flags and settings specified through extensions, a layer settings file, or environment variables
-
-static const std::unordered_map<std::string, VkValidationFeatureDisableEXT> VkValFeatureDisableLookup = {
- {"VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT", VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT},
- {"VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT", VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT},
- {"VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT", VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT},
- {"VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT", VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT},
- {"VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT", VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT},
- {"VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT", VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT},
- {"VK_VALIDATION_FEATURE_DISABLE_ALL_EXT", VK_VALIDATION_FEATURE_DISABLE_ALL_EXT},
-};
-
-static const std::unordered_map<std::string, VkValidationFeatureEnableEXT> VkValFeatureEnableLookup = {
- {"VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT", VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT},
- {"VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT", VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT},
- {"VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT", VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT},
- {"VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT", VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT},
-};
-
-static const std::unordered_map<std::string, ValidationCheckDisables> ValidationDisableLookup = {
- {"VALIDATION_CHECK_DISABLE_COMMAND_BUFFER_STATE", VALIDATION_CHECK_DISABLE_COMMAND_BUFFER_STATE},
- {"VALIDATION_CHECK_DISABLE_OBJECT_IN_USE", VALIDATION_CHECK_DISABLE_OBJECT_IN_USE},
- {"VALIDATION_CHECK_DISABLE_IDLE_DESCRIPTOR_SET", VALIDATION_CHECK_DISABLE_IDLE_DESCRIPTOR_SET},
- {"VALIDATION_CHECK_DISABLE_PUSH_CONSTANT_RANGE", VALIDATION_CHECK_DISABLE_PUSH_CONSTANT_RANGE},
- {"VALIDATION_CHECK_DISABLE_QUERY_VALIDATION", VALIDATION_CHECK_DISABLE_QUERY_VALIDATION},
- {"VALIDATION_CHECK_DISABLE_IMAGE_LAYOUT_VALIDATION", VALIDATION_CHECK_DISABLE_IMAGE_LAYOUT_VALIDATION},
-};
-
-static const std::unordered_map<std::string, ValidationCheckEnables> ValidationEnableLookup = {
- {"VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ARM", VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ARM},
- {"VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ALL", VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ALL},
-};
-
-// Set the local disable flag for the appropriate VALIDATION_CHECK_DISABLE enum
-void SetValidationDisable(CHECK_DISABLED* disable_data, const ValidationCheckDisables disable_id) {
- switch (disable_id) {
- case VALIDATION_CHECK_DISABLE_COMMAND_BUFFER_STATE:
- disable_data->command_buffer_state = true;
- break;
- case VALIDATION_CHECK_DISABLE_OBJECT_IN_USE:
- disable_data->object_in_use = true;
- break;
- case VALIDATION_CHECK_DISABLE_IDLE_DESCRIPTOR_SET:
- disable_data->idle_descriptor_set = true;
- break;
- case VALIDATION_CHECK_DISABLE_PUSH_CONSTANT_RANGE:
- disable_data->push_constant_range = true;
- break;
- case VALIDATION_CHECK_DISABLE_QUERY_VALIDATION:
- disable_data->query_validation = true;
- break;
- case VALIDATION_CHECK_DISABLE_IMAGE_LAYOUT_VALIDATION:
- disable_data->image_layout_validation = true;
- break;
- default:
- assert(true);
+void OutputLayerStatusInfo(ValidationObject *context) {
+ std::string list_of_enables;
+ std::string list_of_disables;
+ for (uint32_t i = 0; i < kMaxEnableFlags; i++) {
+ if (context->enabled[i]) {
+ if (list_of_enables.size()) list_of_enables.append(", ");
+ list_of_enables.append(EnableFlagNameHelper[i]);
+ }
}
-}
-
-// Set the local disable flag for a single VK_VALIDATION_FEATURE_DISABLE_* flag
-void SetValidationFeatureDisable(CHECK_DISABLED* disable_data, const VkValidationFeatureDisableEXT feature_disable) {
- switch (feature_disable) {
- case VK_VALIDATION_FEATURE_DISABLE_SHADERS_EXT:
- disable_data->shader_validation = true;
- break;
- case VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT:
- disable_data->thread_safety = true;
- break;
- case VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT:
- disable_data->stateless_checks = true;
- break;
- case VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT:
- disable_data->object_tracking = true;
- break;
- case VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT:
- disable_data->core_checks = true;
- break;
- case VK_VALIDATION_FEATURE_DISABLE_UNIQUE_HANDLES_EXT:
- disable_data->handle_wrapping = true;
- break;
- case VK_VALIDATION_FEATURE_DISABLE_ALL_EXT:
- // Set all disabled flags to true
- disable_data->SetAll(true);
- break;
- default:
- break;
+ if (list_of_enables.size() == 0) {
+ list_of_enables.append("None");
}
-}
-
-// Set the local enable flag for the appropriate VALIDATION_CHECK_ENABLE enum
-void SetValidationEnable(CHECK_ENABLED* enable_data, const ValidationCheckEnables enable_id) {
- switch (enable_id) {
- case VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ARM:
- enable_data->vendor_specific_arm = true;
- break;
- case VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ALL:
- enable_data->SetAllVendorSpecific(true);
- break;
- default:
- assert(true);
+ for (uint32_t i = 0; i < kMaxDisableFlags; i++) {
+ if (context->disabled[i]) {
+ if (list_of_disables.size()) list_of_disables.append(", ");
+ list_of_disables.append(DisableFlagNameHelper[i]);
+ }
}
-}
-// Set the local enable flag for a single VK_VALIDATION_FEATURE_ENABLE_* flag
-void SetValidationFeatureEnable(CHECK_ENABLED *enable_data, const VkValidationFeatureEnableEXT feature_enable) {
- switch (feature_enable) {
- case VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT:
- enable_data->gpu_validation = true;
- break;
- case VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT:
- enable_data->gpu_validation_reserve_binding_slot = true;
- break;
- case VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT:
- enable_data->best_practices = true;
- break;
- case VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT:
- enable_data->debug_printf = true;
- default:
- break;
+ if (list_of_disables.size() == 0) {
+ list_of_disables.append("None");
}
-}
-// Set the local disable flag for settings specified through the VK_EXT_validation_flags extension
-void SetValidationFlags(CHECK_DISABLED* disables, const VkValidationFlagsEXT* val_flags_struct) {
- for (uint32_t i = 0; i < val_flags_struct->disabledValidationCheckCount; ++i) {
- switch (val_flags_struct->pDisabledValidationChecks[i]) {
- case VK_VALIDATION_CHECK_SHADERS_EXT:
- disables->shader_validation = true;
+ auto settings_info = GetLayerSettingsFileInfo();
+ std::string settings_status;
+ if (!settings_info->file_found) {
+ settings_status = "None. Default location is ";
+ settings_status.append(settings_info->location);
+ settings_status.append(".");
+ } else {
+ settings_status = "Found at ";
+ settings_status.append(settings_info->location);
+ settings_status.append(" specified by ");
+ switch (settings_info->source) {
+ case kEnvVar:
+ settings_status.append("environment variable (VK_LAYER_SETTINGS_PATH).");
break;
- case VK_VALIDATION_CHECK_ALL_EXT:
- // Set all disabled flags to true
- disables->SetAll(true);
+ case kVkConfig:
+ settings_status.append("VkConfig application override.");
break;
+ case kLocal: // Intentionally fall through
default:
+ settings_status.append("default location (current working directory).");
break;
}
}
-}
-// Process Validation Features flags specified through the ValidationFeature extension
-void SetValidationFeatures(CHECK_DISABLED *disable_data, CHECK_ENABLED *enable_data,
- const VkValidationFeaturesEXT *val_features_struct) {
- for (uint32_t i = 0; i < val_features_struct->disabledValidationFeatureCount; ++i) {
- SetValidationFeatureDisable(disable_data, val_features_struct->pDisabledValidationFeatures[i]);
- }
- for (uint32_t i = 0; i < val_features_struct->enabledValidationFeatureCount; ++i) {
- SetValidationFeatureEnable(enable_data, val_features_struct->pEnabledValidationFeatures[i]);
- }
-}
+ // Output layer status information message
+ context->LogInfo(context->instance, kVUID_Core_CreatInstance_Status,
+ "Khronos Validation Layer Active:\\n Settings File: %s\\n Current Enables: %s.\\n Current Disables: %s.\\n",
+ settings_status.c_str(), list_of_enables.c_str(), list_of_disables.c_str());
-// Given a string representation of a list of enable enum values, call the appropriate setter function
-void SetLocalEnableSetting(std::string list_of_enables, std::string delimiter, CHECK_ENABLED* enables) {
- size_t pos = 0;
- std::string token;
- while (list_of_enables.length() != 0) {
- pos = list_of_enables.find(delimiter);
- if (pos != std::string::npos) {
- token = list_of_enables.substr(0, pos);
- } else {
- pos = list_of_enables.length() - delimiter.length();
- token = list_of_enables;
- }
- if (token.find("VK_VALIDATION_FEATURE_ENABLE_") != std::string::npos) {
- auto result = VkValFeatureEnableLookup.find(token);
- if (result != VkValFeatureEnableLookup.end()) {
- SetValidationFeatureEnable(enables, result->second);
- }
- }
- else if (token.find("VALIDATION_CHECK_ENABLE_") != std::string::npos) {
- auto result = ValidationEnableLookup.find(token);
- if (result != ValidationEnableLookup.end()) {
- SetValidationEnable(enables, result->second);
- }
- }
- list_of_enables.erase(0, pos + delimiter.length());
- }
-}
-
-// Given a string representation of a list of disable enum values, call the appropriate setter function
-void SetLocalDisableSetting(std::string list_of_disables, std::string delimiter, CHECK_DISABLED* disables) {
- size_t pos = 0;
- std::string token;
- while (list_of_disables.length() != 0) {
- pos = list_of_disables.find(delimiter);
- if (pos != std::string::npos) {
- token = list_of_disables.substr(0, pos);
- } else {
- pos = list_of_disables.length() - delimiter.length();
- token = list_of_disables;
- }
- if (token.find("VK_VALIDATION_FEATURE_DISABLE_") != std::string::npos) {
- auto result = VkValFeatureDisableLookup.find(token);
- if (result != VkValFeatureDisableLookup.end()) {
- SetValidationFeatureDisable(disables, result->second);
- }
- }
- if (token.find("VALIDATION_CHECK_DISABLE_") != std::string::npos) {
- auto result = ValidationDisableLookup.find(token);
- if (result != ValidationDisableLookup.end()) {
- SetValidationDisable(disables, result->second);
- }
- }
- list_of_disables.erase(0, pos + delimiter.length());
- }
-}
-
-// Process enables and disables set though the vk_layer_settings.txt config file or through an environment variable
-void ProcessConfigAndEnvSettings(const char* layer_description, CHECK_ENABLED* enables, CHECK_DISABLED* disables) {
- std::string enable_key = layer_description;
- std::string disable_key = layer_description;
- enable_key.append(".enables");
- disable_key.append(".disables");
- std::string list_of_config_enables = getLayerOption(enable_key.c_str());
- std::string list_of_env_enables = GetLayerEnvVar("VK_LAYER_ENABLES");
- std::string list_of_config_disables = getLayerOption(disable_key.c_str());
- std::string list_of_env_disables = GetLayerEnvVar("VK_LAYER_DISABLES");
-#if defined(_WIN32)
- std::string env_delimiter = ";";
-#else
- std::string env_delimiter = ":";
+ // Create warning message if user is running debug layers.
+#ifndef NDEBUG
+ context->LogPerformanceWarning(context->instance, kVUID_Core_CreateInstance_Debug_Warning,
+ "VALIDATION LAYERS WARNING: Using debug builds of the validation layers *will* adversely affect performance.");
#endif
- SetLocalEnableSetting(list_of_config_enables, ",", enables);
- SetLocalEnableSetting(list_of_env_enables, env_delimiter, enables);
- SetLocalDisableSetting(list_of_config_disables, ",", disables);
- SetLocalDisableSetting(list_of_env_disables, env_delimiter, disables);
}
-
// Non-code-generated chassis API functions
VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL GetDeviceProcAddr(VkDevice device, const char *funcName) {
@@ -1014,81 +899,56 @@
report_data->instance_pnext_chain = SafePnextCopy(pCreateInfo->pNext);
ActivateInstanceDebugCallbacks(report_data);
+ // Set up enable and disable features flags
CHECK_ENABLED local_enables {};
CHECK_DISABLED local_disables {};
- const auto *validation_features_ext = lvl_find_in_chain<VkValidationFeaturesEXT>(pCreateInfo->pNext);
- if (validation_features_ext) {
- SetValidationFeatures(&local_disables, &local_enables, validation_features_ext);
- }
- const auto *validation_flags_ext = lvl_find_in_chain<VkValidationFlagsEXT>(pCreateInfo->pNext);
- if (validation_flags_ext) {
- SetValidationFlags(&local_disables, validation_flags_ext);
- }
- ProcessConfigAndEnvSettings(OBJECT_LAYER_DESCRIPTION, &local_enables, &local_disables);
+ ConfigAndEnvSettings config_and_env_settings_data {OBJECT_LAYER_DESCRIPTION, pCreateInfo->pNext, local_enables, local_disables,
+ report_data->filter_message_ids, &report_data->duplicate_message_limit};
+ ProcessConfigAndEnvSettings(&config_and_env_settings_data);
+ layer_debug_messenger_actions(report_data, pAllocator, OBJECT_LAYER_DESCRIPTION);
// Create temporary dispatch vector for pre-calls until instance is created
std::vector<ValidationObject*> local_object_dispatch;
+
// Add VOs to dispatch vector. Order here will be the validation dispatch order!
- auto thread_checker = new ThreadSafety(nullptr);
- if (!local_disables.thread_safety) {
- local_object_dispatch.emplace_back(thread_checker);
- }
- thread_checker->container_type = LayerObjectTypeThreading;
- thread_checker->api_version = api_version;
- thread_checker->report_data = report_data;
- auto parameter_validation = new StatelessValidation;
- if (!local_disables.stateless_checks) {
- local_object_dispatch.emplace_back(parameter_validation);
- }
- parameter_validation->container_type = LayerObjectTypeParameterValidation;
- parameter_validation->api_version = api_version;
- parameter_validation->report_data = report_data;
- auto object_tracker = new ObjectLifetimes;
- if (!local_disables.object_tracking) {
- local_object_dispatch.emplace_back(object_tracker);
- }
- object_tracker->container_type = LayerObjectTypeObjectTracker;
- object_tracker->api_version = api_version;
- object_tracker->report_data = report_data;
- auto core_checks = new CoreChecks;
- if (!local_disables.core_checks) {
- local_object_dispatch.emplace_back(core_checks);
- }
- core_checks->container_type = LayerObjectTypeCoreValidation;
- core_checks->api_version = api_version;
- core_checks->report_data = report_data;
- auto best_practices = new BestPractices;
- if (local_enables.best_practices) {
- local_object_dispatch.emplace_back(best_practices);
- }
- best_practices->container_type = LayerObjectTypeBestPractices;
- best_practices->api_version = api_version;
- best_practices->report_data = report_data;
- auto gpu_assisted = new GpuAssisted;
- if (local_enables.gpu_validation) {
- local_object_dispatch.emplace_back(gpu_assisted);
- }
- gpu_assisted->container_type = LayerObjectTypeGpuAssisted;
- gpu_assisted->api_version = api_version;
- gpu_assisted->report_data = report_data;
- auto debug_printf = new DebugPrintf;
- if (local_enables.debug_printf) {
- local_object_dispatch.emplace_back(debug_printf);
- }
- debug_printf->container_type = LayerObjectTypeDebugPrintf;
- debug_printf->api_version = api_version;
- debug_printf->report_data = report_data;
+ auto thread_checker_obj = new ThreadSafety(nullptr);
+ thread_checker_obj->RegisterValidationObject(!local_disables[thread_safety], api_version, report_data, local_object_dispatch);
+
+ auto parameter_validation_obj = new StatelessValidation;
+ parameter_validation_obj->RegisterValidationObject(!local_disables[stateless_checks], api_version, report_data, local_object_dispatch);
+
+ auto object_tracker_obj = new ObjectLifetimes;
+ object_tracker_obj->RegisterValidationObject(!local_disables[object_tracking], api_version, report_data, local_object_dispatch);
+
+ auto core_checks_obj = new CoreChecks;
+ core_checks_obj->RegisterValidationObject(!local_disables[core_checks], api_version, report_data, local_object_dispatch);
+
+ auto best_practices_obj = new BestPractices;
+ best_practices_obj->RegisterValidationObject(local_enables[best_practices], api_version, report_data, local_object_dispatch);
+
+ auto gpu_assisted_obj = new GpuAssisted;
+ gpu_assisted_obj->RegisterValidationObject(local_enables[gpu_validation], api_version, report_data, local_object_dispatch);
+
+ auto debug_printf_obj = new DebugPrintf;
+ debug_printf_obj->RegisterValidationObject(local_enables[debug_printf], api_version, report_data, local_object_dispatch);
+
+ auto sync_validation_obj = new SyncValidator;
+ sync_validation_obj->RegisterValidationObject(local_enables[sync_validation], api_version, report_data, local_object_dispatch);
// If handle wrapping is disabled via the ValidationFeatures extension, override build flag
- if (local_disables.handle_wrapping) {
+ if (local_disables[handle_wrapping]) {
wrap_handles = false;
}
// Init dispatch array and call registration functions
+ bool skip = false;
for (auto intercept : local_object_dispatch) {
- (const_cast<const ValidationObject*>(intercept))->PreCallValidateCreateInstance(pCreateInfo, pAllocator, pInstance);
+ auto lock = intercept->read_lock();
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateCreateInstance(pCreateInfo, pAllocator, pInstance);
+ if (skip) return VK_ERROR_VALIDATION_FAILED_EXT;
}
for (auto intercept : local_object_dispatch) {
+ auto lock = intercept->write_lock();
intercept->PreCallRecordCreateInstance(pCreateInfo, pAllocator, pInstance);
}
@@ -1108,40 +968,28 @@
framework->api_version = api_version;
framework->instance_extensions.InitFromInstanceCreateInfo(specified_version, pCreateInfo);
- layer_debug_messenger_actions(framework->report_data, pAllocator, OBJECT_LAYER_DESCRIPTION);
+ OutputLayerStatusInfo(framework);
- object_tracker->instance_dispatch_table = framework->instance_dispatch_table;
- object_tracker->enabled = framework->enabled;
- object_tracker->disabled = framework->disabled;
- thread_checker->instance_dispatch_table = framework->instance_dispatch_table;
- thread_checker->enabled = framework->enabled;
- thread_checker->disabled = framework->disabled;
- parameter_validation->instance_dispatch_table = framework->instance_dispatch_table;
- parameter_validation->enabled = framework->enabled;
- parameter_validation->disabled = framework->disabled;
- core_checks->instance_dispatch_table = framework->instance_dispatch_table;
- core_checks->instance = *pInstance;
- core_checks->enabled = framework->enabled;
- core_checks->disabled = framework->disabled;
- core_checks->instance_state = core_checks;
- best_practices->instance_dispatch_table = framework->instance_dispatch_table;
- best_practices->enabled = framework->enabled;
- best_practices->disabled = framework->disabled;
- gpu_assisted->instance_dispatch_table = framework->instance_dispatch_table;
- gpu_assisted->enabled = framework->enabled;
- gpu_assisted->disabled = framework->disabled;
- debug_printf->instance_dispatch_table = framework->instance_dispatch_table;
- debug_printf->enabled = framework->enabled;
- debug_printf->disabled = framework->disabled;
+ thread_checker_obj->FinalizeInstanceValidationObject(framework);
+ object_tracker_obj->FinalizeInstanceValidationObject(framework);
+ parameter_validation_obj->FinalizeInstanceValidationObject(framework);
+ core_checks_obj->FinalizeInstanceValidationObject(framework);
+ core_checks_obj->instance = *pInstance;
+ core_checks_obj->instance_state = core_checks_obj;
+ best_practices_obj->FinalizeInstanceValidationObject(framework);
+ gpu_assisted_obj->FinalizeInstanceValidationObject(framework);
+ debug_printf_obj->FinalizeInstanceValidationObject(framework);
+ sync_validation_obj->FinalizeInstanceValidationObject(framework);
for (auto intercept : framework->object_dispatch) {
+ auto lock = intercept->write_lock();
intercept->PostCallRecordCreateInstance(pCreateInfo, pAllocator, pInstance, result);
}
// Delete unused validation objects to avoid memory leak.
std::vector<ValidationObject*> local_objs = {
- thread_checker, object_tracker, parameter_validation,
- core_checks, best_practices, gpu_assisted, debug_printf,
+ thread_checker_obj, object_tracker_obj, parameter_validation_obj,
+ core_checks_obj, best_practices_obj, gpu_assisted_obj, debug_printf_obj,
};
for (auto obj : local_objs) {
if (std::find(local_object_dispatch.begin(), local_object_dispatch.end(), obj) == local_object_dispatch.end()) {
@@ -1159,9 +1007,11 @@
auto layer_data = GetLayerDataPtr(key, layer_data_map);
ActivateInstanceDebugCallbacks(layer_data->report_data);
+ bool skip = false;
""" + precallvalidate_loop + """
auto lock = intercept->read_lock();
- (const_cast<const ValidationObject*>(intercept))->PreCallValidateDestroyInstance(instance, pAllocator);
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateDestroyInstance(instance, pAllocator);
+ //if (skip) return; // WORKAROUD: does not currently work properly
}
""" + precallrecord_loop + """
auto lock = intercept->write_lock();
@@ -1247,76 +1097,38 @@
device_interceptor->instance = instance_interceptor->instance;
device_interceptor->report_data = instance_interceptor->report_data;
- // Note that this defines the order in which the layer validation objects are called
- auto thread_safety = new ThreadSafety(reinterpret_cast<ThreadSafety *>(instance_interceptor->GetValidationObject(instance_interceptor->object_dispatch, LayerObjectTypeThreading)));
- thread_safety->container_type = LayerObjectTypeThreading;
- if (!instance_interceptor->disabled.thread_safety) {
- device_interceptor->object_dispatch.emplace_back(thread_safety);
- }
- auto stateless_validation = new StatelessValidation;
- stateless_validation->container_type = LayerObjectTypeParameterValidation;
- if (!instance_interceptor->disabled.stateless_checks) {
- device_interceptor->object_dispatch.emplace_back(stateless_validation);
- }
- auto object_tracker = new ObjectLifetimes;
- object_tracker->container_type = LayerObjectTypeObjectTracker;
- if (!instance_interceptor->disabled.object_tracking) {
- device_interceptor->object_dispatch.emplace_back(object_tracker);
- }
- auto core_checks = new CoreChecks;
- core_checks->container_type = LayerObjectTypeCoreValidation;
- core_checks->instance_state = reinterpret_cast<CoreChecks *>(
- core_checks->GetValidationObject(instance_interceptor->object_dispatch, LayerObjectTypeCoreValidation));
- if (!instance_interceptor->disabled.core_checks) {
- // Only enable the command counters when needed.
- if (device_extensions.vk_khr_performance_query) {
- auto command_counter = new CommandCounter(core_checks);
- command_counter->container_type = LayerObjectTypeDevice;
- device_interceptor->object_dispatch.emplace_back(command_counter);
- }
- device_interceptor->object_dispatch.emplace_back(core_checks);
- }
- auto best_practices = new BestPractices;
- best_practices->container_type = LayerObjectTypeBestPractices;
- best_practices->instance_state = reinterpret_cast<BestPractices *>(
- best_practices->GetValidationObject(instance_interceptor->object_dispatch, LayerObjectTypeBestPractices));
- if (instance_interceptor->enabled.best_practices) {
- device_interceptor->object_dispatch.emplace_back(best_practices);
- }
- auto gpu_assisted = new GpuAssisted;
- gpu_assisted->container_type = LayerObjectTypeGpuAssisted;
- gpu_assisted->instance_state = reinterpret_cast<GpuAssisted *>(
- gpu_assisted->GetValidationObject(instance_interceptor->object_dispatch, LayerObjectTypeGpuAssisted));
- if (instance_interceptor->enabled.gpu_validation) {
- device_interceptor->object_dispatch.emplace_back(gpu_assisted);
- }
- auto debug_printf = new DebugPrintf;
- debug_printf->container_type = LayerObjectTypeDebugPrintf;
- debug_printf->instance_state = reinterpret_cast<DebugPrintf *>(
- debug_printf->GetValidationObject(instance_interceptor->object_dispatch, LayerObjectTypeDebugPrintf));
- if (instance_interceptor->enabled.debug_printf) {
- device_interceptor->object_dispatch.emplace_back(debug_printf);
- }
+ // Note that this DEFINES THE ORDER IN WHICH THE LAYER VALIDATION OBJECTS ARE CALLED
+ auto disables = instance_interceptor->disabled;
+ auto enables = instance_interceptor->enabled;
- // Set per-intercept common data items
- for (auto dev_intercept : device_interceptor->object_dispatch) {
- dev_intercept->device = *pDevice;
- dev_intercept->physical_device = gpu;
- dev_intercept->instance = instance_interceptor->instance;
- dev_intercept->report_data = device_interceptor->report_data;
- dev_intercept->device_dispatch_table = device_interceptor->device_dispatch_table;
- dev_intercept->api_version = device_interceptor->api_version;
- dev_intercept->disabled = instance_interceptor->disabled;
- dev_intercept->enabled = instance_interceptor->enabled;
- dev_intercept->instance_dispatch_table = instance_interceptor->instance_dispatch_table;
- dev_intercept->instance_extensions = instance_interceptor->instance_extensions;
- dev_intercept->device_extensions = device_interceptor->device_extensions;
- }
+ auto thread_safety_obj = new ThreadSafety(reinterpret_cast<ThreadSafety *>(instance_interceptor->GetValidationObject(instance_interceptor->object_dispatch, LayerObjectTypeThreading)));
+ thread_safety_obj->InitDeviceValidationObject(!disables[thread_safety], instance_interceptor, device_interceptor);
+
+ auto stateless_validation_obj = new StatelessValidation;
+ stateless_validation_obj->InitDeviceValidationObject(!disables[stateless_checks], instance_interceptor, device_interceptor);
+
+ auto object_tracker_obj = new ObjectLifetimes;
+ object_tracker_obj->InitDeviceValidationObject(!disables[object_tracking], instance_interceptor, device_interceptor);
+
+ auto core_checks_obj = new CoreChecks;
+ core_checks_obj->InitDeviceValidationObject(!disables[core_checks], instance_interceptor, device_interceptor);
+
+ auto best_practices_obj = new BestPractices;
+ best_practices_obj->InitDeviceValidationObject(enables[best_practices], instance_interceptor, device_interceptor);
+
+ auto gpu_assisted_obj = new GpuAssisted;
+ gpu_assisted_obj->InitDeviceValidationObject(enables[gpu_validation], instance_interceptor, device_interceptor);
+
+ auto debug_printf_obj = new DebugPrintf;
+ debug_printf_obj->InitDeviceValidationObject(enables[debug_printf], instance_interceptor, device_interceptor);
+
+ auto sync_validation_obj = new SyncValidator;
+ sync_validation_obj->InitDeviceValidationObject(enables[sync_validation], instance_interceptor, device_interceptor);
// Delete unused validation objects to avoid memory leak.
std::vector<ValidationObject *> local_objs = {
- thread_safety, stateless_validation, object_tracker,
- core_checks, best_practices, gpu_assisted, debug_printf,
+ thread_safety_obj, stateless_validation_obj, object_tracker_obj,
+ core_checks_obj, best_practices_obj, gpu_assisted_obj, debug_printf_obj,
};
for (auto obj : local_objs) {
if (std::find(device_interceptor->object_dispatch.begin(), device_interceptor->object_dispatch.end(), obj) ==
@@ -1338,9 +1150,11 @@
VKAPI_ATTR void VKAPI_CALL DestroyDevice(VkDevice device, const VkAllocationCallbacks *pAllocator) {
dispatch_key key = get_dispatch_key(device);
auto layer_data = GetLayerDataPtr(key, layer_data_map);
+ bool skip = false;
""" + precallvalidate_loop + """
auto lock = intercept->read_lock();
- (const_cast<const ValidationObject*>(intercept))->PreCallValidateDestroyDevice(device, pAllocator);
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateDestroyDevice(device, pAllocator);
+ if (skip) return;
}
""" + precallrecord_loop + """
auto lock = intercept->write_lock();
@@ -1569,11 +1383,13 @@
auto layer_data = GetLayerDataPtr(get_dispatch_key(device), layer_data_map);
bool skip = false;
- cvdescriptorset::AllocateDescriptorSetsData ads_state(pAllocateInfo->descriptorSetCount);
+ cvdescriptorset::AllocateDescriptorSetsData ads_state[LayerObjectTypeMaxEnum];
for (auto intercept : layer_data->object_dispatch) {
+ ads_state[intercept->container_type].Init(pAllocateInfo->descriptorSetCount);
auto lock = intercept->read_lock();
- skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateAllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets, &ads_state);
+ skip |= (const_cast<const ValidationObject*>(intercept))->PreCallValidateAllocateDescriptorSets(device,
+ pAllocateInfo, pDescriptorSets, &(ads_state[intercept->container_type]));
if (skip) return VK_ERROR_VALIDATION_FAILED_EXT;
}
for (auto intercept : layer_data->object_dispatch) {
@@ -1583,7 +1399,8 @@
VkResult result = DispatchAllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets);
for (auto intercept : layer_data->object_dispatch) {
auto lock = intercept->write_lock();
- intercept->PostCallRecordAllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets, result, &ads_state);
+ intercept->PostCallRecordAllocateDescriptorSets(device, pAllocateInfo, pDescriptorSets,
+ result, &(ads_state[intercept->container_type]));
}
return result;
}
diff --git a/scripts/layer_dispatch_table_generator.py b/scripts/layer_dispatch_table_generator.py
index e071dc8..e5ea4a5 100644
--- a/scripts/layer_dispatch_table_generator.py
+++ b/scripts/layer_dispatch_table_generator.py
@@ -38,6 +38,7 @@
conventions = None,
filename = None,
directory = '.',
+ genpath = None,
apiname = None,
profile = None,
versions = '.*',
@@ -58,9 +59,20 @@
indentFuncPointer = False,
alignFuncParam = 0,
expandEnumerants = True):
- GeneratorOptions.__init__(self, conventions, filename, directory, apiname, profile,
- versions, emitversions, defaultExtensions,
- addExtensions, removeExtensions, emitExtensions, sortProcedure)
+ GeneratorOptions.__init__(self,
+ conventions = conventions,
+ filename = filename,
+ directory = directory,
+ genpath = genpath,
+ apiname = apiname,
+ profile = profile,
+ versions = versions,
+ emitversions = emitversions,
+ defaultExtensions = defaultExtensions,
+ addExtensions = addExtensions,
+ removeExtensions = removeExtensions,
+ emitExtensions = emitExtensions,
+ sortProcedure = sortProcedure)
self.prefixText = prefixText
self.prefixText = None
self.apicall = apicall
diff --git a/scripts/lvl_genvk.py b/scripts/lvl_genvk.py
index 3de9821..4fdc6ce 100644
--- a/scripts/lvl_genvk.py
+++ b/scripts/lvl_genvk.py
@@ -68,6 +68,9 @@
# Output target directory
directory = args.directory
+ # Path to generated files, particularly api.py
+ genpath = args.genpath
+
# Descriptive names for various regexp patterns used to select
# versions and extensions
allFeatures = allExtensions = '.*'
@@ -122,6 +125,7 @@
conventions = conventions,
filename = 'thread_safety.h',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -146,6 +150,7 @@
conventions = conventions,
filename = 'thread_safety.cpp',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -170,6 +175,7 @@
conventions = conventions,
filename = 'parameter_validation.cpp',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -194,6 +200,7 @@
conventions = conventions,
filename = 'parameter_validation.h',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -218,6 +225,7 @@
conventions = conventions,
filename = 'object_tracker.cpp',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -243,6 +251,7 @@
conventions = conventions,
filename = 'object_tracker.h',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -268,6 +277,7 @@
conventions = conventions,
filename = 'vk_dispatch_table_helper.h',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -291,6 +301,7 @@
conventions = conventions,
filename = 'lvt_function_pointers.h',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -315,6 +326,7 @@
conventions = conventions,
filename = 'lvt_function_pointers.cpp',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -339,6 +351,7 @@
conventions = conventions,
filename = 'vk_layer_dispatch_table.h',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -362,6 +375,7 @@
conventions = conventions,
filename = 'vk_enum_string_helper.h',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -386,6 +400,7 @@
conventions = conventions,
filename = 'vk_safe_struct.h',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -410,6 +425,7 @@
conventions = conventions,
filename = 'vk_safe_struct.cpp',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -434,6 +450,7 @@
conventions = conventions,
filename = 'vk_object_types.h',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -458,6 +475,7 @@
conventions = conventions,
filename = 'vk_extension_helper.h',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -482,6 +500,7 @@
conventions = conventions,
filename = 'vk_typemap_helper.h',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -508,6 +527,7 @@
conventions = conventions,
filename = 'chassis.h',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -532,6 +552,7 @@
conventions = conventions,
filename = 'chassis.cpp',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -556,6 +577,7 @@
conventions = conventions,
filename = 'layer_chassis_dispatch.cpp',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -580,6 +602,7 @@
conventions = conventions,
filename = 'layer_chassis_dispatch.h',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -604,6 +627,7 @@
conventions = conventions,
filename = 'command_counter_helper.h',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -628,6 +652,7 @@
conventions = conventions,
filename = 'command_counter_helper.cpp',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -652,6 +677,7 @@
conventions = conventions,
filename = 'best_practices.cpp',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -676,6 +702,7 @@
conventions = conventions,
filename = 'best_practices.h',
directory = directory,
+ genpath = None,
apiname = 'vulkan',
profile = None,
versions = featuresPat,
@@ -693,6 +720,33 @@
expandEnumerants = False)
]
+# Create an API generator and corresponding generator options based on
+# the requested target and command line options.
+ # Helper file generator options for synchronization_validation_types.h
+ genOpts['synchronization_validation_types.h'] = [
+ HelperFileOutputGenerator,
+ HelperFileOutputGeneratorOptions(
+ conventions = conventions,
+ filename = 'synchronization_validation_types.h',
+ directory = directory,
+ apiname = 'vulkan',
+ profile = None,
+ versions = featuresPat,
+ emitversions = featuresPat,
+ defaultExtensions = 'vulkan',
+ addExtensions = addExtensionsPat,
+ removeExtensions = removeExtensionsPat,
+ emitExtensions = emitExtensionsPat,
+ prefixText = prefixStrings + vkPrefixStrings,
+ protectFeature = False,
+ apicall = 'VKAPI_ATTR ',
+ apientry = 'VKAPI_CALL ',
+ apientryp = 'VKAPI_PTR *',
+ alignFuncParam = 48,
+ expandEnumerants = False,
+ helper_file_type = 'synchronization_helper_header')
+ ]
+
# Generate a target based on the options in the matching genOpts{} object.
# This is encapsulated in a function so it can be profiled and/or timed.
# The args parameter is an parsed argument object containing the following
@@ -705,7 +759,7 @@
def genTarget(args):
global genOpts
- # Create generator options with specified parameters
+ # Create generator options with parameters specified on command line
makeGenOpts(args)
if (args.target in genOpts.keys()):
@@ -721,19 +775,16 @@
write('* options.removeExtensions =', options.removeExtensions, file=sys.stderr)
write('* options.emitExtensions =', options.emitExtensions, file=sys.stderr)
- startTimer(args.time)
gen = createGenerator(errFile=errWarn,
warnFile=errWarn,
diagFile=diag)
- reg.setGenerator(gen)
- reg.apiGen(options)
-
if not args.quiet:
write('* Generated', options.filename, file=sys.stderr)
- endTimer(args.time, '* Time to generate ' + options.filename + ' =')
+ return (gen, options)
else:
write('No generator options for unknown target:',
args.target, file=sys.stderr)
+ return none
# -feature name
# -extension name
@@ -777,7 +828,9 @@
parser.add_argument('-time', action='store_true',
help='Enable timing')
parser.add_argument('-validate', action='store_true',
- help='Enable group validation')
+ help='Enable XML group validation')
+ parser.add_argument('-genpath', action='store', default='gen',
+ help='Path to generated files')
parser.add_argument('-o', action='store', dest='directory',
default='.',
help='Create target and related files in specified directory')
@@ -827,27 +880,6 @@
args.feature = [name for arg in args.feature for name in arg.split()]
args.extension = [name for arg in args.extension for name in arg.split()]
- # Load & parse registry
- reg = Registry()
-
- startTimer(args.time)
- tree = etree.parse(args.registry)
- endTimer(args.time, '* Time to make ElementTree =')
-
- if args.debug:
- pdb.run('reg.loadElementTree(tree)')
- else:
- startTimer(args.time)
- reg.loadElementTree(tree)
- endTimer(args.time, '* Time to parse ElementTree =')
-
- if (args.validate):
- reg.validateGroups()
-
- if (args.dump):
- write('* Dumping registry to regdump.txt', file=sys.stderr)
- reg.dumpReg(filehandle = open('regdump.txt', 'w', encoding='utf-8'))
-
# create error/warning & diagnostic files
if (args.errfile):
errWarn = open(args.errfile, 'w', encoding='utf-8')
@@ -859,12 +891,35 @@
else:
diag = None
+ # Create the API generator & generator options
+ (gen, options) = genTarget(args)
+
+ # Create the registry object with the specified generator and generator
+ # options. The options are set before XML loading as they may affect it.
+ reg = Registry(gen, options)
+
+ # Parse the specified registry XML into an ElementTree object
+ startTimer(args.time)
+ tree = etree.parse(args.registry)
+ endTimer(args.time, '* Time to make ElementTree =')
+
+ # Load the XML tree into the registry object
+ startTimer(args.time)
+ reg.loadElementTree(tree)
+ endTimer(args.time, '* Time to parse ElementTree =')
+
+ if (args.validate):
+ reg.validateGroups()
+
+ if (args.dump):
+ write('* Dumping registry to regdump.txt', file=sys.stderr)
+ reg.dumpReg(filehandle = open('regdump.txt', 'w', encoding='utf-8'))
+
+ # Finally, use the output generator to create the requested target
if (args.debug):
- pdb.run('genTarget(args)')
- elif (args.profile):
- import cProfile, pstats
- cProfile.run('genTarget(args)', 'profile.txt')
- p = pstats.Stats('profile.txt')
- p.strip_dirs().sort_stats('time').print_stats(50)
+ pdb.run('reg.apiGen()')
else:
+ startTimer(args.time)
+ reg.apiGen()
+ endTimer(args.time, '* Time to generate ' + options.filename + ' =')
genTarget(args)
diff --git a/scripts/lvt_file_generator.py b/scripts/lvt_file_generator.py
index 60e1a36..dc054b9 100644
--- a/scripts/lvt_file_generator.py
+++ b/scripts/lvt_file_generator.py
@@ -47,6 +47,7 @@
conventions = None,
filename = None,
directory = '.',
+ genpath = None,
apiname = None,
profile = None,
versions = '.*',
@@ -64,9 +65,20 @@
alignFuncParam = 0,
expandEnumerants = True,
lvt_file_type = ''):
- GeneratorOptions.__init__(self, conventions, filename, directory, apiname, profile,
- versions, emitversions, defaultExtensions,
- addExtensions, removeExtensions, emitExtensions, sortProcedure)
+ GeneratorOptions.__init__(self,
+ conventions = conventions,
+ filename = filename,
+ directory = directory,
+ genpath = genpath,
+ apiname = apiname,
+ profile = profile,
+ versions = versions,
+ emitversions = emitversions,
+ defaultExtensions = defaultExtensions,
+ addExtensions = addExtensions,
+ removeExtensions = removeExtensions,
+ emitExtensions = emitExtensions,
+ sortProcedure = sortProcedure)
self.prefixText = prefixText
self.genFuncPointers = genFuncPointers
self.prefixText = None
diff --git a/scripts/object_tracker_generator.py b/scripts/object_tracker_generator.py
index 22b6005..ced70f8 100644
--- a/scripts/object_tracker_generator.py
+++ b/scripts/object_tracker_generator.py
@@ -67,6 +67,7 @@
conventions = None,
filename = None,
directory = '.',
+ genpath = None,
apiname = None,
profile = None,
versions = '.*',
@@ -88,9 +89,20 @@
alignFuncParam = 0,
expandEnumerants = True,
valid_usage_path = ''):
- GeneratorOptions.__init__(self, conventions, filename, directory, apiname, profile,
- versions, emitversions, defaultExtensions,
- addExtensions, removeExtensions, emitExtensions, sortProcedure)
+ GeneratorOptions.__init__(self,
+ conventions = conventions,
+ filename = filename,
+ directory = directory,
+ genpath = genpath,
+ apiname = apiname,
+ profile = profile,
+ versions = versions,
+ emitversions = emitversions,
+ defaultExtensions = defaultExtensions,
+ addExtensions = addExtensions,
+ removeExtensions = removeExtensions,
+ emitExtensions = emitExtensions,
+ sortProcedure = sortProcedure)
self.prefixText = prefixText
self.genFuncPointers = genFuncPointers
self.protectFile = protectFile
@@ -135,6 +147,7 @@
self.no_autogen_list = [
'vkDestroyInstance',
'vkCreateInstance',
+ 'vkCreateDevice',
'vkEnumeratePhysicalDevices',
'vkGetPhysicalDeviceQueueFamilyProperties',
'vkGetPhysicalDeviceQueueFamilyProperties2',
@@ -214,6 +227,7 @@
"VkGraphicsPipelineCreateInfo-basePipelineHandle": "\"VUID-VkGraphicsPipelineCreateInfo-flags-00722\"",
"VkComputePipelineCreateInfo-basePipelineHandle": "\"VUID-VkComputePipelineCreateInfo-flags-00697\"",
"VkRayTracingPipelineCreateInfoNV-basePipelineHandle": "\"VUID-VkRayTracingPipelineCreateInfoNV-flags-03421\"",
+ "VkRayTracingPipelineCreateInfoKHR-basePipelineHandle": "\"VUID-VkRayTracingPipelineCreateInfoKHR-flags-03421\"",
}
# Commands shadowed by interface functions and are not implemented
@@ -262,7 +276,10 @@
# Matching logic in parameter validation and ValidityOutputGenerator.isHandleOptional
optString = param.attrib.get('noautovalidity')
if optString and optString == 'true':
- isoptional = True;
+ if param.attrib.get('len'):
+ isoptional = [True, True]
+ else:
+ isoptional = True
return isoptional
#
# Get VUID identifier from implicit VUID tag
@@ -315,7 +332,10 @@
for handle in self.object_types:
if self.handle_types.IsNonDispatchable(handle) and not self.is_aliased_type[handle]:
if (objtype == 'device' and self.handle_parents.IsParentDevice(handle)) or (objtype == 'instance' and not self.handle_parents.IsParentDevice(handle)):
- output_func += ' skip |= ReportLeaked%sObjects(%s, %s, error_code);\n' % (upper_objtype, objtype, self.GetVulkanObjType(handle))
+ comment_prefix = ''
+ if (handle == 'VkDisplayKHR' or handle == 'VkDisplayModeKHR'):
+ comment_prefix = '// No destroy API -- do not report: '
+ output_func += ' %sskip |= ReportLeaked%sObjects(%s, %s, error_code);\n' % (comment_prefix, upper_objtype, objtype, self.GetVulkanObjType(handle))
output_func += ' return skip;\n'
output_func += '}\n'
return output_func
@@ -380,7 +400,7 @@
self.valid_usage_path = genOpts.valid_usage_path
vu_json_filename = os.path.join(self.valid_usage_path + os.sep, 'validusage.json')
if os.path.isfile(vu_json_filename):
- json_file = open(vu_json_filename, 'r')
+ json_file = open(vu_json_filename, 'r', encoding='utf-8')
self.vuid_dict = json.load(json_file)
json_file.close()
if len(self.vuid_dict) == 0:
@@ -789,10 +809,17 @@
if member.iscreate and first_level_param and member == members[-1]:
continue
if member.type in self.handle_types:
- count_name = member.len
- if (count_name is not None):
+ if member.len:
count_name = '%s%s' % (prefix, member.len)
- null_allowed = member.isoptional
+ # isoptional may be a list for array types: [the array, the array elements]
+ if type(member.isoptional) == list:
+ null_allowed = member.isoptional[1]
+ else:
+ # Default to false if a value is not provided for the array elements
+ null_allowed = False
+ else:
+ count_name = None
+ null_allowed = member.isoptional
tmp_pre = self.outputObjects(member.type, member.name, count_name, prefix, index, indent, disp_name, parent_name, str(null_allowed).lower(), first_level_param)
pre_code += tmp_pre
# Handle Structs that contain objects at some level
@@ -891,11 +918,15 @@
# Generate member info
membersInfo = []
allocator = 'nullptr'
+
for member in members:
# Get type and name of member
info = self.getTypeNameTuple(member)
type = info[0]
name = info[1]
+ # Skip fake parameters
+ if type == '' or name == '':
+ continue
cdecl = self.makeCParamDecl(member, 0)
# Check for parameter name in lens set
iscount = True if name in lens else False
@@ -937,7 +968,6 @@
manual = False
if cmdname in self.no_autogen_list:
manual = True
-
# Generate object handling code
(pre_call_validate, pre_call_record, post_call_record) = self.generate_wrapping_code(cmdinfo.elem)
diff --git a/scripts/parameter_validation_generator.py b/scripts/parameter_validation_generator.py
index a106634..d5e01c5 100644
--- a/scripts/parameter_validation_generator.py
+++ b/scripts/parameter_validation_generator.py
@@ -67,6 +67,7 @@
conventions = None,
filename = None,
directory = '.',
+ genpath = None,
apiname = None,
profile = None,
versions = '.*',
@@ -85,9 +86,20 @@
alignFuncParam = 0,
expandEnumerants = True,
valid_usage_path = ''):
- GeneratorOptions.__init__(self, conventions, filename, directory, apiname, profile,
- versions, emitversions, defaultExtensions,
- addExtensions, removeExtensions, emitExtensions, sortProcedure)
+ GeneratorOptions.__init__(self,
+ conventions = conventions,
+ filename = filename,
+ directory = directory,
+ genpath = genpath,
+ apiname = apiname,
+ profile = profile,
+ versions = versions,
+ emitversions = emitversions,
+ defaultExtensions = defaultExtensions,
+ addExtensions = addExtensions,
+ removeExtensions = removeExtensions,
+ emitExtensions = emitExtensions,
+ sortProcedure = sortProcedure)
self.prefixText = prefixText
self.apicall = apicall
self.apientry = apientry
@@ -191,11 +203,38 @@
'vkCmdSetViewportWScalingNV',
'vkAcquireNextImageKHR',
'vkAcquireNextImage2KHR',
+ 'vkCmdBindTransformFeedbackBuffersEXT',
+ 'vkCmdBeginTransformFeedbackEXT',
+ 'vkCmdEndTransformFeedbackEXT',
'vkCmdDrawIndirectByteCountEXT',
'vkCreateSamplerYcbcrConversion',
'vkCreateSamplerYcbcrConversionKHR',
'vkImportSemaphoreFdKHR',
'vkCmdBindVertexBuffers',
+ 'vkCreateImageView',
+ 'vkCopyAccelerationStructureToMemoryKHR',
+ 'vkCmdCopyAccelerationStructureToMemoryKHR',
+ 'vkCopyAccelerationStructureKHR',
+ 'vkCmdCopyAccelerationStructureKHR',
+ 'vkCopyMemoryToAccelerationStructureKHR',
+ 'vkCmdCopyMemoryToAccelerationStructureKHR',
+ 'vkCmdDrawIndirectCount',
+ 'vkCmdDrawIndirectCountKHR',
+ 'vkCmdDrawIndexedIndirectCount',
+ 'vkCmdDrawIndexedIndirectCountKHR',
+ 'vkCmdWriteAccelerationStructuresPropertiesKHR',
+ 'vkWriteAccelerationStructuresPropertiesKHR',
+ 'vkGetRayTracingCaptureReplayShaderGroupHandlesKHR',
+ 'vkCmdTraceRaysKHR',
+ 'vkCmdTraceRaysNV',
+ 'vkCmdTraceRaysIndirectKHR',
+ 'vkCmdBuildAccelerationStructureIndirectKHR',
+ 'vkGetDeviceAccelerationStructureCompatibilityKHR',
+ 'vkBuildAccelerationStructureKHR',
+ 'vkCmdBuildAccelerationStructureKHR',
+ 'vkCmdSetViewportWithCountEXT',
+ 'vkCmdSetScissorWithCountEXT',
+ 'vkCmdBindVertexBuffers2EXT',
]
# Commands to ignore
@@ -332,7 +371,7 @@
self.valid_usage_path = genOpts.valid_usage_path
vu_json_filename = os.path.join(self.valid_usage_path + os.sep, 'validusage.json')
if os.path.isfile(vu_json_filename):
- json_file = open(vu_json_filename, 'r')
+ json_file = open(vu_json_filename, 'r', encoding='utf-8')
self.vuid_dict = json.load(json_file)
json_file.close()
if len(self.vuid_dict) == 0:
@@ -375,7 +414,7 @@
protect = self.struct_feature_protect[item]
pnext_case += '#ifdef %s\n' % protect
pnext_case += ' // Validation code for %s structure members\n' % item
- pnext_case += ' case %s: {\n' % self.structTypes[item]
+ pnext_case += ' case %s: { // Covers VUID-%s-sType-sType\n' % (self.structTypes[item], item)
pnext_case += ' %s *structure = (%s *) header;\n' % (item, item)
expr = self.expandStructCode(item, item, 'structure->', '', ' ', [], postProcSpec)
struct_validation_source = self.ScrubStructCode(expr)
@@ -386,6 +425,8 @@
# Skip functions containing no validation
if struct_validation_source:
pnext_handler += pnext_case;
+ else:
+ pnext_handler += '\n // No Validation code for %s structure members -- Covers VUID-%s-sType-sType\n' % (item, item)
pnext_handler += ' default:\n'
pnext_handler += ' skip = false;\n'
pnext_handler += ' }\n'
diff --git a/scripts/sync_val_gen.py b/scripts/sync_val_gen.py
new file mode 100644
index 0000000..6843d9a
--- /dev/null
+++ b/scripts/sync_val_gen.py
@@ -0,0 +1,897 @@
+#!/usr/bin/python3 -i
+#
+# Copyright (c) 2015-2020 The Khronos Group Inc.
+# Copyright (c) 2015-2020 Valve Corporation
+# Copyright (c) 2015-2020 LunarG, Inc.
+# Copyright (c) 2015-2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Author: John Zulauf <jzulauf@lunarg.com>
+
+# Script operation controls
+debug_table_parse = False
+debug_in_bit_order = False
+debug_top_level = False
+debug_queue_caps = False
+debug_stage_order_parse = False
+debug_bubble_insert = False
+experimental_ordering = False
+
+# Some DRY constants
+host_stage = 'VK_PIPELINE_STAGE_HOST_BIT'
+top_stage ='VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT'
+bot_stage ='VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT'
+
+# Snipped from chapters/synchronization.txt -- tag v1.2.135
+snippet_access_types_supported = '''
+[[synchronization-access-types-supported]]
+.Supported access types
+[cols="50,50",options="header"]
+|====
+|Access flag | Supported pipeline stages
+|ename:VK_ACCESS_INDIRECT_COMMAND_READ_BIT | ename:VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
+|ename:VK_ACCESS_INDEX_READ_BIT | ename:VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
+|ename:VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT | ename:VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
+
+|ename:VK_ACCESS_UNIFORM_READ_BIT |
+ifdef::VK_NV_mesh_shader[]
+ ename:VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, ename:VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
+endif::VK_NV_mesh_shader[]
+ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing[]
+ ename:VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR,
+endif::VK_NV_ray_tracing,VK_KHR_ray_tracing[]
+ ename:VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT, ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT, ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT, ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, or ename:VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT
+
+|ename:VK_ACCESS_SHADER_READ_BIT |
+ifdef::VK_NV_mesh_shader[]
+ ename:VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, ename:VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
+endif::VK_NV_mesh_shader[]
+ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing[]
+ ename:VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR,
+endif::VK_NV_ray_tracing,VK_KHR_ray_tracing[]
+ ename:VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT, ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT, ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT, ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, or ename:VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT
+
+|ename:VK_ACCESS_SHADER_WRITE_BIT |
+ifdef::VK_NV_mesh_shader[]
+ ename:VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, ename:VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
+endif::VK_NV_mesh_shader[]
+ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing[]
+ ename:VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR,
+endif::VK_NV_ray_tracing,VK_KHR_ray_tracing[]
+ ename:VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT, ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT, ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT, ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, or ename:VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT
+
+|ename:VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
+|ename:VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
+|ename:VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
+|ename:VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, or ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
+|ename:VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, or ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
+|ename:VK_ACCESS_TRANSFER_READ_BIT | ename:VK_PIPELINE_STAGE_TRANSFER_BIT
+|ename:VK_ACCESS_TRANSFER_WRITE_BIT | ename:VK_PIPELINE_STAGE_TRANSFER_BIT
+|ename:VK_ACCESS_HOST_READ_BIT | ename:VK_PIPELINE_STAGE_HOST_BIT
+|ename:VK_ACCESS_HOST_WRITE_BIT | ename:VK_PIPELINE_STAGE_HOST_BIT
+|ename:VK_ACCESS_MEMORY_READ_BIT | Any
+|ename:VK_ACCESS_MEMORY_WRITE_BIT | Any
+ifdef::VK_EXT_blend_operation_advanced[]
+|ename:VK_ACCESS_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT | ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
+endif::VK_EXT_blend_operation_advanced[]
+ifdef::VK_NV_device_generated_commands[]
+|ename:VK_ACCESS_COMMAND_PREPROCESS_READ_BIT_NV | ename:VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV
+|ename:VK_ACCESS_COMMAND_PREPROCESS_WRITE_BIT_NV | ename:VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV
+endif::VK_NV_device_generated_commands[]
+ifdef::VK_EXT_conditional_rendering[]
+|ename:VK_ACCESS_CONDITIONAL_RENDERING_READ_BIT_EXT | ename:VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT
+endif::VK_EXT_conditional_rendering[]
+ifdef::VK_NV_shading_rate_image[]
+|ename:VK_ACCESS_SHADING_RATE_IMAGE_READ_BIT_NV | ename:VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV
+endif::VK_NV_shading_rate_image[]
+ifdef::VK_EXT_transform_feedback[]
+|ename:VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT | ename:VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT
+|ename:VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_WRITE_BIT_EXT | ename:VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT
+|ename:VK_ACCESS_TRANSFORM_FEEDBACK_COUNTER_READ_BIT_EXT | ename:VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
+endif::VK_EXT_transform_feedback[]
+ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing[]
+|ename:VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_KHR | ename:VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, or ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
+|ename:VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_KHR | ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
+endif::VK_NV_ray_tracing,VK_KHR_ray_tracing[]
+ifdef::VK_EXT_fragment_density_map[]
+|ename:VK_ACCESS_FRAGMENT_DENSITY_MAP_READ_BIT_EXT | ename:VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT
+endif::VK_EXT_fragment_density_map[]
+|====
+'''
+
+# use simplest filtering to assure completest list
+def ParseAccessType(table_text):
+ preproc = ''
+ access_stage_table = {}
+ skip = False
+ outside_table = True
+ for line in table_text.split('\n'):
+ if not line.strip():
+ continue
+ elif outside_table:
+ if line.startswith('|===='):
+ outside_table = False
+ continue
+ elif line.startswith('ifndef'):
+ # Negative preproc filter
+ preproc = line
+ skip = True # for now just ignore subset filtering
+ elif line.startswith('ifdef'):
+ # Positive preproc filter
+ preproc = line
+ skip = False # No support for nested directives...
+ elif line.startswith('endif'):
+ # Positive preproc filter
+ skip = False
+ elif (line.startswith('|ename:') or line.startswith(' ')) and not skip:
+ if debug_table_parse:
+ print("// line {}".format(line))
+ cols = line.split('|')
+ if debug_table_parse:
+ print("len(cols)", len(cols), cols)
+ if len(cols) == 3:
+ stage_column = cols[2]
+ access_enum = cols[1].split(':')[1].strip()
+ access_stage_table[access_enum]=[]
+ else:
+ stage_column = cols[0].strip()
+ if debug_table_parse:
+ print("stage_column:", stage_column)
+ if stage_column.startswith(' Any'):
+ continue
+ if stage_column.startswith(' None required'):
+ continue
+ stage_column = stage_column.replace(', or ',', ') # Oxford comma
+ stage_column = stage_column.replace(' or ',', ') # !Oxford comma
+ stage_column = stage_column.replace(', ',',')
+ stage_column = stage_column.rstrip(',')
+ stages = stage_column.split(',')
+ if debug_table_parse:
+ print("stages", len(stages), stages)
+ if len(stages) < 1:
+ continue
+ elif not stages[0]:
+ continue
+ stages_lens = [len(s.split(':')) for s in stages]
+ stage_enums = [ s.split(':')[1].strip('or ') for s in stages]
+
+ access_stage_table[access_enum] += stage_enums
+ if(debug_table_parse):
+ print("// access_stage_table[{}]: {}".format(access_enum, "|".join(access_stage_table[access_enum])))
+
+ return access_stage_table
+
+def CreateStageAccessTable(stage_order, access_stage_table):
+ stage_access_table = { stage: list() for stage in stage_order}
+ for access, stages in access_stage_table.items():
+ for stage in stages:
+ stage_access_table[stage].append(access)
+
+ return stage_access_table
+
+# Snipped from chapters/synchronization.txt -- tag v1.2.135
+snippet_pipeline_stages_order = '''
+[[synchronization-pipeline-stages-types]]
+The order and set of pipeline stages executed by a given command is
+determined by the command's pipeline type, as described below:
+
+ifndef::VK_NV_mesh_shader[]
+For the graphics pipeline, the following stages occur in this order:
+endif::VK_NV_mesh_shader[]
+ifdef::VK_NV_mesh_shader[]
+For the graphics primitive shading pipeline, the following stages occur in
+this order:
+endif::VK_NV_mesh_shader[]
+
+ * ename:VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT
+ * ename:VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
+ * ename:VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
+ * ename:VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
+ * ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT
+ * ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
+ * ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
+ifdef::VK_EXT_transform_feedback[]
+ * ename:VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT
+endif::VK_EXT_transform_feedback[]
+ifdef::VK_NV_shading_rate_image[]
+ * ename:VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV
+endif::VK_NV_shading_rate_image[]
+ * ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
+ * ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
+ * ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
+ * ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
+ * ename:VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
+
+ifdef::VK_NV_mesh_shader[]
+For the graphics mesh shading pipeline, the following stages occur in this
+order:
+
+ * ename:VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT
+ * ename:VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
+ * ename:VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV
+ * ename:VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV
+ifdef::VK_NV_shading_rate_image[]
+ * ename:VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV
+endif::VK_NV_shading_rate_image[]
+ * ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
+ * ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
+ * ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
+ * ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
+ * ename:VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
+endif::VK_NV_mesh_shader[]
+
+ifdef::VK_EXT_fragment_density_map[]
+For graphics pipeline commands executing in a render pass with a fragment
+density map attachment, the following pipeline stage where the fragment
+density map read happens has no particular order relative to the other
+stages, except that it is logically earlier than
+ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT:
+
+ * ename:VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT
+ * ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
+endif::VK_EXT_fragment_density_map[]
+
+For the compute pipeline, the following stages occur in this order:
+
+ * ename:VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT
+ * ename:VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
+ * ename:VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT
+ * ename:VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
+
+ifdef::VK_EXT_conditional_rendering[]
+The conditional rendering stage is formally part of both the graphics, and
+the compute pipeline.
+The pipeline stage where the predicate read happens has unspecified order
+relative to other stages of these pipelines:
+
+ * ename:VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT
+endif::VK_EXT_conditional_rendering[]
+
+For the transfer pipeline, the following stages occur in this order:
+
+ * ename:VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT
+ * ename:VK_PIPELINE_STAGE_TRANSFER_BIT
+ * ename:VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
+
+For host operations, only one pipeline stage occurs, so no order is
+guaranteed:
+
+ * ename:VK_PIPELINE_STAGE_HOST_BIT
+
+ifdef::VK_NV_device_generated_commands[]
+For the command preprocessing pipeline, the following stages occur in this
+order:
+
+ * ename:VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT
+ * ename:VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV
+ * ename:VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
+endif::VK_NV_device_generated_commands[]
+
+ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing[]
+For the ray tracing shader pipeline, only one pipeline stage occurs, so no
+order is guaranteed:
+
+ * ename:VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR
+
+For ray tracing acceleration structure operations, only one pipeline stage
+occurs, so no order is guaranteed:
+
+ * ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
+
+endif::VK_NV_ray_tracing,VK_KHR_ray_tracing[]
+
+'''
+
+pipeline_name_labels = {
+ 'GRAPHICS': 'For the graphics primitive shading pipeline',
+ 'MESH': 'For the graphics mesh shading pipeline',
+ 'COMPUTE': 'For the compute pipeline',
+ 'TRANSFER': 'For the transfer pipeline',
+ 'HOST': 'For host operations, only one pipeline',
+ 'COMMAND_PROCESS': 'For the command preprocessing pipeline',
+ 'RAY_TRACING_SHADE': 'For the ray tracing shader pipelin',
+ 'ACCELERATION_STRUCTURE': 'For ray tracing acceleration structure operations'
+}
+
+def StageOrderListFromSet(stage_order, stage_set):
+ return [ stage for stage in stage_order if stage in stage_set]
+
+def BubbleInsertStages(stage_order, prior, subseq):
+ # Get a fixed list for the order in which we'll add... this is a 'seed' order and will guarantee repeatilbity as it fixes the
+ # order items not sorted relative to each other. Any seed would do, even alphabetical
+ stage_set = set(prior.keys()).union(set(subseq.keys()))
+
+ #stage_set_ordered = StageOrderListFromSet(stage_order, stage_set)
+ # Come up with a consistent stage order seed that will leave stage types (extension, core, vendor) grouped
+ # Reverse the strings -- a spoonerism of the whole stage string, to put the type first
+ # spoonerism -- https://en.wikipedia.org/wiki/Spoonerism
+ stage_spooner = list()
+ acme = '_AAAAAA'
+ stage_spooner = sorted([ stage.replace('_BIT', acme)[::-1] for stage in stage_set if stage != host_stage])
+ print('ZZZ BUBBLE spooner\n', '\n '.join(stage_spooner))
+
+ # De-spoonerize
+ stage_set_ordered = [ stage[::-1].replace(acme, '_BIT') for stage in stage_spooner]
+ print('ZZZ BUBBLE de-spooner\n', '\n '.join(stage_set_ordered))
+
+ stage_set_ordered.append(host_stage)
+ stages = [ stage_set_ordered.pop(0) ]
+
+ for stage in stage_set_ordered:
+ if debug_bubble_insert: print('BUBBLE adding stage:', stage)
+ inserted = False;
+ for i in range(len(stages)):
+ if stages[i] in subseq[stage]:
+ stages.insert(i, stage)
+ inserted = True
+ break
+ if not inserted:
+ stages.append(stage)
+ if debug_bubble_insert: print('BUBBLE result:', stages)
+
+ print('BUBBLE\n', '\n '.join(stages))
+ return stages
+
+def ParsePipelineStageOrder(stage_order, stage_order_snippet, config) :
+ pipeline_name = ''
+ stage_lists = {}
+ touchup = set()
+ stage_entry_prefix = '* ename:'
+ all_stages = set()
+ list_started = False
+ # Parse the snippet
+ for line in stage_order_snippet.split('\n'):
+ line = line.strip()
+ if debug_stage_order_parse: print ('STAGE_ORDER', line)
+ if not line:
+ if debug_stage_order_parse: print ('STAGE_ORDER', 'skip empty')
+ if list_started:
+ if debug_stage_order_parse: print ('STAGE_ORDER', 'EOL')
+ pipeline_name = ''
+ continue
+ if line.startswith('For') :
+ for name, label in pipeline_name_labels.items():
+ if line.startswith(label):
+ pipeline_name = name
+ stage_lists[name] = list()
+ list_started = False
+ break
+ if debug_stage_order_parse: print ('STAGE_ORDER', 'new pipeline', pipeline_name)
+ continue
+ if line.startswith(stage_entry_prefix):
+ if debug_stage_order_parse: print ('STAGE_ORDER', 'new entry')
+ list_started = True
+ stage = line.lstrip(stage_entry_prefix)
+ all_stages.add(stage)
+ if pipeline_name:
+ if debug_stage_order_parse: print ('STAGE_ORDER', 'normal entry')
+ stage_lists[pipeline_name].append(stage)
+ else:
+ # See if we've seen this before. Touchups must be novel
+ novel_stage = all([not stage in stage_list for stage_list in stage_lists.values()])
+ if (novel_stage):
+ if debug_stage_order_parse: print ('STAGE_ORDER', 'touchup entry')
+ touchup.add(stage)
+ else:
+ if debug_stage_order_parse: print ('STAGE_ORDER', 'context entry')
+
+ if debug_stage_order_parse:
+ print('STAGE_ORDER', 'PARSED PIPELINES')
+ for pipeline_name, stage_list in stage_lists.items():
+ print(pipeline_name,"|".join(stage_list))
+
+ print('STAGE_ORDER', 'PARSED all_stages')
+ print('all_stages',"|".join(all_stages))
+
+
+ # Create earlier/later maps
+ prior = { stage:set() for stage in all_stages }
+ subseq = { stage:set() for stage in all_stages }
+
+ for pipeline_name, stage_list in stage_lists.items():
+ for i in range(len(stage_list)):
+ prior[stage_list[i]].update(stage_list[:i])
+ subseq[stage_list[i]].update(stage_list[i+1:])
+
+ # Touch up the stages that don't quite parse right
+ touchups_done = set()
+
+ # FDP Stage is only constrained to be before VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
+ fdp_stage = 'VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT'
+ fdp_before = 'VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT'
+ prior[fdp_stage] = set()
+ subseq[fdp_stage] = set([fdp_before])
+ subseq[fdp_stage].update(subseq[fdp_before])
+ for stage in subseq[fdp_stage]:
+ prior[stage].add(fdp_stage)
+
+ touchups_done.add(fdp_stage)
+
+ # The is formatted oddly in the snippet, so just add it here
+ cr_stage ='VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT'
+ prior[cr_stage] = set()
+ subseq[cr_stage] = set()
+
+ touchups_done.add(cr_stage)
+
+ # Make sure top and bottom got added to every prior and subseq (respectively) except for HOST
+ # and the every stage is prior and susequent to bottom and top (respectively) also except for HOST
+ for stage, prior_stages in prior.items():
+ if stage == host_stage: continue
+ prior_stages.add(top_stage)
+ subseq[top_stage].add(stage)
+ for stage, subseq_stages in subseq.items():
+ if stage == host_stage: continue
+ subseq_stages.add(bot_stage)
+ prior[bot_stage].add(stage)
+
+ if experimental_ordering:
+ stage_order = BubbleInsertStages(stage_order, prior, subseq)
+
+ # Convert sets to ordered vectors
+ prior_sets = prior
+ prior = { key:StageOrderListFromSet(stage_order, value) for key, value in prior_sets.items() }
+ subseq_sets = subseq
+ subseq = { key:StageOrderListFromSet(stage_order, value) for key, value in subseq_sets.items() }
+
+ if debug_stage_order_parse:
+ print('STAGE_ORDER PRIOR STAGES')
+ for stage, stage_set in prior.items():
+ print(stage,"|".join(stage_set))
+
+ print('STAGE_ORDER SUBSEQUENT STAGES')
+ for stage, stage_set in subseq.items():
+ print(stage,"|".join(stage_set))
+
+ if touchups_done != touchup:
+ print('STAGE_ORDER Stage order touchups failed')
+ print('STAGE_ORDER touchups_done', touchups_done)
+ print('STAGE_ORDER touchups found', touchup)
+ exit(-1)
+
+ return { 'stages': all_stages, 'stage_lists':stage_lists, 'prior': prior, 'subseq':subseq, 'touchups':touchup }
+
+# Note: there should be a machine readable merged order, but there isn't... so we'll need some built-in consistency checks
+# Pipeline stages in rough order, merge sorted. When
+# Legal stages are masked in, remaining stages are ordered
+pipeline_order = '''
+VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT
+VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
+VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
+VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
+VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT
+VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
+VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
+VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT
+VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT
+VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV
+VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV
+VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV
+VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
+VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
+VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
+VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
+VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT
+VK_PIPELINE_STAGE_TRANSFER_BIT
+VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV
+VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT
+VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR
+VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR
+VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
+VK_PIPELINE_STAGE_HOST_BIT
+'''
+
+sync_enum_types = ('VkPipelineStageFlagBits', 'VkAccessFlagBits' )
+
+def InBitOrder(tag, enum_elem):
+ # The input may be unordered or sparse w.r.t. the mask field, sort and gap fill
+ found = []
+ for elem in enum_elem:
+ bitpos = elem.get('bitpos')
+ name = elem.get('name')
+ if not bitpos:
+ continue
+
+ if name.endswith("MAX_ENUM"):
+ break
+
+ found.append({'name': name, 'bitpos': int(bitpos)})
+
+ in_bit_order = []
+ for entry in sorted(found, key=lambda record: record['bitpos']):
+ if debug_in_bit_order:
+ print ("adding ", {'name': entry['name'], 'mask': (1 << entry['bitpos'])})
+ bitpos = entry['bitpos']
+ in_bit_order.append({'name': entry['name'], 'mask': (1 << bitpos), 'bitpos': bitpos})
+
+ return in_bit_order
+
+
+# As of tag v1.2.135
+snippet_pipeline_stages_supported = '''
+[[synchronization-pipeline-stages-supported]]
+.Supported pipeline stage flags
+[cols="60%,40%",options="header"]
+|====
+|Pipeline stage flag | Required queue capability flag
+|ename:VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT | None required
+|ename:VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT | ename:VK_QUEUE_GRAPHICS_BIT or ename:VK_QUEUE_COMPUTE_BIT
+|ename:VK_PIPELINE_STAGE_VERTEX_INPUT_BIT | ename:VK_QUEUE_GRAPHICS_BIT
+|ename:VK_PIPELINE_STAGE_VERTEX_SHADER_BIT | ename:VK_QUEUE_GRAPHICS_BIT
+|ename:VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT | ename:VK_QUEUE_GRAPHICS_BIT
+|ename:VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT | ename:VK_QUEUE_GRAPHICS_BIT
+|ename:VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT | ename:VK_QUEUE_GRAPHICS_BIT
+|ename:VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | ename:VK_QUEUE_GRAPHICS_BIT
+|ename:VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | ename:VK_QUEUE_GRAPHICS_BIT
+|ename:VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT | ename:VK_QUEUE_GRAPHICS_BIT
+|ename:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | ename:VK_QUEUE_GRAPHICS_BIT
+|ename:VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT | ename:VK_QUEUE_COMPUTE_BIT
+|ename:VK_PIPELINE_STAGE_TRANSFER_BIT | ename:VK_QUEUE_GRAPHICS_BIT, ename:VK_QUEUE_COMPUTE_BIT or ename:VK_QUEUE_TRANSFER_BIT
+|ename:VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT | None required
+|ename:VK_PIPELINE_STAGE_HOST_BIT | None required
+|ename:VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT | ename:VK_QUEUE_GRAPHICS_BIT
+|ename:VK_PIPELINE_STAGE_ALL_COMMANDS_BIT | None required
+ifdef::VK_EXT_conditional_rendering[]
+|ename:VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT | ename:VK_QUEUE_GRAPHICS_BIT or ename:VK_QUEUE_COMPUTE_BIT
+endif::VK_EXT_conditional_rendering[]
+ifdef::VK_EXT_transform_feedback[]
+|ename:VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT | ename:VK_QUEUE_GRAPHICS_BIT
+endif::VK_EXT_transform_feedback[]
+ifdef::VK_NV_device_generated_commands[]
+|ename:VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV | ename:VK_QUEUE_GRAPHICS_BIT or ename:VK_QUEUE_COMPUTE_BIT
+endif::VK_NV_device_generated_commands[]
+ifdef::VK_NV_shading_rate_image[]
+|ename:VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV | ename:VK_QUEUE_GRAPHICS_BIT
+endif::VK_NV_shading_rate_image[]
+ifdef::VK_NV_mesh_shader[]
+|ename:VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV | ename:VK_QUEUE_GRAPHICS_BIT
+|ename:VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV | ename:VK_QUEUE_GRAPHICS_BIT
+endif::VK_NV_mesh_shader[]
+ifdef::VK_NV_ray_tracing,VK_KHR_ray_tracing[]
+|ename:VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR | ename:VK_QUEUE_COMPUTE_BIT
+|ename:VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR | ename:VK_QUEUE_COMPUTE_BIT
+endif::VK_NV_ray_tracing,VK_KHR_ray_tracing[]
+ifdef::VK_EXT_fragment_density_map[]
+|ename:VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT | ename:VK_QUEUE_GRAPHICS_BIT
+endif::VK_EXT_fragment_density_map[]
+|====
+'''
+
+def BitSuffixed(name):
+ alt_bit = ('_ANDROID', '_EXT', '_IMG', '_KHR', '_NV', '_NVX')
+ bit_suf = name + '_BIT'
+ for alt in alt_bit:
+ if name.endswith(alt) :
+ bit_suf = name.replace(alt, '_BIT' + alt)
+ break
+ return bit_suf;
+
+ # Create the stage/access combination from the legal uses of access with stages
+def CreateStageAccessCombinations(config, stage_order, stage_access_types):
+ index = 0;
+ enum_prefix = config['enum_prefix']
+ stage_accesses = []
+ for stage in stage_order:
+ mini_stage = stage.lstrip()
+ if mini_stage.startswith(enum_prefix):
+ mini_stage = mini_stage.replace(enum_prefix,"")
+ else:
+ mini_stage = mini_stage.replace("VK_PIPELINE_STAGE_", "")
+ mini_stage = mini_stage.replace("_BIT", "")
+
+ # Because access_stage_table's elements order might be different sometimes.
+ # It causes the generator creates different code. It needs to be sorted.
+ stage_access_types[stage].sort();
+ for access in stage_access_types[stage]:
+ mini_access = access.replace("VK_ACCESS_", "").replace("_BIT", "")
+ stage_access = "_".join((mini_stage,mini_access))
+ stage_access = enum_prefix + stage_access
+ stage_access_bit = BitSuffixed(stage_access)
+ is_read = stage_access.endswith('_READ') or ( '_READ_' in stage_access)
+ stage_accesses.append({
+ 'stage_access': stage_access,
+ 'stage_access_string' : '"' + stage_access + '"',
+ 'stage_access_bit': stage_access_bit,
+ 'index': index,
+ 'stage': stage,
+ 'access': access,
+ 'is_read': 'true' if is_read else 'false' })
+ index += 1
+
+ # Add synthetic stage/access
+ synth_stage_access = [ 'IMAGE_LAYOUT_TRANSITION', 'QUEUE_FAMILY_OWNERSHIP_TRANSFER']
+ stage = 'VK_PIPELINE_STAGE_FLAG_BITS_MAX_ENUM' # The only invalid values available.
+ access = 'VK_ACCESS_FLAG_BITS_MAX_ENUM'
+ for synth in synth_stage_access :
+ stage_access = enum_prefix + synth
+ stage_access_bit = BitSuffixed(stage_access)
+ is_read = False # both ILT and QFO are R/W operations
+ stage_accesses.append({
+ 'stage_access': stage_access,
+ 'stage_access_string' : '"' + stage_access + '"',
+ 'stage_access_bit': stage_access_bit,
+ 'index': index,
+ 'stage': stage,
+ 'access': access,
+ 'is_read': 'true' if is_read else 'false' })
+ index += 1
+
+ return stage_accesses
+
+def StageAccessEnums(stage_accesses, config):
+ type_prefix = config['type_prefix']
+ var_prefix = config['var_prefix']
+ sync_mask_name = config['sync_mask_name']
+ indent = config['indent']
+ # The stage/access combinations in ordinal order
+ output = []
+ ordinal_name = config['ordinal_name']
+ output.append('// Unique number for each stage/access combination')
+ output.append('enum {} {{'.format(ordinal_name))
+ output.extend([ '{}{} = {},'.format(indent, e['stage_access'], e['index']) for e in stage_accesses])
+ output.append('};')
+ output.append('')
+
+ # The stage/access combinations as bit mask
+ bits_name = config['bits_name']
+ output.append('// Unique bit for each stage/access combination')
+ output.append('enum {} : {} {{'.format(bits_name, sync_mask_name))
+ output.extend([ '{}{} = {}(1) << {},'.format(indent, e['stage_access_bit'], sync_mask_name, e['stage_access']) for e in stage_accesses])
+ output.append('};')
+ output.append('')
+
+ map_name = var_prefix + 'StageAccessIndexByStageAccessBit'
+ output.append('// Map of the StageAccessIndices from the StageAccess Bit')
+ output.append('static std::map<{}, {}> {} = {{'.format(sync_mask_name, ordinal_name, map_name))
+ output.extend([ '{}{{ {}, {} }},'.format(indent, e['stage_access_bit'], e['stage_access']) for e in stage_accesses])
+ output.append('};')
+ output.append('')
+
+ # stage/access debug information based on ordinal enum
+ sa_info_type = '{}StageAccessInfoType'.format(type_prefix)
+ output.append('struct {} {{'.format(sa_info_type))
+ output.append('{}const char *name;'.format(indent))
+ output.append('{}VkPipelineStageFlagBits stage_mask;'.format(indent))
+ output.append('{}VkAccessFlagBits access_mask;'.format(indent))
+ output.append('{}{} stage_access_index;'.format(indent, ordinal_name))
+ output.append('{}{} stage_access_bit;'.format(indent, bits_name))
+ output.append('};\n')
+
+ sa_info_var = '{}StageAccessInfoByStageAccessIndex'.format(config['var_prefix'])
+ output.append('// Array of text names and component masks for each stage/access index')
+ output.append('static std::array<{}, {}> {} = {{ {{'.format(sa_info_type, len(stage_accesses), sa_info_var))
+ fields_format ='{tab}{tab}{}'
+ fields = ['stage_access_string', 'stage', 'access', 'stage_access', 'stage_access_bit']
+ for entry in stage_accesses:
+ output.append(indent+'{')
+ output.append (',\n'.join([fields_format.format(entry[field], tab=indent) for field in fields]))
+ output.append('\n' + indent +'},')
+ output.append('} };')
+ output.append('')
+
+ return output
+
+def UnpackField(map, field='name'):
+ return [ e[field] for e in map ]
+
+def CrossReferenceTable(table_name, table_desc, key_type, mapped_type, key_vec, mask_map, config):
+ indent = config['indent']
+
+ table = ['// ' + table_desc]
+ table.append('static std::map<{}, {}> {} = {{'.format(key_type, mapped_type, config['var_prefix'] + table_name))
+
+ for mask_key in key_vec:
+ mask_vec = mask_map[mask_key]
+ if len(mask_vec) == 0:
+ continue
+
+ if len(mask_vec) > 1:
+ sep = ' |\n' + indent * 2
+ table.append( '{tab}{{ {}, (\n{tab}{tab}{}\n{tab})}},'.format(mask_key, sep.join(mask_vec), tab=indent))
+ else:
+ table.append( '{}{{ {}, {}}},'.format(indent, mask_key, mask_vec[0]))
+ if(table_name == 'StageAccessMaskByAccessBit'):
+ table.append( '{}{{ {}, {}}},'.format(indent, 'VK_ACCESS_MEMORY_READ_BIT', 'syncStageAccessReadMask'))
+ table.append( '{}{{ {}, {}}},'.format(indent, 'VK_ACCESS_MEMORY_WRITE_BIT', 'syncStageAccessWriteMask'))
+ table.append('};')
+ table.append('')
+
+ return table
+
+def DoubleCrossReferenceTable(table_name, table_desc, stage_keys, access_keys, stage_access_stage_access_map, config):
+ indent = config['indent']
+ ordinal_name = config['ordinal_name']
+
+ table = ['// ' + table_desc]
+ table.append('static std::map<{vk_stage_flags}, std::map<{vk_access_flags}, {ordinal_name}>> {var_prefix}{} = {{'.format(table_name, **config))
+ sep = ' },\n' + indent * 2 + '{ '
+
+ # Because stage_access_stage_access_map's elements order might be different sometimes.
+ # It causes the generator creates different code. It needs to be sorted.
+ for i in sorted(stage_access_stage_access_map):
+ if len(stage_access_stage_access_map[i].keys()) == 0: continue
+ accesses = [ '{}, {}'.format(access, index) for access, index in sorted(stage_access_stage_access_map[i].items()) ]
+ entry_format = '{tab}{{ {key}, {{\n{tab}{tab}{{ {val} }}\n{tab}}} }},'
+ table.append( entry_format.format(key=i, val=sep.join(accesses), tab=indent))
+ table.append('};')
+ table.append('')
+
+ return table
+
+def StageAccessCrossReference(sync_enum, stage_access_combinations, config):
+ output = []
+ # Setup the cross reference tables
+ enum_in_bit_order = dict()
+ for enum_type in sync_enum_types:
+ enum_in_bit_order[enum_type] = InBitOrder(enum_type, sync_enum[enum_type])
+
+ stages_in_bit_order = enum_in_bit_order['VkPipelineStageFlagBits']
+ access_in_bit_order = enum_in_bit_order['VkAccessFlagBits']
+ stage_access_mask_stage_map = { e['name']: [] for e in stages_in_bit_order }
+ #stage_access_mask_stage_map[none_stage] = [] # Support for N/A
+ stage_access_mask_access_map = { e['name']: [] for e in access_in_bit_order }
+ stage_access_stage_access_map = { e['name']: dict() for e in stages_in_bit_order }
+
+ for stage_access_combo in stage_access_combinations:
+ combo_bit = stage_access_combo['stage_access_bit']
+ stage = stage_access_combo['stage']
+ if stage == 'VK_PIPELINE_STAGE_FLAG_BITS_MAX_ENUM': continue
+ access = stage_access_combo['access']
+ if access == 'VK_ACCESS_FLAG_BITS_MAX_ENUM' : continue
+ stage_access_mask_stage_map[stage].append(combo_bit)
+ stage_access_mask_access_map[access].append(combo_bit)
+ stage_access_stage_access_map[stage][access] = stage_access_combo['stage_access']
+
+ # sas: stage_access masks by stage used to build up SyncMaskTypes from VkPipelineStageFlagBits
+ sas_desc = 'Bit order mask of stage_access bit for each stage'
+ sas_name = 'StageAccessMaskByStageBit'
+ output.extend(CrossReferenceTable(sas_name, sas_desc, 'VkPipelineStageFlags', config['sync_mask_name'],
+ UnpackField(stages_in_bit_order), stage_access_mask_stage_map, config))
+
+ # saa -- stage_access by access used to build up SyncMaskTypes from VkAccessFlagBits
+ saa_name = 'StageAccessMaskByAccessBit'
+ saa_desc = 'Bit order mask of stage_access bit for each access'
+ output.extend(CrossReferenceTable(saa_name, saa_desc, 'VkAccessFlags', config['sync_mask_name'],
+ UnpackField(access_in_bit_order), stage_access_mask_access_map, config))
+
+ #sasa -- stage access index by stage by access
+ sasa_name = 'StageAccessIndexByStageAndAccess'
+ sasa_desc = 'stage_access index for each stage and access'
+ output.extend(DoubleCrossReferenceTable(sasa_name, sasa_desc,stages_in_bit_order, access_in_bit_order, stage_access_stage_access_map, config))
+
+ return output
+
+def GenerateStaticMask(name, desc, bits, config):
+ sep = ' |\n' + config['indent']
+ variable_format = 'static {sync_mask_name} {var_prefix}StageAccess{}Mask = ( // {}'
+ output = [variable_format.format(name, desc, **config)]
+ output.append(config['indent'] + sep.join(bits))
+ output.extend([');', ''])
+
+ return output
+
+def ReadWriteMasks(stage_access_combinations, config):
+ read_list = [ e['stage_access_bit'] for e in stage_access_combinations if e['is_read'] == 'true']
+ write_list = [ e['stage_access_bit'] for e in stage_access_combinations if e['is_read'] != 'true']
+ output = ['// Constants defining the mask of all read and write stage_access states']
+ output.extend(GenerateStaticMask('Read', 'Mask of all read StageAccess bits', read_list, config))
+ output.extend(GenerateStaticMask('Write', 'Mask of all write StageAccess bits', write_list, config))
+
+ return output
+
+def AllCommandsByQueueCapability(stage_order, stage_queue_table, config):
+ queue_cap_set = set()
+ for stage, queue_flag_list in stage_queue_table.items():
+ for queue_flag in queue_flag_list:
+ queue_cap_set.add(queue_flag)
+
+ queue_caps = sorted(queue_cap_set)
+ queue_flag_map = { queue_flag:list() for queue_flag in queue_caps }
+
+ for stage in stage_order:
+ if stage == 'VK_PIPELINE_STAGE_ALL_COMMANDS_BIT' : continue # this is the one we're skipping
+ if stage == 'VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT' : continue # we'll use the VK_QUEUE_GRAPHICS_BIT to expand this too
+
+ queue_flag_list = stage_queue_table[stage]
+
+ if len(queue_flag_list) == 0:
+ queue_flag_list = queue_caps
+
+ if debug_queue_caps: print(stage, queue_flag_list)
+ for queue_flag in queue_flag_list:
+ queue_flag_map[queue_flag].append(stage)
+
+ name = "AllCommandStagesByQueueFlags"
+ desc = 'Pipeline stages corresponding to VK_PIPELINE_STAGE_ALL_COMMANDS_BIT for each VkQueueFlagBits'
+ return CrossReferenceTable(name, desc, 'VkQueueFlagBits', 'VkPipelineStageFlags', queue_caps, queue_flag_map, config)
+
+def PipelineOrderMaskMap(stage_order, stage_order_map, config):
+ output = list()
+ prior_name = 'LogicallyEarlierStages'
+ prior_desc = 'Masks of logically earlier stage flags for a given stage flag'
+ output.extend(CrossReferenceTable(prior_name, prior_desc, config['vk_stage_bits'], config['vk_stage_flags'], stage_order,
+ stage_order_map['prior'], config))
+
+ subseq_name = 'LogicallyLaterStages'
+ subseq_desc = 'Masks of logically later stage flags for a given stage flag'
+ output.extend(CrossReferenceTable(subseq_name, subseq_desc, config['vk_stage_bits'], config['vk_stage_flags'], stage_order,
+ stage_order_map['subseq'], config))
+ return output
+
+def ShaderStageToSyncStageAccess( shader_stage_key, sync_stage_key ):
+ return ' {{VK_SHADER_STAGE_{}, {{\n SYNC_{}_SHADER_READ, SYNC_{}_SHADER_WRITE, SYNC_{}_UNIFORM_READ}}}},'.format(shader_stage_key, sync_stage_key, sync_stage_key, sync_stage_key)
+
+def ShaderStageAndSyncStageAccessMap():
+ output = []
+ output.append('struct SyncShaderStageAccess {')
+ output.append(' SyncStageAccessIndex shader_read;')
+ output.append(' SyncStageAccessIndex shader_write;')
+ output.append(' SyncStageAccessIndex uniform_read;')
+ output.append('};\n')
+ output.append('static std::map<VkShaderStageFlagBits, SyncShaderStageAccess> syncStageAccessMaskByShaderStage = {')
+ output.append(ShaderStageToSyncStageAccess('VERTEX_BIT', 'VERTEX_SHADER'))
+ output.append(ShaderStageToSyncStageAccess('TESSELLATION_CONTROL_BIT', 'TESSELLATION_CONTROL_SHADER'))
+ output.append(ShaderStageToSyncStageAccess('TESSELLATION_EVALUATION_BIT', 'TESSELLATION_EVALUATION_SHADER'))
+ output.append(ShaderStageToSyncStageAccess('GEOMETRY_BIT', 'GEOMETRY_SHADER'))
+ output.append(ShaderStageToSyncStageAccess('FRAGMENT_BIT', 'FRAGMENT_SHADER'))
+ output.append(ShaderStageToSyncStageAccess('COMPUTE_BIT', 'COMPUTE_SHADER'))
+ output.append(ShaderStageToSyncStageAccess('RAYGEN_BIT_KHR', 'RAY_TRACING_SHADER_KHR'))
+ output.append(ShaderStageToSyncStageAccess('ANY_HIT_BIT_KHR', 'RAY_TRACING_SHADER_KHR'))
+ output.append(ShaderStageToSyncStageAccess('CLOSEST_HIT_BIT_KHR', 'RAY_TRACING_SHADER_KHR'))
+ output.append(ShaderStageToSyncStageAccess('MISS_BIT_KHR', 'RAY_TRACING_SHADER_KHR'))
+ output.append(ShaderStageToSyncStageAccess('INTERSECTION_BIT_KHR', 'RAY_TRACING_SHADER_KHR'))
+ output.append(ShaderStageToSyncStageAccess('CALLABLE_BIT_KHR', 'RAY_TRACING_SHADER_KHR'))
+ output.append(ShaderStageToSyncStageAccess('TASK_BIT_NV', 'TASK_SHADER_NV'))
+ output.append(ShaderStageToSyncStageAccess('MESH_BIT_NV', 'MESH_SHADER_NV'))
+ output.append('};\n')
+ return output
+
+def GenSyncTypeHelper(gen) :
+ config = {
+ 'var_prefix': 'sync',
+ 'type_prefix': 'Sync',
+ 'enum_prefix': 'SYNC_',
+ 'indent': ' ',
+ 'sync_mask_base_type': 'uint64_t',
+ 'vk_stage_flags': 'VkPipelineStageFlags',
+ 'vk_stage_bits': 'VkPipelineStageFlagBits',
+ 'vk_access_flags': 'VkAccessFlags',
+ 'vk_access_bits': 'VkAccessFlagBits'}
+ config['sync_mask_name'] = '{}StageAccessFlags'.format(config['type_prefix'])
+ config['ordinal_name'] = '{}StageAccessIndex'.format(config['type_prefix'])
+ config['bits_name'] = '{}StageAccessFlagBits'.format(config['type_prefix'])
+
+ lines = ['#pragma once', '', '#include <array>', '#include <map>', '#include <stdint.h>', '#include <vulkan/vulkan.h>', '']
+ lines.extend(['// clang-format off', ''])
+ lines.extend(("using {} = {};".format(config['sync_mask_name'], config['sync_mask_base_type']), ''))
+
+ stage_order = pipeline_order.split()
+ access_types = {stage:list() for stage in stage_order}
+ if debug_top_level:
+ lines.append('// Access types \n// ' + '\n// '.join(access_types) + '\n' * 2)
+
+ stage_order_map = ParsePipelineStageOrder(stage_order, snippet_pipeline_stages_order, config)
+ access_stage_table = ParseAccessType(snippet_access_types_supported)
+ stage_queue_cap_table = ParseAccessType(snippet_pipeline_stages_supported)
+ stage_access_table = CreateStageAccessTable(stage_order, access_stage_table)
+ stage_access_combinations = CreateStageAccessCombinations(config, stage_order, stage_access_table)
+ lines.extend(StageAccessEnums(stage_access_combinations, config))
+
+ lines.extend(ReadWriteMasks(stage_access_combinations, config))
+
+ lines.extend(StageAccessCrossReference(gen.sync_enum, stage_access_combinations, config))
+ lines.extend(AllCommandsByQueueCapability(stage_order, stage_queue_cap_table, config))
+ lines.extend(PipelineOrderMaskMap(stage_order, stage_order_map, config))
+ lines.extend(ShaderStageAndSyncStageAccessMap())
+ return '\n'.join(lines)
diff --git a/scripts/thread_safety_generator.py b/scripts/thread_safety_generator.py
index 9b14256..c1e3e02 100644
--- a/scripts/thread_safety_generator.py
+++ b/scripts/thread_safety_generator.py
@@ -63,6 +63,7 @@
conventions = None,
filename = None,
directory = '.',
+ genpath = None,
apiname = None,
profile = None,
versions = '.*',
@@ -83,9 +84,20 @@
indentFuncPointer = False,
alignFuncParam = 0,
expandEnumerants = True):
- GeneratorOptions.__init__(self, conventions, filename, directory, apiname, profile,
- versions, emitversions, defaultExtensions,
- addExtensions, removeExtensions, emitExtensions, sortProcedure)
+ GeneratorOptions.__init__(self,
+ conventions = conventions,
+ filename = filename,
+ directory = directory,
+ genpath = genpath,
+ apiname = apiname,
+ profile = profile,
+ versions = versions,
+ emitversions = emitversions,
+ defaultExtensions = defaultExtensions,
+ addExtensions = addExtensions,
+ removeExtensions = removeExtensions,
+ emitExtensions = emitExtensions,
+ sortProcedure = sortProcedure)
self.prefixText = prefixText
self.genFuncPointers = genFuncPointers
self.protectFile = protectFile
@@ -258,7 +270,7 @@
vl_concurrent_unordered_map<T, std::shared_ptr<ObjectUseData>, 6> object_table;
void CreateObject(T object) {
- object_table.insert_or_assign(object, std::make_shared<ObjectUseData>());
+ object_table.insert(object, std::make_shared<ObjectUseData>());
}
void DestroyObject(T object) {
@@ -475,7 +487,9 @@
#else // DISTINCT_NONDISPATCHABLE_HANDLES
c_uint64_t("NON_DISPATCHABLE_HANDLE", kVulkanObjectTypeUnknown, this)
#endif // DISTINCT_NONDISPATCHABLE_HANDLES
- {};
+ {
+ container_type = LayerObjectTypeThreading;
+ };
#define WRAPPER(type) \\
void StartWriteObject(type object, const char *api_name) { \\
@@ -587,7 +601,29 @@
VkPhysicalDevice physicalDevice,
uint32_t* pPropertyCount,
VkDisplayProperties2KHR* pProperties,
- VkResult result);"""
+ VkResult result);
+
+void PreCallRecordGetDisplayPlaneCapabilities2KHR(
+ VkPhysicalDevice physicalDevice,
+ const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo,
+ VkDisplayPlaneCapabilities2KHR* pCapabilities);
+
+void PostCallRecordGetDisplayPlaneCapabilities2KHR(
+ VkPhysicalDevice physicalDevice,
+ const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo,
+ VkDisplayPlaneCapabilities2KHR* pCapabilities,
+ VkResult result);
+
+#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
+
+void PostCallRecordGetRandROutputDisplayEXT(
+ VkPhysicalDevice physicalDevice,
+ Display* dpy,
+ RROutput rrOutput,
+ VkDisplayKHR* pDisplay,
+ VkResult result);
+
+#endif // VK_USE_PLATFORM_XLIB_XRANDR_EXT"""
inline_custom_source_preamble = """
@@ -1162,6 +1198,104 @@
}
}
+void ThreadSafety::PreCallRecordGetDisplayPlaneSupportedDisplaysKHR(
+ VkPhysicalDevice physicalDevice,
+ uint32_t planeIndex,
+ uint32_t* pDisplayCount,
+ VkDisplayKHR* pDisplays) {
+ // Nothing to do for this pre-call function
+}
+
+void ThreadSafety::PostCallRecordGetDisplayPlaneSupportedDisplaysKHR(
+ VkPhysicalDevice physicalDevice,
+ uint32_t planeIndex,
+ uint32_t* pDisplayCount,
+ VkDisplayKHR* pDisplays,
+ VkResult result) {
+ if ((result != VK_SUCCESS) && (result != VK_INCOMPLETE)) return;
+ if (pDisplays) {
+ for (uint32_t index = 0; index < *pDisplayCount; index++) {
+ CreateObject(pDisplays[index]);
+ }
+ }
+}
+
+void ThreadSafety::PreCallRecordGetDisplayModePropertiesKHR(
+ VkPhysicalDevice physicalDevice,
+ VkDisplayKHR display,
+ uint32_t* pPropertyCount,
+ VkDisplayModePropertiesKHR* pProperties) {
+ StartReadObject(display, "vkGetDisplayModePropertiesKHR");
+}
+
+void ThreadSafety::PostCallRecordGetDisplayModePropertiesKHR(
+ VkPhysicalDevice physicalDevice,
+ VkDisplayKHR display,
+ uint32_t* pPropertyCount,
+ VkDisplayModePropertiesKHR* pProperties,
+ VkResult result) {
+ FinishReadObject(display, "vkGetDisplayModePropertiesKHR");
+ if ((result != VK_SUCCESS) && (result != VK_INCOMPLETE)) return;
+ if (pProperties != nullptr) {
+ for (uint32_t index = 0; index < *pPropertyCount; index++) {
+ CreateObject(pProperties[index].displayMode);
+ }
+ }
+}
+
+void ThreadSafety::PreCallRecordGetDisplayModeProperties2KHR(
+ VkPhysicalDevice physicalDevice,
+ VkDisplayKHR display,
+ uint32_t* pPropertyCount,
+ VkDisplayModeProperties2KHR* pProperties) {
+ StartReadObject(display, "vkGetDisplayModeProperties2KHR");
+}
+
+void ThreadSafety::PostCallRecordGetDisplayModeProperties2KHR(
+ VkPhysicalDevice physicalDevice,
+ VkDisplayKHR display,
+ uint32_t* pPropertyCount,
+ VkDisplayModeProperties2KHR* pProperties,
+ VkResult result) {
+ FinishReadObject(display, "vkGetDisplayModeProperties2KHR");
+ if ((result != VK_SUCCESS) && (result != VK_INCOMPLETE)) return;
+ if (pProperties != nullptr) {
+ for (uint32_t index = 0; index < *pPropertyCount; index++) {
+ CreateObject(pProperties[index].displayModeProperties.displayMode);
+ }
+ }
+}
+
+void ThreadSafety::PreCallRecordGetDisplayPlaneCapabilities2KHR(
+ VkPhysicalDevice physicalDevice,
+ const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo,
+ VkDisplayPlaneCapabilities2KHR* pCapabilities) {
+ StartWriteObject(pDisplayPlaneInfo->mode, "vkGetDisplayPlaneCapabilities2KHR");
+}
+
+void ThreadSafety::PostCallRecordGetDisplayPlaneCapabilities2KHR(
+ VkPhysicalDevice physicalDevice,
+ const VkDisplayPlaneInfo2KHR* pDisplayPlaneInfo,
+ VkDisplayPlaneCapabilities2KHR* pCapabilities,
+ VkResult result) {
+ FinishWriteObject(pDisplayPlaneInfo->mode, "vkGetDisplayPlaneCapabilities2KHR");
+}
+
+#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
+
+void ThreadSafety::PostCallRecordGetRandROutputDisplayEXT(
+ VkPhysicalDevice physicalDevice,
+ Display* dpy,
+ RROutput rrOutput,
+ VkDisplayKHR* pDisplay,
+ VkResult result) {
+ if ((result != VK_SUCCESS) || (pDisplay == nullptr)) return;
+ CreateObject(*pDisplay);
+}
+
+#endif // VK_USE_PLATFORM_XLIB_XRANDR_EXT
+
+
"""
@@ -1490,6 +1624,11 @@
'vkUpdateDescriptorSets',
'vkUpdateDescriptorSetWithTemplate',
'vkUpdateDescriptorSetWithTemplateKHR',
+ 'vkGetDisplayPlaneSupportedDisplaysKHR',
+ 'vkGetDisplayModePropertiesKHR',
+ 'vkGetDisplayModeProperties2KHR',
+ 'vkGetDisplayPlaneCapabilities2KHR',
+ 'vkGetRandROutputDisplayEXT',
]
if name == 'vkQueuePresentKHR' or (name in special_functions and self.source_file):
return
diff --git a/scripts/update_deps.py b/scripts/update_deps.py
index f1fe36d..ea21c9f 100755
--- a/scripts/update_deps.py
+++ b/scripts/update_deps.py
@@ -2,7 +2,7 @@
# Copyright 2017 The Glslang Authors. All rights reserved.
# Copyright (c) 2018 Valve Corporation
-# Copyright (c) 2018 LunarG, Inc.
+# Copyright (c) 2018-2020 LunarG, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -250,6 +250,8 @@
import multiprocessing
import shlex
import shutil
+import stat
+import time
KNOWN_GOOD_FILE_NAME = 'known_good.json'
@@ -265,6 +267,14 @@
DEVNULL = open(os.devnull, 'wb')
+def on_rm_error( func, path, exc_info):
+ """Error handler for recursively removing a directory. The
+ shutil.rmtree function can fail on Windows due to read-only files.
+ This handler will change the permissions for tha file and continue.
+ """
+ os.chmod( path, stat.S_IWRITE )
+ os.unlink( path )
+
def command_output(cmd, directory, fail_ok=False):
"""Runs a command in a directory and returns its standard output stream.
@@ -333,17 +343,52 @@
if self.build_platforms == [] or platform.system().lower() in self.build_platforms:
self.on_build_platform = True
- def Clone(self):
- distutils.dir_util.mkpath(self.repo_dir)
- command_output(['git', 'clone', self.url, '.'], self.repo_dir)
+ def Clone(self, retries=10, retry_seconds=60):
+ print('Cloning {n} into {d}'.format(n=self.name, d=self.repo_dir))
+ for retry in range(retries):
+ distutils.dir_util.mkpath(self.repo_dir)
+ try:
+ command_output(['git', 'clone', self.url, '.'], self.repo_dir)
+ # If we get here, we didn't raise an error
+ return
+ except RuntimeError as e:
+ print("Error cloning on iteration {}/{}: {}".format(retry + 1, retries, e))
+ if retry + 1 < retries:
+ if retry_seconds > 0:
+ print("Waiting {} seconds before trying again".format(retry_seconds))
+ time.sleep(retry_seconds)
+ if os.path.isdir(self.repo_dir):
+ print("Removing old tree {}".format(self.repo_dir))
+ shutil.rmtree(self.repo_dir, onerror=on_rm_error)
+ continue
- def Fetch(self):
- command_output(['git', 'fetch', 'origin'], self.repo_dir)
+ # If we get here, we've exhausted our retries.
+ print("Failed to clone {} on all retries.".format(self.url))
+ raise e
+
+ def Fetch(self, retries=10, retry_seconds=60):
+ for retry in range(retries):
+ try:
+ command_output(['git', 'fetch', 'origin'], self.repo_dir)
+ # if we get here, we didn't raise an error, and we're done
+ return
+ except RuntimeError as e:
+ print("Error fetching on iteration {}/{}: {}".format(retry + 1, retries, e))
+ if retry + 1 < retries:
+ if retry_seconds > 0:
+ print("Waiting {} seconds before trying again".format(retry_seconds))
+ time.sleep(retry_seconds)
+ continue
+
+ # If we get here, we've exhausted our retries.
+ print("Failed to fetch {} on all retries.".format(self.url))
+ raise e
def Checkout(self):
print('Checking out {n} in {d}'.format(n=self.name, d=self.repo_dir))
if self._args.do_clean_repo:
- shutil.rmtree(self.repo_dir, ignore_errors=True)
+ if os.path.isdir(self.repo_dir):
+ shutil.rmtree(self.repo_dir, onerror = on_rm_error)
if not os.path.exists(os.path.join(self.repo_dir, '.git')):
self.Clone()
self.Fetch()
@@ -394,7 +439,7 @@
# repo's install dir.
for d in self.deps:
dep_commit = [r for r in repos if r.name == d['repo_name']]
- if len(dep_commit):
+ if len(dep_commit) and dep_commit[0].on_build_platform:
cmake_cmd.append('-D{var_name}={install_dir}'.format(
var_name=d['var_name'],
install_dir=dep_commit[0].install_dir))
@@ -411,9 +456,12 @@
# Use the CMake -A option to select the platform architecture
# without needing a Visual Studio generator.
if platform.system() == 'Windows':
- if self._args.arch == '64' or self._args.arch == 'x64' or self._args.arch == 'win64':
+ if self._args.arch.lower() == '64' or self._args.arch == 'x64' or self._args.arch == 'win64':
cmake_cmd.append('-A')
cmake_cmd.append('x64')
+ else:
+ cmake_cmd.append('-A')
+ cmake_cmd.append('Win32')
# Apply a generator, if one is specified. This can be used to supply
# a specific generator for the dependent repositories to match
diff --git a/scripts/vk_validation_stats.py b/scripts/vk_validation_stats.py
index cf1c8e4..c439a66 100755
--- a/scripts/vk_validation_stats.py
+++ b/scripts/vk_validation_stats.py
@@ -32,6 +32,7 @@
import re
import sys
import time
+import unicodedata
from collections import defaultdict
verbose_mode = False
@@ -45,8 +46,6 @@
vuid_prefixes = ['VUID-', 'UNASSIGNED-', 'kVUID_']
# Hard-coded flags that could be command line args, if we decide that's useful
-# replace KHR vuids with non-KHR during consistency checking
-dealias_khr = True
ignore_unassigned = True # These are not found in layer code unless they appear explicitly (most don't), so produce false positives
layer_source_files = [common_codegen.repo_relative(path) for path in [
@@ -70,76 +69,6 @@
'layers/object_lifetime_validation.h'
]]
-# This needs to be updated as new extensions roll in
-khr_aliases = {
- 'VUID-vkBindBufferMemory2KHR-device-parameter' : 'VUID-vkBindBufferMemory2-device-parameter',
- 'VUID-vkBindBufferMemory2KHR-pBindInfos-parameter' : 'VUID-vkBindBufferMemory2-pBindInfos-parameter',
- 'VUID-vkBindImageMemory2KHR-device-parameter' : 'VUID-vkBindImageMemory2-device-parameter',
- 'VUID-vkBindImageMemory2KHR-pBindInfos-parameter' : 'VUID-vkBindImageMemory2-pBindInfos-parameter',
- 'VUID-vkCmdDispatchBaseKHR-commandBuffer-parameter' : 'VUID-vkCmdDispatchBase-commandBuffer-parameter',
- 'VUID-vkCmdSetDeviceMaskKHR-commandBuffer-parameter' : 'VUID-vkCmdSetDeviceMask-commandBuffer-parameter',
- 'VUID-vkCreateDescriptorUpdateTemplateKHR-device-parameter' : 'VUID-vkCreateDescriptorUpdateTemplate-device-parameter',
- 'VUID-vkCreateDescriptorUpdateTemplateKHR-pDescriptorUpdateTemplate-parameter' : 'VUID-vkCreateDescriptorUpdateTemplate-pDescriptorUpdateTemplate-parameter',
- 'VUID-vkCreateSamplerYcbcrConversionKHR-device-parameter' : 'VUID-vkCreateSamplerYcbcrConversion-device-parameter',
- 'VUID-vkCreateSamplerYcbcrConversionKHR-pYcbcrConversion-parameter' : 'VUID-vkCreateSamplerYcbcrConversion-pYcbcrConversion-parameter',
- 'VUID-vkDestroyDescriptorUpdateTemplateKHR-descriptorUpdateTemplate-parameter' : 'VUID-vkDestroyDescriptorUpdateTemplate-descriptorUpdateTemplate-parameter',
- 'VUID-vkDestroyDescriptorUpdateTemplateKHR-descriptorUpdateTemplate-parent' : 'VUID-vkDestroyDescriptorUpdateTemplate-descriptorUpdateTemplate-parent',
- 'VUID-vkDestroyDescriptorUpdateTemplateKHR-device-parameter' : 'VUID-vkDestroyDescriptorUpdateTemplate-device-parameter',
- 'VUID-vkDestroySamplerYcbcrConversionKHR-device-parameter' : 'VUID-vkDestroySamplerYcbcrConversion-device-parameter',
- 'VUID-vkDestroySamplerYcbcrConversionKHR-ycbcrConversion-parameter' : 'VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parameter',
- 'VUID-vkDestroySamplerYcbcrConversionKHR-ycbcrConversion-parent' : 'VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parent',
- 'VUID-vkEnumeratePhysicalDeviceGroupsKHR-instance-parameter' : 'VUID-vkEnumeratePhysicalDeviceGroups-instance-parameter',
- 'VUID-vkEnumeratePhysicalDeviceGroupsKHR-pPhysicalDeviceGroupProperties-parameter' : 'VUID-vkEnumeratePhysicalDeviceGroups-pPhysicalDeviceGroupProperties-parameter',
- 'VUID-vkGetBufferMemoryRequirements2KHR-device-parameter' : 'VUID-vkGetBufferMemoryRequirements2-device-parameter',
- 'VUID-vkGetDescriptorSetLayoutSupportKHR-device-parameter' : 'VUID-vkGetDescriptorSetLayoutSupport-device-parameter',
- 'VUID-vkGetDeviceGroupPeerMemoryFeaturesKHR-device-parameter' : 'VUID-vkGetDeviceGroupPeerMemoryFeatures-device-parameter',
- 'VUID-vkGetDeviceGroupPeerMemoryFeaturesKHR-pPeerMemoryFeatures-parameter' : 'VUID-vkGetDeviceGroupPeerMemoryFeatures-pPeerMemoryFeatures-parameter',
- 'VUID-vkGetImageMemoryRequirements2KHR-device-parameter' : 'VUID-vkGetImageMemoryRequirements2-device-parameter',
- 'VUID-vkGetImageSparseMemoryRequirements2KHR-device-parameter' : 'VUID-vkGetImageSparseMemoryRequirements2-device-parameter',
- 'VUID-vkGetImageSparseMemoryRequirements2KHR-pSparseMemoryRequirements-parameter' : 'VUID-vkGetImageSparseMemoryRequirements2-pSparseMemoryRequirements-parameter',
- 'VUID-vkGetPhysicalDeviceExternalBufferPropertiesKHR-physicalDevice-parameter' : 'VUID-vkGetPhysicalDeviceExternalBufferProperties-physicalDevice-parameter',
- 'VUID-vkGetPhysicalDeviceExternalFencePropertiesKHR-physicalDevice-parameter' : 'VUID-vkGetPhysicalDeviceExternalFenceProperties-physicalDevice-parameter',
- 'VUID-vkGetPhysicalDeviceExternalSemaphorePropertiesKHR-physicalDevice-parameter' : 'VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-physicalDevice-parameter',
- 'VUID-vkGetPhysicalDeviceFeatures2KHR-physicalDevice-parameter' : 'VUID-vkGetPhysicalDeviceFeatures2-physicalDevice-parameter',
- 'VUID-vkGetPhysicalDeviceFormatProperties2KHR-format-parameter' : 'VUID-vkGetPhysicalDeviceFormatProperties2-format-parameter',
- 'VUID-vkGetPhysicalDeviceFormatProperties2KHR-physicalDevice-parameter' : 'VUID-vkGetPhysicalDeviceFormatProperties2-physicalDevice-parameter',
- 'VUID-vkGetPhysicalDeviceImageFormatProperties2KHR-physicalDevice-parameter' : 'VUID-vkGetPhysicalDeviceImageFormatProperties2-physicalDevice-parameter',
- 'VUID-vkGetPhysicalDeviceMemoryProperties2KHR-physicalDevice-parameter' : 'VUID-vkGetPhysicalDeviceMemoryProperties2-physicalDevice-parameter',
- 'VUID-vkGetPhysicalDeviceProperties2KHR-physicalDevice-parameter' : 'VUID-vkGetPhysicalDeviceProperties2-physicalDevice-parameter',
- 'VUID-vkGetPhysicalDeviceQueueFamilyProperties2KHR-pQueueFamilyProperties-parameter' : 'VUID-vkGetPhysicalDeviceQueueFamilyProperties2-pQueueFamilyProperties-parameter',
- 'VUID-vkGetPhysicalDeviceSparseImageFormatProperties2KHR-pProperties-parameter' : 'VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pProperties-parameter',
- 'VUID-vkGetPhysicalDeviceSparseImageFormatProperties2KHR-physicalDevice-parameter' : 'VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-physicalDevice-parameter',
- 'VUID-vkTrimCommandPoolKHR-commandPool-parameter' : 'VUID-vkTrimCommandPool-commandPool-parameter',
- 'VUID-vkTrimCommandPoolKHR-commandPool-parent' : 'VUID-vkTrimCommandPool-commandPool-parent',
- 'VUID-vkTrimCommandPoolKHR-device-parameter' : 'VUID-vkTrimCommandPool-device-parameter',
- 'VUID-vkTrimCommandPoolKHR-flags-zerobitmask' : 'VUID-vkTrimCommandPool-flags-zerobitmask',
- 'VUID-vkUpdateDescriptorSetWithTemplateKHR-descriptorSet-parameter' : 'VUID-vkUpdateDescriptorSetWithTemplate-descriptorSet-parameter',
- 'VUID-vkUpdateDescriptorSetWithTemplateKHR-descriptorUpdateTemplate-parameter' : 'VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parameter',
- 'VUID-vkUpdateDescriptorSetWithTemplateKHR-descriptorUpdateTemplate-parent' : 'VUID-vkUpdateDescriptorSetWithTemplate-descriptorUpdateTemplate-parent',
- 'VUID-vkUpdateDescriptorSetWithTemplateKHR-device-parameter' : 'VUID-vkUpdateDescriptorSetWithTemplate-device-parameter',
- 'VUID-vkCreateDescriptorUpdateTemplateKHR-pCreateInfo-parameter' : 'VUID-vkCreateDescriptorUpdateTemplate-pCreateInfo-parameter',
- 'VUID-vkCreateSamplerYcbcrConversionKHR-pCreateInfo-parameter' : 'VUID-vkCreateSamplerYcbcrConversion-pCreateInfo-parameter',
- 'VUID-vkGetBufferMemoryRequirements2KHR-pInfo-parameter' : 'VUID-vkGetBufferMemoryRequirements2-pInfo-parameter',
- 'VUID-vkGetBufferMemoryRequirements2KHR-pMemoryRequirements-parameter' : 'VUID-vkGetBufferMemoryRequirements2-pMemoryRequirements-parameter',
- 'VUID-vkGetDescriptorSetLayoutSupportKHR-pCreateInfo-parameter' : 'VUID-vkGetDescriptorSetLayoutSupport-pCreateInfo-parameter',
- 'VUID-vkGetDescriptorSetLayoutSupportKHR-pSupport-parameter' : 'VUID-vkGetDescriptorSetLayoutSupport-pSupport-parameter',
- 'VUID-vkGetImageMemoryRequirements2KHR-pInfo-parameter' : 'VUID-vkGetImageMemoryRequirements2-pInfo-parameter',
- 'VUID-vkGetImageMemoryRequirements2KHR-pMemoryRequirements-parameter' : 'VUID-vkGetImageMemoryRequirements2-pMemoryRequirements-parameter',
- 'VUID-vkGetImageSparseMemoryRequirements2KHR-pInfo-parameter' : 'VUID-vkGetImageSparseMemoryRequirements2-pInfo-parameter',
- 'VUID-vkGetPhysicalDeviceExternalBufferPropertiesKHR-pExternalBufferInfo-parameter' : 'VUID-vkGetPhysicalDeviceExternalBufferProperties-pExternalBufferInfo-parameter',
- 'VUID-vkGetPhysicalDeviceExternalBufferPropertiesKHR-pExternalBufferProperties-parameter' : 'VUID-vkGetPhysicalDeviceExternalBufferProperties-pExternalBufferProperties-parameter',
- 'VUID-vkGetPhysicalDeviceExternalFencePropertiesKHR-pExternalFenceInfo-parameter' : 'VUID-vkGetPhysicalDeviceExternalFenceProperties-pExternalFenceInfo-parameter',
- 'VUID-vkGetPhysicalDeviceExternalFencePropertiesKHR-pExternalFenceProperties-parameter' : 'VUID-vkGetPhysicalDeviceExternalFenceProperties-pExternalFenceProperties-parameter',
- 'VUID-vkGetPhysicalDeviceExternalSemaphorePropertiesKHR-pExternalSemaphoreInfo-parameter' : 'VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-pExternalSemaphoreInfo-parameter',
- 'VUID-vkGetPhysicalDeviceExternalSemaphorePropertiesKHR-pExternalSemaphoreProperties-parameter' : 'VUID-vkGetPhysicalDeviceExternalSemaphoreProperties-pExternalSemaphoreProperties-parameter',
- 'VUID-vkGetPhysicalDeviceFeatures2KHR-pFeatures-parameter' : 'VUID-vkGetPhysicalDeviceFeatures2-pFeatures-parameter',
- 'VUID-vkGetPhysicalDeviceFormatProperties2KHR-pFormatProperties-parameter' : 'VUID-vkGetPhysicalDeviceFormatProperties2-pFormatProperties-parameter',
- 'VUID-vkGetPhysicalDeviceImageFormatProperties2KHR-pImageFormatInfo-parameter' : 'VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatInfo-parameter',
- 'VUID-vkGetPhysicalDeviceImageFormatProperties2KHR-pImageFormatProperties-parameter' : 'VUID-vkGetPhysicalDeviceImageFormatProperties2-pImageFormatProperties-parameter',
- 'VUID-vkGetPhysicalDeviceMemoryProperties2KHR-pMemoryProperties-parameter' : 'VUID-vkGetPhysicalDeviceMemoryProperties2-pMemoryProperties-parameter',
- 'VUID-vkGetPhysicalDeviceProperties2KHR-pProperties-parameter' : 'VUID-vkGetPhysicalDeviceProperties2-pProperties-parameter',
- 'VUID-vkGetPhysicalDeviceSparseImageFormatProperties2KHR-pFormatInfo-parameter' : 'VUID-vkGetPhysicalDeviceSparseImageFormatProperties2-pFormatInfo-parameter' }
-
def printHelp():
print ("Usage:")
print (" python vk_validation_stats.py <json_file>")
@@ -187,21 +116,48 @@
self.regex_dict = {}
self.regex_dict[re.compile('<.*?>|&(amp;)+lt;|&(amp;)+gt;')] = ""
self.regex_dict[re.compile(r'\\\(codeSize \\over 4\\\)')] = "(codeSize/4)"
- self.regex_dict[re.compile(r'\\\(\\lceil{\\frac{height}{maxFragmentDensityTexelSize_{height}}}\\rceil\\\)')] = "the ceiling of height/maxFragmentDensityTexelSize.height"
- self.regex_dict[re.compile(r'\\\(\\lceil{\\frac{width}{maxFragmentDensityTexelSize_{width}}}\\rceil\\\)')] = "the ceiling of width/maxFragmentDensityTexelSize.width"
- self.regex_dict[re.compile(r'\\\(\\lceil{\\frac{maxFramebufferHeight}{minFragmentDensityTexelSize_{height}}}\\rceil\\\)')] = "the ceiling of maxFramebufferHeight/minFragmentDensityTexelSize.height"
- self.regex_dict[re.compile(r'\\\(\\lceil{\\frac{maxFramebufferWidth}{minFragmentDensityTexelSize_{width}}}\\rceil\\\)')] = "the ceiling of maxFramebufferWidth/minFragmentDensityTexelSize.width"
self.regex_dict[re.compile(r'\\\(\\lceil\{\\mathit\{rasterizationSamples} \\over 32}\\rceil\\\)')] = "(rasterizationSamples/32)"
+ self.regex_dict[re.compile(r'\\\(\\left\\lceil{\\frac{maxFramebufferWidth}{minFragmentDensityTexelSize_{width}}}\\right\\rceil\\\)')] = "the ceiling of maxFramebufferWidth/minFragmentDensityTexelSize.width"
+ self.regex_dict[re.compile(r'\\\(\\left\\lceil{\\frac{maxFramebufferHeight}{minFragmentDensityTexelSize_{height}}}\\right\\rceil\\\)')] = "the ceiling of maxFramebufferHeight/minFragmentDensityTexelSize.height"
+ self.regex_dict[re.compile(r'\\\(\\left\\lceil{\\frac{width}{maxFragmentDensityTexelSize_{width}}}\\right\\rceil\\\)')] = "the ceiling of width/maxFragmentDensityTexelSize.width"
+ self.regex_dict[re.compile(r'\\\(\\left\\lceil{\\frac{height}{maxFragmentDensityTexelSize_{height}}}\\right\\rceil\\\)')] = "the ceiling of height/maxFragmentDensityTexelSize.height"
self.regex_dict[re.compile(r'\\\(\\textrm\{codeSize} \\over 4\\\)')] = "(codeSize/4)"
- self.regex_dict[re.compile('\u00b4')] = "'" # Handle acute accent
- self.regex_dict[re.compile('\u2032')] = "'" # Handle prime
- self.regex_dict[re.compile('"')] = '\\"' # Handle \"
- # Some fancy punctuation chars that break the Android build...
- self.regex_dict[re.compile('→')] = "->" # Arrow char
- self.regex_dict[re.compile('’')] = "'" # Left-slanting apostrophe to apostrophe
- self.regex_dict[re.compile('̶(0|1);')] = "'" # L/R-slanting quotes to apostrophe
- self.regex_dict[re.compile('​')] = "" # Zero width space
- self.regex_dict[re.compile('…')] = "..." # Horizontal ellipsis
+
+ # Regular expression for characters outside ascii range
+ self.unicode_regex = re.compile('[^\x00-\x7f]')
+ # Mapping from unicode char to ascii approximation
+ self.unicode_dict = {
+ '\u002b' : '+', # PLUS SIGN
+ '\u00b4' : "'", # ACUTE ACCENT
+ '\u200b' : '', # ZERO WIDTH SPACE
+ '\u2018' : "'", # LEFT SINGLE QUOTATION MARK
+ '\u2019' : "'", # RIGHT SINGLE QUOTATION MARK
+ '\u201c' : '"', # LEFT DOUBLE QUOTATION MARK
+ '\u201d' : '"', # RIGHT DOUBLE QUOTATION MARK
+ '\u2026' : '...',# HORIZONTAL ELLIPSIS
+ '\u2032' : "'", # PRIME
+ '\u2192' : '->', # RIGHTWARDS ARROW
+ }
+
+ def sanitize(self, text, location):
+ # Strip leading/trailing whitespace
+ text = text.strip()
+ # Apply regex text substitutions
+ for regex, replacement in self.regex_dict.items():
+ text = re.sub(regex, replacement, text)
+ # Un-escape html entity codes, ie &#XXXX;
+ text = html.unescape(text)
+ # Apply unicode substitutions
+ for unicode in self.unicode_regex.findall(text):
+ try:
+ # Replace known chars
+ text = text.replace(unicode, self.unicode_dict[unicode])
+ except KeyError:
+ # Strip and warn on unrecognized chars
+ text = text.replace(unicode, '')
+ name = unicodedata.name(unicode, 'UNKNOWN')
+ print('Warning: Unknown unicode character \\u{:04x} ({}) at {}'.format(ord(unicode), name, location))
+ return text
def read(self):
self.json_dict = {}
@@ -222,7 +178,6 @@
# Parse vuid from json into local databases
for apiname in validation.keys():
- # print("entrypoint:%s"%apiname)
apidict = validation[apiname]
for ext in apidict.keys():
vlist = apidict[ext]
@@ -234,10 +189,7 @@
else:
self.implicit_vuids.add(vuid_string) # otherwise, implicit
vtype = 'implicit'
- vuid_text = ventry['text']
- for regex, replacement in self.regex_dict.items():
- vuid_text = re.sub(regex, replacement, vuid_text) # do regex substitution
- vuid_text = html.unescape(vuid_text) # anything missed by the regex
+ vuid_text = self.sanitize(ventry['text'], vuid_string)
self.vuid_db[vuid_string].append({'api':apiname, 'ext':ext, 'type':vtype, 'text':vuid_text})
self.all_vuids = self.explicit_vuids | self.implicit_vuids
self.duplicate_vuids = set({v for v in self.vuid_db if len(self.vuid_db[v]) > 1})
@@ -257,8 +209,8 @@
continue
if 'kVUID_' in line:
- kvuid_pos = line.find('kVUID_'); assert(kvuid_pos >= 0);
- eq_pos = line.find('=', kvuid_pos);
+ kvuid_pos = line.find('kVUID_'); assert(kvuid_pos >= 0)
+ eq_pos = line.find('=', kvuid_pos)
if eq_pos >= 0:
kvuid = line[kvuid_pos:eq_pos].strip(' \t\n;"')
unassigned_str = line[eq_pos+1:].strip(' \t\n;"')
@@ -282,11 +234,12 @@
prepend = None
for sf in self.source_files:
line_num = 0
- with open(sf) as f:
+ with open(sf, encoding='utf-8') as f:
for line in f:
line_num = line_num + 1
if True in [line.strip().startswith(comment) for comment in ['//', '/*']]:
- continue
+ if 'VUID-' not in line or 'TODO:' in line:
+ continue
# Find vuid strings
if prepend is not None:
line = prepend[:-2] + line.lstrip().lstrip('"') # join lines skipping CR, whitespace and trailing/leading quote char
@@ -413,23 +366,6 @@
self.checks = all_checks
self.tests = all_tests
- if (dealias_khr):
- dk = set()
- for vuid in self.checks:
- if vuid in khr_aliases:
- dk.add(khr_aliases[vuid])
- else:
- dk.add(vuid)
- self.checks = dk
-
- dk = set()
- for vuid in self.tests:
- if vuid in khr_aliases:
- dk.add(khr_aliases[vuid])
- else:
- dk.add(vuid)
- self.tests = dk
-
# Report undefined VUIDs in source code
def undef_vuids_in_layer_code(self):
undef_set = self.checks - self.valid
@@ -528,19 +464,13 @@
typedef struct _vuid_spec_text_pair {
const char * vuid;
const char * spec_text;
+ const char * url_id;
} vuid_spec_text_pair;
static const vuid_spec_text_pair vuid_spec_text[] = {
"""
self.header_postamble = """};
"""
- # TODO: it might make sense to ask for khr.io short permalink
- self.spec_url_ext = "https://www.khronos.org/registry/vulkan/specs/1.%s-extensions/html/vkspec.html#%s"
- self.spec_url_khr = "https://www.khronos.org/registry/vulkan/specs/1.%s-khr-extensions/html/vkspec.html#%s"
- self.spec_url_core = "https://www.khronos.org/registry/vulkan/specs/1.%s/html/vkspec.html#%s"
- # For VUIDs that do not exist in any published spec, at least link to spec repo search
- self.spec_url_default = "https://github.com/KhronosGroup/Vulkan-Docs/search?q=%s"
-
def dump_txt(self, only_unimplemented = False):
print("\n Dumping database to text file: %s" % txt_filename)
with open (txt_filename, 'w') as txt:
@@ -627,9 +557,8 @@
# make list of spec versions containing given VUID
@staticmethod
- def make_vuid_spec_version_list(pattern):
+ def make_vuid_spec_version_list(pattern, max_minor_version):
assert pattern
- max_minor_version = 1 # needs to be bumped with new minor versions :/
all_editions_list = []
for e in reversed(range(max_minor_version+1)):
@@ -697,33 +626,36 @@
def export_header(self):
if verbose_mode:
print("\n Exporting header file to: %s" % header_filename)
- with open (header_filename, 'w') as hfile:
+ with open (header_filename, 'w', newline='\n') as hfile:
hfile.write(self.header_version)
hfile.write(self.header_preamble)
vuid_list = list(self.vj.all_vuids)
vuid_list.sort()
cmd_dict = {}
+ minor_version = int(self.vj.apiversion.split('.')[1])
+
for vuid in vuid_list:
db_entry = self.vj.vuid_db[vuid][0]
- spec_list = self.make_vuid_spec_version_list(db_entry['ext'])
+ spec_list = self.make_vuid_spec_version_list(db_entry['ext'], minor_version)
- if not spec_list: spec_url = self.spec_url_default % vuid
- elif spec_list[0]['ext']: spec_url = self.spec_url_ext % (spec_list[0]['version'], vuid)
- elif spec_list[0]['khr']: spec_url = self.spec_url_khr % (spec_list[0]['version'], vuid)
- else: spec_url = self.spec_url_core % (spec_list[0]['version'], vuid)
+ if not spec_list: spec_url_id = 'default'
+ elif spec_list[0]['ext']: spec_url_id = '1.%s-extensions' % spec_list[0]['version']
+ elif spec_list[0]['khr']: spec_url_id = '1.%s-khr-extensions' % spec_list[0]['version']
+ else: spec_url_id = '1.%s' % spec_list[0]['version']
- db_text = db_entry['text'].strip(' ')
- hfile.write(' {"%s", "%s (%s)"},\n' % (vuid, db_text, spec_url))
+ # Escape quotes when generating C strings for source code
+ db_text = db_entry['text'].replace('"', '\\"')
+ hfile.write(' {"%s", "%s", "%s"},\n' % (vuid, db_text, spec_url_id))
# For multiply-defined VUIDs, include versions with extension appended
if len(self.vj.vuid_db[vuid]) > 1:
print('Error: Found a duplicate VUID: %s' % vuid)
sys.exit(-1)
if 'commandBuffer must be in the recording state' in db_text:
- cmd_dict[vuid] = db_text
+ cmd_dict[vuid] = db_text
hfile.write(self.header_postamble)
- # Generate the information for validating recording state VUID's
+ # Generate the information for validating recording state VUID's
cmd_prefix = 'prefix##'
cmd_regex = re.compile(r'VUID-vk(Cmd|End)(\w+)')
cmd_vuid_vector = [' "VUID_Undefined"']
@@ -960,4 +892,3 @@
if __name__ == "__main__":
sys.exit(main(sys.argv[1:]))
-
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index eca8e29..76f49f2 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -18,6 +18,10 @@
# Needed to make structure definitions match with glslang libraries
add_definitions(-DNV_EXTENSIONS -DAMD_EXTENSIONS)
+if(ANNOTATED_SPEC_LINK)
+ add_definitions(-DANNOTATED_SPEC_LINK=${ANNOTATED_SPEC_LINK})
+endif()
+
if(WIN32)
add_definitions(-DVK_USE_PLATFORM_WIN32_KHR -DWIN32_LEAN_AND_MEAN -DNOMINMAX)
# Workaround for TR1 deprecation in Visual Studio 15.5 until Google Test is updated
@@ -63,10 +67,12 @@
set(LIBGLM_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/libs)
set(COMMON_CPP
+ vklayertests_instanceless.cpp
vklayertests_pipeline_shader.cpp
vklayertests_buffer_image_memory_sampler.cpp
vklayertests_others.cpp
vklayertests_best_practices.cpp
+ vklayertests_gpu.cpp
vklayertests_descriptor_renderpass_framebuffer.cpp
vklayertests_command.cpp
vklayertests_imageless_framebuffer.cpp
@@ -103,6 +109,7 @@
${PROJECT_SOURCE_DIR}/layers/generated
${GLSLANG_SPIRV_INCLUDE_DIR}
${SPIRV_TOOLS_INCLUDE_DIR}
+ ${SPIRV_HEADERS_INCLUDE_DIR}
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_BINARY_DIR}
${PROJECT_BINARY_DIR}
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp
index 822a26a..076d35d 100644
--- a/tests/layer_validation_tests.cpp
+++ b/tests/layer_validation_tests.cpp
@@ -26,6 +26,9 @@
#include "cast_utils.h"
#include "layer_validation_tests.h"
+// Global list of sType,size identifiers
+std::vector<std::pair<uint32_t, uint32_t>> custom_stype_info{};
+
VkFormat FindSupportedDepthOnlyFormat(VkPhysicalDevice phy) {
const VkFormat ds_formats[] = {VK_FORMAT_D16_UNORM, VK_FORMAT_X8_D24_UNORM_PACK32, VK_FORMAT_D32_SFLOAT};
for (uint32_t i = 0; i < size(ds_formats); ++i) {
@@ -126,27 +129,6 @@
return true;
}
-VKAPI_ATTR VkBool32 VKAPI_CALL LvtDebugReportFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
- size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
- void *pUserData) {
- ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
- if (msgFlags & errMonitor->GetMessageFlags()) {
- return errMonitor->CheckForDesiredMsg(pMsg);
- }
- return VK_FALSE;
-}
-
-VKAPI_ATTR VkBool32 VKAPI_CALL LvtDebugUtilsFunc(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
- VkDebugUtilsMessageTypeFlagsEXT messageTypes,
- const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData, void *pUserData) {
- ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
- auto msg_flags = DebugAnnotFlagsToMsgTypeFlags(messageSeverity, messageTypes);
- if (msg_flags & errMonitor->GetMessageFlags()) {
- return errMonitor->CheckForDesiredMsg(pCallbackData->pMessage);
- }
- return VK_FALSE;
-}
-
VkPhysicalDevicePushDescriptorPropertiesKHR GetPushDescriptorProperties(VkInstance instance, VkPhysicalDevice gpu) {
// Find address of extension call and make the call -- assumes needed extensions are enabled.
PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
@@ -491,6 +473,32 @@
return VK_FORMAT_UNDEFINED;
}
+void AllocateDisjointMemory(VkDeviceObj *device, PFN_vkGetImageMemoryRequirements2KHR fp, VkImage mp_image,
+ VkDeviceMemory *mp_image_mem, VkImageAspectFlagBits plane) {
+ VkImagePlaneMemoryRequirementsInfo image_plane_req = {};
+ image_plane_req.sType = VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO;
+ image_plane_req.pNext = nullptr;
+ image_plane_req.planeAspect = plane;
+
+ VkImageMemoryRequirementsInfo2 mem_req_info2 = {};
+ mem_req_info2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2;
+ mem_req_info2.pNext = (void *)&image_plane_req;
+ mem_req_info2.image = mp_image;
+
+ VkMemoryRequirements2 mp_image_mem_reqs2 = {};
+ mp_image_mem_reqs2.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2;
+ mp_image_mem_reqs2.pNext = nullptr;
+
+ fp(device->device(), &mem_req_info2, &mp_image_mem_reqs2);
+
+ VkMemoryAllocateInfo mp_image_alloc_info;
+ mp_image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ mp_image_alloc_info.pNext = nullptr;
+ mp_image_alloc_info.allocationSize = mp_image_mem_reqs2.memoryRequirements.size;
+ ASSERT_TRUE(device->phy().set_memory_type(mp_image_mem_reqs2.memoryRequirements.memoryTypeBits, &mp_image_alloc_info, 0));
+ ASSERT_VK_SUCCESS(vk::AllocateMemory(device->device(), &mp_image_alloc_info, NULL, mp_image_mem));
+}
+
void NegHeightViewportTests(VkDeviceObj *m_device, VkCommandBufferObj *m_commandBuffer, ErrorMonitor *m_errorMonitor) {
const auto &limits = m_device->props.limits;
@@ -535,15 +543,15 @@
VkResult err;
VkSampler sampler = VK_NULL_HANDLE;
if (code.length())
- test.Monitor()->SetDesiredFailureMsg(kErrorBit | kWarningBit, code);
+ test.Monitor().SetDesiredFailureMsg(kErrorBit | kWarningBit, code);
else
- test.Monitor()->ExpectSuccess();
+ test.Monitor().ExpectSuccess();
err = vk::CreateSampler(test.device(), pCreateInfo, NULL, &sampler);
if (code.length())
- test.Monitor()->VerifyFound();
+ test.Monitor().VerifyFound();
else
- test.Monitor()->VerifyNotFound();
+ test.Monitor().VerifyNotFound();
if (VK_SUCCESS == err) {
vk::DestroySampler(test.device(), sampler, NULL);
@@ -554,15 +562,15 @@
VkResult err;
VkBuffer buffer = VK_NULL_HANDLE;
if (code.length())
- test.Monitor()->SetDesiredFailureMsg(kErrorBit, code);
+ test.Monitor().SetDesiredFailureMsg(kErrorBit, code);
else
- test.Monitor()->ExpectSuccess();
+ test.Monitor().ExpectSuccess();
err = vk::CreateBuffer(test.device(), pCreateInfo, NULL, &buffer);
if (code.length())
- test.Monitor()->VerifyFound();
+ test.Monitor().VerifyFound();
else
- test.Monitor()->VerifyNotFound();
+ test.Monitor().VerifyNotFound();
if (VK_SUCCESS == err) {
vk::DestroyBuffer(test.device(), buffer, NULL);
@@ -572,16 +580,19 @@
void CreateImageTest(VkLayerTest &test, const VkImageCreateInfo *pCreateInfo, std::string code) {
VkResult err;
VkImage image = VK_NULL_HANDLE;
- if (code.length())
- test.Monitor()->SetDesiredFailureMsg(kErrorBit, code);
- else
- test.Monitor()->ExpectSuccess();
+ if (code.length()) {
+ test.Monitor().SetDesiredFailureMsg(kErrorBit, code);
+ // Very possible a test didn't check for VK_ERROR_FORMAT_NOT_SUPPORTED
+ test.Monitor().SetUnexpectedError("UNASSIGNED-CoreValidation-Image-FormatNotSupported");
+ } else {
+ test.Monitor().ExpectSuccess();
+ }
err = vk::CreateImage(test.device(), pCreateInfo, NULL, &image);
if (code.length())
- test.Monitor()->VerifyFound();
+ test.Monitor().VerifyFound();
else
- test.Monitor()->VerifyNotFound();
+ test.Monitor().VerifyNotFound();
if (VK_SUCCESS == err) {
vk::DestroyImage(test.device(), image, NULL);
@@ -592,16 +603,15 @@
VkResult err;
VkBufferView view = VK_NULL_HANDLE;
if (codes.size())
- std::for_each(codes.begin(), codes.end(),
- [&](const std::string &s) { test.Monitor()->SetDesiredFailureMsg(kErrorBit, s); });
+ std::for_each(codes.begin(), codes.end(), [&](const std::string &s) { test.Monitor().SetDesiredFailureMsg(kErrorBit, s); });
else
- test.Monitor()->ExpectSuccess();
+ test.Monitor().ExpectSuccess();
err = vk::CreateBufferView(test.device(), pCreateInfo, NULL, &view);
if (codes.size())
- test.Monitor()->VerifyFound();
+ test.Monitor().VerifyFound();
else
- test.Monitor()->VerifyNotFound();
+ test.Monitor().VerifyNotFound();
if (VK_SUCCESS == err) {
vk::DestroyBufferView(test.device(), view, NULL);
@@ -612,15 +622,15 @@
VkResult err;
VkImageView view = VK_NULL_HANDLE;
if (code.length())
- test.Monitor()->SetDesiredFailureMsg(kErrorBit, code);
+ test.Monitor().SetDesiredFailureMsg(kErrorBit, code);
else
- test.Monitor()->ExpectSuccess();
+ test.Monitor().ExpectSuccess();
err = vk::CreateImageView(test.device(), pCreateInfo, NULL, &view);
if (code.length())
- test.Monitor()->VerifyFound();
+ test.Monitor().VerifyFound();
else
- test.Monitor()->VerifyNotFound();
+ test.Monitor().VerifyNotFound();
if (VK_SUCCESS == err) {
vk::DestroyImageView(test.device(), view, NULL);
@@ -699,6 +709,20 @@
return false;
}
+bool CheckTimelineSemaphoreSupportAndInitState(VkRenderFramework *renderFramework) {
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(renderFramework->instance(),
+ "vkGetPhysicalDeviceFeatures2KHR");
+ auto timeline_semaphore_features = lvl_init_struct<VkPhysicalDeviceTimelineSemaphoreFeatures>();
+ auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&timeline_semaphore_features);
+ vkGetPhysicalDeviceFeatures2KHR(renderFramework->gpu(), &features2);
+ if (!timeline_semaphore_features.timelineSemaphore) {
+ return false;
+ }
+ renderFramework->InitState(nullptr, &features2);
+ return true;
+}
+
void VkLayerTest::VKTriangleTest(BsoFailSelect failCase) {
ASSERT_TRUE(m_device && m_device->initialized()); // VKTriangleTest assumes Init() has finished
@@ -923,32 +947,32 @@
VkLayerTest::VkLayerTest() {
m_enableWSI = false;
- m_instance_layer_names.clear();
- m_instance_extension_names.clear();
- m_device_extension_names.clear();
+ // TODO: not quite sure why most of this is here instead of in super
// Add default instance extensions to the list
- m_instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
- m_instance_extension_names.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
+ instance_extensions_.push_back(debug_reporter_.debug_extension_name);
- m_instance_layer_names.push_back("VK_LAYER_KHRONOS_validation");
+ instance_layers_.push_back(kValidationLayerName);
if (VkTestFramework::m_devsim_layer) {
if (InstanceLayerSupported("VK_LAYER_LUNARG_device_simulation")) {
- m_instance_layer_names.push_back("VK_LAYER_LUNARG_device_simulation");
+ instance_layers_.push_back("VK_LAYER_LUNARG_device_simulation");
} else {
VkTestFramework::m_devsim_layer = false;
printf(" Did not find VK_LAYER_LUNARG_device_simulation layer so it will not be enabled.\n");
}
+ } else {
+ if (InstanceLayerSupported("VK_LAYER_LUNARG_device_profile_api"))
+ instance_layers_.push_back("VK_LAYER_LUNARG_device_profile_api");
}
- this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
- this->app_info.pNext = NULL;
- this->app_info.pApplicationName = "layer_tests";
- this->app_info.applicationVersion = 1;
- this->app_info.pEngineName = "unittest";
- this->app_info.engineVersion = 1;
- this->app_info.apiVersion = VK_API_VERSION_1_0;
+ app_info_.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
+ app_info_.pNext = NULL;
+ app_info_.pApplicationName = "layer_tests";
+ app_info_.applicationVersion = 1;
+ app_info_.pEngineName = "unittest";
+ app_info_.engineVersion = 1;
+ app_info_.apiVersion = VK_API_VERSION_1_0;
// Find out what version the instance supports and record the default target instance
auto enumerateInstanceVersion = (PFN_vkEnumerateInstanceVersion)vk::GetInstanceProcAddr(nullptr, "vkEnumerateInstanceVersion");
@@ -957,7 +981,7 @@
} else {
m_instance_api_version = VK_API_VERSION_1_0;
}
- m_target_api_version = app_info.apiVersion;
+ m_target_api_version = app_info_.apiVersion;
}
bool VkLayerTest::AddSurfaceInstanceExtension() {
@@ -966,7 +990,7 @@
printf("%s %s extension not supported\n", kSkipPrefix, VK_KHR_SURFACE_EXTENSION_NAME);
return false;
}
- m_instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
+ instance_extensions_.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
bool bSupport = false;
#if defined(VK_USE_PLATFORM_WIN32_KHR)
@@ -974,7 +998,7 @@
printf("%s %s extension not supported\n", kSkipPrefix, VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
return false;
}
- m_instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
+ instance_extensions_.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
bSupport = true;
#endif
@@ -983,7 +1007,7 @@
printf("%s %s extension not supported\n", kSkipPrefix, VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
return false;
}
- m_instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
+ instance_extensions_.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
bSupport = true;
#endif
@@ -993,7 +1017,7 @@
return false;
}
if (XOpenDisplay(NULL)) {
- m_instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
+ instance_extensions_.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
bSupport = true;
}
#endif
@@ -1004,7 +1028,7 @@
return false;
}
if (!bSupport && xcb_connect(NULL, NULL)) {
- m_instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
+ instance_extensions_.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
bSupport = true;
}
#endif
@@ -1027,15 +1051,14 @@
if (target_api_version == 0) target_api_version = VK_API_VERSION_1_0;
if (target_api_version <= m_instance_api_version) {
m_target_api_version = target_api_version;
- app_info.apiVersion = m_target_api_version;
+ app_info_.apiVersion = m_target_api_version;
}
return m_target_api_version;
}
+
uint32_t VkLayerTest::DeviceValidationVersion() {
- // The validation layers, assume the version we are validating to is the apiVersion unless the device apiVersion is lower
- VkPhysicalDeviceProperties props;
- GetPhysicalDeviceProperties(&props);
- return std::min(m_target_api_version, props.apiVersion);
+ // The validation layers assume the version we are validating to is the apiVersion unless the device apiVersion is lower
+ return std::min(m_target_api_version, physDevProps().apiVersion);
}
bool VkLayerTest::LoadDeviceProfileLayer(
@@ -1055,6 +1078,24 @@
return 1;
}
+bool VkLayerTest::LoadDeviceProfileLayer(
+ PFN_vkSetPhysicalDeviceFormatProperties2EXT &fpvkSetPhysicalDeviceFormatProperties2EXT,
+ PFN_vkGetOriginalPhysicalDeviceFormatProperties2EXT &fpvkGetOriginalPhysicalDeviceFormatProperties2EXT) {
+ // Load required functions
+ fpvkSetPhysicalDeviceFormatProperties2EXT =
+ (PFN_vkSetPhysicalDeviceFormatProperties2EXT)vk::GetInstanceProcAddr(instance(), "vkSetPhysicalDeviceFormatProperties2EXT");
+ fpvkGetOriginalPhysicalDeviceFormatProperties2EXT =
+ (PFN_vkGetOriginalPhysicalDeviceFormatProperties2EXT)vk::GetInstanceProcAddr(
+ instance(), "vkGetOriginalPhysicalDeviceFormatProperties2EXT");
+
+ if (!(fpvkSetPhysicalDeviceFormatProperties2EXT) || !(fpvkGetOriginalPhysicalDeviceFormatProperties2EXT)) {
+ printf("%s Can't find device_profile_api functions; skipped.\n", kSkipPrefix);
+ return false;
+ }
+
+ return true;
+}
+
bool VkBufferTest::GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage) {
if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
return true;
@@ -1241,10 +1282,12 @@
OneOffDescriptorSet::OneOffDescriptorSet(VkDeviceObj *device, const Bindings &bindings,
VkDescriptorSetLayoutCreateFlags layout_flags, void *layout_pnext,
- VkDescriptorPoolCreateFlags poolFlags, void *allocate_pnext)
+ VkDescriptorPoolCreateFlags poolFlags, void *allocate_pnext, int buffer_info_size,
+ int image_info_size)
: device_{device}, pool_{}, layout_(device, bindings, layout_flags, layout_pnext), set_{} {
VkResult err;
-
+ buffer_infos.reserve(buffer_info_size);
+ image_infos.reserve(image_info_size);
std::vector<VkDescriptorPoolSize> sizes;
for (const auto &b : bindings) sizes.push_back({b.descriptorType, std::max(1u, b.descriptorCount)});
@@ -1274,7 +1317,6 @@
buffer_info.offset = 0;
buffer_info.range = size;
buffer_infos.emplace_back(buffer_info);
- size_t index = buffer_infos.size() - 1;
VkWriteDescriptorSet descriptor_write;
memset(&descriptor_write, 0, sizeof(descriptor_write));
@@ -1283,7 +1325,7 @@
descriptor_write.dstBinding = blinding;
descriptor_write.descriptorCount = 1;
descriptor_write.descriptorType = descriptorType;
- descriptor_write.pBufferInfo = &buffer_infos[index];
+ descriptor_write.pBufferInfo = &buffer_infos.back();
descriptor_write.pImageInfo = nullptr;
descriptor_write.pTexelBufferView = nullptr;
@@ -1306,13 +1348,12 @@
}
void OneOffDescriptorSet::WriteDescriptorImageInfo(int blinding, VkImageView image_view, VkSampler sampler,
- VkDescriptorType descriptorType) {
+ VkDescriptorType descriptorType, VkImageLayout imageLayout) {
VkDescriptorImageInfo image_info = {};
image_info.imageView = image_view;
image_info.sampler = sampler;
- image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+ image_info.imageLayout = imageLayout;
image_infos.emplace_back(image_info);
- size_t index = image_infos.size() - 1;
VkWriteDescriptorSet descriptor_write;
memset(&descriptor_write, 0, sizeof(descriptor_write));
@@ -1321,7 +1362,7 @@
descriptor_write.dstBinding = blinding;
descriptor_write.descriptorCount = 1;
descriptor_write.descriptorType = descriptorType;
- descriptor_write.pImageInfo = &image_infos[index];
+ descriptor_write.pImageInfo = &image_infos.back();
descriptor_write.pBufferInfo = nullptr;
descriptor_write.pTexelBufferView = nullptr;
@@ -1662,6 +1703,38 @@
}
}
+void CreateNVRayTracingPipelineHelper::InitShaderGroupsKHR() {
+ {
+ VkRayTracingShaderGroupCreateInfoKHR group = {};
+ group.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR;
+ group.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR;
+ group.generalShader = 0;
+ group.closestHitShader = VK_SHADER_UNUSED_KHR;
+ group.anyHitShader = VK_SHADER_UNUSED_KHR;
+ group.intersectionShader = VK_SHADER_UNUSED_KHR;
+ groups_KHR_.push_back(group);
+ }
+ {
+ VkRayTracingShaderGroupCreateInfoKHR group = {};
+ group.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR;
+ group.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR;
+ group.generalShader = VK_SHADER_UNUSED_KHR;
+ group.closestHitShader = 1;
+ group.anyHitShader = VK_SHADER_UNUSED_KHR;
+ group.intersectionShader = VK_SHADER_UNUSED_KHR;
+ groups_KHR_.push_back(group);
+ }
+ {
+ VkRayTracingShaderGroupCreateInfoKHR group = {};
+ group.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR;
+ group.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR;
+ group.generalShader = 2;
+ group.closestHitShader = VK_SHADER_UNUSED_KHR;
+ group.anyHitShader = VK_SHADER_UNUSED_KHR;
+ group.intersectionShader = VK_SHADER_UNUSED_KHR;
+ groups_KHR_.push_back(group);
+ }
+}
void CreateNVRayTracingPipelineHelper::InitDescriptorSetInfo() {
dsl_bindings_ = {
{0, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_RAYGEN_BIT_NV, nullptr},
@@ -1735,6 +1808,15 @@
rp_ci_.pGroups = groups_.data();
}
+void CreateNVRayTracingPipelineHelper::InitKHRRayTracingPipelineInfo() {
+ rp_ci_KHR_.sType = VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV;
+ rp_ci_KHR_.maxRecursionDepth = 0;
+ rp_ci_KHR_.stageCount = shader_stages_.size();
+ rp_ci_KHR_.pStages = shader_stages_.data();
+ rp_ci_KHR_.groupCount = groups_KHR_.size();
+ rp_ci_KHR_.pGroups = groups_KHR_.data();
+}
+
void CreateNVRayTracingPipelineHelper::InitPipelineCacheInfo() {
pc_ci_.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
pc_ci_.pNext = nullptr;
@@ -1743,12 +1825,12 @@
pc_ci_.pInitialData = nullptr;
}
-void CreateNVRayTracingPipelineHelper::InitInfo() {
- InitShaderGroups();
+void CreateNVRayTracingPipelineHelper::InitInfo(bool isKHR) {
+ isKHR ? InitShaderGroupsKHR() : InitShaderGroups();
InitDescriptorSetInfo();
InitPipelineLayoutInfo();
InitShaderInfo();
- InitNVRayTracingPipelineInfo();
+ isKHR ? InitKHRRayTracingPipelineInfo() : InitNVRayTracingPipelineInfo();
InitPipelineCacheInfo();
}
@@ -1763,11 +1845,17 @@
ASSERT_VK_SUCCESS(err);
}
-void CreateNVRayTracingPipelineHelper::LateBindPipelineInfo() {
+void CreateNVRayTracingPipelineHelper::LateBindPipelineInfo(bool isKHR) {
// By value or dynamically located items must be late bound
- rp_ci_.layout = pipeline_layout_.handle();
- rp_ci_.stageCount = shader_stages_.size();
- rp_ci_.pStages = shader_stages_.data();
+ if (isKHR) {
+ rp_ci_KHR_.layout = pipeline_layout_.handle();
+ rp_ci_KHR_.stageCount = shader_stages_.size();
+ rp_ci_KHR_.pStages = shader_stages_.data();
+ } else {
+ rp_ci_.layout = pipeline_layout_.handle();
+ rp_ci_.stageCount = shader_stages_.size();
+ rp_ci_.pStages = shader_stages_.data();
+ }
}
VkResult CreateNVRayTracingPipelineHelper::CreateNVRayTracingPipeline(bool implicit_destroy, bool do_late_bind) {
@@ -1786,6 +1874,21 @@
return err;
}
+VkResult CreateNVRayTracingPipelineHelper::CreateKHRRayTracingPipeline(bool implicit_destroy, bool do_late_bind) {
+ VkResult err;
+ if (do_late_bind) {
+ LateBindPipelineInfo(true /*isKHR*/);
+ }
+ if (implicit_destroy && (pipeline_ != VK_NULL_HANDLE)) {
+ vk::DestroyPipeline(layer_test_.device(), pipeline_, nullptr);
+ pipeline_ = VK_NULL_HANDLE;
+ }
+ PFN_vkCreateRayTracingPipelinesKHR vkCreateRayTracingPipelinesKHR =
+ (PFN_vkCreateRayTracingPipelinesKHR)vk::GetInstanceProcAddr(layer_test_.instance(), "vkCreateRayTracingPipelinesKHR");
+ err = vkCreateRayTracingPipelinesKHR(layer_test_.device(), pipeline_cache_, 1, &rp_ci_KHR_, nullptr, &pipeline_);
+ return err;
+}
+
namespace chain_util {
const void *ExtensionChain::Head() const { return head_; }
} // namespace chain_util
@@ -1863,9 +1966,9 @@
void BarrierQueueFamilyTestHelper::operator()(std::string img_err, std::string buf_err, uint32_t src, uint32_t dst, bool positive,
uint32_t queue_family_index, Modifier mod) {
- auto monitor = context_->layer_test->Monitor();
- if (img_err.length()) monitor->SetDesiredFailureMsg(kErrorBit | kWarningBit, img_err);
- if (buf_err.length()) monitor->SetDesiredFailureMsg(kErrorBit | kWarningBit, buf_err);
+ auto &monitor = context_->layer_test->Monitor();
+ if (img_err.length()) monitor.SetDesiredFailureMsg(kErrorBit | kWarningBit, img_err);
+ if (buf_err.length()) monitor.SetDesiredFailureMsg(kErrorBit | kWarningBit, buf_err);
image_barrier_.srcQueueFamilyIndex = src;
image_barrier_.dstQueueFamilyIndex = dst;
@@ -1895,13 +1998,1149 @@
}
if (positive) {
- monitor->VerifyNotFound();
+ monitor.VerifyNotFound();
} else {
- monitor->VerifyFound();
+ monitor.VerifyFound();
}
context_->Reset();
};
+bool InitFrameworkForRayTracingTest(VkRenderFramework *renderFramework, bool isKHR,
+ std::vector<const char *> &instance_extension_names,
+ std::vector<const char *> &device_extension_names, void *user_data, bool need_gpu_validation,
+ bool need_push_descriptors, bool deferred_state_init) {
+ const std::array<const char *, 1> required_instance_extensions = {{VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME}};
+ for (const char *required_instance_extension : required_instance_extensions) {
+ if (renderFramework->InstanceExtensionSupported(required_instance_extension)) {
+ instance_extension_names.push_back(required_instance_extension);
+ } else {
+ printf("%s %s instance extension not supported, skipping test\n", kSkipPrefix, required_instance_extension);
+ return false;
+ }
+ }
+
+ VkValidationFeatureEnableEXT enables[] = {VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT};
+ VkValidationFeatureDisableEXT disables[] = {
+ VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT, VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT,
+ VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT, VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT};
+ VkValidationFeaturesEXT features = {};
+ features.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
+ features.enabledValidationFeatureCount = 1;
+ features.pEnabledValidationFeatures = enables;
+ features.disabledValidationFeatureCount = 4;
+ features.pDisabledValidationFeatures = disables;
+
+ VkValidationFeaturesEXT *enabled_features = need_gpu_validation ? &features : nullptr;
+
+ renderFramework->InitFramework(user_data, enabled_features);
+
+ if (renderFramework->IsPlatform(kMockICD) || renderFramework->DeviceSimulation()) {
+ printf("%s Test not supported by MockICD, skipping tests\n", kSkipPrefix);
+ return false;
+ }
+
+ std::vector<const char *> required_device_extensions;
+ required_device_extensions.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ if (isKHR) {
+ required_device_extensions.push_back(VK_KHR_RAY_TRACING_EXTENSION_NAME);
+ required_device_extensions.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ required_device_extensions.push_back(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME);
+ required_device_extensions.push_back(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME);
+ required_device_extensions.push_back(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME);
+ required_device_extensions.push_back(VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME);
+ } else {
+ required_device_extensions.push_back(VK_NV_RAY_TRACING_EXTENSION_NAME);
+ }
+ if (need_push_descriptors) {
+ required_device_extensions.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
+ }
+
+ for (const char *required_device_extension : required_device_extensions) {
+ if (renderFramework->DeviceExtensionSupported(renderFramework->gpu(), nullptr, required_device_extension)) {
+ device_extension_names.push_back(required_device_extension);
+ } else {
+ printf("%s %s device extension not supported, skipping test\n", kSkipPrefix, required_device_extension);
+ return false;
+ }
+ }
+ if (!deferred_state_init) renderFramework->InitState();
+ return true;
+}
+
+void GetSimpleGeometryForAccelerationStructureTests(const VkDeviceObj &device, VkBufferObj *vbo, VkBufferObj *ibo,
+ VkGeometryNV *geometry) {
+ vbo->init(device, 1024, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+ VK_BUFFER_USAGE_RAY_TRACING_BIT_NV);
+ ibo->init(device, 1024, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+ VK_BUFFER_USAGE_RAY_TRACING_BIT_NV);
+
+ const std::vector<float> vertices = {1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f};
+ const std::vector<uint32_t> indicies = {0, 1, 2};
+
+ uint8_t *mapped_vbo_buffer_data = (uint8_t *)vbo->memory().map();
+ std::memcpy(mapped_vbo_buffer_data, (uint8_t *)vertices.data(), sizeof(float) * vertices.size());
+ vbo->memory().unmap();
+
+ uint8_t *mapped_ibo_buffer_data = (uint8_t *)ibo->memory().map();
+ std::memcpy(mapped_ibo_buffer_data, (uint8_t *)indicies.data(), sizeof(uint32_t) * indicies.size());
+ ibo->memory().unmap();
+
+ *geometry = {};
+ geometry->sType = VK_STRUCTURE_TYPE_GEOMETRY_NV;
+ geometry->geometryType = VK_GEOMETRY_TYPE_TRIANGLES_NV;
+ geometry->geometry.triangles.sType = VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV;
+ geometry->geometry.triangles.vertexData = vbo->handle();
+ geometry->geometry.triangles.vertexOffset = 0;
+ geometry->geometry.triangles.vertexCount = 3;
+ geometry->geometry.triangles.vertexStride = 12;
+ geometry->geometry.triangles.vertexFormat = VK_FORMAT_R32G32B32_SFLOAT;
+ geometry->geometry.triangles.indexData = ibo->handle();
+ geometry->geometry.triangles.indexOffset = 0;
+ geometry->geometry.triangles.indexCount = 3;
+ geometry->geometry.triangles.indexType = VK_INDEX_TYPE_UINT32;
+ geometry->geometry.triangles.transformData = VK_NULL_HANDLE;
+ geometry->geometry.triangles.transformOffset = 0;
+ geometry->geometry.aabbs = {};
+ geometry->geometry.aabbs.sType = VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV;
+}
+
+void VkLayerTest::OOBRayTracingShadersTestBody(bool gpu_assisted) {
+ std::array<const char *, 1> required_instance_extensions = {{VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME}};
+ for (auto instance_extension : required_instance_extensions) {
+ if (InstanceExtensionSupported(instance_extension)) {
+ m_instance_extension_names.push_back(instance_extension);
+ } else {
+ printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix, instance_extension);
+ return;
+ }
+ }
+
+ VkValidationFeatureEnableEXT validation_feature_enables[] = {VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT};
+ VkValidationFeatureDisableEXT validation_feature_disables[] = {
+ VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT, VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT,
+ VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT, VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT};
+ VkValidationFeaturesEXT validation_features = {};
+ validation_features.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
+ validation_features.enabledValidationFeatureCount = 1;
+ validation_features.pEnabledValidationFeatures = validation_feature_enables;
+ validation_features.disabledValidationFeatureCount = 4;
+ validation_features.pDisabledValidationFeatures = validation_feature_disables;
+ bool descriptor_indexing = CheckDescriptorIndexingSupportAndInitFramework(
+ this, m_instance_extension_names, m_device_extension_names, gpu_assisted ? &validation_features : nullptr, m_errorMonitor);
+
+ if (IsPlatform(kMockICD) || DeviceSimulation()) {
+ printf("%s Test not supported by MockICD, skipping tests\n", kSkipPrefix);
+ return;
+ }
+
+ std::array<const char *, 2> required_device_extensions = {
+ {VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME, VK_NV_RAY_TRACING_EXTENSION_NAME}};
+ for (auto device_extension : required_device_extensions) {
+ if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
+ m_device_extension_names.push_back(device_extension);
+ } else {
+ printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
+ return;
+ }
+ }
+
+ VkPhysicalDeviceFeatures2KHR features2 = {};
+ auto indexing_features = lvl_init_struct<VkPhysicalDeviceDescriptorIndexingFeaturesEXT>();
+ if (descriptor_indexing) {
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+
+ features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&indexing_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+
+ if (!indexing_features.runtimeDescriptorArray || !indexing_features.descriptorBindingPartiallyBound ||
+ !indexing_features.descriptorBindingSampledImageUpdateAfterBind ||
+ !indexing_features.descriptorBindingVariableDescriptorCount) {
+ printf("Not all descriptor indexing features supported, skipping descriptor indexing tests\n");
+ descriptor_indexing = false;
+ }
+ }
+ VkCommandPoolCreateFlags pool_flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, pool_flags));
+
+ PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
+ (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
+
+ auto ray_tracing_properties = lvl_init_struct<VkPhysicalDeviceRayTracingPropertiesNV>();
+ auto properties2 = lvl_init_struct<VkPhysicalDeviceProperties2KHR>(&ray_tracing_properties);
+ vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
+ if (ray_tracing_properties.maxTriangleCount == 0) {
+ printf("%s Did not find required ray tracing properties; skipped.\n", kSkipPrefix);
+ return;
+ }
+
+ VkQueue ray_tracing_queue = m_device->m_queue;
+ uint32_t ray_tracing_queue_family_index = 0;
+
+ // If supported, run on the compute only queue.
+ uint32_t compute_only_queue_family_index = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
+ if (compute_only_queue_family_index != UINT32_MAX) {
+ const auto &compute_only_queues = m_device->queue_family_queues(compute_only_queue_family_index);
+ if (!compute_only_queues.empty()) {
+ ray_tracing_queue = compute_only_queues[0]->handle();
+ ray_tracing_queue_family_index = compute_only_queue_family_index;
+ }
+ }
+
+ VkCommandPoolObj ray_tracing_command_pool(m_device, ray_tracing_queue_family_index,
+ VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
+ VkCommandBufferObj ray_tracing_command_buffer(m_device, &ray_tracing_command_pool);
+
+ struct AABB {
+ float min_x;
+ float min_y;
+ float min_z;
+ float max_x;
+ float max_y;
+ float max_z;
+ };
+
+ const std::vector<AABB> aabbs = {{-1.0f, -1.0f, -1.0f, +1.0f, +1.0f, +1.0f}};
+
+ struct VkGeometryInstanceNV {
+ float transform[12];
+ uint32_t instanceCustomIndex : 24;
+ uint32_t mask : 8;
+ uint32_t instanceOffset : 24;
+ uint32_t flags : 8;
+ uint64_t accelerationStructureHandle;
+ };
+
+ VkDeviceSize aabb_buffer_size = sizeof(AABB) * aabbs.size();
+ VkBufferObj aabb_buffer;
+ aabb_buffer.init(*m_device, aabb_buffer_size, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+ VK_BUFFER_USAGE_RAY_TRACING_BIT_NV, {ray_tracing_queue_family_index});
+
+ uint8_t *mapped_aabb_buffer_data = (uint8_t *)aabb_buffer.memory().map();
+ std::memcpy(mapped_aabb_buffer_data, (uint8_t *)aabbs.data(), static_cast<std::size_t>(aabb_buffer_size));
+ aabb_buffer.memory().unmap();
+
+ VkGeometryNV geometry = {};
+ geometry.sType = VK_STRUCTURE_TYPE_GEOMETRY_NV;
+ geometry.geometryType = VK_GEOMETRY_TYPE_AABBS_NV;
+ geometry.geometry.triangles = {};
+ geometry.geometry.triangles.sType = VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV;
+ geometry.geometry.aabbs = {};
+ geometry.geometry.aabbs.sType = VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV;
+ geometry.geometry.aabbs.aabbData = aabb_buffer.handle();
+ geometry.geometry.aabbs.numAABBs = static_cast<uint32_t>(aabbs.size());
+ geometry.geometry.aabbs.offset = 0;
+ geometry.geometry.aabbs.stride = static_cast<VkDeviceSize>(sizeof(AABB));
+ geometry.flags = 0;
+
+ VkAccelerationStructureInfoNV bot_level_as_info = {};
+ bot_level_as_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
+ bot_level_as_info.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV;
+ bot_level_as_info.instanceCount = 0;
+ bot_level_as_info.geometryCount = 1;
+ bot_level_as_info.pGeometries = &geometry;
+
+ VkAccelerationStructureCreateInfoNV bot_level_as_create_info = {};
+ bot_level_as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
+ bot_level_as_create_info.info = bot_level_as_info;
+
+ VkAccelerationStructureObj bot_level_as(*m_device, bot_level_as_create_info);
+
+ const std::vector<VkGeometryInstanceNV> instances = {
+ VkGeometryInstanceNV{
+ {
+ // clang-format off
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ // clang-format on
+ },
+ 0,
+ 0xFF,
+ 0,
+ VK_GEOMETRY_INSTANCE_TRIANGLE_CULL_DISABLE_BIT_NV,
+ bot_level_as.opaque_handle(),
+ },
+ };
+
+ VkDeviceSize instance_buffer_size = sizeof(VkGeometryInstanceNV) * instances.size();
+ VkBufferObj instance_buffer;
+ instance_buffer.init(*m_device, instance_buffer_size,
+ VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+ VK_BUFFER_USAGE_RAY_TRACING_BIT_NV, {ray_tracing_queue_family_index});
+
+ uint8_t *mapped_instance_buffer_data = (uint8_t *)instance_buffer.memory().map();
+ std::memcpy(mapped_instance_buffer_data, (uint8_t *)instances.data(), static_cast<std::size_t>(instance_buffer_size));
+ instance_buffer.memory().unmap();
+
+ VkAccelerationStructureInfoNV top_level_as_info = {};
+ top_level_as_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
+ top_level_as_info.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV;
+ top_level_as_info.instanceCount = 1;
+ top_level_as_info.geometryCount = 0;
+
+ VkAccelerationStructureCreateInfoNV top_level_as_create_info = {};
+ top_level_as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
+ top_level_as_create_info.info = top_level_as_info;
+
+ VkAccelerationStructureObj top_level_as(*m_device, top_level_as_create_info);
+
+ VkDeviceSize scratch_buffer_size = std::max(bot_level_as.build_scratch_memory_requirements().memoryRequirements.size,
+ top_level_as.build_scratch_memory_requirements().memoryRequirements.size);
+ VkBufferObj scratch_buffer;
+ scratch_buffer.init(*m_device, scratch_buffer_size, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_RAY_TRACING_BIT_NV);
+
+ ray_tracing_command_buffer.begin();
+
+ // Build bot level acceleration structure
+ ray_tracing_command_buffer.BuildAccelerationStructure(&bot_level_as, scratch_buffer.handle());
+
+ // Barrier to prevent using scratch buffer for top level build before bottom level build finishes
+ VkMemoryBarrier memory_barrier = {};
+ memory_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
+ memory_barrier.srcAccessMask = VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_NV | VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_NV;
+ memory_barrier.dstAccessMask = VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_NV | VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_NV;
+ ray_tracing_command_buffer.PipelineBarrier(VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_NV,
+ VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_NV, 0, 1, &memory_barrier, 0,
+ nullptr, 0, nullptr);
+
+ // Build top level acceleration structure
+ ray_tracing_command_buffer.BuildAccelerationStructure(&top_level_as, scratch_buffer.handle(), instance_buffer.handle());
+
+ ray_tracing_command_buffer.end();
+
+ VkSubmitInfo submit_info = {};
+ submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ submit_info.commandBufferCount = 1;
+ submit_info.pCommandBuffers = &ray_tracing_command_buffer.handle();
+ vk::QueueSubmit(ray_tracing_queue, 1, &submit_info, VK_NULL_HANDLE);
+ vk::QueueWaitIdle(ray_tracing_queue);
+ m_errorMonitor->VerifyNotFound();
+
+ VkTextureObj texture(m_device, nullptr);
+ VkSamplerObj sampler(m_device);
+
+ VkDeviceSize storage_buffer_size = 1024;
+ VkBufferObj storage_buffer;
+ storage_buffer.init(*m_device, storage_buffer_size, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+ VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, {ray_tracing_queue_family_index});
+
+ VkDeviceSize shader_binding_table_buffer_size = ray_tracing_properties.shaderGroupBaseAlignment * 4ull;
+ VkBufferObj shader_binding_table_buffer;
+ shader_binding_table_buffer.init(*m_device, shader_binding_table_buffer_size,
+ VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+ VK_BUFFER_USAGE_RAY_TRACING_BIT_NV, {ray_tracing_queue_family_index});
+
+ // Setup descriptors!
+ const VkShaderStageFlags kAllRayTracingStages = VK_SHADER_STAGE_RAYGEN_BIT_NV | VK_SHADER_STAGE_ANY_HIT_BIT_NV |
+ VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV | VK_SHADER_STAGE_MISS_BIT_NV |
+ VK_SHADER_STAGE_INTERSECTION_BIT_NV | VK_SHADER_STAGE_CALLABLE_BIT_NV;
+
+ void *layout_pnext = nullptr;
+ void *allocate_pnext = nullptr;
+ VkDescriptorPoolCreateFlags pool_create_flags = 0;
+ VkDescriptorSetLayoutCreateFlags layout_create_flags = 0;
+ VkDescriptorBindingFlagsEXT ds_binding_flags[3] = {};
+ VkDescriptorSetLayoutBindingFlagsCreateInfoEXT layout_createinfo_binding_flags[1] = {};
+ if (descriptor_indexing) {
+ ds_binding_flags[0] = 0;
+ ds_binding_flags[1] = 0;
+ ds_binding_flags[2] = VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT | VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT;
+
+ layout_createinfo_binding_flags[0].sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT;
+ layout_createinfo_binding_flags[0].pNext = NULL;
+ layout_createinfo_binding_flags[0].bindingCount = 3;
+ layout_createinfo_binding_flags[0].pBindingFlags = ds_binding_flags;
+ layout_create_flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT;
+ pool_create_flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT;
+ layout_pnext = layout_createinfo_binding_flags;
+ }
+
+ // Prepare descriptors
+ OneOffDescriptorSet ds(m_device,
+ {
+ {0, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV, 1, kAllRayTracingStages, nullptr},
+ {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, kAllRayTracingStages, nullptr},
+ {2, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 6, kAllRayTracingStages, nullptr},
+ },
+ layout_create_flags, layout_pnext, pool_create_flags);
+
+ VkDescriptorSetVariableDescriptorCountAllocateInfoEXT variable_count = {};
+ uint32_t desc_counts;
+ if (descriptor_indexing) {
+ layout_create_flags = 0;
+ pool_create_flags = 0;
+ ds_binding_flags[2] =
+ VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT | VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT;
+ desc_counts = 6; // We'll reserve 8 spaces in the layout, but the descriptor will only use 6
+ variable_count.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT;
+ variable_count.descriptorSetCount = 1;
+ variable_count.pDescriptorCounts = &desc_counts;
+ allocate_pnext = &variable_count;
+ }
+
+ OneOffDescriptorSet ds_variable(m_device,
+ {
+ {0, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV, 1, kAllRayTracingStages, nullptr},
+ {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, kAllRayTracingStages, nullptr},
+ {2, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 8, kAllRayTracingStages, nullptr},
+ },
+ layout_create_flags, layout_pnext, pool_create_flags, allocate_pnext);
+
+ VkAccelerationStructureNV top_level_as_handle = top_level_as.handle();
+ VkWriteDescriptorSetAccelerationStructureNV write_descript_set_as = {};
+ write_descript_set_as.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV;
+ write_descript_set_as.accelerationStructureCount = 1;
+ write_descript_set_as.pAccelerationStructures = &top_level_as_handle;
+
+ VkDescriptorBufferInfo descriptor_buffer_info = {};
+ descriptor_buffer_info.buffer = storage_buffer.handle();
+ descriptor_buffer_info.offset = 0;
+ descriptor_buffer_info.range = storage_buffer_size;
+
+ VkDescriptorImageInfo descriptor_image_infos[6] = {};
+ for (int i = 0; i < 6; i++) {
+ descriptor_image_infos[i] = texture.DescriptorImageInfo();
+ descriptor_image_infos[i].sampler = sampler.handle();
+ descriptor_image_infos[i].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+ }
+
+ VkWriteDescriptorSet descriptor_writes[3] = {};
+ descriptor_writes[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ descriptor_writes[0].dstSet = ds.set_;
+ descriptor_writes[0].dstBinding = 0;
+ descriptor_writes[0].descriptorCount = 1;
+ descriptor_writes[0].descriptorType = VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV;
+ descriptor_writes[0].pNext = &write_descript_set_as;
+
+ descriptor_writes[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ descriptor_writes[1].dstSet = ds.set_;
+ descriptor_writes[1].dstBinding = 1;
+ descriptor_writes[1].descriptorCount = 1;
+ descriptor_writes[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
+ descriptor_writes[1].pBufferInfo = &descriptor_buffer_info;
+
+ descriptor_writes[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ descriptor_writes[2].dstSet = ds.set_;
+ descriptor_writes[2].dstBinding = 2;
+ if (descriptor_indexing) {
+ descriptor_writes[2].descriptorCount = 5; // Intentionally don't write index 5
+ } else {
+ descriptor_writes[2].descriptorCount = 6;
+ }
+ descriptor_writes[2].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+ descriptor_writes[2].pImageInfo = descriptor_image_infos;
+ vk::UpdateDescriptorSets(m_device->device(), 3, descriptor_writes, 0, NULL);
+ if (descriptor_indexing) {
+ descriptor_writes[0].dstSet = ds_variable.set_;
+ descriptor_writes[1].dstSet = ds_variable.set_;
+ descriptor_writes[2].dstSet = ds_variable.set_;
+ vk::UpdateDescriptorSets(m_device->device(), 3, descriptor_writes, 0, NULL);
+ }
+
+ const VkPipelineLayoutObj pipeline_layout(m_device, {&ds.layout_});
+ const VkPipelineLayoutObj pipeline_layout_variable(m_device, {&ds_variable.layout_});
+
+ const auto SetImagesArrayLength = [](const std::string &shader_template, const std::string &length_str) {
+ const std::string to_replace = "IMAGES_ARRAY_LENGTH";
+
+ std::string result = shader_template;
+ auto position = result.find(to_replace);
+ assert(position != std::string::npos);
+ result.replace(position, to_replace.length(), length_str);
+ return result;
+ };
+
+ const std::string rgen_source_template = R"(#version 460
+ #extension GL_EXT_nonuniform_qualifier : require
+ #extension GL_EXT_samplerless_texture_functions : require
+ #extension GL_NV_ray_tracing : require
+
+ layout(set = 0, binding = 0) uniform accelerationStructureNV topLevelAS;
+ layout(set = 0, binding = 1, std430) buffer RayTracingSbo {
+ uint rgen_index;
+ uint ahit_index;
+ uint chit_index;
+ uint miss_index;
+ uint intr_index;
+ uint call_index;
+
+ uint rgen_ran;
+ uint ahit_ran;
+ uint chit_ran;
+ uint miss_ran;
+ uint intr_ran;
+ uint call_ran;
+
+ float result1;
+ float result2;
+ float result3;
+ } sbo;
+ layout(set = 0, binding = 2) uniform texture2D textures[IMAGES_ARRAY_LENGTH];
+
+ layout(location = 0) rayPayloadNV vec3 payload;
+ layout(location = 3) callableDataNV vec3 callableData;
+
+ void main() {
+ sbo.rgen_ran = 1;
+
+ executeCallableNV(0, 3);
+ sbo.result1 = callableData.x;
+
+ vec3 origin = vec3(0.0f, 0.0f, -2.0f);
+ vec3 direction = vec3(0.0f, 0.0f, 1.0f);
+
+ traceNV(topLevelAS, gl_RayFlagsNoneNV, 0xFF, 0, 1, 0, origin, 0.001, direction, 10000.0, 0);
+ sbo.result2 = payload.x;
+
+ traceNV(topLevelAS, gl_RayFlagsNoneNV, 0xFF, 0, 1, 0, origin, 0.001, -direction, 10000.0, 0);
+ sbo.result3 = payload.x;
+
+ if (sbo.rgen_index > 0) {
+ // OOB here:
+ sbo.result3 = texelFetch(textures[sbo.rgen_index], ivec2(0, 0), 0).x;
+ }
+ }
+ )";
+
+ const std::string rgen_source = SetImagesArrayLength(rgen_source_template, "6");
+ const std::string rgen_source_runtime = SetImagesArrayLength(rgen_source_template, "");
+
+ const std::string ahit_source_template = R"(#version 460
+ #extension GL_EXT_nonuniform_qualifier : require
+ #extension GL_EXT_samplerless_texture_functions : require
+ #extension GL_NV_ray_tracing : require
+
+ layout(set = 0, binding = 1, std430) buffer StorageBuffer {
+ uint rgen_index;
+ uint ahit_index;
+ uint chit_index;
+ uint miss_index;
+ uint intr_index;
+ uint call_index;
+
+ uint rgen_ran;
+ uint ahit_ran;
+ uint chit_ran;
+ uint miss_ran;
+ uint intr_ran;
+ uint call_ran;
+
+ float result1;
+ float result2;
+ float result3;
+ } sbo;
+ layout(set = 0, binding = 2) uniform texture2D textures[IMAGES_ARRAY_LENGTH];
+
+ hitAttributeNV vec3 hitValue;
+
+ layout(location = 0) rayPayloadInNV vec3 payload;
+
+ void main() {
+ sbo.ahit_ran = 2;
+
+ payload = vec3(0.1234f);
+
+ if (sbo.ahit_index > 0) {
+ // OOB here:
+ payload.x = texelFetch(textures[sbo.ahit_index], ivec2(0, 0), 0).x;
+ }
+ }
+ )";
+ const std::string ahit_source = SetImagesArrayLength(ahit_source_template, "6");
+ const std::string ahit_source_runtime = SetImagesArrayLength(ahit_source_template, "");
+
+ const std::string chit_source_template = R"(#version 460
+ #extension GL_EXT_nonuniform_qualifier : require
+ #extension GL_EXT_samplerless_texture_functions : require
+ #extension GL_NV_ray_tracing : require
+
+ layout(set = 0, binding = 1, std430) buffer RayTracingSbo {
+ uint rgen_index;
+ uint ahit_index;
+ uint chit_index;
+ uint miss_index;
+ uint intr_index;
+ uint call_index;
+
+ uint rgen_ran;
+ uint ahit_ran;
+ uint chit_ran;
+ uint miss_ran;
+ uint intr_ran;
+ uint call_ran;
+
+ float result1;
+ float result2;
+ float result3;
+ } sbo;
+ layout(set = 0, binding = 2) uniform texture2D textures[IMAGES_ARRAY_LENGTH];
+
+ layout(location = 0) rayPayloadInNV vec3 payload;
+
+ hitAttributeNV vec3 attribs;
+
+ void main() {
+ sbo.chit_ran = 3;
+
+ payload = attribs;
+ if (sbo.chit_index > 0) {
+ // OOB here:
+ payload.x = texelFetch(textures[sbo.chit_index], ivec2(0, 0), 0).x;
+ }
+ }
+ )";
+ const std::string chit_source = SetImagesArrayLength(chit_source_template, "6");
+ const std::string chit_source_runtime = SetImagesArrayLength(chit_source_template, "");
+
+ const std::string miss_source_template = R"(#version 460
+ #extension GL_EXT_nonuniform_qualifier : enable
+ #extension GL_EXT_samplerless_texture_functions : require
+ #extension GL_NV_ray_tracing : require
+
+ layout(set = 0, binding = 1, std430) buffer RayTracingSbo {
+ uint rgen_index;
+ uint ahit_index;
+ uint chit_index;
+ uint miss_index;
+ uint intr_index;
+ uint call_index;
+
+ uint rgen_ran;
+ uint ahit_ran;
+ uint chit_ran;
+ uint miss_ran;
+ uint intr_ran;
+ uint call_ran;
+
+ float result1;
+ float result2;
+ float result3;
+ } sbo;
+ layout(set = 0, binding = 2) uniform texture2D textures[IMAGES_ARRAY_LENGTH];
+
+ layout(location = 0) rayPayloadInNV vec3 payload;
+
+ void main() {
+ sbo.miss_ran = 4;
+
+ payload = vec3(1.0, 0.0, 0.0);
+
+ if (sbo.miss_index > 0) {
+ // OOB here:
+ payload.x = texelFetch(textures[sbo.miss_index], ivec2(0, 0), 0).x;
+ }
+ }
+ )";
+ const std::string miss_source = SetImagesArrayLength(miss_source_template, "6");
+ const std::string miss_source_runtime = SetImagesArrayLength(miss_source_template, "");
+
+ const std::string intr_source_template = R"(#version 460
+ #extension GL_EXT_nonuniform_qualifier : require
+ #extension GL_EXT_samplerless_texture_functions : require
+ #extension GL_NV_ray_tracing : require
+
+ layout(set = 0, binding = 1, std430) buffer StorageBuffer {
+ uint rgen_index;
+ uint ahit_index;
+ uint chit_index;
+ uint miss_index;
+ uint intr_index;
+ uint call_index;
+
+ uint rgen_ran;
+ uint ahit_ran;
+ uint chit_ran;
+ uint miss_ran;
+ uint intr_ran;
+ uint call_ran;
+
+ float result1;
+ float result2;
+ float result3;
+ } sbo;
+ layout(set = 0, binding = 2) uniform texture2D textures[IMAGES_ARRAY_LENGTH];
+
+ hitAttributeNV vec3 hitValue;
+
+ void main() {
+ sbo.intr_ran = 5;
+
+ hitValue = vec3(0.0f, 0.5f, 0.0f);
+
+ reportIntersectionNV(1.0f, 0);
+
+ if (sbo.intr_index > 0) {
+ // OOB here:
+ hitValue.x = texelFetch(textures[sbo.intr_index], ivec2(0, 0), 0).x;
+ }
+ }
+ )";
+ const std::string intr_source = SetImagesArrayLength(intr_source_template, "6");
+ const std::string intr_source_runtime = SetImagesArrayLength(intr_source_template, "");
+
+ const std::string call_source_template = R"(#version 460
+ #extension GL_EXT_nonuniform_qualifier : require
+ #extension GL_EXT_samplerless_texture_functions : require
+ #extension GL_NV_ray_tracing : require
+
+ layout(set = 0, binding = 1, std430) buffer StorageBuffer {
+ uint rgen_index;
+ uint ahit_index;
+ uint chit_index;
+ uint miss_index;
+ uint intr_index;
+ uint call_index;
+
+ uint rgen_ran;
+ uint ahit_ran;
+ uint chit_ran;
+ uint miss_ran;
+ uint intr_ran;
+ uint call_ran;
+
+ float result1;
+ float result2;
+ float result3;
+ } sbo;
+ layout(set = 0, binding = 2) uniform texture2D textures[IMAGES_ARRAY_LENGTH];
+
+ layout(location = 3) callableDataInNV vec3 callableData;
+
+ void main() {
+ sbo.call_ran = 6;
+
+ callableData = vec3(0.1234f);
+
+ if (sbo.call_index > 0) {
+ // OOB here:
+ callableData.x = texelFetch(textures[sbo.call_index], ivec2(0, 0), 0).x;
+ }
+ }
+ )";
+ const std::string call_source = SetImagesArrayLength(call_source_template, "6");
+ const std::string call_source_runtime = SetImagesArrayLength(call_source_template, "");
+
+ struct TestCase {
+ const std::string &rgen_shader_source;
+ const std::string &ahit_shader_source;
+ const std::string &chit_shader_source;
+ const std::string &miss_shader_source;
+ const std::string &intr_shader_source;
+ const std::string &call_shader_source;
+ bool variable_length;
+ uint32_t rgen_index;
+ uint32_t ahit_index;
+ uint32_t chit_index;
+ uint32_t miss_index;
+ uint32_t intr_index;
+ uint32_t call_index;
+ const char *expected_error;
+ };
+
+ std::vector<TestCase> tests;
+ tests.push_back({rgen_source, ahit_source, chit_source, miss_source, intr_source, call_source, false, 25, 0, 0, 0, 0, 0,
+ "Index of 25 used to index descriptor array of length 6."});
+ tests.push_back({rgen_source, ahit_source, chit_source, miss_source, intr_source, call_source, false, 0, 25, 0, 0, 0, 0,
+ "Index of 25 used to index descriptor array of length 6."});
+ tests.push_back({rgen_source, ahit_source, chit_source, miss_source, intr_source, call_source, false, 0, 0, 25, 0, 0, 0,
+ "Index of 25 used to index descriptor array of length 6."});
+ tests.push_back({rgen_source, ahit_source, chit_source, miss_source, intr_source, call_source, false, 0, 0, 0, 25, 0, 0,
+ "Index of 25 used to index descriptor array of length 6."});
+ tests.push_back({rgen_source, ahit_source, chit_source, miss_source, intr_source, call_source, false, 0, 0, 0, 0, 25, 0,
+ "Index of 25 used to index descriptor array of length 6."});
+ tests.push_back({rgen_source, ahit_source, chit_source, miss_source, intr_source, call_source, false, 0, 0, 0, 0, 0, 25,
+ "Index of 25 used to index descriptor array of length 6."});
+
+ if (descriptor_indexing) {
+ tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
+ call_source_runtime, true, 25, 0, 0, 0, 0, 0, "Index of 25 used to index descriptor array of length 6."});
+ tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
+ call_source_runtime, true, 0, 25, 0, 0, 0, 0, "Index of 25 used to index descriptor array of length 6."});
+ tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
+ call_source_runtime, true, 0, 0, 25, 0, 0, 0, "Index of 25 used to index descriptor array of length 6."});
+ tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
+ call_source_runtime, true, 0, 0, 0, 25, 0, 0, "Index of 25 used to index descriptor array of length 6."});
+ tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
+ call_source_runtime, true, 0, 0, 0, 0, 25, 0, "Index of 25 used to index descriptor array of length 6."});
+ tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
+ call_source_runtime, true, 0, 0, 0, 0, 0, 25, "Index of 25 used to index descriptor array of length 6."});
+
+ // For this group, 6 is less than max specified (max specified is 8) but more than actual specified (actual specified is 5)
+ tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
+ call_source_runtime, true, 6, 0, 0, 0, 0, 0, "Index of 6 used to index descriptor array of length 6."});
+ tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
+ call_source_runtime, true, 0, 6, 0, 0, 0, 0, "Index of 6 used to index descriptor array of length 6."});
+ tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
+ call_source_runtime, true, 0, 0, 6, 0, 0, 0, "Index of 6 used to index descriptor array of length 6."});
+ tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
+ call_source_runtime, true, 0, 0, 0, 6, 0, 0, "Index of 6 used to index descriptor array of length 6."});
+ tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
+ call_source_runtime, true, 0, 0, 0, 0, 6, 0, "Index of 6 used to index descriptor array of length 6."});
+ tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
+ call_source_runtime, true, 0, 0, 0, 0, 0, 6, "Index of 6 used to index descriptor array of length 6."});
+
+ tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
+ call_source_runtime, true, 5, 0, 0, 0, 0, 0, "Descriptor index 5 is uninitialized."});
+ tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
+ call_source_runtime, true, 0, 5, 0, 0, 0, 0, "Descriptor index 5 is uninitialized."});
+ tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
+ call_source_runtime, true, 0, 0, 5, 0, 0, 0, "Descriptor index 5 is uninitialized."});
+ tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
+ call_source_runtime, true, 0, 0, 0, 5, 0, 0, "Descriptor index 5 is uninitialized."});
+ tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
+ call_source_runtime, true, 0, 0, 0, 0, 5, 0, "Descriptor index 5 is uninitialized."});
+ tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
+ call_source_runtime, true, 0, 0, 0, 0, 0, 5, "Descriptor index 5 is uninitialized."});
+ }
+
+ PFN_vkCreateRayTracingPipelinesNV vkCreateRayTracingPipelinesNV = reinterpret_cast<PFN_vkCreateRayTracingPipelinesNV>(
+ vk::GetDeviceProcAddr(m_device->handle(), "vkCreateRayTracingPipelinesNV"));
+ ASSERT_TRUE(vkCreateRayTracingPipelinesNV != nullptr);
+
+ PFN_vkGetRayTracingShaderGroupHandlesNV vkGetRayTracingShaderGroupHandlesNV =
+ reinterpret_cast<PFN_vkGetRayTracingShaderGroupHandlesNV>(
+ vk::GetDeviceProcAddr(m_device->handle(), "vkGetRayTracingShaderGroupHandlesNV"));
+ ASSERT_TRUE(vkGetRayTracingShaderGroupHandlesNV != nullptr);
+
+ PFN_vkCmdTraceRaysNV vkCmdTraceRaysNV =
+ reinterpret_cast<PFN_vkCmdTraceRaysNV>(vk::GetDeviceProcAddr(m_device->handle(), "vkCmdTraceRaysNV"));
+ ASSERT_TRUE(vkCmdTraceRaysNV != nullptr);
+
+ // Iteration 0 tests with no descriptor set bound (to sanity test "draw" validation). Iteration 1
+ // tests what's in the test case vector.
+ for (const auto &test : tests) {
+ if (gpu_assisted) {
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test.expected_error);
+ }
+
+ VkShaderObj rgen_shader(m_device, test.rgen_shader_source.c_str(), VK_SHADER_STAGE_RAYGEN_BIT_NV, this, "main");
+ VkShaderObj ahit_shader(m_device, test.ahit_shader_source.c_str(), VK_SHADER_STAGE_ANY_HIT_BIT_NV, this, "main");
+ VkShaderObj chit_shader(m_device, test.chit_shader_source.c_str(), VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV, this, "main");
+ VkShaderObj miss_shader(m_device, test.miss_shader_source.c_str(), VK_SHADER_STAGE_MISS_BIT_NV, this, "main");
+ VkShaderObj intr_shader(m_device, test.intr_shader_source.c_str(), VK_SHADER_STAGE_INTERSECTION_BIT_NV, this, "main");
+ VkShaderObj call_shader(m_device, test.call_shader_source.c_str(), VK_SHADER_STAGE_CALLABLE_BIT_NV, this, "main");
+
+ VkPipelineShaderStageCreateInfo stage_create_infos[6] = {};
+ stage_create_infos[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+ stage_create_infos[0].stage = VK_SHADER_STAGE_RAYGEN_BIT_NV;
+ stage_create_infos[0].module = rgen_shader.handle();
+ stage_create_infos[0].pName = "main";
+
+ stage_create_infos[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+ stage_create_infos[1].stage = VK_SHADER_STAGE_ANY_HIT_BIT_NV;
+ stage_create_infos[1].module = ahit_shader.handle();
+ stage_create_infos[1].pName = "main";
+
+ stage_create_infos[2].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+ stage_create_infos[2].stage = VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV;
+ stage_create_infos[2].module = chit_shader.handle();
+ stage_create_infos[2].pName = "main";
+
+ stage_create_infos[3].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+ stage_create_infos[3].stage = VK_SHADER_STAGE_MISS_BIT_NV;
+ stage_create_infos[3].module = miss_shader.handle();
+ stage_create_infos[3].pName = "main";
+
+ stage_create_infos[4].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+ stage_create_infos[4].stage = VK_SHADER_STAGE_INTERSECTION_BIT_NV;
+ stage_create_infos[4].module = intr_shader.handle();
+ stage_create_infos[4].pName = "main";
+
+ stage_create_infos[5].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+ stage_create_infos[5].stage = VK_SHADER_STAGE_CALLABLE_BIT_NV;
+ stage_create_infos[5].module = call_shader.handle();
+ stage_create_infos[5].pName = "main";
+
+ VkRayTracingShaderGroupCreateInfoNV group_create_infos[4] = {};
+ group_create_infos[0].sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV;
+ group_create_infos[0].type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV;
+ group_create_infos[0].generalShader = 0; // rgen
+ group_create_infos[0].closestHitShader = VK_SHADER_UNUSED_NV;
+ group_create_infos[0].anyHitShader = VK_SHADER_UNUSED_NV;
+ group_create_infos[0].intersectionShader = VK_SHADER_UNUSED_NV;
+
+ group_create_infos[1].sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV;
+ group_create_infos[1].type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV;
+ group_create_infos[1].generalShader = 3; // miss
+ group_create_infos[1].closestHitShader = VK_SHADER_UNUSED_NV;
+ group_create_infos[1].anyHitShader = VK_SHADER_UNUSED_NV;
+ group_create_infos[1].intersectionShader = VK_SHADER_UNUSED_NV;
+
+ group_create_infos[2].sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV;
+ group_create_infos[2].type = VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_NV;
+ group_create_infos[2].generalShader = VK_SHADER_UNUSED_NV;
+ group_create_infos[2].closestHitShader = 2;
+ group_create_infos[2].anyHitShader = 1;
+ group_create_infos[2].intersectionShader = 4;
+
+ group_create_infos[3].sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV;
+ group_create_infos[3].type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV;
+ group_create_infos[3].generalShader = 5; // call
+ group_create_infos[3].closestHitShader = VK_SHADER_UNUSED_NV;
+ group_create_infos[3].anyHitShader = VK_SHADER_UNUSED_NV;
+ group_create_infos[3].intersectionShader = VK_SHADER_UNUSED_NV;
+
+ VkRayTracingPipelineCreateInfoNV pipeline_ci = {};
+ pipeline_ci.sType = VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV;
+ pipeline_ci.stageCount = 6;
+ pipeline_ci.pStages = stage_create_infos;
+ pipeline_ci.groupCount = 4;
+ pipeline_ci.pGroups = group_create_infos;
+ pipeline_ci.maxRecursionDepth = 2;
+ pipeline_ci.layout = test.variable_length ? pipeline_layout_variable.handle() : pipeline_layout.handle();
+
+ VkPipeline pipeline = VK_NULL_HANDLE;
+ ASSERT_VK_SUCCESS(vkCreateRayTracingPipelinesNV(m_device->handle(), VK_NULL_HANDLE, 1, &pipeline_ci, nullptr, &pipeline));
+
+ std::vector<uint8_t> shader_binding_table_data;
+ shader_binding_table_data.resize(static_cast<std::size_t>(shader_binding_table_buffer_size), 0);
+ ASSERT_VK_SUCCESS(vkGetRayTracingShaderGroupHandlesNV(m_device->handle(), pipeline, 0, 4,
+ static_cast<std::size_t>(shader_binding_table_buffer_size),
+ shader_binding_table_data.data()));
+
+ uint8_t *mapped_shader_binding_table_data = (uint8_t *)shader_binding_table_buffer.memory().map();
+ std::memcpy(mapped_shader_binding_table_data, shader_binding_table_data.data(), shader_binding_table_data.size());
+ shader_binding_table_buffer.memory().unmap();
+
+ ray_tracing_command_buffer.begin();
+
+ vk::CmdBindPipeline(ray_tracing_command_buffer.handle(), VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, pipeline);
+
+ if (gpu_assisted) {
+ vk::CmdBindDescriptorSets(ray_tracing_command_buffer.handle(), VK_PIPELINE_BIND_POINT_RAY_TRACING_NV,
+ test.variable_length ? pipeline_layout_variable.handle() : pipeline_layout.handle(), 0, 1,
+ test.variable_length ? &ds_variable.set_ : &ds.set_, 0, nullptr);
+ } else {
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysNV-None-02697");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-DescriptorSetNotBound");
+ }
+
+ if (gpu_assisted) {
+ // Need these values to pass mapped storage buffer checks
+ vkCmdTraceRaysNV(ray_tracing_command_buffer.handle(), shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupHandleSize * 0ull, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupHandleSize * 1ull, ray_tracing_properties.shaderGroupHandleSize,
+ shader_binding_table_buffer.handle(), ray_tracing_properties.shaderGroupHandleSize * 2ull,
+ ray_tracing_properties.shaderGroupHandleSize, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupHandleSize * 3ull, ray_tracing_properties.shaderGroupHandleSize,
+ /*width=*/1, /*height=*/1, /*depth=*/1);
+ } else {
+ // offset shall be multiple of shaderGroupBaseAlignment and stride of shaderGroupHandleSize
+ vkCmdTraceRaysNV(ray_tracing_command_buffer.handle(), shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 0ull, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 1ull, ray_tracing_properties.shaderGroupHandleSize,
+ shader_binding_table_buffer.handle(), ray_tracing_properties.shaderGroupBaseAlignment * 2ull,
+ ray_tracing_properties.shaderGroupHandleSize, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 3ull, ray_tracing_properties.shaderGroupHandleSize,
+ /*width=*/1, /*height=*/1, /*depth=*/1);
+ }
+
+ ray_tracing_command_buffer.end();
+ // Update the index of the texture that the shaders should read
+ uint32_t *mapped_storage_buffer_data = (uint32_t *)storage_buffer.memory().map();
+ mapped_storage_buffer_data[0] = test.rgen_index;
+ mapped_storage_buffer_data[1] = test.ahit_index;
+ mapped_storage_buffer_data[2] = test.chit_index;
+ mapped_storage_buffer_data[3] = test.miss_index;
+ mapped_storage_buffer_data[4] = test.intr_index;
+ mapped_storage_buffer_data[5] = test.call_index;
+ mapped_storage_buffer_data[6] = 0;
+ mapped_storage_buffer_data[7] = 0;
+ mapped_storage_buffer_data[8] = 0;
+ mapped_storage_buffer_data[9] = 0;
+ mapped_storage_buffer_data[10] = 0;
+ mapped_storage_buffer_data[11] = 0;
+ storage_buffer.memory().unmap();
+
+ vk::QueueSubmit(ray_tracing_queue, 1, &submit_info, VK_NULL_HANDLE);
+ vk::QueueWaitIdle(ray_tracing_queue);
+ m_errorMonitor->VerifyFound();
+
+ if (gpu_assisted) {
+ mapped_storage_buffer_data = (uint32_t *)storage_buffer.memory().map();
+ ASSERT_TRUE(mapped_storage_buffer_data[6] == 1);
+ ASSERT_TRUE(mapped_storage_buffer_data[7] == 2);
+ ASSERT_TRUE(mapped_storage_buffer_data[8] == 3);
+ ASSERT_TRUE(mapped_storage_buffer_data[9] == 4);
+ ASSERT_TRUE(mapped_storage_buffer_data[10] == 5);
+ ASSERT_TRUE(mapped_storage_buffer_data[11] == 6);
+ storage_buffer.memory().unmap();
+ } else {
+ ray_tracing_command_buffer.begin();
+ vk::CmdBindPipeline(ray_tracing_command_buffer.handle(), VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, pipeline);
+ vk::CmdBindDescriptorSets(ray_tracing_command_buffer.handle(), VK_PIPELINE_BIND_POINT_RAY_TRACING_NV,
+ test.variable_length ? pipeline_layout_variable.handle() : pipeline_layout.handle(), 0, 1,
+ test.variable_length ? &ds_variable.set_ : &ds.set_, 0, nullptr);
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysNV-callableShaderBindingOffset-02462");
+ VkDeviceSize stride_align = ray_tracing_properties.shaderGroupHandleSize;
+ VkDeviceSize invalid_max_stride = ray_tracing_properties.maxShaderGroupStride +
+ (stride_align - (ray_tracing_properties.maxShaderGroupStride %
+ stride_align)); // should be less than maxShaderGroupStride
+ VkDeviceSize invalid_stride =
+ ray_tracing_properties.shaderGroupHandleSize >> 1; // should be multiple of shaderGroupHandleSize
+ VkDeviceSize invalid_offset =
+ ray_tracing_properties.shaderGroupBaseAlignment >> 1; // should be multiple of shaderGroupBaseAlignment
+
+ vkCmdTraceRaysNV(ray_tracing_command_buffer.handle(), shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 0ull, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 1ull, ray_tracing_properties.shaderGroupHandleSize,
+ shader_binding_table_buffer.handle(), ray_tracing_properties.shaderGroupBaseAlignment * 2ull,
+ ray_tracing_properties.shaderGroupHandleSize, shader_binding_table_buffer.handle(), invalid_offset,
+ ray_tracing_properties.shaderGroupHandleSize,
+ /*width=*/1, /*height=*/1, /*depth=*/1);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysNV-callableShaderBindingStride-02465");
+ vkCmdTraceRaysNV(ray_tracing_command_buffer.handle(), shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 0ull, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 1ull, ray_tracing_properties.shaderGroupHandleSize,
+ shader_binding_table_buffer.handle(), ray_tracing_properties.shaderGroupBaseAlignment * 2ull,
+ ray_tracing_properties.shaderGroupHandleSize, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment, invalid_stride,
+ /*width=*/1, /*height=*/1, /*depth=*/1);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysNV-callableShaderBindingStride-02468");
+ vkCmdTraceRaysNV(ray_tracing_command_buffer.handle(), shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 0ull, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 1ull, ray_tracing_properties.shaderGroupHandleSize,
+ shader_binding_table_buffer.handle(), ray_tracing_properties.shaderGroupBaseAlignment * 2ull,
+ ray_tracing_properties.shaderGroupHandleSize, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment, invalid_max_stride,
+ /*width=*/1, /*height=*/1, /*depth=*/1);
+ m_errorMonitor->VerifyFound();
+
+ // hit shader
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysNV-hitShaderBindingOffset-02460");
+ vkCmdTraceRaysNV(ray_tracing_command_buffer.handle(), shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 0ull, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 1ull, ray_tracing_properties.shaderGroupHandleSize,
+ shader_binding_table_buffer.handle(), invalid_offset, ray_tracing_properties.shaderGroupHandleSize,
+ shader_binding_table_buffer.handle(), ray_tracing_properties.shaderGroupBaseAlignment,
+ ray_tracing_properties.shaderGroupHandleSize,
+ /*width=*/1, /*height=*/1, /*depth=*/1);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysNV-hitShaderBindingStride-02464");
+ vkCmdTraceRaysNV(ray_tracing_command_buffer.handle(), shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 0ull, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 1ull, ray_tracing_properties.shaderGroupHandleSize,
+ shader_binding_table_buffer.handle(), ray_tracing_properties.shaderGroupBaseAlignment * 2ull,
+ invalid_stride, shader_binding_table_buffer.handle(), ray_tracing_properties.shaderGroupBaseAlignment,
+ ray_tracing_properties.shaderGroupHandleSize,
+ /*width=*/1, /*height=*/1, /*depth=*/1);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysNV-hitShaderBindingStride-02467");
+ vkCmdTraceRaysNV(ray_tracing_command_buffer.handle(), shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 0ull, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 1ull, ray_tracing_properties.shaderGroupHandleSize,
+ shader_binding_table_buffer.handle(), ray_tracing_properties.shaderGroupBaseAlignment * 2ull,
+ invalid_max_stride, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment, ray_tracing_properties.shaderGroupHandleSize,
+ /*width=*/1, /*height=*/1, /*depth=*/1);
+ m_errorMonitor->VerifyFound();
+
+ // miss shader
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysNV-missShaderBindingOffset-02458");
+ vkCmdTraceRaysNV(ray_tracing_command_buffer.handle(), shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 0ull, shader_binding_table_buffer.handle(),
+ invalid_offset, ray_tracing_properties.shaderGroupHandleSize, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 2ull, ray_tracing_properties.shaderGroupHandleSize,
+ shader_binding_table_buffer.handle(), ray_tracing_properties.shaderGroupBaseAlignment,
+ ray_tracing_properties.shaderGroupHandleSize,
+ /*width=*/1, /*height=*/1, /*depth=*/1);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysNV-missShaderBindingStride-02463");
+ vkCmdTraceRaysNV(ray_tracing_command_buffer.handle(), shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 0ull, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 1ull, invalid_stride,
+ shader_binding_table_buffer.handle(), ray_tracing_properties.shaderGroupBaseAlignment * 2ull,
+ ray_tracing_properties.shaderGroupHandleSize, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment, ray_tracing_properties.shaderGroupHandleSize,
+ /*width=*/1, /*height=*/1, /*depth=*/1);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysNV-missShaderBindingStride-02466");
+ vkCmdTraceRaysNV(ray_tracing_command_buffer.handle(), shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 0ull, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 1ull, invalid_max_stride,
+ shader_binding_table_buffer.handle(), ray_tracing_properties.shaderGroupBaseAlignment * 2ull,
+ ray_tracing_properties.shaderGroupHandleSize, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment, ray_tracing_properties.shaderGroupHandleSize,
+ /*width=*/1, /*height=*/1, /*depth=*/1);
+ m_errorMonitor->VerifyFound();
+
+ // raygenshader
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysNV-raygenShaderBindingOffset-02456");
+ vkCmdTraceRaysNV(ray_tracing_command_buffer.handle(), shader_binding_table_buffer.handle(), invalid_offset,
+ shader_binding_table_buffer.handle(), ray_tracing_properties.shaderGroupBaseAlignment * 1ull,
+ ray_tracing_properties.shaderGroupHandleSize, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 2ull, ray_tracing_properties.shaderGroupHandleSize,
+ shader_binding_table_buffer.handle(), ray_tracing_properties.shaderGroupBaseAlignment,
+ ray_tracing_properties.shaderGroupHandleSize,
+ /*width=*/1, /*height=*/1, /*depth=*/1);
+
+ m_errorMonitor->VerifyFound();
+ const auto &limits = m_device->props.limits;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysNV-width-02469");
+ uint32_t invalid_width = limits.maxComputeWorkGroupCount[0] + 1;
+ vkCmdTraceRaysNV(ray_tracing_command_buffer.handle(), shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 0ull, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 1ull, ray_tracing_properties.shaderGroupHandleSize,
+ shader_binding_table_buffer.handle(), ray_tracing_properties.shaderGroupBaseAlignment * 2ull,
+ ray_tracing_properties.shaderGroupHandleSize, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment, ray_tracing_properties.shaderGroupHandleSize,
+ /*width=*/invalid_width, /*height=*/1, /*depth=*/1);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysNV-height-02470");
+ uint32_t invalid_height = limits.maxComputeWorkGroupCount[1] + 1;
+ vkCmdTraceRaysNV(ray_tracing_command_buffer.handle(), shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 0ull, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 1ull, ray_tracing_properties.shaderGroupHandleSize,
+ shader_binding_table_buffer.handle(), ray_tracing_properties.shaderGroupBaseAlignment * 2ull,
+ ray_tracing_properties.shaderGroupHandleSize, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment, ray_tracing_properties.shaderGroupHandleSize,
+ /*width=*/1, /*height=*/invalid_height, /*depth=*/1);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysNV-depth-02471");
+ uint32_t invalid_depth = limits.maxComputeWorkGroupCount[2] + 1;
+ vkCmdTraceRaysNV(ray_tracing_command_buffer.handle(), shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 0ull, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment * 1ull, ray_tracing_properties.shaderGroupHandleSize,
+ shader_binding_table_buffer.handle(), ray_tracing_properties.shaderGroupBaseAlignment * 2ull,
+ ray_tracing_properties.shaderGroupHandleSize, shader_binding_table_buffer.handle(),
+ ray_tracing_properties.shaderGroupBaseAlignment, ray_tracing_properties.shaderGroupHandleSize,
+ /*width=*/1, /*height=*/1, /*depth=*/invalid_depth);
+ m_errorMonitor->VerifyFound();
+
+ ray_tracing_command_buffer.end();
+ }
+ vk::DestroyPipeline(m_device->handle(), pipeline, nullptr);
+ }
+}
+
+void VkSyncValTest::InitSyncValFramework() {
+ // Enable synchronization validation
+ VkLayerSettingValueDataEXT sy_setting_string_value{};
+ sy_setting_string_value.arrayString.pCharArray = "VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION";
+ sy_setting_string_value.arrayString.count = sizeof(sy_setting_string_value.arrayString.pCharArray);
+ VkLayerSettingValueEXT sy_vendor_all_setting_val = {"enables", VK_LAYER_SETTING_VALUE_TYPE_STRING_ARRAY_EXT,
+ sy_setting_string_value};
+ VkLayerSettingsEXT sy_settings{static_cast<VkStructureType>(VK_STRUCTURE_TYPE_INSTANCE_LAYER_SETTINGS_EXT), nullptr, 1,
+ &sy_vendor_all_setting_val};
+ features_.pNext = &sy_settings;
+ InitFramework(m_errorMonitor, &features_);
+}
+
void print_android(const char *c) {
#ifdef VK_USE_PLATFORM_ANDROID_KHR
__android_log_print(ANDROID_LOG_INFO, "VulkanLayerValidationTests", "%s", c);
@@ -2103,10 +3342,14 @@
int main(int argc, char **argv) {
int result;
-#if defined(_WIN32) && !defined(NDEBUG)
+#if defined(_WIN32)
+#if !defined(NDEBUG)
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
#endif
+ // Avoid "Abort, Retry, Ignore" dialog boxes
+ _set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT);
+#endif
::testing::InitGoogleTest(&argc, argv);
VkTestFramework::InitArgs(&argc, argv);
diff --git a/tests/layer_validation_tests.h b/tests/layer_validation_tests.h
index 6506613..44fddbe 100644
--- a/tests/layer_validation_tests.h
+++ b/tests/layer_validation_tests.h
@@ -34,6 +34,7 @@
#endif
#include "layers/vk_device_profile_api_layer.h"
+#include "vk_layer_settings_ext.h"
#if defined(ANDROID)
#include <android/log.h>
@@ -55,7 +56,12 @@
#include <functional>
#include <limits>
#include <memory>
+#include <string>
#include <unordered_set>
+#include <vector>
+
+using std::string;
+using std::vector;
//--------------------------------------------------------------------------------------
// Mesh and VertexFormat Data
@@ -198,6 +204,9 @@
std::vector<const char *> &device_extension_names,
VkValidationFeaturesEXT *features, void *userData);
+// Helper for checking timeline semaphore support and initializing
+bool CheckTimelineSemaphoreSupportAndInitState(VkRenderFramework *renderFramework);
+
// Dependent "false" type for the static assert, as GCC will evaluate
// non-dependent static_asserts even for non-instantiated templates
template <typename T>
@@ -223,6 +232,7 @@
class VkLayerTest : public VkRenderFramework {
public:
const char *kValidationLayerName = "VK_LAYER_KHRONOS_validation";
+
void VKTriangleTest(BsoFailSelect failCase);
void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
@@ -233,6 +243,7 @@
bool AddSurfaceInstanceExtension();
bool AddSwapchainDeviceExtension();
VkCommandBufferObj *CommandBuffer();
+ void OOBRayTracingShadersTestBody(bool gpu_assisted);
protected:
uint32_t m_instance_api_version = 0;
@@ -244,6 +255,9 @@
bool LoadDeviceProfileLayer(
PFN_vkSetPhysicalDeviceFormatPropertiesEXT &fpvkSetPhysicalDeviceFormatPropertiesEXT,
PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT &fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT);
+ bool LoadDeviceProfileLayer(
+ PFN_vkSetPhysicalDeviceFormatProperties2EXT &fpvkSetPhysicalDeviceFormatProperties2EXT,
+ PFN_vkGetOriginalPhysicalDeviceFormatProperties2EXT &fpvkGetOriginalPhysicalDeviceFormatProperties2EXT);
VkLayerTest();
};
@@ -258,6 +272,11 @@
void InitBestPracticesFramework();
protected:
+ VkValidationFeatureEnableEXT enables_[1] = {VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT};
+ VkValidationFeatureDisableEXT disables_[4] = {
+ VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT, VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT,
+ VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT, VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT};
+ VkValidationFeaturesEXT features_ = {VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT, nullptr, 1, enables_, 4, disables_};
};
class VkArmBestPracticesLayerTest : public VkBestPracticesLayerTest {};
@@ -268,6 +287,31 @@
VkWsiEnabledLayerTest() { m_enableWSI = true; }
};
+class VkGpuAssistedLayerTest : public VkLayerTest {
+ public:
+ bool InitGpuAssistedFramework(bool request_descriptor_indexing);
+
+ protected:
+};
+
+class VkDebugPrintfTest : public VkLayerTest {
+ public:
+ void InitDebugPrintfFramework();
+
+ protected:
+};
+
+class VkSyncValTest : public VkLayerTest {
+ public:
+ void InitSyncValFramework();
+
+ protected:
+ VkValidationFeatureDisableEXT disables_[4] = {
+ VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT, VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT,
+ VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT, VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT};
+ VkValidationFeaturesEXT features_ = {VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT, nullptr, 0, nullptr, 4, disables_};
+};
+
class VkBufferTest {
public:
enum eTestEnFlags {
@@ -336,7 +380,8 @@
std::vector<VkWriteDescriptorSet> descriptor_writes;
OneOffDescriptorSet(VkDeviceObj *device, const Bindings &bindings, VkDescriptorSetLayoutCreateFlags layout_flags = 0,
- void *layout_pnext = NULL, VkDescriptorPoolCreateFlags poolFlags = 0, void *allocate_pnext = NULL);
+ void *layout_pnext = NULL, VkDescriptorPoolCreateFlags poolFlags = 0, void *allocate_pnext = NULL,
+ int buffer_info_size = 10, int image_info_size = 10);
~OneOffDescriptorSet();
bool Initialized();
void WriteDescriptorBufferInfo(int binding, VkBuffer buffer, VkDeviceSize size,
@@ -344,7 +389,8 @@
void WriteDescriptorBufferView(int binding, VkBufferView &buffer_view,
VkDescriptorType descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER);
void WriteDescriptorImageInfo(int binding, VkImageView image_view, VkSampler sampler,
- VkDescriptorType descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER);
+ VkDescriptorType descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
+ VkImageLayout imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
void UpdateDescriptorSets();
};
@@ -420,13 +466,13 @@
info_override(helper);
helper.InitState();
- for (const auto &error : errors) test.Monitor()->SetDesiredFailureMsg(flags, error);
+ for (const auto &error : errors) test.Monitor().SetDesiredFailureMsg(flags, error);
helper.CreateGraphicsPipeline();
if (positive_test) {
- test.Monitor()->VerifyNotFound();
+ test.Monitor().VerifyNotFound();
} else {
- test.Monitor()->VerifyFound();
+ test.Monitor().VerifyFound();
}
}
@@ -476,13 +522,13 @@
info_override(helper);
helper.InitState();
- for (const auto &error : errors) test.Monitor()->SetDesiredFailureMsg(flags, error);
+ for (const auto &error : errors) test.Monitor().SetDesiredFailureMsg(flags, error);
helper.CreateComputePipeline();
if (positive_test) {
- test.Monitor()->VerifyNotFound();
+ test.Monitor().VerifyNotFound();
} else {
- test.Monitor()->VerifyFound();
+ test.Monitor().VerifyFound();
}
}
@@ -505,10 +551,12 @@
VkPipelineLayoutCreateInfo pipeline_layout_ci_ = {};
VkPipelineLayoutObj pipeline_layout_;
VkRayTracingPipelineCreateInfoNV rp_ci_ = {};
+ VkRayTracingPipelineCreateInfoKHR rp_ci_KHR_ = {};
VkPipelineCacheCreateInfo pc_ci_ = {};
VkPipeline pipeline_ = VK_NULL_HANDLE;
VkPipelineCache pipeline_cache_ = VK_NULL_HANDLE;
std::vector<VkRayTracingShaderGroupCreateInfoNV> groups_;
+ std::vector<VkRayTracingShaderGroupCreateInfoKHR> groups_KHR_;
std::unique_ptr<VkShaderObj> rgs_;
std::unique_ptr<VkShaderObj> chs_;
std::unique_ptr<VkShaderObj> mis_;
@@ -519,16 +567,18 @@
static bool InitInstanceExtensions(VkLayerTest &test, std::vector<const char *> &instance_extension_names);
static bool InitDeviceExtensions(VkLayerTest &test, std::vector<const char *> &device_extension_names);
void InitShaderGroups();
+ void InitShaderGroupsKHR();
void InitDescriptorSetInfo();
void InitPipelineLayoutInfo();
void InitShaderInfo();
void InitNVRayTracingPipelineInfo();
+ void InitKHRRayTracingPipelineInfo();
void InitPipelineCacheInfo();
- void InitInfo();
+ void InitInfo(bool isKHR = false);
void InitState();
- void LateBindPipelineInfo();
+ void LateBindPipelineInfo(bool isKHR = false);
VkResult CreateNVRayTracingPipeline(bool implicit_destroy = true, bool do_late_bind = true);
-
+ VkResult CreateKHRRayTracingPipeline(bool implicit_destroy = true, bool do_late_bind = true);
// Helper function to create a simple test case (positive or negative)
//
// info_override can be any callable that takes a CreateNVRayTracingPipelineHelper &
@@ -541,9 +591,9 @@
info_override(helper);
helper.InitState();
- for (const auto &error : errors) test.Monitor()->SetDesiredFailureMsg(flags, error);
+ for (const auto &error : errors) test.Monitor().SetDesiredFailureMsg(flags, error);
helper.CreateNVRayTracingPipeline();
- test.Monitor()->VerifyFound();
+ test.Monitor().VerifyFound();
}
template <typename Test, typename OverrideFunc, typename Error>
@@ -558,9 +608,9 @@
info_override(helper);
helper.InitState();
- test.Monitor()->ExpectSuccess(message_flag_mask);
+ test.Monitor().ExpectSuccess(message_flag_mask);
ASSERT_VK_SUCCESS(helper.CreateNVRayTracingPipeline());
- test.Monitor()->VerifyNotFound();
+ test.Monitor().VerifyNotFound();
}
};
@@ -710,6 +760,9 @@
VkFormat FindFormatWithoutFeatures(VkPhysicalDevice gpu, VkImageTiling tiling,
VkFormatFeatureFlags undesired_features = UINT32_MAX);
+void AllocateDisjointMemory(VkDeviceObj *device, PFN_vkGetImageMemoryRequirements2KHR fp, VkImage mp_image,
+ VkDeviceMemory *mp_image_mem, VkImageAspectFlagBits plane);
+
void NegHeightViewportTests(VkDeviceObj *m_device, VkCommandBufferObj *m_commandBuffer, ErrorMonitor *m_errorMonitor);
void CreateSamplerTest(VkLayerTest &test, const VkSamplerCreateInfo *pCreateInfo, std::string code = "");
@@ -722,5 +775,14 @@
void CreateImageViewTest(VkLayerTest &test, const VkImageViewCreateInfo *pCreateInfo, std::string code = "");
+bool InitFrameworkForRayTracingTest(VkRenderFramework *renderFramework, bool isKHR,
+ std::vector<const char *> &instance_extension_names,
+ std::vector<const char *> &device_extension_names, void *user_data,
+ bool need_gpu_validation = false, bool need_push_descriptors = false,
+ bool deferred_state_init = false);
+
+void GetSimpleGeometryForAccelerationStructureTests(const VkDeviceObj &device, VkBufferObj *vbo, VkBufferObj *ibo,
+ VkGeometryNV *geometry);
+
void print_android(const char *c);
#endif // VKLAYERTEST_H
diff --git a/tests/layers/device_profile_api.cpp b/tests/layers/device_profile_api.cpp
index b7795ee..ca2ef56 100644
--- a/tests/layers/device_profile_api.cpp
+++ b/tests/layers/device_profile_api.cpp
@@ -1,8 +1,8 @@
/*
- * Copyright (c) 2015-2019 The Khronos Group Inc.
- * Copyright (c) 2015-2019 Valve Corporation
- * Copyright (c) 2015-2019 LunarG, Inc.
- * Copyright (C) 2015-2019 Google Inc.
+ * Copyright (c) 2015-2020 The Khronos Group Inc.
+ * Copyright (c) 2015-2020 Valve Corporation
+ * Copyright (c) 2015-2020 LunarG, Inc.
+ * Copyright (C) 2015-2020 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -43,6 +43,7 @@
VkInstance instance;
VkPhysicalDeviceProperties phy_device_props;
std::unordered_map<VkFormat, VkFormatProperties, std::hash<int> > format_properties_map;
+ VkPhysicalDeviceFeatures phy_device_features;
VkLayerInstanceDispatchTable dispatch_table;
};
@@ -56,6 +57,13 @@
const VkFormatProperties *properties);
typedef void(VKAPI_PTR *PFN_vkSetPhysicalDeviceFormatPropertiesEXT)(VkPhysicalDevice physicalDevice, VkFormat format,
const VkFormatProperties newProperties);
+typedef void(VKAPI_PTR *PFN_vkGetOriginalPhysicalDeviceFormatProperties2EXT)(VkPhysicalDevice physicalDevice, VkFormat format,
+ const VkFormatProperties2 *properties);
+typedef void(VKAPI_PTR *PFN_vkSetPhysicalDeviceFormatProperties2EXT)(VkPhysicalDevice physicalDevice, VkFormat format,
+ const VkFormatProperties2 newProperties);
+typedef void(VKAPI_PTR *PFN_vkGetOriginalPhysicalDeviceFeaturesEXT)(VkPhysicalDevice physicalDevice,
+ const VkPhysicalDeviceFeatures *features);
+typedef void(VKAPI_PTR *PFN_vkSetPhysicalDeviceFeaturesEXT)(VkPhysicalDevice physicalDevice, const VkFormatProperties2 newFeatures);
VKAPI_ATTR void VKAPI_CALL GetOriginalPhysicalDeviceLimitsEXT(VkPhysicalDevice physicalDevice, VkPhysicalDeviceLimits *orgLimits) {
std::lock_guard<std::mutex> lock(global_lock);
@@ -88,6 +96,40 @@
memcpy(&(phy_dev_data->format_properties_map[format]), &newProperties, sizeof(VkFormatProperties));
}
+VKAPI_ATTR void VKAPI_CALL GetOriginalPhysicalDeviceFormatProperties2EXT(VkPhysicalDevice physicalDevice, VkFormat format,
+ VkFormatProperties2 *properties) {
+ // Currently only supports getting VkFormatProperties
+ // TODO: Add support for VkDrmFormatModifierPropertiesListEXT and future pNext structs of VkFormatProperties2
+ std::lock_guard<std::mutex> lock(global_lock);
+ layer_data *phy_dev_data = GetLayerDataPtr(physicalDevice, device_profile_api_dev_data_map);
+ layer_data *instance_data = GetLayerDataPtr(phy_dev_data->instance, device_profile_api_dev_data_map);
+ instance_data->dispatch_table.GetPhysicalDeviceFormatProperties2(physicalDevice, format, properties);
+}
+
+VKAPI_ATTR void VKAPI_CALL SetPhysicalDeviceFormatProperties2EXT(VkPhysicalDevice physicalDevice, VkFormat format,
+ const VkFormatProperties2 newProperties) {
+ std::lock_guard<std::mutex> lock(global_lock);
+ layer_data *phy_dev_data = GetLayerDataPtr(physicalDevice, device_profile_api_dev_data_map);
+
+ memcpy(&(phy_dev_data->format_properties_map[format]), &(newProperties.formatProperties), sizeof(VkFormatProperties));
+}
+
+VKAPI_ATTR void VKAPI_CALL GetOriginalPhysicalDeviceFeaturesEXT(VkPhysicalDevice physicalDevice,
+ VkPhysicalDeviceFeatures *features) {
+ std::lock_guard<std::mutex> lock(global_lock);
+ layer_data *phy_dev_data = GetLayerDataPtr(physicalDevice, device_profile_api_dev_data_map);
+ layer_data *instance_data = GetLayerDataPtr(phy_dev_data->instance, device_profile_api_dev_data_map);
+ instance_data->dispatch_table.GetPhysicalDeviceFeatures(physicalDevice, features);
+}
+
+VKAPI_ATTR void VKAPI_CALL SetPhysicalDeviceFeaturesEXT(VkPhysicalDevice physicalDevice,
+ const VkPhysicalDeviceFeatures newFeatures) {
+ std::lock_guard<std::mutex> lock(global_lock);
+ layer_data *phy_dev_data = GetLayerDataPtr(physicalDevice, device_profile_api_dev_data_map);
+
+ memcpy(&phy_dev_data->phy_device_features, &newFeatures, sizeof(VkPhysicalDeviceFeatures));
+}
+
VKAPI_ATTR VkResult VKAPI_CALL CreateInstance(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator,
VkInstance *pInstance) {
VkLayerInstanceCreateInfo *chain_info = get_chain_info(pCreateInfo, VK_LAYER_LINK_INFO);
@@ -120,6 +162,7 @@
for (VkPhysicalDevice physical_device : physical_devices) {
layer_data *phy_dev_data = GetLayerDataPtr(physical_device, device_profile_api_dev_data_map);
instance_data->dispatch_table.GetPhysicalDeviceProperties(physical_device, &phy_dev_data->phy_device_props);
+ instance_data->dispatch_table.GetPhysicalDeviceFeatures(physical_device, &phy_dev_data->phy_device_features);
phy_dev_data->instance = *pInstance;
}
return result;
@@ -144,6 +187,25 @@
}
}
+VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFormatProperties2(VkPhysicalDevice physicalDevice, VkFormat format,
+ VkFormatProperties2 *pProperties) {
+ std::lock_guard<std::mutex> lock(global_lock);
+ layer_data *phy_dev_data = GetLayerDataPtr(physicalDevice, device_profile_api_dev_data_map);
+ layer_data *instance_data = GetLayerDataPtr(phy_dev_data->instance, device_profile_api_dev_data_map);
+ auto device_format_map_it = phy_dev_data->format_properties_map.find(format);
+ if (device_format_map_it != phy_dev_data->format_properties_map.end()) {
+ memcpy((void *)&(pProperties->formatProperties), &phy_dev_data->format_properties_map[format], sizeof(VkFormatProperties));
+ } else {
+ instance_data->dispatch_table.GetPhysicalDeviceFormatProperties2(physicalDevice, format, pProperties);
+ }
+}
+
+VKAPI_ATTR void VKAPI_CALL GetPhysicalDeviceFeatures(VkPhysicalDevice physicalDevice, VkPhysicalDeviceFeatures *pFeatures) {
+ std::lock_guard<std::mutex> lock(global_lock);
+ layer_data *phy_dev_data = GetLayerDataPtr(physicalDevice, device_profile_api_dev_data_map);
+ memcpy(pFeatures, &phy_dev_data->phy_device_features, sizeof(VkPhysicalDeviceFeatures));
+}
+
static const VkLayerProperties device_profile_api_LayerProps = {
"VK_LAYER_LUNARG_device_profile_api",
VK_MAKE_VERSION(1, 0, VK_HEADER_VERSION), // specVersion
@@ -183,6 +245,11 @@
if (!strcmp(name, "vkSetPhysicalDeviceFormatPropertiesEXT")) return (PFN_vkVoidFunction)SetPhysicalDeviceFormatPropertiesEXT;
if (!strcmp(name, "vkGetOriginalPhysicalDeviceFormatPropertiesEXT"))
return (PFN_vkVoidFunction)GetOriginalPhysicalDeviceFormatPropertiesEXT;
+ if (!strcmp(name, "vkSetPhysicalDeviceFormatProperties2EXT")) return (PFN_vkVoidFunction)SetPhysicalDeviceFormatProperties2EXT;
+ if (!strcmp(name, "vkGetOriginalPhysicalDeviceFormatProperties2EXT"))
+ return (PFN_vkVoidFunction)GetOriginalPhysicalDeviceFormatProperties2EXT;
+ if (!strcmp(name, "vkGetOriginalPhysicalDeviceFeaturesEXT")) return (PFN_vkVoidFunction)GetOriginalPhysicalDeviceFeaturesEXT;
+ if (!strcmp(name, "vkSetPhysicalDeviceFeaturesEXT")) return (PFN_vkVoidFunction)SetPhysicalDeviceFeaturesEXT;
layer_data *instance_data = GetLayerDataPtr(instance, device_profile_api_dev_data_map);
auto &table = instance_data->dispatch_table;
if (!table.GetPhysicalDeviceProcAddr) return nullptr;
@@ -193,6 +260,9 @@
if (!strcmp(name, "vkCreateInstance")) return (PFN_vkVoidFunction)CreateInstance;
if (!strcmp(name, "vkGetPhysicalDeviceProperties")) return (PFN_vkVoidFunction)GetPhysicalDeviceProperties;
if (!strcmp(name, "vkGetPhysicalDeviceFormatProperties")) return (PFN_vkVoidFunction)GetPhysicalDeviceFormatProperties;
+ if (!strcmp(name, "vkGetPhysicalDeviceFormatProperties2")) return (PFN_vkVoidFunction)GetPhysicalDeviceFormatProperties2;
+ if (!strcmp(name, "vkGetPhysicalDeviceFormatProperties2KHR")) return (PFN_vkVoidFunction)GetPhysicalDeviceFormatProperties2;
+ if (!strcmp(name, "vkGetPhysicalDeviceFeatures")) return (PFN_vkVoidFunction)GetPhysicalDeviceFeatures;
if (!strcmp(name, "vkGetInstanceProcAddr")) return (PFN_vkVoidFunction)GetInstanceProcAddr;
if (!strcmp(name, "vkEnumerateInstanceExtensionProperties")) return (PFN_vkVoidFunction)EnumerateInstanceExtensionProperties;
if (!strcmp(name, "vkEnumerateInstanceLayerProperties")) return (PFN_vkVoidFunction)EnumerateInstanceLayerProperties;
@@ -201,6 +271,11 @@
if (!strcmp(name, "vkSetPhysicalDeviceFormatPropertiesEXT")) return (PFN_vkVoidFunction)SetPhysicalDeviceFormatPropertiesEXT;
if (!strcmp(name, "vkGetOriginalPhysicalDeviceFormatPropertiesEXT"))
return (PFN_vkVoidFunction)GetOriginalPhysicalDeviceFormatPropertiesEXT;
+ if (!strcmp(name, "vkSetPhysicalDeviceFormatProperties2EXT")) return (PFN_vkVoidFunction)SetPhysicalDeviceFormatProperties2EXT;
+ if (!strcmp(name, "vkGetOriginalPhysicalDeviceFormatProperties2EXT"))
+ return (PFN_vkVoidFunction)GetOriginalPhysicalDeviceFormatProperties2EXT;
+ if (!strcmp(name, "vkGetOriginalPhysicalDeviceFeaturesEXT")) return (PFN_vkVoidFunction)GetOriginalPhysicalDeviceFeaturesEXT;
+ if (!strcmp(name, "vkSetPhysicalDeviceFeaturesEXT")) return (PFN_vkVoidFunction)SetPhysicalDeviceFeaturesEXT;
assert(instance);
layer_data *instance_data = GetLayerDataPtr(instance, device_profile_api_dev_data_map);
auto &table = instance_data->dispatch_table;
diff --git a/tests/layers/vk_lunarg_device_profile_api_layer.h b/tests/layers/vk_lunarg_device_profile_api_layer.h
index 07e6c83..0b65986 100644
--- a/tests/layers/vk_lunarg_device_profile_api_layer.h
+++ b/tests/layers/vk_lunarg_device_profile_api_layer.h
@@ -1,7 +1,8 @@
/*
*
- * Copyright (c) 2016-2017 Valve Corporation
- * Copyright (c) 2016-2017 LunarG, Inc.
+ * Copyright (c) 2016-2020 Valve Corporation
+ * Copyright (c) 2016-2020 LunarG, Inc.
+ * Copyright (c) 2016-2020 The Khronos Group Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -40,6 +41,14 @@
const VkFormatProperties *properties);
typedef void(VKAPI_PTR *PFN_vkSetPhysicalDeviceFormatPropertiesEXT)(VkPhysicalDevice physicalDevice, VkFormat format,
const VkFormatProperties newProperties);
+typedef void(VKAPI_PTR *PFN_vkGetOriginalPhysicalDeviceFormatProperties2EXT)(VkPhysicalDevice physicalDevice, VkFormat format,
+ const VkFormatProperties2 *properties);
+typedef void(VKAPI_PTR *PFN_vkSetPhysicalDeviceFormatProperties2EXT)(VkPhysicalDevice physicalDevice, VkFormat format,
+ const VkFormatProperties2 newProperties);
+typedef void(VKAPI_PTR *PFN_vkGetOriginalPhysicalDeviceFeaturesEXT)(VkPhysicalDevice physicalDevice,
+ const VkPhysicalDeviceFeatures *features);
+typedef void(VKAPI_PTR *PFN_vkSetPhysicalDeviceFeaturesEXT)(VkPhysicalDevice physicalDevice,
+ const VkPhysicalDeviceFeatures newFeatures);
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
diff --git a/tests/test_common.h b/tests/test_common.h
index 91e95ab..9304e45 100644
--- a/tests/test_common.h
+++ b/tests/test_common.h
@@ -45,7 +45,7 @@
#include <vulkan/vk_sdk_platform.h>
#include <vulkan/vulkan.h>
-#ifdef _WIN32
+#ifdef _MSC_VER
#pragma warning(push)
/*
warnings 4251 and 4275 have to do with potential dll-interface mismatch
@@ -78,7 +78,7 @@
#pragma pop_macro("None")
#endif
-#ifdef _WIN32
+#ifdef _MSC_VER
#pragma warning(pop)
#endif
#include "vktestbinding.h"
diff --git a/tests/vk_layer_settings.txt b/tests/vk_layer_settings.txt
deleted file mode 100644
index 3d8dae9..0000000
--- a/tests/vk_layer_settings.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-lunarg_core_validation.report_flags = error
-lunarg_core_validation.debug_action = VK_DBG_LAYER_ACTION_LOG_MSG
-lunarg_object_tracker.report_flags = error
-lunarg_object_tracker.debug_action = VK_DBG_LAYER_ACTION_LOG_MSG
-lunarg_parameter_validation.report_flags = error
-lunarg_parameter_validation.debug_action = VK_DBG_LAYER_ACTION_LOG_MSG
-google_threading.report_flags = error
-google_threading.debug_action = VK_DBG_LAYER_ACTION_LOG_MSG
diff --git a/tests/vklayertests_best_practices.cpp b/tests/vklayertests_best_practices.cpp
index 469754e..f69211d 100644
--- a/tests/vklayertests_best_practices.cpp
+++ b/tests/vklayertests_best_practices.cpp
@@ -17,32 +17,131 @@
#include "layer_validation_tests.h"
void VkBestPracticesLayerTest::InitBestPracticesFramework() {
- VkValidationFeatureEnableEXT enables[] = {VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT};
- VkValidationFeatureDisableEXT disables[] = {VK_VALIDATION_FEATURE_DISABLE_ALL_EXT};
-
- VkValidationFeaturesEXT features = {};
- features.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
- features.enabledValidationFeatureCount = 1;
- features.disabledValidationFeatureCount = 1;
- features.pEnabledValidationFeatures = enables;
- features.pDisabledValidationFeatures = disables;
-
// Enable all vendor-specific checks
-#if defined(_WIN32)
- SetEnvironmentVariable("VK_LAYER_ENABLES", "VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ALL;");
-#else
- setenv("VK_LAYER_ENABLES", "VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ALL:", true);
-#endif
-
- InitFramework(m_errorMonitor, &features);
+ VkLayerSettingValueDataEXT bp_setting_string_value{};
+ bp_setting_string_value.arrayString.pCharArray = "VALIDATION_CHECK_ENABLE_VENDOR_SPECIFIC_ALL";
+ bp_setting_string_value.arrayString.count = sizeof(bp_setting_string_value.arrayString.pCharArray);
+ VkLayerSettingValueEXT bp_vendor_all_setting_val = {"enables", VK_LAYER_SETTING_VALUE_TYPE_STRING_ARRAY_EXT,
+ bp_setting_string_value};
+ VkLayerSettingsEXT bp_settings{static_cast<VkStructureType>(VK_STRUCTURE_TYPE_INSTANCE_LAYER_SETTINGS_EXT), nullptr, 1,
+ &bp_vendor_all_setting_val};
+ features_.pNext = &bp_settings;
+ InitFramework(m_errorMonitor, &features_);
}
-TEST_F(VkBestPracticesLayerTest, UseDeprecatedExtensions) {
- TEST_DESCRIPTION("Create an instance and device with a deprecated extension.");
+TEST_F(VkBestPracticesLayerTest, ValidateReturnCodes) {
+ uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_2);
+ if (version < VK_API_VERSION_1_1) {
+ printf("%s At least Vulkan version 1.2 is required, skipping test.\n", kSkipPrefix);
+ return;
+ }
+
+ if (!AddSurfaceInstanceExtension()) {
+ printf("%s surface extensions not supported, skipping test\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitBestPracticesFramework());
+
+ if (!AddSwapchainDeviceExtension()) {
+ printf("%s swapchain extensions not supported, skipping CmdCopySwapchainImage test\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ if (!InitSwapchain()) {
+ printf("%s Cannot create surface or swapchain, skipping CmdCopySwapchainImage test\n", kSkipPrefix);
+ return;
+ }
+
+ // Attempt to force an invalid return code for an unsupported format
+ VkImageFormatProperties2 image_format_prop = {};
+ image_format_prop.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2;
+ VkPhysicalDeviceImageFormatInfo2 image_format_info = {};
+ image_format_info.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2;
+ image_format_info.format = VK_FORMAT_R32G32B32_SFLOAT;
+ image_format_info.tiling = VK_IMAGE_TILING_LINEAR;
+ image_format_info.type = VK_IMAGE_TYPE_3D;
+ image_format_info.usage = VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT;
+
+ VkResult result = vk::GetPhysicalDeviceImageFormatProperties2(m_device->phy().handle(), &image_format_info, &image_format_prop);
+ // Only run this test if this super-wierd format is not supported
+ if (VK_SUCCESS != result) {
+ m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "UNASSIGNED-BestPractices-Error-Result");
+ vk::GetPhysicalDeviceImageFormatProperties2(m_device->phy().handle(), &image_format_info, &image_format_prop);
+ m_errorMonitor->VerifyFound();
+ }
+
+ if (IsPlatform(kMockICD) || DeviceSimulation()) {
+ printf("%s Test not supported by MockICD, skipping test case.\n", kSkipPrefix);
+ return;
+ }
+
+ // Force a non-success success code by only asking for a subset of query results
+ uint32_t format_count;
+ std::vector<VkSurfaceFormatKHR> formats;
+ result = vk::GetPhysicalDeviceSurfaceFormatsKHR(gpu(), m_surface, &format_count, NULL);
+ if (result != VK_SUCCESS || format_count <= 1) {
+ printf("%s test requires 2 or more extensions available, skipping test.\n", kSkipPrefix);
+ return;
+ }
+ format_count -= 1;
+ formats.resize(format_count);
+
+ m_errorMonitor->SetDesiredFailureMsg(kInformationBit, "UNASSIGNED-BestPractices-NonSuccess-Result");
+ result = vk::GetPhysicalDeviceSurfaceFormatsKHR(gpu(), m_surface, &format_count, formats.data());
+ m_errorMonitor->VerifyFound();
+}
+
+TEST_F(VkBestPracticesLayerTest, UseDeprecatedInstanceExtensions) {
+ TEST_DESCRIPTION("Create an instance with a deprecated extension.");
+
+ uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
+ if (version < VK_API_VERSION_1_1) {
+ printf("%s At least Vulkan version 1.1 is required, skipping test.\n", kSkipPrefix);
+ return;
+ }
+
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s Did not find %s extension, skipped.\n", kSkipPrefix, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitBestPracticesFramework());
+
+ // Create a 1.1 vulkan instance and request an extension promoted to core in 1.1
+ m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "UNASSIGNED-BestPractices-vkCreateInstance-deprecated-extension");
+ VkInstance dummy;
+ auto features = features_;
+ auto ici = GetInstanceCreateInfo();
+ features.pNext = ici.pNext;
+ ici.pNext = &features;
+ vk::CreateInstance(&ici, nullptr, &dummy);
+ m_errorMonitor->VerifyFound();
+
+ // Create a 1.0 vulkan instance and request an extension promoted to core in 1.1
+ m_errorMonitor->ExpectSuccess(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT);
+ m_errorMonitor->SetUnexpectedError("UNASSIGNED-khronos-Validation-debug-build-warning-message");
+ VkApplicationInfo* new_info = new VkApplicationInfo;
+ new_info->apiVersion = VK_API_VERSION_1_0;
+ new_info->pApplicationName = ici.pApplicationInfo->pApplicationName;
+ new_info->applicationVersion = ici.pApplicationInfo->applicationVersion;
+ new_info->pEngineName = ici.pApplicationInfo->pEngineName;
+ new_info->engineVersion = ici.pApplicationInfo->engineVersion;
+ ici.pApplicationInfo = new_info;
+ vk::CreateInstance(&ici, nullptr, &dummy);
+ vk::DestroyInstance(dummy, nullptr);
+ m_errorMonitor->VerifyNotFound();
+}
+
+TEST_F(VkBestPracticesLayerTest, UseDeprecatedDeviceExtensions) {
+ TEST_DESCRIPTION("Create a device with a deprecated extension.");
uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_2);
- if (version <= VK_API_VERSION_1_0) {
- printf("%s At least Vulkan version 1.1 is required for instance, skipping test.\n", kSkipPrefix);
+ if (version < VK_API_VERSION_1_2) {
+ printf("%s At least Vulkan version 1.2 is required, skipping test.\n", kSkipPrefix);
return;
}
@@ -53,9 +152,7 @@
return;
}
- m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "UNASSIGNED-BestPractices-vkCreateInstance-deprecated-extension");
- InitBestPracticesFramework();
- m_errorMonitor->VerifyFound();
+ ASSERT_NO_FATAL_FAILURE(InitBestPracticesFramework());
if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
printf("%s At least Vulkan version 1.2 is required for device, skipping test\n", kSkipPrefix);
@@ -386,6 +483,12 @@
InitBestPracticesFramework();
InitState();
+ if (IsPlatform(kPixel2XL) || IsPlatform(kPixel3) || IsPlatform(kPixel3aXL) || IsPlatform(kShieldTV) || IsPlatform(kShieldTVb) ||
+ IsPlatform(kNexusPlayer)) {
+ printf("%s This test seems super-picky on Android platforms\n", kSkipPrefix);
+ return;
+ }
+
m_errorMonitor->SetDesiredFailureMsg(kPerformanceWarningBit,
"UNASSIGNED-BestPractices-vkCreateFramebuffer-attachment-should-not-be-transient");
@@ -657,7 +760,7 @@
rp_info.pSubpasses = &subpass;
vk::CreateRenderPass(m_device->device(), &rp_info, nullptr, &m_renderPass);
- renderPass_info_ = rp_info;
+ m_renderPass_info = rp_info;
VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
@@ -705,6 +808,10 @@
InitBestPracticesFramework();
InitState();
+ if (IsPlatform(kNexusPlayer) || IsPlatform(kShieldTV) || IsPlatform(kShieldTVb)) {
+ return;
+ }
+
m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
"UNASSIGNED-BestPractices-vkCmdDrawIndexed-many-small-indexed-drawcalls");
@@ -742,3 +849,550 @@
m_commandBuffer->EndRenderPass();
m_commandBuffer->end();
}
+
+TEST_F(VkArmBestPracticesLayerTest, SuboptimalDescriptorReuseTest) {
+ TEST_DESCRIPTION("Test for validation warnings of potentially suboptimal re-use of descriptor set allocations");
+
+ InitBestPracticesFramework();
+ InitState();
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ VkDescriptorPoolSize ds_type_count = {};
+ ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
+ ds_type_count.descriptorCount = 3;
+
+ VkDescriptorPoolCreateInfo ds_pool_ci = {};
+ ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
+ ds_pool_ci.pNext = NULL;
+ ds_pool_ci.maxSets = 6;
+ ds_pool_ci.poolSizeCount = 1;
+ ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
+ ds_pool_ci.pPoolSizes = &ds_type_count;
+
+ VkDescriptorPool ds_pool;
+ VkResult err = vk::CreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
+ ASSERT_VK_SUCCESS(err);
+
+ VkDescriptorSetLayoutBinding ds_binding = {};
+ ds_binding.binding = 0;
+ ds_binding.descriptorCount = 1;
+ ds_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
+
+ VkDescriptorSetLayoutCreateInfo ds_layout_info = {};
+ ds_layout_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
+ ds_layout_info.bindingCount = 1;
+ ds_layout_info.pBindings = &ds_binding;
+
+ VkDescriptorSetLayout ds_layout;
+ err = vk::CreateDescriptorSetLayout(m_device->device(), &ds_layout_info, nullptr, &ds_layout);
+ ASSERT_VK_SUCCESS(err);
+
+ auto ds_layouts = std::vector<VkDescriptorSetLayout>(ds_pool_ci.maxSets, ds_layout);
+
+ std::vector<VkDescriptorSet> descriptor_sets = {};
+ descriptor_sets.resize(ds_layouts.size());
+
+ // allocate N/2 descriptor sets
+ VkDescriptorSetAllocateInfo alloc_info = {};
+ alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
+ alloc_info.descriptorPool = ds_pool;
+ alloc_info.descriptorSetCount = descriptor_sets.size() / 2;
+ alloc_info.pSetLayouts = ds_layouts.data();
+
+ err = vk::AllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets.data());
+ ASSERT_VK_SUCCESS(err);
+
+ // free one descriptor set
+ VkDescriptorSet* ds = descriptor_sets.data();
+ err = vk::FreeDescriptorSets(m_device->device(), ds_pool, 1, ds);
+
+ // the previous allocate and free should not cause any warning
+ ASSERT_VK_SUCCESS(err);
+ m_errorMonitor->VerifyNotFound();
+
+ // allocate the previously freed descriptor set
+ alloc_info = {};
+ alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
+ alloc_info.descriptorPool = ds_pool;
+ alloc_info.descriptorSetCount = 1;
+ alloc_info.pSetLayouts = ds_layouts.data();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
+ "UNASSIGNED-BestPractices-vkAllocateDescriptorSets-suboptimal-reuse");
+
+ err = vk::AllocateDescriptorSets(m_device->device(), &alloc_info, ds);
+
+ // this should create a validation warning, in addition to the appropriate warning message
+ m_errorMonitor->VerifyFound();
+
+ // allocate the remaining descriptor sets (N - (N/2))
+ alloc_info.descriptorSetCount = descriptor_sets.size() - (descriptor_sets.size() / 2);
+ err = vk::AllocateDescriptorSets(m_device->device(), &alloc_info, ds);
+
+ // this should create no validation warnings
+ m_errorMonitor->VerifyNotFound();
+}
+
+TEST_F(VkArmBestPracticesLayerTest, SparseIndexBufferTest) {
+ TEST_DESCRIPTION(
+ "Test for appropriate warnings to be thrown when recording an indexed draw call with sparse/non-sparse index buffers.");
+
+ InitBestPracticesFramework();
+ InitState();
+ ASSERT_NO_FATAL_FAILURE(InitViewport());
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ if (IsPlatform(kMockICD) || DeviceSimulation()) {
+ printf("%s Test not supported by MockICD, skipping tests\n", kSkipPrefix);
+ return;
+ }
+
+ // create a non-sparse index buffer
+ std::vector<uint16_t> nonsparse_indices;
+ nonsparse_indices.resize(128);
+ for (unsigned i = 0; i < nonsparse_indices.size(); i++) {
+ nonsparse_indices[i] = i;
+ }
+
+ std::vector<uint16_t> sparse_indices = nonsparse_indices;
+ // The buffer (0, 1, 2, ..., n) is completely un-sparse. However, if n < 0xFFFF, by adding 0xFFFF at the end, we
+ // should trigger a warning due to loading all the indices in the range 0 to 0xFFFF, despite indices in the range
+ // (n+1) to (0xFFFF - 1) not being used.
+ sparse_indices[sparse_indices.size() - 1] = 0xFFFF;
+
+ VkConstantBufferObj nonsparse_ibo(m_device, nonsparse_indices.size() * sizeof(uint16_t), nonsparse_indices.data(),
+ VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
+ VkConstantBufferObj sparse_ibo(m_device, sparse_indices.size() * sizeof(uint16_t), sparse_indices.data(),
+ VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
+
+ CreatePipelineHelper pipe(*this);
+ pipe.InitInfo();
+ pipe.InitState();
+ pipe.ia_ci_.primitiveRestartEnable = VK_FALSE;
+ pipe.CreateGraphicsPipeline();
+
+ // pipeline with primitive restarts enabled
+ CreatePipelineHelper pr_pipe(*this);
+ pr_pipe.InitInfo();
+ pr_pipe.InitState();
+ pr_pipe.ia_ci_.primitiveRestartEnable = VK_TRUE;
+ pr_pipe.CreateGraphicsPipeline();
+
+ m_commandBuffer->begin();
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+
+ auto test_pipelines = [&](VkConstantBufferObj& ibo, size_t index_count, bool expect_error) -> void {
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
+ m_commandBuffer->BindIndexBuffer(&ibo, static_cast<VkDeviceSize>(0), VK_INDEX_TYPE_UINT16);
+ m_errorMonitor->VerifyNotFound();
+
+ // the validation layer will only be able to analyse mapped memory, it's too expensive otherwise to do in the layer itself
+ ibo.memory().map();
+ if (expect_error)
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
+ "UNASSIGNED-BestPractices-vkCmdDrawIndexed-sparse-index-buffer");
+ m_commandBuffer->DrawIndexed(index_count, 0, 0, 0, 0);
+ m_errorMonitor->VerifyFound();
+ ibo.memory().unmap();
+
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pr_pipe.pipeline_);
+ m_commandBuffer->BindIndexBuffer(&ibo, static_cast<VkDeviceSize>(0), VK_INDEX_TYPE_UINT16);
+ m_errorMonitor->VerifyNotFound();
+
+ ibo.memory().map();
+ if (expect_error)
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
+ "UNASSIGNED-BestPractices-vkCmdDrawIndexed-sparse-index-buffer");
+ m_commandBuffer->DrawIndexed(index_count, 0, 0, 0, 0);
+ m_errorMonitor->VerifyFound();
+ ibo.memory().unmap();
+ };
+
+ // our non-sparse indices should not trigger a warning for both pipelines in this case
+ test_pipelines(nonsparse_ibo, nonsparse_indices.size(), false);
+ // our sparse indices should trigger warnings for both pipelines in this case
+ test_pipelines(sparse_ibo, sparse_indices.size(), true);
+}
+
+TEST_F(VkArmBestPracticesLayerTest, PostTransformVertexCacheThrashingIndicesTest) {
+ TEST_DESCRIPTION(
+ "Test for appropriate warnings to be thrown when recording an indexed draw call where the indices thrash the "
+ "post-transform vertex cache.");
+
+ InitBestPracticesFramework();
+ InitState();
+ ASSERT_NO_FATAL_FAILURE(InitViewport());
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ if (IsPlatform(kMockICD) || DeviceSimulation()) {
+ printf("%s Test not supported by MockICD, skipping tests\n", kSkipPrefix);
+ return;
+ }
+
+ CreatePipelineHelper pipe(*this);
+ pipe.InitInfo();
+ pipe.InitState();
+ pipe.CreateGraphicsPipeline();
+
+ m_commandBuffer->begin();
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
+
+ std::vector<uint16_t> worst_indices;
+ worst_indices.resize(128 * 16);
+ for (size_t i = 0; i < 16; i++) {
+ for (size_t j = 0; j < 128; j++) {
+ // worst case index buffer sequence for re-use
+ // (0, 1, 2, 3, ..., 127, 0, 1, 2, 3, ..., 127, 0, 1, 2, ...<x16>)
+ worst_indices[j + i * 128] = j;
+ }
+ }
+
+ std::vector<uint16_t> best_indices;
+ best_indices.resize(128 * 16);
+ for (size_t i = 0; i < 16; i++) {
+ for (size_t j = 0; j < 128; j++) {
+ // best case index buffer sequence for re-use
+ // (0, 0, 0, ...<x16>, 1, 1, 1, ...<x16>, 2, 2, 2, ...<x16> , ..., 127)
+ best_indices[i + j * 16] = j;
+ }
+ }
+
+ // make sure the worst-case indices throw a warning
+ VkConstantBufferObj worst_ibo(m_device, worst_indices.size() * sizeof(uint16_t), worst_indices.data(),
+ VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
+ m_commandBuffer->BindIndexBuffer(&worst_ibo, static_cast<VkDeviceSize>(0), VK_INDEX_TYPE_UINT16);
+ m_errorMonitor->VerifyNotFound();
+
+ // the validation layer will only be able to analyse mapped memory, it's too expensive otherwise to do in the layer itself
+ worst_ibo.memory().map();
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
+ "UNASSIGNED-BestPractices-vkCmdDrawIndexed-post-transform-cache-thrashing");
+ m_commandBuffer->DrawIndexed(worst_indices.size(), 0, 0, 0, 0);
+ m_errorMonitor->VerifyFound();
+ worst_ibo.memory().unmap();
+
+ // make sure that the best-case indices don't throw a warning
+ VkConstantBufferObj best_ibo(m_device, best_indices.size() * sizeof(uint16_t), best_indices.data(),
+ VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
+ m_commandBuffer->BindIndexBuffer(&best_ibo, static_cast<VkDeviceSize>(0), VK_INDEX_TYPE_UINT16);
+ m_errorMonitor->VerifyNotFound();
+
+ best_ibo.memory().map();
+ m_commandBuffer->DrawIndexed(best_indices.size(), 0, 0, 0, 0);
+ m_errorMonitor->VerifyNotFound();
+ best_ibo.memory().unmap();
+}
+
+TEST_F(VkBestPracticesLayerTest, TripleBufferingTest) {
+ TEST_DESCRIPTION("Test for usage of triple buffering");
+
+ AddSurfaceInstanceExtension();
+ InitBestPracticesFramework();
+ AddSwapchainDeviceExtension();
+ InitState();
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
+ "UNASSIGNED-BestPractices-vkCreateSwapchainKHR-suboptimal-swapchain-image-count");
+ InitSurface();
+ VkImageUsageFlags imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+ VkSurfaceTransformFlagBitsKHR preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
+ VkSurfaceCapabilitiesKHR capabilities;
+ vk::GetPhysicalDeviceSurfaceCapabilitiesKHR(m_device->phy().handle(), m_surface, &capabilities);
+
+ uint32_t format_count;
+ vk::GetPhysicalDeviceSurfaceFormatsKHR(m_device->phy().handle(), m_surface, &format_count, nullptr);
+ vector<VkSurfaceFormatKHR> formats;
+ if (format_count != 0) {
+ formats.resize(format_count);
+ vk::GetPhysicalDeviceSurfaceFormatsKHR(m_device->phy().handle(), m_surface, &format_count, formats.data());
+ }
+
+ uint32_t present_mode_count;
+ vk::GetPhysicalDeviceSurfacePresentModesKHR(m_device->phy().handle(), m_surface, &present_mode_count, nullptr);
+ vector<VkPresentModeKHR> present_modes;
+ if (present_mode_count != 0) {
+ present_modes.resize(present_mode_count);
+ vk::GetPhysicalDeviceSurfacePresentModesKHR(m_device->phy().handle(), m_surface, &present_mode_count, present_modes.data());
+ }
+
+ VkSwapchainCreateInfoKHR swapchain_create_info = {};
+ swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
+ swapchain_create_info.pNext = 0;
+ swapchain_create_info.surface = m_surface;
+ swapchain_create_info.minImageCount = 2;
+ swapchain_create_info.imageFormat = formats[0].format;
+ swapchain_create_info.imageColorSpace = formats[0].colorSpace;
+ swapchain_create_info.imageExtent = {capabilities.minImageExtent.width, capabilities.minImageExtent.height};
+ swapchain_create_info.imageArrayLayers = 1;
+ swapchain_create_info.imageUsage = imageUsage;
+ swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ swapchain_create_info.preTransform = preTransform;
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
+ swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR;
+#else
+ swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
+#endif
+ swapchain_create_info.presentMode = present_modes[0];
+ swapchain_create_info.clipped = VK_FALSE;
+ swapchain_create_info.oldSwapchain = 0;
+
+ VkResult err = vk::CreateSwapchainKHR(device(), &swapchain_create_info, nullptr, &m_swapchain);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
+ "UNASSIGNED-BestPractices-vkCreateSwapchainKHR-suboptimal-swapchain-image-count");
+ swapchain_create_info.minImageCount = 3;
+ err = vk::CreateSwapchainKHR(device(), &swapchain_create_info, nullptr, &m_swapchain);
+ m_errorMonitor->VerifyNotFound();
+ ASSERT_VK_SUCCESS(err)
+ DestroySwapchain();
+}
+
+TEST_F(VkArmBestPracticesLayerTest, PresentModeTest) {
+ TEST_DESCRIPTION("Test for usage of Presentation Modes");
+
+ AddSurfaceInstanceExtension();
+ InitBestPracticesFramework();
+ AddSwapchainDeviceExtension();
+ InitState();
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
+ "UNASSIGNED-BestPractices-vkCreateSwapchainKHR-swapchain-presentmode-not-fifo");
+ InitSurface();
+ VkImageUsageFlags imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+ VkSurfaceTransformFlagBitsKHR preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
+ VkSurfaceCapabilitiesKHR capabilities;
+ vk::GetPhysicalDeviceSurfaceCapabilitiesKHR(m_device->phy().handle(), m_surface, &capabilities);
+
+ uint32_t format_count;
+ vk::GetPhysicalDeviceSurfaceFormatsKHR(m_device->phy().handle(), m_surface, &format_count, nullptr);
+ vector<VkSurfaceFormatKHR> formats;
+ if (format_count != 0) {
+ formats.resize(format_count);
+ vk::GetPhysicalDeviceSurfaceFormatsKHR(m_device->phy().handle(), m_surface, &format_count, formats.data());
+ }
+
+ uint32_t present_mode_count;
+ vk::GetPhysicalDeviceSurfacePresentModesKHR(m_device->phy().handle(), m_surface, &present_mode_count, nullptr);
+ vector<VkPresentModeKHR> present_modes;
+ if (present_mode_count != 0) {
+ present_modes.resize(present_mode_count);
+ vk::GetPhysicalDeviceSurfacePresentModesKHR(m_device->phy().handle(), m_surface, &present_mode_count, present_modes.data());
+ }
+
+ VkSwapchainCreateInfoKHR swapchain_create_info = {};
+ swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
+ swapchain_create_info.pNext = 0;
+ swapchain_create_info.surface = m_surface;
+ swapchain_create_info.minImageCount = capabilities.minImageCount;
+ swapchain_create_info.imageFormat = formats[0].format;
+ swapchain_create_info.imageColorSpace = formats[0].colorSpace;
+ swapchain_create_info.imageExtent = {capabilities.minImageExtent.width, capabilities.minImageExtent.height};
+ swapchain_create_info.imageArrayLayers = 1;
+ swapchain_create_info.imageUsage = imageUsage;
+ swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ swapchain_create_info.preTransform = preTransform;
+ swapchain_create_info.clipped = VK_FALSE;
+ swapchain_create_info.oldSwapchain = 0;
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
+ swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR;
+#else
+ swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
+#endif
+ if (present_modes.size() <= 1) {
+ printf("TEST SKIPPED: Only %i presentation mode is available!", int(present_modes.size()));
+ return;
+ }
+
+ for (size_t i = 0; i < present_modes.size(); i++) {
+ if (present_modes[i] != VK_PRESENT_MODE_FIFO_KHR) {
+ swapchain_create_info.presentMode = present_modes[i];
+ break;
+ }
+ }
+
+ VkResult err = vk::CreateSwapchainKHR(device(), &swapchain_create_info, nullptr, &m_swapchain);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
+ "UNASSIGNED-BestPractices-vkCreateSwapchainKHR-swapchain-presentmode-not-fifo");
+ swapchain_create_info.presentMode = VK_PRESENT_MODE_FIFO_KHR;
+ err = vk::CreateSwapchainKHR(device(), &swapchain_create_info, nullptr, &m_swapchain);
+ m_errorMonitor->VerifyNotFound();
+ ASSERT_VK_SUCCESS(err)
+ DestroySwapchain();
+}
+
+TEST_F(VkArmBestPracticesLayerTest, PipelineDepthBiasZeroTest) {
+ TEST_DESCRIPTION("Test for unnecessary rasterization due to using 0 for depthBiasConstantFactor and depthBiasSlopeFactor");
+
+ InitBestPracticesFramework();
+ InitState();
+ ASSERT_NO_FATAL_FAILURE(InitViewport());
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ CreatePipelineHelper pipe(*this);
+ pipe.InitInfo();
+ pipe.rs_state_ci_.depthBiasEnable = VK_TRUE;
+ pipe.rs_state_ci_.depthBiasConstantFactor = 0.0f;
+ pipe.rs_state_ci_.depthBiasSlopeFactor = 0.0f;
+ pipe.InitState();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
+ "UNASSIGNED-BestPractices-vkCreatePipelines-depthbias-zero");
+ pipe.CreateGraphicsPipeline();
+ m_errorMonitor->VerifyFound();
+
+ pipe.rs_state_ci_.depthBiasEnable = VK_FALSE;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
+ "UNASSIGNED-BestPractices-vkCreatePipelines-depthbias-zero");
+ pipe.CreateGraphicsPipeline();
+ m_errorMonitor->VerifyNotFound();
+}
+
+TEST_F(VkArmBestPracticesLayerTest, RobustBufferAccessTest) {
+ TEST_DESCRIPTION("Test for appropriate warnings to be thrown when robustBufferAccess is enabled.");
+
+ InitBestPracticesFramework();
+
+ VkDevice local_device;
+ VkDeviceQueueCreateInfo queue_info = {};
+ queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
+ queue_info.pNext = nullptr;
+ queue_info.queueFamilyIndex = 0;
+ queue_info.queueCount = 1;
+ queue_info.pQueuePriorities = nullptr;
+ VkDeviceCreateInfo dev_info = {};
+ dev_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
+ dev_info.pNext = nullptr;
+ dev_info.queueCreateInfoCount = 1;
+ dev_info.pQueueCreateInfos = &queue_info;
+ dev_info.enabledLayerCount = 0;
+ dev_info.ppEnabledLayerNames = nullptr;
+ dev_info.enabledExtensionCount = m_device_extension_names.size();
+ dev_info.ppEnabledExtensionNames = m_device_extension_names.data();
+
+ VkPhysicalDeviceFeatures supported_features;
+ vk::GetPhysicalDeviceFeatures(this->gpu(), &supported_features);
+ if (supported_features.robustBufferAccess) {
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
+ "UNASSIGNED-BestPractices-vkCreateDevice-RobustBufferAccess");
+ VkPhysicalDeviceFeatures device_features = {};
+ device_features.robustBufferAccess = VK_TRUE;
+ dev_info.pEnabledFeatures = &device_features;
+ vk::CreateDevice(this->gpu(), &dev_info, nullptr, &local_device);
+ m_errorMonitor->VerifyFound();
+ } else {
+ printf("%s robustBufferAccess is not available, skipping test\n", kSkipPrefix);
+ return;
+ }
+}
+
+TEST_F(VkArmBestPracticesLayerTest, DepthPrePassUsage) {
+ InitBestPracticesFramework();
+ InitState();
+
+ if (IsPlatform(kNexusPlayer)) {
+ printf("%s This test crashes on the NexusPlayer platform\n", kSkipPrefix);
+ return;
+ }
+
+ InitRenderTarget();
+
+ VkAttachmentDescription attachment{};
+ attachment.samples = VK_SAMPLE_COUNT_4_BIT;
+ attachment.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
+ attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
+ attachment.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+
+ VkRenderPassCreateInfo rp_info{};
+ rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
+ rp_info.attachmentCount = 1;
+ rp_info.pAttachments = &attachment;
+ rp_info.pNext = nullptr;
+
+ VkRenderPass rp = VK_NULL_HANDLE;
+ vk::CreateRenderPass(m_device->device(), &rp_info, nullptr, &rp);
+
+ // set up pipelines
+
+ VkPipelineColorBlendAttachmentState color_write_off = {};
+ VkPipelineColorBlendAttachmentState color_write_on = {};
+ color_write_on.colorWriteMask = 0xF;
+
+ VkPipelineColorBlendStateCreateInfo cb_depth_only_ci = {};
+ cb_depth_only_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
+ cb_depth_only_ci.attachmentCount = 1;
+ cb_depth_only_ci.pAttachments = &color_write_off;
+
+ VkPipelineColorBlendStateCreateInfo cb_depth_equal_ci = {};
+ cb_depth_equal_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
+ cb_depth_equal_ci.attachmentCount = 1;
+ cb_depth_equal_ci.pAttachments = &color_write_on;
+
+ VkPipelineDepthStencilStateCreateInfo ds_depth_only_ci = {};
+ ds_depth_only_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
+ ds_depth_only_ci.depthTestEnable = VK_TRUE;
+ ds_depth_only_ci.depthWriteEnable = VK_TRUE;
+ ds_depth_only_ci.depthCompareOp = VK_COMPARE_OP_LESS;
+
+ VkPipelineDepthStencilStateCreateInfo ds_depth_equal_ci = {};
+ ds_depth_equal_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
+ ds_depth_equal_ci.depthTestEnable = VK_TRUE;
+ ds_depth_equal_ci.depthWriteEnable = VK_FALSE;
+ ds_depth_equal_ci.depthCompareOp = VK_COMPARE_OP_EQUAL;
+
+ CreatePipelineHelper pipe_depth_only(*this);
+ pipe_depth_only.InitInfo();
+ pipe_depth_only.gp_ci_.pColorBlendState = &cb_depth_only_ci;
+ pipe_depth_only.gp_ci_.pDepthStencilState = &ds_depth_only_ci;
+ pipe_depth_only.InitState();
+ pipe_depth_only.CreateGraphicsPipeline();
+
+ CreatePipelineHelper pipe_depth_equal(*this);
+ pipe_depth_equal.InitInfo();
+ pipe_depth_equal.gp_ci_.pColorBlendState = &cb_depth_equal_ci;
+ pipe_depth_equal.gp_ci_.pDepthStencilState = &ds_depth_equal_ci;
+ pipe_depth_equal.InitState();
+ pipe_depth_equal.CreateGraphicsPipeline();
+
+ // create a simple index buffer
+
+ std::vector<uint32_t> indices = {};
+ indices.resize(3);
+
+ VkConstantBufferObj ibo(m_device, sizeof(uint32_t) * indices.size(), indices.data(), VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
+
+ m_commandBuffer->begin();
+ m_commandBuffer->BindIndexBuffer(&ibo, 0, VK_INDEX_TYPE_UINT32);
+
+ // record a command buffer which doesn't use enough depth pre-passes or geometry to matter
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_depth_only.pipeline_);
+ for (size_t i = 0; i < 30; i++) m_commandBuffer->DrawIndexed(indices.size(), 10, 0, 0, 0);
+
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_depth_equal.pipeline_);
+ for (size_t i = 0; i < 30; i++) m_commandBuffer->DrawIndexed(indices.size(), 10, 0, 0, 0);
+
+ m_commandBuffer->EndRenderPass();
+
+ m_errorMonitor->VerifyNotFound();
+
+ // record a command buffer which records a significant number of depth pre-passes
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+
+ m_errorMonitor->SetDesiredFailureMsg(kPerformanceWarningBit,
+ "UNASSIGNED-BestPractices-vkCmdEndRenderPass-depth-pre-pass-usage");
+
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_depth_only.pipeline_);
+ for (size_t i = 0; i < 30; i++) m_commandBuffer->DrawIndexed(indices.size(), 1000, 0, 0, 0);
+
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_depth_equal.pipeline_);
+ for (size_t i = 0; i < 30; i++) m_commandBuffer->DrawIndexed(indices.size(), 1000, 0, 0, 0);
+
+ m_commandBuffer->EndRenderPass();
+
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->end();
+}
diff --git a/tests/vklayertests_buffer_image_memory_sampler.cpp b/tests/vklayertests_buffer_image_memory_sampler.cpp
index 46932a5..eb759a4 100644
--- a/tests/vklayertests_buffer_image_memory_sampler.cpp
+++ b/tests/vklayertests_buffer_image_memory_sampler.cpp
@@ -24,6 +24,8 @@
* Author: John Zulauf <jzulauf@lunarg.com>
*/
+#include <type_traits>
+
#include "cast_utils.h"
#include "layer_validation_tests.h"
@@ -1108,23 +1110,7 @@
VkResult err;
bool pass;
- // Enable KHR YCbCr req'd extensions for Disjoint Bit
- bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
- if (mp_extensions) {
- m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
- }
- ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
- mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
- mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
- mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
- mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
- if (mp_extensions) {
- m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
- m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
- m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
- m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
- }
- ASSERT_NO_FATAL_FAILURE(InitState());
+ ASSERT_NO_FATAL_FAILURE(Init());
const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
const int32_t tex_width = 256;
@@ -1464,152 +1450,1027 @@
vk::DestroyBuffer(m_device->device(), sparse_buffer, NULL);
}
}
+}
- // Try to bind an image created with multi-planar formats
- if (!mp_extensions) {
- printf("%s test requires KHR YCbCr extensions, not available. Skipping.\n", kSkipPrefix);
+TEST_F(VkLayerTest, BindInvalidMemoryYcbcr) {
+ // Enable KHR YCbCr req'd extensions for Disjoint Bit
+ bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ if (mp_extensions) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ if (mp_extensions) {
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
} else {
+ printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ // Create aliased function pointers for 1.0 and 1.1 contexts
+ PFN_vkBindImageMemory2KHR vkBindImageMemory2Function = nullptr;
+ PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2Function = nullptr;
+ if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
+ vkBindImageMemory2Function = vk::BindImageMemory2;
+ vkGetImageMemoryRequirements2Function = vk::GetImageMemoryRequirements2;
+ } else {
+ vkBindImageMemory2Function = (PFN_vkBindImageMemory2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkBindImageMemory2KHR");
+ vkGetImageMemoryRequirements2Function =
+ (PFN_vkGetImageMemoryRequirements2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkGetImageMemoryRequirements2KHR");
+ }
+
+ // Try to bind an image created with Disjoint bit
+ VkFormatProperties format_properties;
+ VkFormat mp_format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
+ vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), mp_format, &format_properties);
+ // Need to make sure disjoint is supported for format
+ // Also need to support an arbitrary image usage feature
+ if (0 == (format_properties.optimalTilingFeatures & (VK_FORMAT_FEATURE_DISJOINT_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT))) {
+ printf("%s test requires disjoint/sampled feature bit on format. Skipping.\n", kSkipPrefix);
+ } else {
+ VkImageCreateInfo image_create_info = {};
+ image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_create_info.pNext = NULL;
+ image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ image_create_info.format = mp_format;
+ image_create_info.extent.width = 64;
+ image_create_info.extent.height = 64;
+ image_create_info.extent.depth = 1;
+ image_create_info.mipLevels = 1;
+ image_create_info.arrayLayers = 1;
+ image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
+ image_create_info.flags = VK_IMAGE_CREATE_DISJOINT_BIT;
+
+ VkImage image;
+ ASSERT_VK_SUCCESS(vk::CreateImage(device(), &image_create_info, NULL, &image));
+
+ VkImagePlaneMemoryRequirementsInfo image_plane_req = {VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO};
+ image_plane_req.planeAspect = VK_IMAGE_ASPECT_PLANE_0_BIT;
+
+ VkImageMemoryRequirementsInfo2 mem_req_info2 = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2};
+ mem_req_info2.pNext = &image_plane_req;
+ mem_req_info2.image = image;
+ VkMemoryRequirements2 mem_req2 = {VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2};
+ vkGetImageMemoryRequirements2Function(device(), &mem_req_info2, &mem_req2);
+
+ // Find a valid memory type index to memory to be allocated from
+ VkMemoryAllocateInfo alloc_info = {VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO};
+ alloc_info.allocationSize = mem_req2.memoryRequirements.size;
+ ASSERT_TRUE(m_device->phy().set_memory_type(mem_req2.memoryRequirements.memoryTypeBits, &alloc_info, 0));
+
+ VkDeviceMemory image_memory;
+ ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &alloc_info, NULL, &image_memory));
+
+ // Bind disjoint with BindImageMemory instead of BindImageMemory2
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindImageMemory-image-01608");
+ vk::BindImageMemory(device(), image, image_memory, 0);
+ m_errorMonitor->VerifyFound();
+
+ VkBindImagePlaneMemoryInfo plane_memory_info = {VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO};
+ ASSERT_TRUE(FormatPlaneCount(mp_format) == 2);
+ plane_memory_info.planeAspect = VK_IMAGE_ASPECT_PLANE_2_BIT;
+
+ VkBindImageMemoryInfo bind_image_info = {VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO};
+ bind_image_info.pNext = &plane_memory_info;
+ bind_image_info.image = image;
+ bind_image_info.memory = image_memory;
+ bind_image_info.memoryOffset = 0;
+
+ // Set invalid planeAspect
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBindImagePlaneMemoryInfo-planeAspect-02283");
+ // Error is thrown from not having both planes bound
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindImageMemory2-pBindInfos-02858");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindImageMemory2-pBindInfos-02858");
+ // Might happen as plane2 wasn't queried for its memroy type
+ m_errorMonitor->SetUnexpectedError("VUID-VkBindImageMemoryInfo-pNext-01619");
+ m_errorMonitor->SetUnexpectedError("VUID-VkBindImageMemoryInfo-pNext-01621");
+ vkBindImageMemory2Function(device(), 1, &bind_image_info);
+ m_errorMonitor->VerifyFound();
+
+ vk::FreeMemory(device(), image_memory, NULL);
+ vk::DestroyImage(device(), image, nullptr);
+ }
+
+ // Bind image with VkBindImagePlaneMemoryInfo without disjoint bit in image
+ // Need to support an arbitrary image usage feature for multi-planar format
+ if (0 == (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
+ printf("%s test requires sampled feature bit on multi-planar format. Skipping.\n", kSkipPrefix);
+ } else {
+ VkImageCreateInfo image_create_info = {};
+ image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_create_info.pNext = NULL;
+ image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ image_create_info.format = mp_format;
+ image_create_info.extent.width = 64;
+ image_create_info.extent.height = 64;
+ image_create_info.extent.depth = 1;
+ image_create_info.mipLevels = 1;
+ image_create_info.arrayLayers = 1;
+ image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
+ image_create_info.flags = 0; // no disjoint bit set
+
+ VkImage image;
+ ASSERT_VK_SUCCESS(vk::CreateImage(device(), &image_create_info, NULL, &image));
+
+ VkImageMemoryRequirementsInfo2 mem_req_info2 = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2};
+ mem_req_info2.pNext = NULL;
+ mem_req_info2.image = image;
+ VkMemoryRequirements2 mem_req2 = {VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2};
+ vkGetImageMemoryRequirements2Function(device(), &mem_req_info2, &mem_req2);
+
+ // Find a valid memory type index to memory to be allocated from
+ VkMemoryAllocateInfo alloc_info = {VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO};
+ alloc_info.allocationSize = mem_req2.memoryRequirements.size;
+ ASSERT_TRUE(m_device->phy().set_memory_type(mem_req2.memoryRequirements.memoryTypeBits, &alloc_info, 0));
+
+ VkDeviceMemory image_memory;
+ ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &alloc_info, NULL, &image_memory));
+
+ VkBindImagePlaneMemoryInfo plane_memory_info = {VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO};
+ plane_memory_info.planeAspect = VK_IMAGE_ASPECT_PLANE_0_BIT;
+ VkBindImageMemoryInfo bind_image_info = {VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO};
+ bind_image_info.pNext = &plane_memory_info;
+ bind_image_info.image = image;
+ bind_image_info.memory = image_memory;
+ bind_image_info.memoryOffset = 0;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBindImageMemoryInfo-pNext-01618");
+ vkBindImageMemory2Function(device(), 1, &bind_image_info);
+ m_errorMonitor->VerifyFound();
+
+ vk::FreeMemory(device(), image_memory, NULL);
+ vk::DestroyImage(device(), image, nullptr);
+ }
+}
+
+TEST_F(VkLayerTest, BindInvalidMemory2Disjoint) {
+ TEST_DESCRIPTION("These tests deal with VK_KHR_bind_memory_2 and disjoint memory being bound");
+
+ // Enable KHR YCbCr req'd extensions for Disjoint Bit
+ bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ if (mp_extensions) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+
+ bool bind_memory_2_extension = DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+
+ if (mp_extensions) {
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ } else if (bind_memory_2_extension) {
+ // bind_memory_2 extension is subset of mp_extensions
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ } else {
+ printf("%s test requires VK_KHR_bind_memory2 extensions, not available. Skipping.\n", kSkipPrefix);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ // Create aliased function pointers for 1.0 and 1.1 contexts
+ PFN_vkBindImageMemory2KHR vkBindImageMemory2Function = nullptr;
+ PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2Function = nullptr;
+
+ if (bind_memory_2_extension) {
+ if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
+ vkBindImageMemory2Function = vk::BindImageMemory2;
+ } else {
+ vkBindImageMemory2Function =
+ (PFN_vkBindImageMemory2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkBindImageMemory2KHR");
+ }
+ }
+
+ if (mp_extensions) {
+ if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
+ vkGetImageMemoryRequirements2Function = vk::GetImageMemoryRequirements2;
+ } else {
+ vkGetImageMemoryRequirements2Function =
+ (PFN_vkGetImageMemoryRequirements2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkGetImageMemoryRequirements2KHR");
+ }
+ }
+
+ const VkFormat mp_format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
+ const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
+
+ VkImageCreateInfo image_create_info = {};
+ image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_create_info.pNext = NULL;
+ image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ image_create_info.format = tex_format;
+ image_create_info.extent.width = 256;
+ image_create_info.extent.height = 256;
+ image_create_info.extent.depth = 1;
+ image_create_info.mipLevels = 1;
+ image_create_info.arrayLayers = 1;
+ image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
+ image_create_info.flags = 0;
+
+ // Only gets used in MP tests
+ VkImageCreateInfo mp_image_create_info = image_create_info;
+ mp_image_create_info.format = mp_format;
+ mp_image_create_info.flags = VK_IMAGE_CREATE_DISJOINT_BIT;
+
+ // Check for support of format used by all multi-planar tests
+ // Need seperate boolean as its valid to do tests that support YCbCr but not disjoint
+ bool mp_disjoint_support = false;
+ if (mp_extensions == true) {
+ VkFormatProperties mp_format_properties;
+ vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), mp_format, &mp_format_properties);
+ if (0 !=
+ (mp_format_properties.optimalTilingFeatures & (VK_FORMAT_FEATURE_DISJOINT_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT))) {
+ mp_disjoint_support = true;
+ }
+ }
+
+ // Try to bind memory to an object with an invalid memoryOffset
+
+ VkImage image = VK_NULL_HANDLE;
+ ASSERT_VK_SUCCESS(vk::CreateImage(device(), &image_create_info, NULL, &image));
+ VkMemoryRequirements image_mem_reqs = {};
+ vk::GetImageMemoryRequirements(device(), image, &image_mem_reqs);
+ VkMemoryAllocateInfo image_alloc_info = {};
+ image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ // Leave some extra space for alignment wiggle room
+ image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
+ ASSERT_TRUE(m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0));
+ VkDeviceMemory image_mem;
+ ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &image_alloc_info, NULL, &image_mem));
+
+ // Keep values outside scope so multiple tests cases can reuse
+ VkImage mp_image = VK_NULL_HANDLE;
+ VkDeviceMemory mp_image_mem[2] = {VK_NULL_HANDLE, VK_NULL_HANDLE};
+ VkMemoryRequirements2 mp_image_mem_reqs2[2];
+ VkMemoryAllocateInfo mp_image_alloc_info[2];
+ if (mp_disjoint_support == true) {
+ ASSERT_VK_SUCCESS(vk::CreateImage(device(), &mp_image_create_info, NULL, &mp_image));
+
+ VkImagePlaneMemoryRequirementsInfo image_plane_req = {VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO};
+ image_plane_req.pNext = nullptr;
+ image_plane_req.planeAspect = VK_IMAGE_ASPECT_PLANE_0_BIT;
+
+ VkImageMemoryRequirementsInfo2 mem_req_info2 = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2};
+ mem_req_info2.pNext = (void *)&image_plane_req;
+ mem_req_info2.image = mp_image;
+ mp_image_mem_reqs2[0].sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2;
+ mp_image_mem_reqs2[0].pNext = nullptr;
+ vkGetImageMemoryRequirements2Function(device(), &mem_req_info2, &mp_image_mem_reqs2[0]);
+
+ image_plane_req.planeAspect = VK_IMAGE_ASPECT_PLANE_1_BIT;
+ mp_image_mem_reqs2[1].sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2;
+ mp_image_mem_reqs2[1].pNext = nullptr;
+ vkGetImageMemoryRequirements2Function(device(), &mem_req_info2, &mp_image_mem_reqs2[1]);
+
+ mp_image_alloc_info[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ mp_image_alloc_info[0].pNext = nullptr;
+ mp_image_alloc_info[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ mp_image_alloc_info[1].pNext = nullptr;
+ // Leave some extra space for alignment wiggle room
+ // plane 0
+ mp_image_alloc_info[0].allocationSize =
+ mp_image_mem_reqs2[0].memoryRequirements.size + mp_image_mem_reqs2[0].memoryRequirements.alignment;
+ ASSERT_TRUE(
+ m_device->phy().set_memory_type(mp_image_mem_reqs2[0].memoryRequirements.memoryTypeBits, &mp_image_alloc_info[0], 0));
+ // Exact size as VU will always be for plane 1
+ // plane 1
+ mp_image_alloc_info[1].allocationSize = mp_image_mem_reqs2[1].memoryRequirements.size;
+ ASSERT_TRUE(
+ m_device->phy().set_memory_type(mp_image_mem_reqs2[1].memoryRequirements.memoryTypeBits, &mp_image_alloc_info[1], 0));
+
+ ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &mp_image_alloc_info[0], NULL, &mp_image_mem[0]));
+ ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &mp_image_alloc_info[1], NULL, &mp_image_mem[1]));
+ }
+
+ // All planes must be bound at once the same here
+ VkBindImagePlaneMemoryInfo plane_memory_info[2];
+ plane_memory_info[0].sType = VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO;
+ plane_memory_info[0].pNext = nullptr;
+ plane_memory_info[0].planeAspect = VK_IMAGE_ASPECT_PLANE_0_BIT;
+ plane_memory_info[1].sType = VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO;
+ plane_memory_info[1].pNext = nullptr;
+ plane_memory_info[1].planeAspect = VK_IMAGE_ASPECT_PLANE_1_BIT;
+
+ // Test unaligned memory offset
+
+ // single-plane image
+ if (bind_memory_2_extension == true) {
+ VkBindImageMemoryInfo bind_image_info = {VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO};
+ bind_image_info.pNext = nullptr;
+ bind_image_info.image = image;
+ bind_image_info.memory = image_mem;
+ bind_image_info.memoryOffset = 1; // off alignment
+
+ if (mp_disjoint_support == true) {
+ VkImageMemoryRequirementsInfo2 mem_req_info2 = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2};
+ mem_req_info2.pNext = nullptr;
+ mem_req_info2.image = image;
+ VkMemoryRequirements2 mem_req2 = {VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2, nullptr};
+ vkGetImageMemoryRequirements2Function(device(), &mem_req_info2, &mem_req2);
+
+ if (mem_req2.memoryRequirements.alignment > 1) {
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBindImageMemoryInfo-pNext-01616");
+ vkBindImageMemory2Function(device(), 1, &bind_image_info);
+ m_errorMonitor->VerifyFound();
+ }
+ } else {
+ // Same as 01048 but with bindImageMemory2 call
+ if (image_mem_reqs.alignment > 1) {
+ const char *vuid =
+ (mp_extensions) ? "VUID-VkBindImageMemoryInfo-pNext-01616" : "VUID-VkBindImageMemoryInfo-memoryOffset-01613";
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
+ vkBindImageMemory2Function(device(), 1, &bind_image_info);
+ m_errorMonitor->VerifyFound();
+ }
+ }
+ }
+
+ // Multi-plane image
+ if (mp_disjoint_support == true) {
+ if (mp_image_mem_reqs2[0].memoryRequirements.alignment > 1) {
+ VkBindImageMemoryInfo bind_image_info[2];
+ bind_image_info[0].sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO;
+ bind_image_info[0].pNext = (void *)&plane_memory_info[0];
+ bind_image_info[0].image = mp_image;
+ bind_image_info[0].memory = mp_image_mem[0];
+ bind_image_info[0].memoryOffset = 1; // off alignment
+ bind_image_info[1].sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO;
+ bind_image_info[1].pNext = (void *)&plane_memory_info[1];
+ bind_image_info[1].image = mp_image;
+ bind_image_info[1].memory = mp_image_mem[1];
+ bind_image_info[1].memoryOffset = 0;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBindImageMemoryInfo-pNext-01620");
+ vkBindImageMemory2Function(device(), 2, bind_image_info);
+ m_errorMonitor->VerifyFound();
+ }
+ }
+
+ // Test memory offsets within the memory allocation, but which leave too little memory for
+ // the resource.
+ // single-plane image
+ if (bind_memory_2_extension == true) {
+ VkBindImageMemoryInfo bind_image_info = {VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO};
+ bind_image_info.pNext = nullptr;
+ bind_image_info.image = image;
+ bind_image_info.memory = image_mem;
+
+ if (mp_disjoint_support == true) {
+ VkImageMemoryRequirementsInfo2 mem_req_info2 = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2};
+ mem_req_info2.pNext = nullptr;
+ mem_req_info2.image = image;
+ VkMemoryRequirements2 mem_req2 = {VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2, nullptr};
+ vkGetImageMemoryRequirements2Function(device(), &mem_req_info2, &mem_req2);
+
+ VkDeviceSize image2_offset = (mem_req2.memoryRequirements.size - 1) & ~(mem_req2.memoryRequirements.alignment - 1);
+ if ((image2_offset > 0) &&
+ (mem_req2.memoryRequirements.size < (image_alloc_info.allocationSize - mem_req2.memoryRequirements.alignment))) {
+ bind_image_info.memoryOffset = image2_offset;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBindImageMemoryInfo-pNext-01617");
+ vkBindImageMemory2Function(device(), 1, &bind_image_info);
+ m_errorMonitor->VerifyFound();
+ }
+ } else {
+ // Same as 01049 but with bindImageMemory2 call
+ VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
+ if ((image_offset > 0) && (image_mem_reqs.size < (image_alloc_info.allocationSize - image_mem_reqs.alignment))) {
+ bind_image_info.memoryOffset = image_offset;
+ const char *vuid =
+ (mp_extensions) ? "VUID-VkBindImageMemoryInfo-pNext-01617" : "VUID-VkBindImageMemoryInfo-memory-01614";
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
+ vkBindImageMemory2Function(device(), 1, &bind_image_info);
+ m_errorMonitor->VerifyFound();
+ }
+ }
+ }
+
+ // Multi-plane image
+ if (mp_disjoint_support == true) {
+ VkDeviceSize mp_image_offset =
+ (mp_image_mem_reqs2[0].memoryRequirements.size - 1) & ~(mp_image_mem_reqs2[0].memoryRequirements.alignment - 1);
+ if ((mp_image_offset > 0) &&
+ (mp_image_mem_reqs2[0].memoryRequirements.size <
+ (mp_image_alloc_info[0].allocationSize - mp_image_mem_reqs2[0].memoryRequirements.alignment))) {
+ VkBindImageMemoryInfo bind_image_info[2];
+ bind_image_info[0].sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO;
+ bind_image_info[0].pNext = (void *)&plane_memory_info[0];
+ bind_image_info[0].image = mp_image;
+ bind_image_info[0].memory = mp_image_mem[0];
+ bind_image_info[0].memoryOffset = mp_image_offset; // mis-offset
+ bind_image_info[1].sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO;
+ bind_image_info[1].pNext = (void *)&plane_memory_info[1];
+ bind_image_info[1].image = mp_image;
+ bind_image_info[1].memory = mp_image_mem[1];
+ bind_image_info[1].memoryOffset = 0;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBindImageMemoryInfo-pNext-01621");
+ vkBindImageMemory2Function(device(), 2, bind_image_info);
+ m_errorMonitor->VerifyFound();
+ }
+ }
+
+ // Free Memory to reset
+ vk::FreeMemory(device(), image_mem, NULL);
+ if (mp_disjoint_support == true) {
+ // only reset plane 0
+ vk::FreeMemory(device(), mp_image_mem[0], NULL);
+ }
+
+ // Try to bind memory to an object with an invalid memory type
+
+ // Create a mask of available memory types *not* supported by these resources, and try to use one of them.
+ VkPhysicalDeviceMemoryProperties memory_properties = {};
+ vk::GetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
+
+ // single-plane image
+ if (bind_memory_2_extension == true) {
+ VkBindImageMemoryInfo bind_image_info = {VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO};
+ bind_image_info.pNext = nullptr;
+ bind_image_info.image = image;
+ bind_image_info.memoryOffset = 0;
+
+ if (mp_disjoint_support == true) {
+ VkImageMemoryRequirementsInfo2 mem_req_info2 = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2};
+ mem_req_info2.pNext = nullptr;
+ mem_req_info2.image = image;
+ VkMemoryRequirements2 mem_req2 = {VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2, nullptr};
+ vkGetImageMemoryRequirements2Function(device(), &mem_req_info2, &mem_req2);
+
+ uint32_t image2_unsupported_mem_type_bits =
+ ((1 << memory_properties.memoryTypeCount) - 1) & ~mem_req2.memoryRequirements.memoryTypeBits;
+ if (image2_unsupported_mem_type_bits != 0) {
+ ASSERT_TRUE(m_device->phy().set_memory_type(image2_unsupported_mem_type_bits, &image_alloc_info, 0));
+ ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &image_alloc_info, NULL, &image_mem));
+ bind_image_info.memory = image_mem;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBindImageMemoryInfo-pNext-01615");
+ vkBindImageMemory2Function(device(), 1, &bind_image_info);
+ m_errorMonitor->VerifyFound();
+ vk::FreeMemory(device(), image_mem, NULL);
+ }
+ } else {
+ // Same as 01047 but with bindImageMemory2 call
+ uint32_t image_unsupported_mem_type_bits =
+ ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
+ if (image_unsupported_mem_type_bits != 0) {
+ ASSERT_TRUE(m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0));
+ ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &image_alloc_info, NULL, &image_mem));
+ bind_image_info.memory = image_mem;
+ const char *vuid =
+ (mp_extensions) ? "VUID-VkBindImageMemoryInfo-pNext-01615" : "VUID-VkBindImageMemoryInfo-memory-01612";
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
+ vkBindImageMemory2Function(device(), 1, &bind_image_info);
+ m_errorMonitor->VerifyFound();
+ vk::FreeMemory(device(), image_mem, NULL);
+ }
+ }
+ }
+
+ // Multi-plane image
+ if (mp_disjoint_support == true) {
+ // Get plane 0 memory requirements
+ VkImagePlaneMemoryRequirementsInfo image_plane_req = {VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO};
+ image_plane_req.pNext = nullptr;
+ image_plane_req.planeAspect = VK_IMAGE_ASPECT_PLANE_0_BIT;
+
+ VkImageMemoryRequirementsInfo2 mem_req_info2 = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2};
+ mem_req_info2.pNext = (void *)&image_plane_req;
+ mem_req_info2.image = mp_image;
+ vkGetImageMemoryRequirements2Function(device(), &mem_req_info2, &mp_image_mem_reqs2[0]);
+
+ uint32_t mp_image_unsupported_mem_type_bits =
+ ((1 << memory_properties.memoryTypeCount) - 1) & ~mp_image_mem_reqs2[0].memoryRequirements.memoryTypeBits;
+ if (mp_image_unsupported_mem_type_bits != 0) {
+ mp_image_alloc_info[0].allocationSize = mp_image_mem_reqs2[0].memoryRequirements.size;
+ ASSERT_TRUE(m_device->phy().set_memory_type(mp_image_unsupported_mem_type_bits, &mp_image_alloc_info[0], 0));
+ ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &mp_image_alloc_info[0], NULL, &mp_image_mem[0]));
+
+ VkBindImageMemoryInfo bind_image_info[2];
+ bind_image_info[0].sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO;
+ bind_image_info[0].pNext = (void *)&plane_memory_info[0];
+ bind_image_info[0].image = mp_image;
+ bind_image_info[0].memory = mp_image_mem[0];
+ bind_image_info[0].memoryOffset = 0;
+ bind_image_info[1].sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO;
+ bind_image_info[1].pNext = (void *)&plane_memory_info[1];
+ bind_image_info[1].image = mp_image;
+ bind_image_info[1].memory = mp_image_mem[1];
+ bind_image_info[1].memoryOffset = 0;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBindImageMemoryInfo-pNext-01619");
+ vkBindImageMemory2Function(device(), 2, bind_image_info);
+ m_errorMonitor->VerifyFound();
+ vk::FreeMemory(device(), mp_image_mem[0], NULL);
+ }
+ }
+
+ vk::DestroyImage(device(), image, NULL);
+ if (mp_disjoint_support == true) {
+ vk::FreeMemory(device(), mp_image_mem[1], NULL);
+ vk::DestroyImage(device(), mp_image, NULL);
+ }
+}
+
+TEST_F(VkLayerTest, BindInvalidMemoryNoCheck) {
+ TEST_DESCRIPTION("Tests case were no call to memory requirements was made prior to binding");
+
+ // Enable KHR YCbCr req'd extensions for Disjoint Bit
+ bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ if (mp_extensions) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ if (mp_extensions) {
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ // first test buffer
+ {
+ VkBufferCreateInfo buffer_create_info = {};
+ buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ buffer_create_info.pNext = NULL;
+ buffer_create_info.flags = 0;
+ buffer_create_info.size = 1024;
+ buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
+ buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+
+ // Create 2 buffers, one that is checked and one that isn't by GetBufferMemoryRequirements
+ VkBuffer buffer = VK_NULL_HANDLE;
+ VkBuffer unchecked_buffer = VK_NULL_HANDLE;
+ VkDeviceMemory buffer_mem = VK_NULL_HANDLE;
+ VkDeviceMemory unchecked_buffer_mem = VK_NULL_HANDLE;
+ ASSERT_VK_SUCCESS(vk::CreateBuffer(device(), &buffer_create_info, NULL, &buffer));
+ ASSERT_VK_SUCCESS(vk::CreateBuffer(device(), &buffer_create_info, NULL, &unchecked_buffer));
+
+ VkMemoryRequirements buffer_mem_reqs = {};
+ vk::GetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
+ VkMemoryAllocateInfo buffer_alloc_info = {};
+ buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ // Leave some extra space for alignment wiggle room
+ buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
+ ASSERT_TRUE(m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0));
+ ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem));
+ ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &buffer_alloc_info, NULL, &unchecked_buffer_mem));
+
+ if (buffer_mem_reqs.alignment > 1) {
+ VkDeviceSize buffer_offset = 1;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindBufferMemory-memoryOffset-01036");
+ vk::BindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
+ m_errorMonitor->VerifyFound();
+
+ // Should trigger same VUID even when image was never checked
+ // this makes an assumption that the driver will return the same image requirements for same createImageInfo where even
+ // being close to running out of heap space
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindBufferMemory-memoryOffset-01036");
+ vk::BindBufferMemory(device(), unchecked_buffer, unchecked_buffer_mem, buffer_offset);
+ m_errorMonitor->VerifyFound();
+ }
+
+ vk::DestroyBuffer(device(), buffer, NULL);
+ vk::DestroyBuffer(device(), unchecked_buffer, NULL);
+ vk::FreeMemory(device(), buffer_mem, NULL);
+ vk::FreeMemory(device(), unchecked_buffer_mem, NULL);
+ }
+
+ // Next test is a single-plane image
+ {
+ VkImageCreateInfo image_create_info = {};
+ image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_create_info.pNext = NULL;
+ image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
+ image_create_info.extent.width = 256;
+ image_create_info.extent.height = 256;
+ image_create_info.extent.depth = 1;
+ image_create_info.mipLevels = 1;
+ image_create_info.arrayLayers = 1;
+ image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
+ image_create_info.flags = 0;
+
+ // Create 2 images, one that is checked and one that isn't by GetImageMemoryRequirements
+ VkImage image = VK_NULL_HANDLE;
+ VkImage unchecked_image = VK_NULL_HANDLE;
+ VkDeviceMemory image_mem = VK_NULL_HANDLE;
+ VkDeviceMemory unchecked_image_mem = VK_NULL_HANDLE;
+ ASSERT_VK_SUCCESS(vk::CreateImage(device(), &image_create_info, NULL, &image));
+ ASSERT_VK_SUCCESS(vk::CreateImage(device(), &image_create_info, NULL, &unchecked_image));
+
+ VkMemoryRequirements image_mem_reqs = {};
+ vk::GetImageMemoryRequirements(device(), image, &image_mem_reqs);
+ VkMemoryAllocateInfo image_alloc_info = {};
+ image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ // Leave some extra space for alignment wiggle room
+ image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
+ ASSERT_TRUE(m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0));
+ ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &image_alloc_info, NULL, &image_mem));
+ ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &image_alloc_info, NULL, &unchecked_image_mem));
+
+ // single-plane image
+ if (image_mem_reqs.alignment > 1) {
+ VkDeviceSize image_offset = 1;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindImageMemory-memoryOffset-01048");
+ vk::BindImageMemory(device(), image, image_mem, image_offset);
+ m_errorMonitor->VerifyFound();
+
+ // Should trigger same VUID even when image was never checked
+ // this makes an assumption that the driver will return the same image requirements for same createImageInfo where even
+ // being close to running out of heap space
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindImageMemory-memoryOffset-01048");
+ vk::BindImageMemory(device(), unchecked_image, unchecked_image_mem, image_offset);
+ m_errorMonitor->VerifyFound();
+ }
+
+ vk::DestroyImage(device(), image, NULL);
+ vk::DestroyImage(device(), unchecked_image, NULL);
+ vk::FreeMemory(device(), image_mem, NULL);
+ vk::FreeMemory(device(), unchecked_image_mem, NULL);
+ }
+
+ // Same style test but with a multi-planar disjoint image
+ // Test doesn't check either of the planes for the unchecked image
+ if (mp_extensions == false) {
+ printf("%s Rest of test rely on YCbCr Multi-planar support.\n", kSkipPrefix);
+ return;
+ } else {
+ // Check for support of format used by all multi-planar tests
+ const VkFormat mp_format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
+ VkFormatProperties mp_format_properties;
+ vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), mp_format, &mp_format_properties);
+ if (0 ==
+ (mp_format_properties.optimalTilingFeatures & (VK_FORMAT_FEATURE_DISJOINT_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT))) {
+ printf("%s Rest of test rely on a supported disjoint format.\n", kSkipPrefix);
+ return;
+ }
+
+ VkImageCreateInfo mp_image_create_info = {};
+ mp_image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ mp_image_create_info.pNext = NULL;
+ mp_image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ mp_image_create_info.format = mp_format;
+ mp_image_create_info.extent.width = 256;
+ mp_image_create_info.extent.height = 256;
+ mp_image_create_info.extent.depth = 1;
+ mp_image_create_info.mipLevels = 1;
+ mp_image_create_info.arrayLayers = 1;
+ mp_image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ mp_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ mp_image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
+ mp_image_create_info.flags = VK_IMAGE_CREATE_DISJOINT_BIT;
+
// Create aliased function pointers for 1.0 and 1.1 contexts
PFN_vkBindImageMemory2KHR vkBindImageMemory2Function = nullptr;
PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2Function = nullptr;
+
if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
vkBindImageMemory2Function = vk::BindImageMemory2;
vkGetImageMemoryRequirements2Function = vk::GetImageMemoryRequirements2;
} else {
+ vkGetImageMemoryRequirements2Function =
+ (PFN_vkGetImageMemoryRequirements2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkGetImageMemoryRequirements2KHR");
vkBindImageMemory2Function =
(PFN_vkBindImageMemory2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkBindImageMemory2KHR");
+ }
+
+ VkImage mp_image = VK_NULL_HANDLE;
+ VkImage mp_unchecked_image = VK_NULL_HANDLE;
+ // Array represent planes for disjoint images
+ VkDeviceMemory mp_image_mem[2] = {VK_NULL_HANDLE, VK_NULL_HANDLE};
+ VkDeviceMemory mp_unchecked_image_mem[2] = {VK_NULL_HANDLE, VK_NULL_HANDLE};
+ VkMemoryRequirements2 mp_image_mem_reqs2[2];
+ VkMemoryAllocateInfo mp_image_alloc_info[2];
+
+ ASSERT_VK_SUCCESS(vk::CreateImage(device(), &mp_image_create_info, NULL, &mp_image));
+ ASSERT_VK_SUCCESS(vk::CreateImage(device(), &mp_image_create_info, NULL, &mp_unchecked_image));
+
+ VkImagePlaneMemoryRequirementsInfo image_plane_req = {VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO};
+ image_plane_req.pNext = nullptr;
+ image_plane_req.planeAspect = VK_IMAGE_ASPECT_PLANE_0_BIT;
+
+ VkImageMemoryRequirementsInfo2 mem_req_info2 = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2};
+ mem_req_info2.pNext = (void *)&image_plane_req;
+ mem_req_info2.image = mp_image;
+ mp_image_mem_reqs2[0].sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2;
+ mp_image_mem_reqs2[0].pNext = nullptr;
+ vkGetImageMemoryRequirements2Function(device(), &mem_req_info2, &mp_image_mem_reqs2[0]);
+
+ image_plane_req.planeAspect = VK_IMAGE_ASPECT_PLANE_1_BIT;
+ mp_image_mem_reqs2[1].sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2;
+ mp_image_mem_reqs2[1].pNext = nullptr;
+ vkGetImageMemoryRequirements2Function(device(), &mem_req_info2, &mp_image_mem_reqs2[1]);
+
+ mp_image_alloc_info[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ mp_image_alloc_info[0].pNext = nullptr;
+ mp_image_alloc_info[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ mp_image_alloc_info[1].pNext = nullptr;
+
+ mp_image_alloc_info[0].allocationSize = mp_image_mem_reqs2[0].memoryRequirements.size;
+ ASSERT_TRUE(
+ m_device->phy().set_memory_type(mp_image_mem_reqs2[0].memoryRequirements.memoryTypeBits, &mp_image_alloc_info[0], 0));
+ // Leave some extra space for alignment wiggle room
+ mp_image_alloc_info[1].allocationSize =
+ mp_image_mem_reqs2[1].memoryRequirements.size + mp_image_mem_reqs2[1].memoryRequirements.alignment;
+ ASSERT_TRUE(
+ m_device->phy().set_memory_type(mp_image_mem_reqs2[1].memoryRequirements.memoryTypeBits, &mp_image_alloc_info[1], 0));
+
+ ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &mp_image_alloc_info[0], NULL, &mp_image_mem[0]));
+ ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &mp_image_alloc_info[1], NULL, &mp_image_mem[1]));
+ ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &mp_image_alloc_info[0], NULL, &mp_unchecked_image_mem[0]));
+ ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &mp_image_alloc_info[1], NULL, &mp_unchecked_image_mem[1]));
+
+ // Sets an invalid offset to plane 1
+ if (mp_image_mem_reqs2[1].memoryRequirements.alignment > 1) {
+ VkBindImagePlaneMemoryInfo plane_memory_info[2];
+ plane_memory_info[0].sType = VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO;
+ plane_memory_info[0].pNext = nullptr;
+ plane_memory_info[0].planeAspect = VK_IMAGE_ASPECT_PLANE_0_BIT;
+ plane_memory_info[1].sType = VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO;
+ plane_memory_info[1].pNext = nullptr;
+ plane_memory_info[1].planeAspect = VK_IMAGE_ASPECT_PLANE_1_BIT;
+
+ VkBindImageMemoryInfo bind_image_info[2];
+ bind_image_info[0].sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO;
+ bind_image_info[0].pNext = (void *)&plane_memory_info[0];
+ bind_image_info[0].image = mp_image;
+ bind_image_info[0].memory = mp_image_mem[0];
+ bind_image_info[0].memoryOffset = 0;
+ bind_image_info[1].sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO;
+ bind_image_info[1].pNext = (void *)&plane_memory_info[1];
+ bind_image_info[1].image = mp_image;
+ bind_image_info[1].memory = mp_image_mem[1];
+ bind_image_info[1].memoryOffset = 1; // off alignment
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBindImageMemoryInfo-pNext-01620");
+ vkBindImageMemory2Function(device(), 2, bind_image_info);
+ m_errorMonitor->VerifyFound();
+
+ // Should trigger same VUID even when image was never checked
+ // this makes an assumption that the driver will return the same image requirements for same createImageInfo where even
+ // being close to running out of heap space
+ bind_image_info[0].image = mp_unchecked_image;
+ bind_image_info[0].memory = mp_unchecked_image_mem[0];
+ bind_image_info[1].image = mp_unchecked_image;
+ bind_image_info[1].memory = mp_unchecked_image_mem[1];
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBindImageMemoryInfo-pNext-01620");
+ vkBindImageMemory2Function(device(), 2, bind_image_info);
+ m_errorMonitor->VerifyFound();
+ }
+
+ vk::DestroyImage(device(), mp_image, NULL);
+ vk::DestroyImage(device(), mp_unchecked_image, NULL);
+ vk::FreeMemory(device(), mp_image_mem[0], NULL);
+ vk::FreeMemory(device(), mp_image_mem[1], NULL);
+ vk::FreeMemory(device(), mp_unchecked_image_mem[0], NULL);
+ vk::FreeMemory(device(), mp_unchecked_image_mem[1], NULL);
+ }
+}
+
+TEST_F(VkLayerTest, BindInvalidMemory2BindInfos) {
+ TEST_DESCRIPTION("These tests deal with VK_KHR_bind_memory_2 and invalid VkBindImageMemoryInfo* pBindInfos");
+
+ // Enable KHR YCbCr req'd extensions for Disjoint Bit
+ bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ if (mp_extensions) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+
+ bool bind_memory_2_extension = DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+
+ if (mp_extensions) {
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ } else if (bind_memory_2_extension) {
+ // bind_memory_2 extension is subset of mp_extensions
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ } else {
+ printf("%s test requires VK_KHR_bind_memory2 extensions, not available. Skipping.\n", kSkipPrefix);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ // Create aliased function pointers for 1.0 and 1.1 contexts
+ PFN_vkBindImageMemory2KHR vkBindImageMemory2Function = nullptr;
+ if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
+ vkBindImageMemory2Function = vk::BindImageMemory2;
+ } else {
+ vkBindImageMemory2Function = (PFN_vkBindImageMemory2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkBindImageMemory2KHR");
+ }
+
+ VkImageCreateInfo image_create_info = {};
+ image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_create_info.pNext = NULL;
+ image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
+ image_create_info.extent.width = 256;
+ image_create_info.extent.height = 256;
+ image_create_info.extent.depth = 1;
+ image_create_info.mipLevels = 1;
+ image_create_info.arrayLayers = 1;
+ image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
+ image_create_info.flags = 0;
+
+ {
+ // Create 2 image with 2 memory objects
+ VkImage image_a = VK_NULL_HANDLE;
+ VkImage image_b = VK_NULL_HANDLE;
+ VkDeviceMemory image_a_mem = VK_NULL_HANDLE;
+ VkDeviceMemory image_b_mem = VK_NULL_HANDLE;
+ ASSERT_VK_SUCCESS(vk::CreateImage(device(), &image_create_info, NULL, &image_a));
+ ASSERT_VK_SUCCESS(vk::CreateImage(device(), &image_create_info, NULL, &image_b));
+
+ VkMemoryRequirements image_mem_reqs = {};
+ vk::GetImageMemoryRequirements(device(), image_a, &image_mem_reqs);
+ VkMemoryAllocateInfo image_alloc_info = {};
+ image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ image_alloc_info.allocationSize = image_mem_reqs.size;
+ ASSERT_TRUE(m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0));
+ ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &image_alloc_info, NULL, &image_a_mem));
+ vk::GetImageMemoryRequirements(device(), image_b, &image_mem_reqs);
+ image_alloc_info.allocationSize = image_mem_reqs.size;
+ ASSERT_TRUE(m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0));
+ ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &image_alloc_info, NULL, &image_b_mem));
+
+ // Try binding same image twice in array
+ VkBindImageMemoryInfo bind_image_info[3];
+ bind_image_info[0].sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO;
+ bind_image_info[0].pNext = nullptr;
+ bind_image_info[0].image = image_a;
+ bind_image_info[0].memory = image_a_mem;
+ bind_image_info[0].memoryOffset = 0;
+ bind_image_info[1].sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO;
+ bind_image_info[1].pNext = nullptr;
+ bind_image_info[1].image = image_b;
+ bind_image_info[1].memory = image_b_mem;
+ bind_image_info[1].memoryOffset = 0;
+ bind_image_info[2] = bind_image_info[0]; // duplicate bind
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindImageMemory2-pBindInfos-04006");
+ vkBindImageMemory2Function(device(), 3, bind_image_info);
+ m_errorMonitor->VerifyFound();
+
+ // Bind same image to 2 different memory in same array
+ bind_image_info[1].image = image_a;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindImageMemory2-pBindInfos-04006");
+ vkBindImageMemory2Function(device(), 2, bind_image_info);
+ m_errorMonitor->VerifyFound();
+
+ vk::FreeMemory(device(), image_a_mem, NULL);
+ vk::FreeMemory(device(), image_b_mem, NULL);
+ vk::DestroyImage(device(), image_a, NULL);
+ vk::DestroyImage(device(), image_b, NULL);
+ }
+
+ if (mp_extensions) {
+ const VkFormat mp_format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
+
+ // Check for support of format used by all multi-planar tests
+ VkFormatProperties mp_format_properties;
+ vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), mp_format, &mp_format_properties);
+ if (0 ==
+ (mp_format_properties.optimalTilingFeatures & (VK_FORMAT_FEATURE_DISJOINT_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT))) {
+ printf("%s test requires disjoint support extensions, not available. Skipping.\n", kSkipPrefix);
+ return;
+ }
+
+ PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2Function = nullptr;
+ if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
+ vkGetImageMemoryRequirements2Function = vk::GetImageMemoryRequirements2;
+ } else {
vkGetImageMemoryRequirements2Function =
(PFN_vkGetImageMemoryRequirements2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkGetImageMemoryRequirements2KHR");
}
- // Try to bind an image created with Disjoint bit
- VkFormatProperties format_properties;
- VkFormat mp_format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
- vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), mp_format, &format_properties);
- // Need to make sure disjoint is supported for format
- // Also need to support an arbitrary image usage feature
- if (0 ==
- (format_properties.optimalTilingFeatures & (VK_FORMAT_FEATURE_DISJOINT_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT))) {
- printf("%s test requires disjoint/sampled feature bit on format. Skipping.\n", kSkipPrefix);
- } else {
- image_create_info = {};
- image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
- image_create_info.pNext = NULL;
- image_create_info.imageType = VK_IMAGE_TYPE_2D;
- image_create_info.format = mp_format;
- image_create_info.extent.width = 64;
- image_create_info.extent.height = 64;
- image_create_info.extent.depth = 1;
- image_create_info.mipLevels = 1;
- image_create_info.arrayLayers = 1;
- image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
- image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
- image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
- image_create_info.flags = VK_IMAGE_CREATE_DISJOINT_BIT;
+ // Creat 1 normal, not disjoint image
+ VkImage normal_image = VK_NULL_HANDLE;
+ VkDeviceMemory normal_image_mem = VK_NULL_HANDLE;
+ ASSERT_VK_SUCCESS(vk::CreateImage(device(), &image_create_info, NULL, &normal_image));
+ VkMemoryRequirements image_mem_reqs = {};
+ vk::GetImageMemoryRequirements(device(), normal_image, &image_mem_reqs);
+ VkMemoryAllocateInfo image_alloc_info = {};
+ image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ image_alloc_info.allocationSize = image_mem_reqs.size;
+ ASSERT_TRUE(m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0));
+ ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &image_alloc_info, NULL, &normal_image_mem));
- VkImage image;
- err = vk::CreateImage(device(), &image_create_info, NULL, &image);
- ASSERT_VK_SUCCESS(err);
+ // Create 2 disjoint images with memory backing each plane
+ VkImageCreateInfo mp_image_create_info = image_create_info;
+ mp_image_create_info.format = mp_format;
+ mp_image_create_info.flags = VK_IMAGE_CREATE_DISJOINT_BIT;
- VkImagePlaneMemoryRequirementsInfo image_plane_req = {VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO};
- image_plane_req.planeAspect = VK_IMAGE_ASPECT_PLANE_0_BIT;
+ VkImage mp_image_a = VK_NULL_HANDLE;
+ VkImage mp_image_b = VK_NULL_HANDLE;
+ VkDeviceMemory mp_image_a_mem[2] = {VK_NULL_HANDLE, VK_NULL_HANDLE};
+ VkDeviceMemory mp_image_b_mem[2] = {VK_NULL_HANDLE, VK_NULL_HANDLE};
+ ASSERT_VK_SUCCESS(vk::CreateImage(device(), &mp_image_create_info, NULL, &mp_image_a));
+ ASSERT_VK_SUCCESS(vk::CreateImage(device(), &mp_image_create_info, NULL, &mp_image_b));
- VkImageMemoryRequirementsInfo2 mem_req_info2 = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2};
- mem_req_info2.pNext = &image_plane_req;
- mem_req_info2.image = image;
- VkMemoryRequirements2 mem_req2 = {VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2};
- vkGetImageMemoryRequirements2Function(device(), &mem_req_info2, &mem_req2);
+ AllocateDisjointMemory(m_device, vkGetImageMemoryRequirements2Function, mp_image_a, &mp_image_a_mem[0],
+ VK_IMAGE_ASPECT_PLANE_0_BIT);
+ AllocateDisjointMemory(m_device, vkGetImageMemoryRequirements2Function, mp_image_a, &mp_image_a_mem[1],
+ VK_IMAGE_ASPECT_PLANE_1_BIT);
+ AllocateDisjointMemory(m_device, vkGetImageMemoryRequirements2Function, mp_image_b, &mp_image_b_mem[0],
+ VK_IMAGE_ASPECT_PLANE_0_BIT);
+ AllocateDisjointMemory(m_device, vkGetImageMemoryRequirements2Function, mp_image_b, &mp_image_b_mem[1],
+ VK_IMAGE_ASPECT_PLANE_1_BIT);
- // Find a valid memory type index to memory to be allocated from
- VkMemoryAllocateInfo alloc_info = {VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO};
- alloc_info.allocationSize = mem_req2.memoryRequirements.size;
- pass = m_device->phy().set_memory_type(mem_req2.memoryRequirements.memoryTypeBits, &alloc_info, 0);
- ASSERT_TRUE(pass);
+ VkBindImagePlaneMemoryInfo plane_memory_info[2];
+ plane_memory_info[0].sType = VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO;
+ plane_memory_info[0].pNext = nullptr;
+ plane_memory_info[0].planeAspect = VK_IMAGE_ASPECT_PLANE_0_BIT;
+ plane_memory_info[1].sType = VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO;
+ plane_memory_info[1].pNext = nullptr;
+ plane_memory_info[1].planeAspect = VK_IMAGE_ASPECT_PLANE_1_BIT;
- VkDeviceMemory image_memory;
- ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &alloc_info, NULL, &image_memory));
-
- // Bind disjoint with BindImageMemory instead of BindImageMemory2
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindImageMemory-image-01608");
- vk::BindImageMemory(device(), image, image_memory, 0);
- m_errorMonitor->VerifyFound();
-
- VkBindImagePlaneMemoryInfo plane_memory_info = {VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO};
- ASSERT_TRUE(FormatPlaneCount(mp_format) == 2);
- plane_memory_info.planeAspect = VK_IMAGE_ASPECT_PLANE_2_BIT;
-
- VkBindImageMemoryInfo bind_image_info = {VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO};
- bind_image_info.pNext = &plane_memory_info;
- bind_image_info.image = image;
- bind_image_info.memory = image_memory;
- bind_image_info.memoryOffset = 0;
-
- // Set invalid planeAspect
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBindImagePlaneMemoryInfo-planeAspect-02283");
- vkBindImageMemory2Function(device(), 1, &bind_image_info);
- m_errorMonitor->VerifyFound();
-
- vk::FreeMemory(device(), image_memory, NULL);
- vk::DestroyImage(device(), image, nullptr);
+ // set all sType and memoryOffset as they are the same
+ VkBindImageMemoryInfo bind_image_info[6];
+ for (int i = 0; i < 6; i++) {
+ bind_image_info[i].sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO;
+ bind_image_info[i].memoryOffset = 0;
}
- // Bind image with VkBindImagePlaneMemoryInfo without disjoint bit in image
- // Need to support an arbitrary image usage feature for multi-planar format
- if (0 == (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
- printf("%s test requires sampled feature bit on multi-planar format. Skipping.\n", kSkipPrefix);
- } else {
- image_create_info = {};
- image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
- image_create_info.pNext = NULL;
- image_create_info.imageType = VK_IMAGE_TYPE_2D;
- image_create_info.format = mp_format;
- image_create_info.extent.width = 64;
- image_create_info.extent.height = 64;
- image_create_info.extent.depth = 1;
- image_create_info.mipLevels = 1;
- image_create_info.arrayLayers = 1;
- image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
- image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
- image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
- image_create_info.flags = 0; // no disjoint bit set
+ // Try only binding part of image_b
+ bind_image_info[0].pNext = (void *)&plane_memory_info[0];
+ bind_image_info[0].image = mp_image_a;
+ bind_image_info[0].memory = mp_image_a_mem[0];
+ bind_image_info[1].pNext = (void *)&plane_memory_info[1];
+ bind_image_info[1].image = mp_image_a;
+ bind_image_info[1].memory = mp_image_a_mem[1];
+ bind_image_info[2].pNext = (void *)&plane_memory_info[0];
+ bind_image_info[2].image = mp_image_b;
+ bind_image_info[2].memory = mp_image_b_mem[0];
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindImageMemory2-pBindInfos-02858");
+ vkBindImageMemory2Function(device(), 3, bind_image_info);
+ m_errorMonitor->VerifyFound();
- VkImage image;
- err = vk::CreateImage(device(), &image_create_info, NULL, &image);
- ASSERT_VK_SUCCESS(err);
+ // Same thing, but mix in a non-disjoint image
+ bind_image_info[3].pNext = nullptr;
+ bind_image_info[3].image = normal_image;
+ bind_image_info[3].memory = normal_image_mem;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindImageMemory2-pBindInfos-02858");
+ vkBindImageMemory2Function(device(), 4, bind_image_info);
+ m_errorMonitor->VerifyFound();
- VkImagePlaneMemoryRequirementsInfo image_plane_req = {VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO};
- image_plane_req.planeAspect = VK_IMAGE_ASPECT_PLANE_0_BIT;
+ // Try binding image_b plane 1 twice
+ // Valid case where binding disjoint and non-disjoint
+ bind_image_info[4].pNext = (void *)&plane_memory_info[1];
+ bind_image_info[4].image = mp_image_b;
+ bind_image_info[4].memory = mp_image_b_mem[1];
+ bind_image_info[5].pNext = (void *)&plane_memory_info[1];
+ bind_image_info[5].image = mp_image_b;
+ bind_image_info[5].memory = mp_image_b_mem[1];
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindImageMemory2-pBindInfos-04006");
+ vkBindImageMemory2Function(device(), 6, bind_image_info);
+ m_errorMonitor->VerifyFound();
- VkImageMemoryRequirementsInfo2 mem_req_info2 = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2};
- mem_req_info2.pNext = &image_plane_req;
- mem_req_info2.image = image;
- VkMemoryRequirements2 mem_req2 = {VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2};
- vkGetImageMemoryRequirements2Function(device(), &mem_req_info2, &mem_req2);
+ // Valid case of binding 2 disjoint image and normal image by removing duplicate
+ m_errorMonitor->ExpectSuccess();
+ vkBindImageMemory2Function(device(), 5, bind_image_info);
+ m_errorMonitor->VerifyNotFound();
- // Find a valid memory type index to memory to be allocated from
- VkMemoryAllocateInfo alloc_info = {VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO};
- alloc_info.allocationSize = mem_req2.memoryRequirements.size;
- pass = m_device->phy().set_memory_type(mem_req2.memoryRequirements.memoryTypeBits, &alloc_info, 0);
- ASSERT_TRUE(pass);
-
- VkDeviceMemory image_memory;
- ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &alloc_info, NULL, &image_memory));
-
- VkBindImagePlaneMemoryInfo plane_memory_info = {VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO};
- plane_memory_info.planeAspect = VK_IMAGE_ASPECT_PLANE_0_BIT;
- VkBindImageMemoryInfo bind_image_info = {VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO};
- bind_image_info.pNext = &plane_memory_info;
- bind_image_info.image = image;
- bind_image_info.memory = image_memory;
- bind_image_info.memoryOffset = 0;
-
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBindImageMemoryInfo-pNext-01618");
- vkBindImageMemory2Function(device(), 1, &bind_image_info);
- m_errorMonitor->VerifyFound();
-
- vk::FreeMemory(device(), image_memory, NULL);
- vk::DestroyImage(device(), image, nullptr);
- }
+ vk::FreeMemory(device(), normal_image_mem, NULL);
+ vk::FreeMemory(device(), mp_image_a_mem[0], NULL);
+ vk::FreeMemory(device(), mp_image_a_mem[1], NULL);
+ vk::FreeMemory(device(), mp_image_b_mem[0], NULL);
+ vk::FreeMemory(device(), mp_image_b_mem[1], NULL);
+ vk::DestroyImage(device(), normal_image, NULL);
+ vk::DestroyImage(device(), mp_image_a, NULL);
+ vk::DestroyImage(device(), mp_image_b, NULL);
}
}
@@ -1730,6 +2591,53 @@
}
}
+TEST_F(VkLayerTest, ExceedSamplerAllocationCount) {
+ VkResult err = VK_SUCCESS;
+ const int max_samplers = 32;
+ VkSampler samplers[max_samplers + 1];
+
+ if (!EnableDeviceProfileLayer()) {
+ printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ PFN_vkSetPhysicalDeviceLimitsEXT fpvkSetPhysicalDeviceLimitsEXT =
+ (PFN_vkSetPhysicalDeviceLimitsEXT)vk::GetInstanceProcAddr(instance(), "vkSetPhysicalDeviceLimitsEXT");
+ PFN_vkGetOriginalPhysicalDeviceLimitsEXT fpvkGetOriginalPhysicalDeviceLimitsEXT =
+ (PFN_vkGetOriginalPhysicalDeviceLimitsEXT)vk::GetInstanceProcAddr(instance(), "vkGetOriginalPhysicalDeviceLimitsEXT");
+
+ if (!(fpvkSetPhysicalDeviceLimitsEXT) || !(fpvkGetOriginalPhysicalDeviceLimitsEXT)) {
+ printf("%s Can't find device_profile_api functions; skipped.\n", kSkipPrefix);
+ return;
+ }
+ VkPhysicalDeviceProperties props;
+ fpvkGetOriginalPhysicalDeviceLimitsEXT(gpu(), &props.limits);
+ if (props.limits.maxSamplerAllocationCount > max_samplers) {
+ props.limits.maxSamplerAllocationCount = max_samplers;
+ fpvkSetPhysicalDeviceLimitsEXT(gpu(), &props.limits);
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState());
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
+ "Number of currently valid sampler objects is not less than the maximum allowed");
+
+ VkSamplerCreateInfo sampler_create_info = SafeSaneSamplerCreateInfo();
+
+ int i;
+ for (i = 0; i <= max_samplers; i++) {
+ err = vk::CreateSampler(m_device->device(), &sampler_create_info, NULL, &samplers[i]);
+ if (err != VK_SUCCESS) {
+ break;
+ }
+ }
+ m_errorMonitor->VerifyFound();
+
+ for (int j = 0; j < i; j++) {
+ vk::DestroySampler(m_device->device(), samplers[j], NULL);
+ }
+}
+
TEST_F(VkLayerTest, ImageSampleCounts) {
TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
@@ -1776,9 +2684,7 @@
dst_image.init(&image_create_info);
dst_image.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
m_commandBuffer->begin();
- // TODO: These 2 VUs are redundant - expect one of them to go away
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-srcImage-00233");
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-srcImage-00228");
vk::CmdBlitImage(m_commandBuffer->handle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dst_image.handle(),
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
m_errorMonitor->VerifyFound();
@@ -1799,9 +2705,7 @@
dst_image.init(&image_create_info);
dst_image.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
m_commandBuffer->begin();
- // TODO: These 2 VUs are redundant - expect one of them to go away
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-dstImage-00234");
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-srcImage-00228");
vk::CmdBlitImage(m_commandBuffer->handle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dst_image.handle(),
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
m_errorMonitor->VerifyFound();
@@ -2530,8 +3434,6 @@
blitRegion.dstSubresource.baseArrayLayer = 0;
// Blit multi-sample image
- // TODO: redundant VUs, one (1c8) or two (1d2 & 1d4) should be eliminated.
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-srcImage-00228");
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-srcImage-00233");
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-dstImage-00234");
vk::CmdBlitImage(m_commandBuffer->handle(), ms_img.image(), ms_img.Layout(), ms_img.image(), ms_img.Layout(), 1, &blitRegion,
@@ -2923,7 +3825,7 @@
VkImageObj lone_image(m_device);
lone_image.InitNoLayout(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
img_barrier.image = lone_image.handle();
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-image-02635");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-image-04073");
vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
&img_barrier);
@@ -2939,7 +3841,7 @@
img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-oldLayout-02636");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-oldLayout-01181");
vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
&img_barrier);
@@ -3055,7 +3957,11 @@
pipe.InitState();
pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
pipe.pipeline_layout_ = VkPipelineLayoutObj(m_device, {&descriptor_set.layout_});
- pipe.CreateGraphicsPipeline();
+ err = pipe.CreateGraphicsPipeline();
+ if (err != VK_SUCCESS) {
+ printf("%s Unable to compile shader, skipping.\n", kSkipPrefix);
+ return;
+ }
m_commandBuffer->begin();
m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
@@ -3229,6 +4135,70 @@
vk::DestroyImageView(m_device->device(), view, nullptr);
}
+TEST_F(VkLayerTest, FramebufferAttachmentMemoryFreed) {
+ TEST_DESCRIPTION("Attempt to create framebuffer with attachment which memory was freed.");
+ ASSERT_NO_FATAL_FAILURE(Init());
+ VkFormatProperties format_properties;
+ VkResult err = VK_SUCCESS;
+ vk::GetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
+ if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
+ printf("%s Image format doesn't support required features.\n", kSkipPrefix);
+ return;
+ }
+ VkFramebuffer fb;
+ VkImageView view;
+
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+ {
+ VkImageCreateInfo image_ci = {};
+ image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_ci.pNext = NULL;
+ image_ci.imageType = VK_IMAGE_TYPE_2D;
+ image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
+ image_ci.extent.width = 32;
+ image_ci.extent.height = 32;
+ image_ci.extent.depth = 1;
+ image_ci.mipLevels = 1;
+ image_ci.arrayLayers = 1;
+ image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
+ image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ image_ci.flags = 0;
+
+ vk_testing::Image image;
+ image.init_no_mem(*m_device, image_ci);
+
+ vk_testing::DeviceMemory *image_memory = new vk_testing::DeviceMemory;
+ image_memory->init(*m_device, vk_testing::DeviceMemory::get_resource_alloc_info(*m_device, image.memory_requirements(), 0));
+ image.bind_memory(*image_memory, 0);
+
+ VkImageViewCreateInfo ivci = {
+ VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
+ nullptr,
+ 0,
+ image.handle(),
+ VK_IMAGE_VIEW_TYPE_2D,
+ VK_FORMAT_B8G8R8A8_UNORM,
+ {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
+ {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
+ };
+ err = vk::CreateImageView(m_device->device(), &ivci, nullptr, &view);
+ ASSERT_VK_SUCCESS(err);
+
+ VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
+
+ // Introduce error:
+ // Free the attachment image memory, then create framebuffer.
+ delete image_memory;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-BoundResourceFreedMemoryAccess");
+ err = vk::CreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
+ m_errorMonitor->VerifyFound();
+ }
+
+ vk::DestroyImageView(m_device->device(), view, nullptr);
+}
+
TEST_F(VkLayerTest, ImageMemoryNotBound) {
TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
ASSERT_NO_FATAL_FAILURE(Init());
@@ -3434,7 +4404,7 @@
// Then destroy view itself and verify that same error is hit
VkResult err;
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00323");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-02994");
ASSERT_NO_FATAL_FAILURE(Init());
OneOffDescriptorSet descriptor_set(m_device, {
@@ -3478,7 +4448,7 @@
// Now destroy view itself and verify same error, which is hit in PV this time
vk::DestroyBufferView(m_device->device(), view, NULL);
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00323");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-02994");
vk::UpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
m_errorMonitor->VerifyFound();
}
@@ -3522,7 +4492,18 @@
TEST_F(VkLayerTest, InvalidBufferViewCreateInfoEntries) {
TEST_DESCRIPTION("Attempt to create a buffer view with invalid create info.");
- ASSERT_NO_FATAL_FAILURE(Init());
+ // Attempt to enable texel buffer alignmnet extension
+ bool texel_buffer_alignment = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ if (texel_buffer_alignment) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ texel_buffer_alignment =
+ texel_buffer_alignment && DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME);
+ if (texel_buffer_alignment) {
+ m_device_extension_names.push_back(VK_EXT_TEXEL_BUFFER_ALIGNMENT_EXTENSION_NAME);
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState());
const VkPhysicalDeviceLimits &dev_limits = m_device->props.limits;
const VkDeviceSize minTexelBufferOffsetAlignment = dev_limits.minTexelBufferOffsetAlignment;
@@ -3542,15 +4523,6 @@
format_with_uniform_texel_support_string);
return;
}
- vk::GetPhysicalDeviceFormatProperties(gpu(), format_without_texel_support, &format_properties);
- if ((format_properties.bufferFeatures & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) ||
- (format_properties.bufferFeatures & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT)) {
- printf(
- "%s Test requires %s to not support VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT nor "
- "VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT\n",
- kSkipPrefix, format_without_texel_support_string);
- return;
- }
// Create a test buffer--buffer must have been created using VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or
// VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, so use a different usage value instead to cause an error
@@ -3579,7 +4551,9 @@
// Offset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment so add 1 to ensure it is not
buff_view_ci.offset = minTexelBufferOffsetAlignment + 1;
- CreateBufferViewTest(*this, &buff_view_ci, {"VUID-VkBufferViewCreateInfo-offset-02749"});
+ const char *offset_vuid =
+ (texel_buffer_alignment == true) ? "VUID-VkBufferViewCreateInfo-offset-02749" : "VUID-VkBufferViewCreateInfo-offset-00926";
+ CreateBufferViewTest(*this, &buff_view_ci, {offset_vuid});
// Set offset to acceptable value for range tests
buff_view_ci.offset = minTexelBufferOffsetAlignment;
@@ -3598,7 +4572,39 @@
CreateBufferViewTest(*this, &buff_view_ci,
{"VUID-VkBufferViewCreateInfo-range-00930", "VUID-VkBufferViewCreateInfo-offset-00931"});
- // Set rage to acceptable value for buffer tests
+ // Create a new test buffer that is larger than VkPhysicalDeviceLimits::maxTexelBufferElements
+ // The spec min max is just 64K, but some implementations support a much larger value than that.
+ // Skip the test if the limit is very large to not allocate excessive amounts of memory.
+ if (dev_limits.maxTexelBufferElements > 64 * 1024 * 1024) {
+ printf("%s Test skipped if maxTexelBufferElements is very large. \n", kSkipPrefix);
+ } else {
+ const VkDeviceSize large_resource_size =
+ 2 * static_cast<VkDeviceSize>(format_size) * static_cast<VkDeviceSize>(dev_limits.maxTexelBufferElements);
+ const VkBufferCreateInfo large_buffer_info =
+ VkBufferObj::create_info(large_resource_size, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT);
+ VkBufferObj large_buffer;
+ large_buffer.init(*m_device, large_buffer_info, (VkMemoryPropertyFlags)VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
+
+ // Offset must be less than the size of the buffer, so set it equal to the buffer size to cause an error
+ buff_view_ci.buffer = large_buffer.handle();
+ buff_view_ci.range = VK_WHOLE_SIZE;
+
+ // For VK_WHOLE_SIZE, the buffer size - offset must be less than VkPhysicalDeviceLimits::maxTexelBufferElements
+ CreateBufferViewTest(*this, &buff_view_ci, {"VUID-VkBufferViewCreateInfo-range-04059"});
+ }
+
+ vk::GetPhysicalDeviceFormatProperties(gpu(), format_without_texel_support, &format_properties);
+ if ((format_properties.bufferFeatures & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT) ||
+ (format_properties.bufferFeatures & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT)) {
+ printf(
+ "%s Test requires %s to not support VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT nor "
+ "VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT\n",
+ kSkipPrefix, format_without_texel_support_string);
+ return;
+ }
+
+ // Set range to acceptable value for buffer tests
+ buff_view_ci.buffer = buffer.handle();
buff_view_ci.format = format_without_texel_support;
buff_view_ci.range = VK_WHOLE_SIZE;
@@ -3637,7 +4643,7 @@
}
}
- if (DeviceIsMockICD() || DeviceSimulation()) {
+ if (IsPlatform(kMockICD) || DeviceSimulation()) {
printf("%s MockICD does not support this feature, skipping tests\n", kSkipPrefix);
return;
}
@@ -3812,7 +4818,7 @@
// Try levelCount = 0
{
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-pRanges-01692");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceRange-levelCount-01720");
const VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 0, 1};
vk::CmdClearColorImage(cb_handle, image.handle(), image.Layout(), &clear_color, 1, &range);
m_errorMonitor->VerifyFound();
@@ -3845,7 +4851,7 @@
// Try layerCount = 0
{
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-pRanges-01693");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceRange-layerCount-01721");
const VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 0};
vk::CmdClearColorImage(cb_handle, image.handle(), image.Layout(), &clear_color, 1, &range);
m_errorMonitor->VerifyFound();
@@ -4055,7 +5061,7 @@
// Try levelCount = 0
{
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-pRanges-01694");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceRange-levelCount-01720");
const VkImageSubresourceRange range = {ds_aspect, 0, 0, 0, 1};
vk::CmdClearDepthStencilImage(cb_handle, image.handle(), image.Layout(), &clear_value, 1, &range);
m_errorMonitor->VerifyFound();
@@ -4088,7 +5094,7 @@
// Try layerCount = 0
{
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-pRanges-01695");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceRange-layerCount-01721");
const VkImageSubresourceRange range = {ds_aspect, 0, 1, 0, 0};
vk::CmdClearDepthStencilImage(cb_handle, image.handle(), image.Layout(), &clear_value, 1, &range);
m_errorMonitor->VerifyFound();
@@ -4223,13 +5229,46 @@
TEST_F(VkLayerTest, InvalidBarriers) {
TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
+ // Make sure extensions for multi-planar and separate depth stencil images are enabled if possible
+ bool mp_extensions = true;
if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ mp_extensions = false;
}
ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
- if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME)) {
- m_device_extension_names.push_back(VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME);
+ if (IsPlatform(kNexusPlayer)) {
+ printf("%s This test should not run on Nexus Player\n", kSkipPrefix);
+ return;
}
+ bool rp2Supported = CheckCreateRenderPass2Support(this, m_device_extension_names);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ if (mp_extensions) {
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ }
+ bool separate_ds_layouts = false;
+ if (rp2Supported && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS_EXTENSION_NAME);
+ separate_ds_layouts = true;
+ }
+ bool maintaince2 = DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
+ if (maintaince2) {
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
+ }
+ // Check for external memory device extensions
+ bool external_memory = false;
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
+ external_memory = true;
+ }
+
+ // Set separate depth stencil feature bit
PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
(PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
auto separate_depth_stencil_layouts_features = lvl_init_struct<VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR>();
@@ -4239,6 +5278,7 @@
} else {
separate_depth_stencil_layouts_features.separateDepthStencilLayouts = VK_FALSE;
}
+
ASSERT_NO_FATAL_FAILURE(InitState(nullptr, (vkGetPhysicalDeviceFeatures2KHR) ? &features2 : nullptr));
auto depth_format = FindSupportedDepthStencilFormat(gpu());
@@ -4329,6 +5369,30 @@
img_barriers);
m_errorMonitor->VerifyFound();
+ if (!external_memory) {
+ printf("%s External memory extension not supported, skipping external queue family subcase\n", kSkipPrefix);
+ } else {
+ // Transitions to and from EXTERNAL within the same command buffer are valid, if pointless.
+ m_errorMonitor->ExpectSuccess();
+ img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
+ img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+ img_barrier.srcQueueFamilyIndex = submit_family;
+ img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_EXTERNAL;
+ img_barrier.srcAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT;
+ img_barrier.dstAccessMask = 0;
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
+ img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+ img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
+ img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_EXTERNAL;
+ img_barrier.dstQueueFamilyIndex = submit_family;
+ img_barrier.srcAccessMask = 0;
+ img_barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT;
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+ 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
+ m_errorMonitor->VerifyNotFound();
+ }
+
// Exceed the buffer size
conc_test.buffer_barrier_.offset = conc_test.buffer_.create_info().size + 1;
conc_test("", "VUID-VkBufferMemoryBarrier-offset-01187");
@@ -4360,11 +5424,13 @@
if (separate_depth_stencil_layouts_features.separateDepthStencilLayouts) {
conc_test("VUID-VkImageMemoryBarrier-image-03319");
} else {
- conc_test("VUID-VkImageMemoryBarrier-image-03320");
+ const char *vuid =
+ (separate_ds_layouts == true) ? "VUID-VkImageMemoryBarrier-image-03320" : "VUID-VkImageMemoryBarrier-image-01207";
+ conc_test(vuid);
// Having only one of depth or stencil set for DS image is an error
conc_test.image_barrier_.subresourceRange.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
- conc_test("VUID-VkImageMemoryBarrier-image-03320");
+ conc_test(vuid);
}
// Having anything other than DEPTH and STENCIL is an error
@@ -4417,13 +5483,115 @@
conc_test.image_barrier_.newLayout = VK_IMAGE_LAYOUT_GENERAL;
conc_test.image_barrier_.image = c_image.handle();
+ const char *color_vuid = (mp_extensions) ? "VUID-VkImageMemoryBarrier-image-01671" : "VUID-VkImageMemoryBarrier-image-02902";
+
// COLOR bit must be set
conc_test.image_barrier_.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
- conc_test("Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-InvalidImageAspect");
+ conc_test(color_vuid);
// No bits other than COLOR may be set
conc_test.image_barrier_.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
- conc_test("Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-InvalidImageAspect");
+ conc_test(color_vuid);
+
+ // Test multip-planar image
+ if (mp_extensions) {
+ PFN_vkBindImageMemory2KHR vkBindImageMemory2Function = nullptr;
+ PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2Function = nullptr;
+ if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
+ vkBindImageMemory2Function = vk::BindImageMemory2;
+ vkGetImageMemoryRequirements2Function = vk::GetImageMemoryRequirements2;
+ } else {
+ vkBindImageMemory2Function =
+ (PFN_vkBindImageMemory2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkBindImageMemory2KHR");
+ vkGetImageMemoryRequirements2Function =
+ (PFN_vkGetImageMemoryRequirements2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkGetImageMemoryRequirements2KHR");
+ }
+
+ VkFormatProperties format_properties;
+ VkFormat mp_format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
+ vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), mp_format, &format_properties);
+ if (0 !=
+ (format_properties.optimalTilingFeatures & (VK_FORMAT_FEATURE_DISJOINT_BIT | VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT))) {
+ VkImageCreateInfo image_create_info = {};
+ image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_create_info.pNext = NULL;
+ image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ image_create_info.format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
+ image_create_info.extent.width = 64;
+ image_create_info.extent.height = 64;
+ image_create_info.extent.depth = 1;
+ image_create_info.mipLevels = 1;
+ image_create_info.arrayLayers = 1;
+ image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
+ image_create_info.flags = VK_IMAGE_CREATE_DISJOINT_BIT;
+
+ VkImage mp_image;
+ VkDeviceMemory plane_0_memory;
+ VkDeviceMemory plane_1_memory;
+ ASSERT_VK_SUCCESS(vk::CreateImage(m_device->device(), &image_create_info, NULL, &mp_image));
+
+ VkImagePlaneMemoryRequirementsInfo image_plane_req = {VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO};
+ image_plane_req.planeAspect = VK_IMAGE_ASPECT_PLANE_0_BIT;
+
+ VkImageMemoryRequirementsInfo2 mem_req_info2 = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2};
+ mem_req_info2.pNext = &image_plane_req;
+ mem_req_info2.image = mp_image;
+ VkMemoryRequirements2 mem_req2 = {VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2};
+ vkGetImageMemoryRequirements2Function(device(), &mem_req_info2, &mem_req2);
+
+ // Find a valid memory type index to memory to be allocated from
+ VkMemoryAllocateInfo alloc_info = {VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO};
+ alloc_info.allocationSize = mem_req2.memoryRequirements.size;
+ ASSERT_TRUE(m_device->phy().set_memory_type(mem_req2.memoryRequirements.memoryTypeBits, &alloc_info, 0));
+ ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &alloc_info, NULL, &plane_0_memory));
+
+ image_plane_req.planeAspect = VK_IMAGE_ASPECT_PLANE_1_BIT;
+ vkGetImageMemoryRequirements2Function(device(), &mem_req_info2, &mem_req2);
+ alloc_info.allocationSize = mem_req2.memoryRequirements.size;
+ ASSERT_TRUE(m_device->phy().set_memory_type(mem_req2.memoryRequirements.memoryTypeBits, &alloc_info, 0));
+ ASSERT_VK_SUCCESS(vk::AllocateMemory(device(), &alloc_info, NULL, &plane_1_memory));
+
+ VkBindImagePlaneMemoryInfo plane_0_memory_info = {VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO};
+ plane_0_memory_info.planeAspect = VK_IMAGE_ASPECT_PLANE_0_BIT;
+ VkBindImagePlaneMemoryInfo plane_1_memory_info = {VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO};
+ plane_1_memory_info.planeAspect = VK_IMAGE_ASPECT_PLANE_1_BIT;
+
+ VkBindImageMemoryInfo bind_image_info[2];
+ bind_image_info[0].sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO;
+ bind_image_info[0].pNext = &plane_0_memory_info;
+ bind_image_info[0].image = mp_image;
+ bind_image_info[0].memory = plane_0_memory;
+ bind_image_info[0].memoryOffset = 0;
+ bind_image_info[1] = bind_image_info[0];
+ bind_image_info[1].pNext = &plane_1_memory_info;
+ bind_image_info[1].memory = plane_1_memory;
+ vkBindImageMemory2Function(device(), 2, bind_image_info);
+
+ conc_test.image_barrier_.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ conc_test.image_barrier_.newLayout = VK_IMAGE_LAYOUT_GENERAL;
+ conc_test.image_barrier_.image = mp_image;
+
+ // Test valid usage first
+ conc_test.image_barrier_.subresourceRange.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
+ conc_test("", "", VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, true);
+
+ conc_test.image_barrier_.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-InvalidImageAspect");
+ conc_test("VUID-VkImageMemoryBarrier-image-01672");
+
+ conc_test.image_barrier_.subresourceRange.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-InvalidImageAspect");
+ conc_test("VUID-VkImageMemoryBarrier-image-01673");
+
+ vk::FreeMemory(device(), plane_0_memory, NULL);
+ vk::FreeMemory(device(), plane_1_memory, NULL);
+ vk::DestroyImage(m_device->device(), mp_image, nullptr);
+ }
+ }
// A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
{
@@ -4491,23 +5659,38 @@
{img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "VUID-VkImageMemoryBarrier-oldLayout-01213"},
{img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "VUID-VkImageMemoryBarrier-oldLayout-01213"},
{img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, "VUID-VkImageMemoryBarrier-oldLayout-01213"},
+ // images _without_ VK_KHR_maintenance2 added layouts
+ {img_color, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, "VUID-VkImageMemoryBarrier-oldLayout-01658"},
+ {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, "VUID-VkImageMemoryBarrier-oldLayout-01658"},
+ {img_sampled, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, "VUID-VkImageMemoryBarrier-oldLayout-01658"},
+ {img_input, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, "VUID-VkImageMemoryBarrier-oldLayout-01658"},
+ {img_color, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, "VUID-VkImageMemoryBarrier-oldLayout-01659"},
+ {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, "VUID-VkImageMemoryBarrier-oldLayout-01659"},
+ {img_sampled, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, "VUID-VkImageMemoryBarrier-oldLayout-01659"},
+ {img_input, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, "VUID-VkImageMemoryBarrier-oldLayout-01659"},
// clang-format on
};
const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
for (uint32_t i = 0; i < layout_count; ++i) {
+ const VkImageLayout bad_layout = bad_buffer_layouts[i].bad_layout;
+ // Skip layouts that require maintaince2 support
+ if ((maintaince2 == false) && ((bad_layout == VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL) ||
+ (bad_layout == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL))) {
+ continue;
+ }
conc_test.image_barrier_.image = bad_buffer_layouts[i].image_obj.handle();
const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
conc_test.image_barrier_.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
: VK_IMAGE_ASPECT_COLOR_BIT;
- conc_test.image_barrier_.oldLayout = bad_buffer_layouts[i].bad_layout;
+ conc_test.image_barrier_.oldLayout = bad_layout;
conc_test.image_barrier_.newLayout = VK_IMAGE_LAYOUT_GENERAL;
conc_test(bad_buffer_layouts[i].msg_code);
conc_test.image_barrier_.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
- conc_test.image_barrier_.newLayout = bad_buffer_layouts[i].bad_layout;
+ conc_test.image_barrier_.newLayout = bad_layout;
conc_test(bad_buffer_layouts[i].msg_code);
}
@@ -4548,7 +5731,7 @@
buf_barrier.offset = 0;
buf_barrier.size = VK_WHOLE_SIZE;
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-01183");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-4098");
VkCommandPoolObj command_pool(m_device, queue_family_index, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
VkCommandBufferObj bad_command_buffer(m_device, &command_pool);
@@ -4563,7 +5746,7 @@
// Check for error for trying to wait on pipeline stage not supported by this queue. Specifically since our queue is not a
// compute queue, vk::CmdWaitEvents cannot have it's source stage mask be VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-01164");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-4098");
VkEvent event;
VkEventCreateInfo event_create_info{};
event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
@@ -4578,6 +5761,7 @@
TEST_F(VkLayerTest, InvalidBarrierQueueFamily) {
TEST_DESCRIPTION("Create and submit barriers with invalid queue families");
+ SetTargetApiVersion(VK_API_VERSION_1_0);
ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
// Find queues of two families
@@ -4592,7 +5776,7 @@
}
BarrierQueueFamilyTestHelper::Context test_context(this, qf_indices);
- if (m_device->props.apiVersion >= VK_API_VERSION_1_1) {
+ if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
printf(
"%s Device has apiVersion greater than 1.0 -- skipping test cases that require external memory "
"to be "
@@ -4620,15 +5804,15 @@
BarrierQueueFamilyTestHelper excl_test(&test_context);
excl_test.Init(nullptr); // no queue families means *exclusive* sharing mode.
- // core_validation::barrier_queue_families::kBothIgnoreOrBothValid
- excl_test("VUID-VkImageMemoryBarrier-image-01200", "VUID-VkBufferMemoryBarrier-buffer-01192", VK_QUEUE_FAMILY_IGNORED,
+ // core_validation::barrier_queue_families::kSrcAndDstBothValid
+ excl_test("VUID-VkImageMemoryBarrier-image-04069", "VUID-VkBufferMemoryBarrier-buffer-04086", VK_QUEUE_FAMILY_IGNORED,
submit_family);
- excl_test("VUID-VkImageMemoryBarrier-image-01200", "VUID-VkBufferMemoryBarrier-buffer-01192", submit_family,
+ excl_test("VUID-VkImageMemoryBarrier-image-04069", "VUID-VkBufferMemoryBarrier-buffer-04086", submit_family,
VK_QUEUE_FAMILY_IGNORED);
// true -> positive test
- excl_test("VUID-VkImageMemoryBarrier-image-01200", "VUID-VkBufferMemoryBarrier-buffer-01192", submit_family, submit_family,
+ excl_test("VUID-VkImageMemoryBarrier-image-04069", "VUID-VkBufferMemoryBarrier-buffer-04086", submit_family, submit_family,
true);
- excl_test("VUID-VkImageMemoryBarrier-image-01200", "VUID-VkBufferMemoryBarrier-buffer-01192", VK_QUEUE_FAMILY_IGNORED,
+ excl_test("VUID-VkImageMemoryBarrier-image-04069", "VUID-VkBufferMemoryBarrier-buffer-04086", VK_QUEUE_FAMILY_IGNORED,
VK_QUEUE_FAMILY_IGNORED, true);
}
@@ -4639,7 +5823,8 @@
excl_test.Init(nullptr);
// core_validation::barrier_queue_families::kSubmitQueueMustMatchSrcOrDst
- excl_test("VUID-VkImageMemoryBarrier-image-01205", "VUID-VkBufferMemoryBarrier-buffer-01196", other_family, other_family,
+ excl_test("UNASSIGNED-CoreValidation-vkImageMemoryBarrier-sharing-mode-exclusive-same-family",
+ "UNASSIGNED-CoreValidation-vkBufferMemoryBarrier-sharing-mode-exclusive-same-family", other_family, other_family,
false, submit_family);
// true -> positive test (testing both the index logic and the QFO transfer tracking.
@@ -4725,48 +5910,30 @@
VK_QUEUE_FAMILY_IGNORED, true);
// core_validation::barrier_queue_families::kSpecialOrIgnoreOnly
- conc_test("VUID-VkImageMemoryBarrier-image-01766", "VUID-VkBufferMemoryBarrier-buffer-01763", submit_family,
+ conc_test("VUID-VkImageMemoryBarrier-image-04071", "VUID-VkBufferMemoryBarrier-buffer-04088", submit_family,
VK_QUEUE_FAMILY_IGNORED);
- conc_test("VUID-VkImageMemoryBarrier-image-01766", "VUID-VkBufferMemoryBarrier-buffer-01763", VK_QUEUE_FAMILY_IGNORED,
+ conc_test("VUID-VkImageMemoryBarrier-image-04071", "VUID-VkBufferMemoryBarrier-buffer-04088", VK_QUEUE_FAMILY_IGNORED,
submit_family);
// This is to flag the errors that would be considered only "unexpected" in the parallel case above
// true -> positive test
- conc_test("VUID-VkImageMemoryBarrier-image-01766", "VUID-VkBufferMemoryBarrier-buffer-01763", VK_QUEUE_FAMILY_IGNORED,
+ conc_test("VUID-VkImageMemoryBarrier-image-04071", "VUID-VkBufferMemoryBarrier-buffer-04088", VK_QUEUE_FAMILY_IGNORED,
VK_QUEUE_FAMILY_EXTERNAL_KHR, true);
- conc_test("VUID-VkImageMemoryBarrier-image-01766", "VUID-VkBufferMemoryBarrier-buffer-01763", VK_QUEUE_FAMILY_EXTERNAL_KHR,
+ conc_test("VUID-VkImageMemoryBarrier-image-04071", "VUID-VkBufferMemoryBarrier-buffer-04088", VK_QUEUE_FAMILY_EXTERNAL_KHR,
VK_QUEUE_FAMILY_IGNORED, true);
}
BarrierQueueFamilyTestHelper excl_test(&test_context);
excl_test.Init(nullptr); // no queue families means *exclusive* sharing mode.
- // core_validation::barrier_queue_families::kSrcIgnoreRequiresDstIgnore
- excl_test("VUID-VkImageMemoryBarrier-image-01201", "VUID-VkBufferMemoryBarrier-buffer-01193", VK_QUEUE_FAMILY_IGNORED,
- submit_family);
- excl_test("VUID-VkImageMemoryBarrier-image-01201", "VUID-VkBufferMemoryBarrier-buffer-01193", VK_QUEUE_FAMILY_IGNORED,
- VK_QUEUE_FAMILY_EXTERNAL_KHR);
+ // core_validation::barrier_queue_families::kSrcAndDstValidOrSpecial
+ excl_test("VUID-VkImageMemoryBarrier-image-04072", "VUID-VkBufferMemoryBarrier-buffer-04089", submit_family, invalid);
+ excl_test("VUID-VkImageMemoryBarrier-image-04072", "VUID-VkBufferMemoryBarrier-buffer-04089", invalid, submit_family);
// true -> positive test
- excl_test("VUID-VkImageMemoryBarrier-image-01201", "VUID-VkBufferMemoryBarrier-buffer-01193", VK_QUEUE_FAMILY_IGNORED,
- VK_QUEUE_FAMILY_IGNORED, true);
-
- // core_validation::barrier_queue_families::kDstValidOrSpecialIfNotIgnore
- excl_test("VUID-VkImageMemoryBarrier-image-01768", "VUID-VkBufferMemoryBarrier-buffer-01765", submit_family, invalid);
- // true -> positive test
- excl_test("VUID-VkImageMemoryBarrier-image-01768", "VUID-VkBufferMemoryBarrier-buffer-01765", submit_family, submit_family,
+ excl_test("VUID-VkImageMemoryBarrier-image-04072", "VUID-VkBufferMemoryBarrier-buffer-04089", submit_family, submit_family,
true);
- excl_test("VUID-VkImageMemoryBarrier-image-01768", "VUID-VkBufferMemoryBarrier-buffer-01765", submit_family,
- VK_QUEUE_FAMILY_IGNORED, true);
- excl_test("VUID-VkImageMemoryBarrier-image-01768", "VUID-VkBufferMemoryBarrier-buffer-01765", submit_family,
+ excl_test("VUID-VkImageMemoryBarrier-image-04072", "VUID-VkBufferMemoryBarrier-buffer-04089", submit_family,
VK_QUEUE_FAMILY_EXTERNAL_KHR, true);
-
- // core_validation::barrier_queue_families::kSrcValidOrSpecialIfNotIgnore
- excl_test("VUID-VkImageMemoryBarrier-image-01767", "VUID-VkBufferMemoryBarrier-buffer-01764", invalid, submit_family);
- // true -> positive test
- excl_test("VUID-VkImageMemoryBarrier-image-01767", "VUID-VkBufferMemoryBarrier-buffer-01764", submit_family, submit_family,
- true);
- excl_test("VUID-VkImageMemoryBarrier-image-01767", "VUID-VkBufferMemoryBarrier-buffer-01764", VK_QUEUE_FAMILY_IGNORED,
- VK_QUEUE_FAMILY_IGNORED, true);
- excl_test("VUID-VkImageMemoryBarrier-image-01767", "VUID-VkBufferMemoryBarrier-buffer-01764", VK_QUEUE_FAMILY_EXTERNAL_KHR,
+ excl_test("VUID-VkImageMemoryBarrier-image-04072", "VUID-VkBufferMemoryBarrier-buffer-04089", VK_QUEUE_FAMILY_EXTERNAL_KHR,
submit_family, true);
}
@@ -4829,7 +5996,7 @@
// Try levelCount = 0
{
conc_test.image_barrier_.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 0, 1};
- conc_test("VUID-VkImageMemoryBarrier-subresourceRange-01724");
+ conc_test("VUID-VkImageSubresourceRange-levelCount-01720");
}
// Try baseMipLevel + levelCount > image.mipLevels
@@ -4854,7 +6021,7 @@
// Try layerCount = 0
{
conc_test.image_barrier_.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 0};
- conc_test("VUID-VkImageMemoryBarrier-subresourceRange-01725");
+ conc_test("VUID-VkImageSubresourceRange-layerCount-01721");
}
// Try baseArrayLayer + layerCount > image.arrayLayers
@@ -4897,7 +6064,7 @@
// Try levelCount = 0
{
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageMemoryBarrier-subresourceRange-01724");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceRange-levelCount-01720");
const VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 0, 1};
VkImageMemoryBarrier img_barrier = img_barrier_template;
img_barrier.subresourceRange = range;
@@ -4942,7 +6109,7 @@
// Try layerCount = 0
{
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageMemoryBarrier-subresourceRange-01725");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceRange-layerCount-01721");
const VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 0};
VkImageMemoryBarrier img_barrier = img_barrier_template;
img_barrier.subresourceRange = range;
@@ -5135,6 +6302,37 @@
m_commandBuffer->end();
}
+TEST_F(VkLayerTest, BadIndexBufferOffset) {
+ TEST_DESCRIPTION("Submit bad offsets binding the index buffer");
+
+ ASSERT_NO_FATAL_FAILURE(Init());
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+ static const uint32_t ibo_data[3] = {0, 1, 2};
+ VkConstantBufferObj ibo(m_device, sizeof(ibo_data), (const void *)&ibo_data, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
+ VkMemoryRequirements mem_reqs;
+ vk::GetBufferMemoryRequirements(m_device->device(), ibo.handle(), &mem_reqs);
+ m_commandBuffer->begin();
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+
+ // Set offset over buffer size
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindIndexBuffer-offset-00431");
+ m_commandBuffer->BindIndexBuffer(&ibo, mem_reqs.size + sizeof(uint32_t), VK_INDEX_TYPE_UINT32);
+ m_errorMonitor->VerifyFound();
+
+ // Set offset to be misaligned with index buffer UINT32 type
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindIndexBuffer-offset-00432");
+ m_commandBuffer->BindIndexBuffer(&ibo, 1, VK_INDEX_TYPE_UINT32);
+ m_errorMonitor->VerifyFound();
+
+ // Test for missing pNext struct for index buffer UINT8 type
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindIndexBuffer-indexType-02765");
+ m_commandBuffer->BindIndexBuffer(&ibo, 1, VK_INDEX_TYPE_UINT8_EXT);
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->EndRenderPass();
+ m_commandBuffer->end();
+}
+
// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
TEST_F(VkLayerTest, InvalidImageLayout) {
TEST_DESCRIPTION(
@@ -5332,14 +6530,13 @@
rpci.pSubpasses = &subpass;
rpci.attachmentCount = 1;
VkAttachmentDescription attach_desc = {};
- attach_desc.format = VK_FORMAT_UNDEFINED;
+ attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
attach_desc.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
rpci.pAttachments = &attach_desc;
rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
VkRenderPass rp;
- m_errorMonitor->SetDesiredFailureMsg(kPerformanceWarningBit,
- "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
+ m_errorMonitor->SetDesiredFailureMsg(kPerformanceWarningBit, "UNASSIGNED-CoreValidation-DrawState-InvalidImageLayout");
vk::CreateRenderPass(m_device->device(), &rpci, NULL, &rp);
m_errorMonitor->VerifyFound();
// error w/ non-general layout
@@ -5355,8 +6552,7 @@
subpass.pColorAttachments = &attach;
attach.layout = VK_IMAGE_LAYOUT_GENERAL;
// perf warning for GENERAL layout on color attachment
- m_errorMonitor->SetDesiredFailureMsg(kPerformanceWarningBit,
- "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
+ m_errorMonitor->SetDesiredFailureMsg(kPerformanceWarningBit, "UNASSIGNED-CoreValidation-DrawState-InvalidImageLayout");
vk::CreateRenderPass(m_device->device(), &rpci, NULL, &rp);
m_errorMonitor->VerifyFound();
// error w/ non-color opt or GENERAL layout for color attachment
@@ -5368,10 +6564,10 @@
m_errorMonitor->VerifyFound();
subpass.colorAttachmentCount = 0;
subpass.pDepthStencilAttachment = &attach;
+ attach_desc.format = VK_FORMAT_D16_UNORM;
attach.layout = VK_IMAGE_LAYOUT_GENERAL;
// perf warning for GENERAL layout on DS attachment
- m_errorMonitor->SetDesiredFailureMsg(kPerformanceWarningBit,
- "GENERAL layout for depth attachment may not give optimal performance.");
+ m_errorMonitor->SetDesiredFailureMsg(kPerformanceWarningBit, "UNASSIGNED-CoreValidation-DrawState-InvalidImageLayout");
vk::CreateRenderPass(m_device->device(), &rpci, NULL, &rp);
m_errorMonitor->VerifyFound();
// error w/ non-ds opt or GENERAL layout for color attachment
@@ -5393,7 +6589,7 @@
attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkAttachmentDescription-format-03283");
vk::CreateRenderPass(m_device->device(), &rpci, NULL, &rp);
m_errorMonitor->VerifyFound();
}
@@ -6442,6 +7638,7 @@
cubeImgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
cubeImgViewInfo.format = VK_FORMAT_R8_UINT; // compatiable format
cubeImgViewInfo.image = cubeImage.handle();
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageViewCreateInfo-viewType-02961");
CreateImageViewTest(*this, &cubeImgViewInfo, "VUID-VkImageViewCreateInfo-viewType-01004");
}
}
@@ -6486,45 +7683,86 @@
ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
- // Verify format
- VkFormatFeatureFlags features = VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT;
+ const VkFormatFeatureFlags features = VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT;
bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
+ // Verify format 3 Plane format
if (!supported) {
printf("%s Multiplane image format not supported. Skipping test.\n", kSkipPrefix);
- return;
+ } else {
+ VkImageObj image_obj(m_device);
+ image_obj.init(&ci);
+ ASSERT_TRUE(image_obj.initialized());
+
+ VkImageViewCreateInfo ivci = {};
+ ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
+ ivci.image = image_obj.image();
+ ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
+ ivci.format = VK_FORMAT_R8_SNORM; // Compat is VK_FORMAT_R8_UNORM
+ ivci.subresourceRange.layerCount = 1;
+ ivci.subresourceRange.baseMipLevel = 0;
+ ivci.subresourceRange.levelCount = 1;
+ ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
+
+ // Incompatible format error
+ CreateImageViewTest(*this, &ivci, "VUID-VkImageViewCreateInfo-image-01586");
+
+ // Correct format succeeds
+ ivci.format = VK_FORMAT_R8_UNORM;
+ CreateImageViewTest(*this, &ivci);
+
+ // Try a multiplane imageview
+ ivci.format = VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM;
+ ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ CreateImageViewTest(*this, &ivci);
}
- VkImageObj image_obj(m_device);
- image_obj.init(&ci);
- ASSERT_TRUE(image_obj.initialized());
+ ci.format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
+ supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
+ // Verify format 2 Plane format
+ if (!supported) {
+ printf("%s Multiplane image format not supported. Skipping test.\n", kSkipPrefix);
+ } else {
+ VkImageObj image_obj(m_device);
+ image_obj.init(&ci);
+ ASSERT_TRUE(image_obj.initialized());
- VkImageViewCreateInfo ivci = {};
- ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
- ivci.image = image_obj.image();
- ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
- ivci.format = VK_FORMAT_R8_SNORM; // Compat is VK_FORMAT_R8_UNORM
- ivci.subresourceRange.layerCount = 1;
- ivci.subresourceRange.baseMipLevel = 0;
- ivci.subresourceRange.levelCount = 1;
- ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
+ VkImageViewCreateInfo ivci = {};
+ ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
+ ivci.image = image_obj.image();
+ ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
+ ivci.subresourceRange.layerCount = 1;
+ ivci.subresourceRange.baseMipLevel = 0;
+ ivci.subresourceRange.levelCount = 1;
- // Incompatible format error
- CreateImageViewTest(*this, &ivci, "VUID-VkImageViewCreateInfo-image-01586");
+ // Plane 0 is compatible with VK_FORMAT_R8_UNORM
+ // Plane 1 is compatible with VK_FORMAT_R8G8_UNORM
- // Correct format succeeds
- ivci.format = VK_FORMAT_R8_UNORM;
- CreateImageViewTest(*this, &ivci);
+ // Correct format succeeds
+ ivci.format = VK_FORMAT_R8_UNORM;
+ ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
+ CreateImageViewTest(*this, &ivci);
- // Try a multiplane imageview
- ivci.format = VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM;
- ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
- CreateImageViewTest(*this, &ivci);
+ ivci.format = VK_FORMAT_R8G8_UNORM;
+ ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
+ CreateImageViewTest(*this, &ivci);
+
+ // Incompatible format error
+ ivci.format = VK_FORMAT_R8_UNORM;
+ ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
+ CreateImageViewTest(*this, &ivci, "VUID-VkImageViewCreateInfo-image-01586");
+
+ ivci.format = VK_FORMAT_R8G8_UNORM;
+ ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
+ CreateImageViewTest(*this, &ivci, "VUID-VkImageViewCreateInfo-image-01586");
+ }
}
TEST_F(VkLayerTest, CreateImageViewInvalidSubresourceRange) {
TEST_DESCRIPTION("Passing bad image subrange to CreateImageView");
+ VkPhysicalDeviceFeatures device_features = {};
ASSERT_NO_FATAL_FAILURE(Init());
+ ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
VkImageObj image(m_device);
image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
@@ -6565,7 +7803,7 @@
const VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 0, 1};
VkImageViewCreateInfo img_view_info = img_view_info_template;
img_view_info.subresourceRange = range;
- CreateImageViewTest(*this, &img_view_info, "VUID-VkImageViewCreateInfo-subresourceRange-01718");
+ CreateImageViewTest(*this, &img_view_info, "VUID-VkImageSubresourceRange-levelCount-01720");
}
// Try baseMipLevel + levelCount > image.mipLevels
@@ -6577,7 +7815,7 @@
}
// These tests rely on having the Maintenance1 extension not being enabled, and are invalid on all but version 1.0
- if (m_device->props.apiVersion < VK_API_VERSION_1_1) {
+ if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
// Try baseArrayLayer >= image.arrayLayers with VK_REMAINING_ARRAY_LAYERS
{
const VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 1, VK_REMAINING_ARRAY_LAYERS};
@@ -6600,7 +7838,7 @@
const VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 0};
VkImageViewCreateInfo img_view_info = img_view_info_template;
img_view_info.subresourceRange = range;
- CreateImageViewTest(*this, &img_view_info, "VUID-VkImageViewCreateInfo-subresourceRange-01719");
+ CreateImageViewTest(*this, &img_view_info, "VUID-VkImageSubresourceRange-layerCount-01721");
}
// Try baseArrayLayer + layerCount > image.arrayLayers
@@ -6611,6 +7849,87 @@
CreateImageViewTest(*this, &img_view_info, "VUID-VkImageViewCreateInfo-subresourceRange-01719");
}
}
+
+ {
+ VkImageObj cubeArrayImg(m_device);
+ auto image_ci = vk_testing::Image::create_info();
+ image_ci.arrayLayers = 18;
+ image_ci.flags = VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
+ image_ci.imageType = VK_IMAGE_TYPE_2D;
+ image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
+ image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
+ image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ cubeArrayImg.init(&image_ci);
+
+ VkImageViewCreateInfo cube_img_view_info_template = {};
+ cube_img_view_info_template.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
+ cube_img_view_info_template.image = cubeArrayImg.handle();
+ cube_img_view_info_template.viewType = VK_IMAGE_VIEW_TYPE_CUBE;
+ cube_img_view_info_template.format = cubeArrayImg.format();
+ // subresourceRange to be filled later for the purposes of this test
+ cube_img_view_info_template.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ cube_img_view_info_template.subresourceRange.baseMipLevel = 0;
+ cube_img_view_info_template.subresourceRange.levelCount = 0;
+ cube_img_view_info_template.subresourceRange.baseArrayLayer = 0;
+ cube_img_view_info_template.subresourceRange.layerCount = 0;
+
+ {
+ const VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 6};
+ VkImageViewCreateInfo img_view_info = cube_img_view_info_template;
+ img_view_info.subresourceRange = range;
+ CreateImageViewTest(*this, &img_view_info);
+ }
+ {
+ const VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 5};
+ VkImageViewCreateInfo img_view_info = cube_img_view_info_template;
+ img_view_info.subresourceRange = range;
+ CreateImageViewTest(*this, &img_view_info, "VUID-VkImageViewCreateInfo-viewType-02960");
+ }
+ {
+ const VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 12, VK_REMAINING_ARRAY_LAYERS};
+ VkImageViewCreateInfo img_view_info = cube_img_view_info_template;
+ img_view_info.subresourceRange = range;
+ CreateImageViewTest(*this, &img_view_info);
+ }
+ {
+ const VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 6, VK_REMAINING_ARRAY_LAYERS};
+ VkImageViewCreateInfo img_view_info = cube_img_view_info_template;
+ img_view_info.subresourceRange = range;
+ CreateImageViewTest(*this, &img_view_info, "VUID-VkImageViewCreateInfo-viewType-02962");
+ }
+
+ if (device_features.imageCubeArray == VK_TRUE) {
+ {
+ const VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 12};
+ VkImageViewCreateInfo img_view_info = cube_img_view_info_template;
+ img_view_info.viewType = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
+ img_view_info.subresourceRange = range;
+ CreateImageViewTest(*this, &img_view_info);
+ }
+ {
+ const VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 13};
+ VkImageViewCreateInfo img_view_info = cube_img_view_info_template;
+ img_view_info.viewType = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
+ img_view_info.subresourceRange = range;
+ CreateImageViewTest(*this, &img_view_info, "VUID-VkImageViewCreateInfo-viewType-02961");
+ }
+ {
+ const VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 6, VK_REMAINING_ARRAY_LAYERS};
+ VkImageViewCreateInfo img_view_info = cube_img_view_info_template;
+ img_view_info.viewType = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
+ img_view_info.subresourceRange = range;
+ CreateImageViewTest(*this, &img_view_info);
+ }
+ {
+ const VkImageSubresourceRange range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 11, VK_REMAINING_ARRAY_LAYERS};
+ VkImageViewCreateInfo img_view_info = cube_img_view_info_template;
+ img_view_info.viewType = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
+ img_view_info.subresourceRange = range;
+ CreateImageViewTest(*this, &img_view_info, "VUID-VkImageViewCreateInfo-viewType-02963");
+ }
+ }
+ }
}
TEST_F(VkLayerTest, CreateImageMiscErrors) {
@@ -6781,7 +8100,7 @@
enum Dimension { kWidth = 0x1, kHeight = 0x2, kDepth = 0x4 };
- for (underlying_type<Dimension>::type bad_dimensions = 0x1; bad_dimensions < 0x8; ++bad_dimensions) {
+ for (std::underlying_type<Dimension>::type bad_dimensions = 0x1; bad_dimensions < 0x8; ++bad_dimensions) {
VkExtent3D extent = {1, 1, 1};
if (bad_dimensions & kWidth) {
@@ -6952,6 +8271,23 @@
{
VkImageCreateInfo image_ci = safe_image_ci;
+ image_ci.imageType = VK_IMAGE_TYPE_3D;
+
+ VkImageFormatProperties img_limits;
+ ASSERT_VK_SUCCESS(GPDIFPHelper(gpu(), &image_ci, &img_limits));
+
+ image_ci.extent = {img_limits.maxExtent.width + 1, 1, 1};
+ CreateImageTest(*this, &image_ci, "VUID-VkImageCreateInfo-extent-02252");
+
+ image_ci.extent = {1, img_limits.maxExtent.height + 1, 1};
+ CreateImageTest(*this, &image_ci, "VUID-VkImageCreateInfo-extent-02253");
+
+ image_ci.extent = {1, 1, img_limits.maxExtent.depth + 1};
+ CreateImageTest(*this, &image_ci, "VUID-VkImageCreateInfo-extent-02254");
+ }
+
+ {
+ VkImageCreateInfo image_ci = safe_image_ci;
image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; // (any attachment bit)
VkImageFormatProperties img_limits;
@@ -6959,6 +8295,9 @@
if (dev_limits.maxFramebufferWidth != UINT32_MAX) {
image_ci.extent = {dev_limits.maxFramebufferWidth + 1, 64, 1};
+ if (dev_limits.maxFramebufferWidth + 1 > img_limits.maxExtent.width) {
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCreateInfo-extent-02252");
+ }
CreateImageTest(*this, &image_ci, "VUID-VkImageCreateInfo-usage-00964");
} else {
printf("%s VkPhysicalDeviceLimits::maxFramebufferWidth is already UINT32_MAX; skipping part of test.\n", kSkipPrefix);
@@ -6967,6 +8306,9 @@
if (dev_limits.maxFramebufferHeight != UINT32_MAX) {
image_ci.usage = VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT; // try different one too
image_ci.extent = {64, dev_limits.maxFramebufferHeight + 1, 1};
+ if (dev_limits.maxFramebufferHeight + 1 > img_limits.maxExtent.height) {
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCreateInfo-extent-02253");
+ }
CreateImageTest(*this, &image_ci, "VUID-VkImageCreateInfo-usage-00965");
} else {
printf("%s VkPhysicalDeviceLimits::maxFramebufferHeight is already UINT32_MAX; skipping part of test.\n", kSkipPrefix);
@@ -6983,14 +8325,321 @@
ASSERT_VK_SUCCESS(GPDIFPHelper(gpu(), &image_ci, &img_limits));
image_ci.extent = {dev_limits.maxFramebufferWidth + 1, 64, 1};
+ if (dev_limits.maxFramebufferWidth + 1 > img_limits.maxExtent.width) {
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCreateInfo-extent-02252");
+ }
CreateImageTest(*this, &image_ci, "VUID-VkImageCreateInfo-usage-02559");
image_ci.extent = {64, dev_limits.maxFramebufferHeight + 1, 1};
+ if (dev_limits.maxFramebufferHeight + 1 > img_limits.maxExtent.height) {
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCreateInfo-extent-02253");
+ }
CreateImageTest(*this, &image_ci, "VUID-VkImageCreateInfo-usage-02560");
}
}
}
+TEST_F(VkLayerTest, SamplerImageViewFormatUnsupportedFilter) {
+ TEST_DESCRIPTION(
+ "Create sampler with a filter and use with image view using a format that does not support the sampler filter.");
+
+ SetTargetApiVersion(VK_API_VERSION_1_1);
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ bool cubic_support = false;
+ if (DeviceExtensionSupported(gpu(), nullptr, "VK_IMG_filter_cubic")) {
+ m_device_extension_names.push_back("VK_IMG_filter_cubic");
+ cubic_support = true;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, 0));
+
+ enum FormatTypes { FLOAT, SINT, UINT };
+
+ struct TestFilterType {
+ VkFilter filter = VK_FILTER_LINEAR;
+ VkFormatFeatureFlagBits required_format_feature = VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_LINEAR_BIT;
+ VkImageTiling tiling = VK_IMAGE_TILING_LINEAR;
+ VkFormat format = VK_FORMAT_UNDEFINED;
+ FormatTypes format_type;
+ std::string err_msg;
+ };
+
+ std::vector<std::pair<VkFormat, FormatTypes>> formats_to_check({{VK_FORMAT_R8_UNORM, FLOAT},
+ {VK_FORMAT_R8_SNORM, FLOAT},
+ {VK_FORMAT_R8_SRGB, FLOAT},
+ {VK_FORMAT_R8G8_UNORM, FLOAT},
+ {VK_FORMAT_R8G8_SNORM, FLOAT},
+ {VK_FORMAT_R8G8_SRGB, FLOAT},
+ {VK_FORMAT_R8G8B8_UNORM, FLOAT},
+ {VK_FORMAT_R8G8B8_SNORM, FLOAT},
+ {VK_FORMAT_R8G8B8_SRGB, FLOAT},
+ {VK_FORMAT_R8G8B8A8_UNORM, FLOAT},
+ {VK_FORMAT_R8G8B8A8_SNORM, FLOAT},
+ {VK_FORMAT_R8G8B8A8_SRGB, FLOAT},
+ {VK_FORMAT_B8G8R8A8_UNORM, FLOAT},
+ {VK_FORMAT_B8G8R8A8_SNORM, FLOAT},
+ {VK_FORMAT_B8G8R8A8_SRGB, FLOAT},
+ {VK_FORMAT_R16_UNORM, FLOAT},
+ {VK_FORMAT_R16_SNORM, FLOAT},
+ {VK_FORMAT_R16_SFLOAT, FLOAT},
+ {VK_FORMAT_R16G16_UNORM, FLOAT},
+ {VK_FORMAT_R16G16_SNORM, FLOAT},
+ {VK_FORMAT_R16G16_SFLOAT, FLOAT},
+ {VK_FORMAT_R16G16B16_UNORM, FLOAT},
+ {VK_FORMAT_R16G16B16_SNORM, FLOAT},
+ {VK_FORMAT_R16G16B16_SFLOAT, FLOAT},
+ {VK_FORMAT_R16G16B16A16_UNORM, FLOAT},
+ {VK_FORMAT_R16G16B16A16_SNORM, FLOAT},
+ {VK_FORMAT_R16G16B16A16_SFLOAT, FLOAT},
+ {VK_FORMAT_R32_SFLOAT, FLOAT},
+ {VK_FORMAT_R32G32_SFLOAT, FLOAT},
+ {VK_FORMAT_R32G32B32_SFLOAT, FLOAT},
+ {VK_FORMAT_R32G32B32A32_SFLOAT, FLOAT},
+ {VK_FORMAT_R64_SFLOAT, FLOAT},
+ {VK_FORMAT_R64G64_SFLOAT, FLOAT},
+ {VK_FORMAT_R64G64B64_SFLOAT, FLOAT},
+ {VK_FORMAT_R64G64B64A64_SFLOAT, FLOAT},
+ {VK_FORMAT_R8_SINT, SINT},
+ {VK_FORMAT_R8G8_SINT, SINT},
+ {VK_FORMAT_R8G8B8_SINT, SINT},
+ {VK_FORMAT_R8G8B8A8_SINT, SINT},
+ {VK_FORMAT_B8G8R8A8_SINT, SINT},
+ {VK_FORMAT_R16_SINT, SINT},
+ {VK_FORMAT_R16G16_SINT, SINT},
+ {VK_FORMAT_R16G16B16_SINT, SINT},
+ {VK_FORMAT_R16G16B16A16_SINT, SINT},
+ {VK_FORMAT_R32_SINT, SINT},
+ {VK_FORMAT_R32G32_SINT, SINT},
+ {VK_FORMAT_R32G32B32_SINT, SINT},
+ {VK_FORMAT_R32G32B32A32_SINT, SINT},
+ {VK_FORMAT_R64_SINT, SINT},
+ {VK_FORMAT_R64G64_SINT, SINT},
+ {VK_FORMAT_R64G64B64_SINT, SINT},
+ {VK_FORMAT_R64G64B64A64_SINT, SINT},
+ {VK_FORMAT_R8_UINT, UINT},
+ {VK_FORMAT_R8G8_UINT, UINT},
+ {VK_FORMAT_R8G8B8_UINT, UINT},
+ {VK_FORMAT_R8G8B8A8_UINT, UINT},
+ {VK_FORMAT_B8G8R8A8_UINT, UINT},
+ {VK_FORMAT_R16_UINT, UINT},
+ {VK_FORMAT_R16G16_UINT, UINT},
+ {VK_FORMAT_R16G16B16_UINT, UINT},
+ {VK_FORMAT_R16G16B16A16_UINT, UINT},
+ {VK_FORMAT_R32_UINT, UINT},
+ {VK_FORMAT_R32G32_UINT, UINT},
+ {VK_FORMAT_R32G32B32_UINT, UINT},
+ {VK_FORMAT_R32G32B32A32_UINT, UINT},
+ {VK_FORMAT_R64_UINT, UINT},
+ {VK_FORMAT_R64G64_UINT, UINT},
+ {VK_FORMAT_R64G64B64_UINT, UINT},
+ {VK_FORMAT_R64G64B64A64_UINT, UINT}});
+
+ std::vector<struct TestFilterType> tests(2);
+ tests[0].err_msg = "VUID-vkCmdDraw-None-02690";
+
+ tests[1].filter = VK_FILTER_CUBIC_IMG;
+ tests[1].required_format_feature = VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG;
+ tests[1].err_msg = "VUID-vkCmdDraw-None-02692";
+
+ for (auto &test_struct : tests) {
+ for (std::pair<VkFormat, FormatTypes> cur_format_pair : formats_to_check) {
+ VkFormatProperties props = {};
+ vk::GetPhysicalDeviceFormatProperties(gpu(), cur_format_pair.first, &props);
+ if (test_struct.format == VK_FORMAT_UNDEFINED && props.linearTilingFeatures != 0 &&
+ (props.linearTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) &&
+ !(props.linearTilingFeatures & test_struct.required_format_feature)) {
+ test_struct.format = cur_format_pair.first;
+ test_struct.format_type = cur_format_pair.second;
+ } else if (test_struct.format == VK_FORMAT_UNDEFINED && props.optimalTilingFeatures != 0 &&
+ (props.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) &&
+ !(props.optimalTilingFeatures & test_struct.required_format_feature)) {
+ test_struct.format = cur_format_pair.first;
+ test_struct.format_type = cur_format_pair.second;
+ test_struct.tiling = VK_IMAGE_TILING_OPTIMAL;
+ }
+
+ if (test_struct.format != VK_FORMAT_UNDEFINED) {
+ break;
+ }
+ }
+ }
+
+ const char bindStateFragiSamplerShaderText[] =
+ "#version 450\n"
+ "layout(set=0, binding=0) uniform isampler2D s;\n"
+ "layout(location=0) out vec4 x;\n"
+ "void main(){\n"
+ " x = texture(s, vec2(1));\n"
+ "}\n";
+
+ const char bindStateFraguSamplerShaderText[] =
+ "#version 450\n"
+ "layout(set=0, binding=0) uniform usampler2D s;\n"
+ "layout(location=0) out vec4 x;\n"
+ "void main(){\n"
+ " x = texture(s, vec2(1));\n"
+ "}\n";
+
+ ASSERT_NO_FATAL_FAILURE(InitViewport());
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ for (auto test_struct : tests) {
+ if (test_struct.format == VK_FORMAT_UNDEFINED) {
+ printf("%s Could not find a testable format for filter %d. Skipping test for said filter.\n", kSkipPrefix,
+ test_struct.filter);
+ continue;
+ }
+
+ VkSamplerCreateInfo sci = SafeSaneSamplerCreateInfo();
+
+ sci.magFilter = test_struct.filter;
+ sci.minFilter = test_struct.filter;
+
+ if (test_struct.filter == VK_FILTER_CUBIC_IMG) {
+ if (cubic_support) {
+ sci.anisotropyEnable = VK_FALSE;
+ } else {
+ printf("%s VK_FILTER_CUBIC_IMG not supported. Skipping use of VK_FILTER_CUBIC_IMG this test.\n", kSkipPrefix);
+ continue;
+ }
+ }
+
+ VkSampler sampler;
+ VkResult err = vk::CreateSampler(m_device->device(), &sci, nullptr, &sampler);
+ ASSERT_VK_SUCCESS(err);
+
+ VkImageObj mpimage(m_device);
+ mpimage.Init(128, 128, 1, test_struct.format, VK_IMAGE_USAGE_SAMPLED_BIT, test_struct.tiling);
+ ASSERT_TRUE(mpimage.initialized());
+
+ VkImageView view = mpimage.targetView(test_struct.format);
+
+ CreatePipelineHelper pipe(*this);
+ VkShaderObj *fs = nullptr;
+
+ pipe.InitInfo();
+
+ if (test_struct.format_type == FLOAT) {
+ fs = new VkShaderObj(m_device, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
+ } else if (test_struct.format_type == SINT) {
+ fs = new VkShaderObj(m_device, bindStateFragiSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
+ } else if (test_struct.format_type == UINT) {
+ fs = new VkShaderObj(m_device, bindStateFraguSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
+ }
+
+ pipe.shader_stages_ = {pipe.vs_->GetStageCreateInfo(), fs->GetStageCreateInfo()};
+ pipe.dsl_bindings_ = {
+ {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_ALL, nullptr},
+ };
+ pipe.InitState();
+ pipe.CreateGraphicsPipeline();
+
+ pipe.descriptor_set_->WriteDescriptorImageInfo(0, view, sampler, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER);
+ pipe.descriptor_set_->UpdateDescriptorSets();
+
+ m_commandBuffer->begin();
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+
+ VkViewport viewport = {0, 0, 16, 16, 0, 1};
+ vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
+ VkRect2D scissor = {{0, 0}, {16, 16}};
+ vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
+ &pipe.descriptor_set_->set_, 0, nullptr);
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_struct.err_msg.c_str());
+ m_commandBuffer->Draw(1, 0, 0, 0);
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->EndRenderPass();
+ m_commandBuffer->end();
+
+ delete fs;
+ vk::DestroySampler(m_device->device(), sampler, nullptr);
+ }
+}
+
+TEST_F(VkLayerTest, IllegalAddressModeWithCornerSampledNV) {
+ TEST_DESCRIPTION(
+ "Create image with VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV flag and sample it with something other than "
+ "VK_SAMPLER_ADDRESS_MODE_CLAMP_EDGE.");
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ if (DeviceExtensionSupported(gpu(), nullptr, "VK_NV_corner_sampled_image")) {
+ m_device_extension_names.push_back("VK_NV_corner_sampled_image");
+ } else {
+ printf("%s VK_NV_corner_sampled_image not supported. Skipping test.\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, 0));
+ ASSERT_NO_FATAL_FAILURE(InitViewport());
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ VkImageObj test_image(m_device);
+ VkImageCreateInfo image_info = VkImageObj::create_info();
+ image_info.flags = VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV;
+ image_info.format = VK_FORMAT_R8G8B8A8_UNORM;
+ image_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
+ // If flags contains VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV,
+ // imageType must be VK_IMAGE_TYPE_2D or VK_IMAGE_TYPE_3D
+ image_info.imageType = VK_IMAGE_TYPE_2D;
+ // If flags contains VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV and imageType is VK_IMAGE_TYPE_2D,
+ // extent.width and extent.height must be greater than 1.
+ image_info.extent = {2, 2, 1};
+ image_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+
+ test_image.init(&image_info);
+ ASSERT_TRUE(test_image.initialized());
+
+ VkSamplerCreateInfo sci = SafeSaneSamplerCreateInfo();
+ sci.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;
+ VkSampler sampler;
+ VkResult err = vk::CreateSampler(m_device->device(), &sci, nullptr, &sampler);
+ ASSERT_VK_SUCCESS(err);
+
+ VkImageView view = test_image.targetView(image_info.format);
+
+ CreatePipelineHelper pipe(*this);
+ VkShaderObj fs(m_device, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
+
+ pipe.InitInfo();
+
+ pipe.shader_stages_ = {pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
+ pipe.dsl_bindings_ = {
+ {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_ALL, nullptr},
+ };
+ pipe.InitState();
+ pipe.CreateGraphicsPipeline();
+
+ pipe.descriptor_set_->WriteDescriptorImageInfo(0, view, sampler, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER);
+ pipe.descriptor_set_->UpdateDescriptorSets();
+
+ m_commandBuffer->begin();
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+
+ VkViewport viewport = {0, 0, 16, 16, 0, 1};
+ vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
+ VkRect2D scissor = {{0, 0}, {16, 16}};
+ vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
+ &pipe.descriptor_set_->set_, 0, nullptr);
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-flags-02696");
+ m_commandBuffer->Draw(1, 0, 0, 0);
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->EndRenderPass();
+ m_commandBuffer->end();
+
+ vk::DestroySampler(m_device->device(), sampler, nullptr);
+}
+
TEST_F(VkLayerTest, MultiplaneImageSamplerConversionMismatch) {
TEST_DESCRIPTION(
"Create sampler with ycbcr conversion and use with an image created without ycrcb conversion or immutable sampler");
@@ -7003,6 +8652,9 @@
}
SetTargetApiVersion(VK_API_VERSION_1_1);
ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ VkPhysicalDeviceFeatures device_features = {};
+ ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
+
mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
@@ -7080,7 +8732,7 @@
false};
VkSamplerYcbcrConversion conversions[2];
vkCreateSamplerYcbcrConversionFunction(m_device->handle(), &ycbcr_create_info, nullptr, &conversions[0]);
- ycbcr_create_info.components.r = VK_COMPONENT_SWIZZLE_ZERO; // Just anything different than above
+ ycbcr_create_info.components.a = VK_COMPONENT_SWIZZLE_ZERO; // Just anything different than above
vkCreateSamplerYcbcrConversionFunction(m_device->handle(), &ycbcr_create_info, nullptr, &conversions[1]);
VkSamplerYcbcrConversionInfo ycbcr_info = {};
@@ -7113,11 +8765,13 @@
err = vk::CreateSampler(m_device->device(), &sci, NULL, &BadSampler);
m_errorMonitor->VerifyFound();
- sci.unnormalizedCoordinates = VK_FALSE;
- sci.anisotropyEnable = VK_TRUE;
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerCreateInfo-addressModeU-01646");
- err = vk::CreateSampler(m_device->device(), &sci, NULL, &BadSampler);
- m_errorMonitor->VerifyFound();
+ if (device_features.samplerAnisotropy == VK_TRUE) {
+ sci.unnormalizedCoordinates = VK_FALSE;
+ sci.anisotropyEnable = VK_TRUE;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerCreateInfo-addressModeU-01646");
+ err = vk::CreateSampler(m_device->device(), &sci, NULL, &BadSampler);
+ m_errorMonitor->VerifyFound();
+ }
// Create an image without a Ycbcr conversion
VkImageObj mpimage(m_device);
@@ -7755,6 +9409,11 @@
TEST_F(VkLayerTest, CreateYCbCrSampler) {
TEST_DESCRIPTION("Verify YCbCr sampler creation.");
+ if (!EnableDeviceProfileLayer()) {
+ printf("%s Test requires DeviceProfileLayer, unavailable - skipped.\n", kSkipPrefix);
+ return;
+ }
+
if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
} else {
@@ -7762,16 +9421,12 @@
VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
return;
}
-
- // Test requires API 1.1 or (API 1.0 + SamplerYCbCr extension). Request API 1.1
- SetTargetApiVersion(VK_API_VERSION_1_1);
ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
(PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
- // In case we don't have API 1.1+, try enabling the extension directly (and it's dependencies)
if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME)) {
m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
@@ -7790,17 +9445,29 @@
ycbcr_features.samplerYcbcrConversion = VK_TRUE;
ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
- VkDevice dev = m_device->device();
+
+ PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
+ PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
+
+ // Load required functions
+ if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
+ printf("%s Required extensions are not avaiable.\n", kSkipPrefix);
+ return;
+ }
PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionFunction = nullptr;
+ PFN_vkDestroySamplerYcbcrConversionKHR vkDestroySamplerYcbcrConversionFunction = nullptr;
if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
vkCreateSamplerYcbcrConversionFunction = vk::CreateSamplerYcbcrConversion;
+ vkDestroySamplerYcbcrConversionFunction = vk::DestroySamplerYcbcrConversion;
} else {
vkCreateSamplerYcbcrConversionFunction =
(PFN_vkCreateSamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCreateSamplerYcbcrConversionKHR");
+ vkDestroySamplerYcbcrConversionFunction =
+ (PFN_vkDestroySamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkDestroySamplerYcbcrConversionKHR");
}
- if (!vkCreateSamplerYcbcrConversionFunction) {
+ if (!vkCreateSamplerYcbcrConversionFunction || !vkDestroySamplerYcbcrConversionFunction) {
printf("%s Did not find required device support for YcbcrSamplerConversion; test skipped.\n", kSkipPrefix);
return;
}
@@ -7820,10 +9487,273 @@
sycci.format = VK_FORMAT_UNDEFINED;
sycci.ycbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY;
sycci.ycbcrRange = VK_SAMPLER_YCBCR_RANGE_ITU_FULL;
+ sycci.forceExplicitReconstruction = VK_FALSE;
+ sycci.chromaFilter = VK_FILTER_NEAREST;
+ sycci.xChromaOffset = VK_CHROMA_LOCATION_COSITED_EVEN;
+ sycci.yChromaOffset = VK_CHROMA_LOCATION_COSITED_EVEN;
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerYcbcrConversionCreateInfo-format-01649");
- vkCreateSamplerYcbcrConversionFunction(dev, &sycci, NULL, &ycbcr_conv);
+ // test non external conversion with a VK_FORMAT_UNDEFINED
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerYcbcrConversionCreateInfo-format-04060");
+ vkCreateSamplerYcbcrConversionFunction(device(), &sycci, NULL, &ycbcr_conv);
m_errorMonitor->VerifyFound();
+
+ // test for non unorm
+ sycci.format = VK_FORMAT_R8G8B8A8_SNORM;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerYcbcrConversionCreateInfo-format-04060");
+ m_errorMonitor->SetUnexpectedError("VUID-VkSamplerYcbcrConversionCreateInfo-format-01650");
+ vkCreateSamplerYcbcrConversionFunction(device(), &sycci, NULL, &ycbcr_conv);
+ m_errorMonitor->VerifyFound();
+
+ // Force the multi-planar format support desired format features
+ VkFormat mp_format = VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM;
+ VkFormatProperties formatProps;
+ fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), mp_format, &formatProps);
+ formatProps.linearTilingFeatures = 0;
+ formatProps.optimalTilingFeatures = 0;
+ fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), mp_format, formatProps);
+
+ // Check that errors are caught when format feature don't exist
+ sycci.format = mp_format;
+
+ // No Chroma Sampler Bit set
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerYcbcrConversionCreateInfo-format-01650");
+ // 01651 set off twice for both xChromaOffset and yChromaOffset
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01651");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01651");
+ vkCreateSamplerYcbcrConversionFunction(device(), &sycci, NULL, &ycbcr_conv);
+ m_errorMonitor->VerifyFound();
+
+ // Cosited feature supported, but midpoint samples set
+ formatProps.linearTilingFeatures = 0;
+ formatProps.optimalTilingFeatures = VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT;
+ fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), mp_format, formatProps);
+ sycci.xChromaOffset = VK_CHROMA_LOCATION_MIDPOINT;
+ sycci.yChromaOffset = VK_CHROMA_LOCATION_COSITED_EVEN;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01652");
+ vkCreateSamplerYcbcrConversionFunction(device(), &sycci, NULL, &ycbcr_conv);
+ m_errorMonitor->VerifyFound();
+
+ // Moving support to Linear to test that it checks either linear or optimal
+ formatProps.linearTilingFeatures = VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT;
+ formatProps.optimalTilingFeatures = 0;
+ fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), mp_format, formatProps);
+ sycci.xChromaOffset = VK_CHROMA_LOCATION_MIDPOINT;
+ sycci.yChromaOffset = VK_CHROMA_LOCATION_COSITED_EVEN;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01652");
+ vkCreateSamplerYcbcrConversionFunction(device(), &sycci, NULL, &ycbcr_conv);
+ m_errorMonitor->VerifyFound();
+
+ // Using forceExplicitReconstruction without feature bit
+ sycci.forceExplicitReconstruction = VK_TRUE;
+ sycci.xChromaOffset = VK_CHROMA_LOCATION_COSITED_EVEN;
+ sycci.yChromaOffset = VK_CHROMA_LOCATION_COSITED_EVEN;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerYcbcrConversionCreateInfo-forceExplicitReconstruction-01656");
+ vkCreateSamplerYcbcrConversionFunction(device(), &sycci, NULL, &ycbcr_conv);
+ m_errorMonitor->VerifyFound();
+
+ // Linear chroma filtering without feature bit
+ sycci.forceExplicitReconstruction = VK_FALSE;
+ sycci.chromaFilter = VK_FILTER_LINEAR;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-01657");
+ vkCreateSamplerYcbcrConversionFunction(device(), &sycci, NULL, &ycbcr_conv);
+ m_errorMonitor->VerifyFound();
+
+ // Add linear feature bit so can create valid SamplerYcbcrConversion
+ formatProps.linearTilingFeatures = VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT;
+ formatProps.optimalTilingFeatures = VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT;
+ fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), mp_format, formatProps);
+ m_errorMonitor->ExpectSuccess();
+ vkCreateSamplerYcbcrConversionFunction(device(), &sycci, NULL, &ycbcr_conv);
+ m_errorMonitor->VerifyNotFound();
+
+ // Try to create a Sampler with non-matching filters without feature bit set
+ VkSamplerYcbcrConversionInfo sampler_ycbcr_info = {VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO, nullptr, ycbcr_conv};
+ VkSampler sampler;
+ VkSamplerCreateInfo sampler_info = SafeSaneSamplerCreateInfo();
+ sampler_info.minFilter = VK_FILTER_NEAREST; // Different than chromaFilter
+ sampler_info.magFilter = VK_FILTER_LINEAR;
+ sampler_info.pNext = (void *)&sampler_ycbcr_info;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerCreateInfo-minFilter-01645");
+ vk::CreateSampler(device(), &sampler_info, nullptr, &sampler);
+ m_errorMonitor->VerifyFound();
+
+ sampler_info.magFilter = VK_FILTER_NEAREST;
+ sampler_info.minFilter = VK_FILTER_LINEAR;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerCreateInfo-minFilter-01645");
+ vk::CreateSampler(device(), &sampler_info, nullptr, &sampler);
+ m_errorMonitor->VerifyFound();
+
+ vkDestroySamplerYcbcrConversionFunction(device(), ycbcr_conv, nullptr);
+}
+
+TEST_F(VkLayerTest, InvalidSwizzleYCbCr) {
+ TEST_DESCRIPTION("Verify Invalid use of siwizzle components when dealing with YCbCr.");
+
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
+ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ } else {
+ printf("%s Did not find required device extension %s; skipped.\n", kSkipPrefix,
+ VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ return;
+ }
+
+ // Need to enable YCbCr feature
+ auto ycbcr_features = lvl_init_struct<VkPhysicalDeviceSamplerYcbcrConversionFeatures>();
+ auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&ycbcr_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+ ycbcr_features.samplerYcbcrConversion = VK_TRUE;
+
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
+
+ PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionFunction = nullptr;
+ PFN_vkDestroySamplerYcbcrConversionKHR vkDestroySamplerYcbcrConversionFunction = nullptr;
+ if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
+ vkCreateSamplerYcbcrConversionFunction = vk::CreateSamplerYcbcrConversion;
+ vkDestroySamplerYcbcrConversionFunction = vk::DestroySamplerYcbcrConversion;
+ } else {
+ vkCreateSamplerYcbcrConversionFunction =
+ (PFN_vkCreateSamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCreateSamplerYcbcrConversionKHR");
+ vkDestroySamplerYcbcrConversionFunction =
+ (PFN_vkDestroySamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkDestroySamplerYcbcrConversionKHR");
+ }
+ if (!vkCreateSamplerYcbcrConversionFunction || !vkDestroySamplerYcbcrConversionFunction) {
+ printf("%s Did not find required device support for YcbcrSamplerConversion; test skipped.\n", kSkipPrefix);
+ return;
+ }
+
+ const VkComponentMapping identity = {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
+ VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY};
+
+ VkSamplerYcbcrConversion ycbcr_conv = VK_NULL_HANDLE;
+ VkSamplerYcbcrConversionCreateInfo sycci = {};
+ sycci.sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO;
+ sycci.format = VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM;
+ sycci.ycbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY;
+ sycci.ycbcrRange = VK_SAMPLER_YCBCR_RANGE_ITU_FULL;
+ sycci.forceExplicitReconstruction = VK_FALSE;
+ sycci.chromaFilter = VK_FILTER_NEAREST;
+ sycci.xChromaOffset = VK_CHROMA_LOCATION_COSITED_EVEN;
+ sycci.yChromaOffset = VK_CHROMA_LOCATION_COSITED_EVEN;
+
+ // test components.g
+ sycci.components = identity;
+ sycci.components.g = VK_COMPONENT_SWIZZLE_R;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerYcbcrConversionCreateInfo-components-02581");
+ vkCreateSamplerYcbcrConversionFunction(device(), &sycci, NULL, &ycbcr_conv);
+ m_errorMonitor->VerifyFound();
+
+ // test components.a
+ sycci.components = identity;
+ sycci.components.a = VK_COMPONENT_SWIZZLE_R;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerYcbcrConversionCreateInfo-components-02582");
+ vkCreateSamplerYcbcrConversionFunction(device(), &sycci, NULL, &ycbcr_conv);
+ m_errorMonitor->VerifyFound();
+
+ // make sure zero and one are allowed for components.a
+ m_errorMonitor->ExpectSuccess();
+ sycci.components.a = VK_COMPONENT_SWIZZLE_ONE;
+ vkCreateSamplerYcbcrConversionFunction(device(), &sycci, NULL, &ycbcr_conv);
+ vkDestroySamplerYcbcrConversionFunction(device(), ycbcr_conv, nullptr);
+ sycci.components.a = VK_COMPONENT_SWIZZLE_ZERO;
+ vkCreateSamplerYcbcrConversionFunction(device(), &sycci, NULL, &ycbcr_conv);
+ vkDestroySamplerYcbcrConversionFunction(device(), ycbcr_conv, nullptr);
+ m_errorMonitor->VerifyNotFound();
+
+ // test components.r
+ sycci.components = identity;
+ sycci.components.r = VK_COMPONENT_SWIZZLE_G;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerYcbcrConversionCreateInfo-components-02583");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerYcbcrConversionCreateInfo-components-02585");
+ vkCreateSamplerYcbcrConversionFunction(device(), &sycci, NULL, &ycbcr_conv);
+ m_errorMonitor->VerifyFound();
+
+ // test components.b
+ sycci.components = identity;
+ sycci.components.b = VK_COMPONENT_SWIZZLE_G;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerYcbcrConversionCreateInfo-components-02584");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerYcbcrConversionCreateInfo-components-02585");
+ vkCreateSamplerYcbcrConversionFunction(device(), &sycci, NULL, &ycbcr_conv);
+ m_errorMonitor->VerifyFound();
+
+ // test components.r and components.b together
+ sycci.components = identity;
+ sycci.components.r = VK_COMPONENT_SWIZZLE_B;
+ sycci.components.b = VK_COMPONENT_SWIZZLE_B;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerYcbcrConversionCreateInfo-components-02585");
+ vkCreateSamplerYcbcrConversionFunction(device(), &sycci, NULL, &ycbcr_conv);
+ m_errorMonitor->VerifyFound();
+
+ // make sure components.r and components.b can be swapped
+ m_errorMonitor->ExpectSuccess();
+ sycci.components = identity;
+ sycci.components.r = VK_COMPONENT_SWIZZLE_B;
+ sycci.components.b = VK_COMPONENT_SWIZZLE_R;
+ vkCreateSamplerYcbcrConversionFunction(device(), &sycci, NULL, &ycbcr_conv);
+ vkDestroySamplerYcbcrConversionFunction(device(), ycbcr_conv, nullptr);
+ m_errorMonitor->VerifyNotFound();
+
+ // Make sure components doesn't affect _444 formats
+ VkFormatProperties format_props;
+ vk::GetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM, &format_props);
+ if ((format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT) != 0) {
+ sycci.format = VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM;
+ sycci.components = identity;
+ sycci.components.g = VK_COMPONENT_SWIZZLE_R;
+ m_errorMonitor->ExpectSuccess();
+ vkCreateSamplerYcbcrConversionFunction(device(), &sycci, NULL, &ycbcr_conv);
+ vkDestroySamplerYcbcrConversionFunction(device(), ycbcr_conv, nullptr);
+ m_errorMonitor->VerifyNotFound();
+ }
+
+ // Create a valid conversion with guaranteed support
+ sycci.format = VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM;
+ sycci.components = identity;
+ vkCreateSamplerYcbcrConversionFunction(device(), &sycci, NULL, &ycbcr_conv);
+
+ VkImageObj image(m_device);
+ image.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
+ ASSERT_TRUE(image.initialized());
+
+ VkSamplerYcbcrConversionInfo conversion_info = {};
+ conversion_info.sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO;
+ conversion_info.pNext = nullptr;
+ conversion_info.conversion = ycbcr_conv;
+
+ VkImageView image_view;
+ VkImageViewCreateInfo image_view_create_info = {};
+ image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
+ image_view_create_info.pNext = &conversion_info;
+ image_view_create_info.image = image.handle();
+ image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
+ image_view_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
+ image_view_create_info.subresourceRange.layerCount = 1;
+ image_view_create_info.subresourceRange.baseMipLevel = 0;
+ image_view_create_info.subresourceRange.levelCount = 1;
+ image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ image_view_create_info.components = identity;
+ image_view_create_info.components.r = VK_COMPONENT_SWIZZLE_B;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageViewCreateInfo-pNext-01970");
+ vk::CreateImageView(m_device->device(), &image_view_create_info, nullptr, &image_view);
+ m_errorMonitor->VerifyFound();
+
+ vkDestroySamplerYcbcrConversionFunction(device(), ycbcr_conv, nullptr);
}
TEST_F(VkLayerTest, BufferDeviceAddressEXT) {
@@ -7847,7 +9777,7 @@
}
}
- if (DeviceIsMockICD() || DeviceSimulation()) {
+ if (IsPlatform(kMockICD) || DeviceSimulation()) {
printf("%s MockICD does not support this feature, skipping tests\n", kSkipPrefix);
return;
}
@@ -7892,7 +9822,22 @@
vkGetBufferDeviceAddressEXT(m_device->device(), &info);
m_errorMonitor->VerifyFound();
+ VkMemoryRequirements buffer_mem_reqs = {};
+ vk::GetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
+ VkMemoryAllocateInfo buffer_alloc_info = {};
+ buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
+ m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
+ VkDeviceMemory buffer_mem;
+ err = vk::AllocateMemory(m_device->device(), &buffer_alloc_info, NULL, &buffer_mem);
+ ASSERT_VK_SUCCESS(err);
+
+ m_errorMonitor->ExpectSuccess();
+ vk::BindBufferMemory(m_device->device(), buffer, buffer_mem, 0);
+
+ vk::FreeMemory(m_device->device(), buffer_mem, NULL);
vk::DestroyBuffer(m_device->device(), buffer, NULL);
+ m_errorMonitor->VerifyNotFound();
}
TEST_F(VkLayerTest, BufferDeviceAddressEXTDisabled) {
@@ -7916,7 +9861,7 @@
}
}
- if (DeviceIsMockICD() || DeviceSimulation()) {
+ if (IsPlatform(kMockICD) || DeviceSimulation()) {
printf("%s MockICD does not support this feature, skipping tests\n", kSkipPrefix);
return;
}
@@ -7979,7 +9924,7 @@
}
}
- if (DeviceIsMockICD() || DeviceSimulation()) {
+ if (IsPlatform(kMockICD) || DeviceSimulation()) {
printf("%s MockICD does not support this feature, skipping tests\n", kSkipPrefix);
return;
}
@@ -8120,7 +10065,7 @@
}
}
- if (DeviceIsMockICD() || DeviceSimulation()) {
+ if (IsPlatform(kMockICD) || DeviceSimulation()) {
printf("%s MockICD does not support this feature, skipping tests\n", kSkipPrefix);
return;
}
@@ -8215,6 +10160,11 @@
TEST_F(VkLayerTest, CreateImageYcbcrFormats) {
TEST_DESCRIPTION("Creating images with Ycbcr Formats.");
+ if (!EnableDeviceProfileLayer()) {
+ printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
+ return;
+ }
+
// Enable KHR multiplane req'd extensions
bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
if (mp_extensions) {
@@ -8243,7 +10193,22 @@
ASSERT_NO_FATAL_FAILURE(InitState());
ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
- VkFormat mp_format = VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM;
+ PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
+ PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
+
+ // Load required functions
+ if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
+ printf("%s Failed to device profile layer.\n", kSkipPrefix);
+ return;
+ }
+
+ // Set format features as needed for tests
+ VkFormatProperties formatProps;
+ const VkFormat mp_format = VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM;
+ fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), mp_format, &formatProps);
+ formatProps.optimalTilingFeatures |= VK_FORMAT_FEATURE_TRANSFER_SRC_BIT;
+ formatProps.optimalTilingFeatures = formatProps.optimalTilingFeatures & ~VK_FORMAT_FEATURE_DISJOINT_BIT;
+ fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), mp_format, formatProps);
// Create ycbcr image with all valid values
// Each test changes needed values and returns them back after
@@ -8259,12 +10224,7 @@
image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
image_create_info.arrayLayers = 1;
-
- bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), image_create_info, VK_FORMAT_FEATURE_TRANSFER_SRC_BIT);
- if (!supported) {
- printf("%s Multiplane image format not supported. Skipping test.\n", kSkipPrefix);
- return;
- }
+ VkImageCreateInfo reset_create_info = image_create_info;
VkImageFormatProperties img_limits;
ASSERT_VK_SUCCESS(GPDIFPHelper(gpu(), &image_create_info, &img_limits));
@@ -8277,7 +10237,7 @@
const char *error_vuid =
(ycbcr_array_extension) ? "VUID-VkImageCreateInfo-format-02653" : "VUID-VkImageCreateInfo-format-02564";
CreateImageTest(*this, &image_create_info, error_vuid);
- image_create_info.arrayLayers = 1;
+ image_create_info = reset_create_info;
}
// invalid mipLevels
@@ -8289,7 +10249,7 @@
// if up the depth the VU for IMAGE_TYPE_2D and depth != 1 hits
image_create_info.mipLevels = 2;
CreateImageTest(*this, &image_create_info, "VUID-VkImageCreateInfo-format-02561");
- image_create_info.mipLevels = 1;
+ image_create_info = reset_create_info;
}
// invalid samples count
@@ -8302,14 +10262,117 @@
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCreateInfo-samples-02258");
}
CreateImageTest(*this, &image_create_info, "VUID-VkImageCreateInfo-format-02562");
- image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_create_info = reset_create_info;
// invalid imageType
image_create_info.extent.height = 1; // to satisfy 1D requriments
image_create_info.imageType = VK_IMAGE_TYPE_1D;
CreateImageTest(*this, &image_create_info, "VUID-VkImageCreateInfo-format-02563");
- image_create_info.imageType = VK_IMAGE_TYPE_2D;
- image_create_info.extent.height = 32;
+ image_create_info = reset_create_info;
+
+ // Test using a format that doesn't support disjoint
+ image_create_info.flags = VK_IMAGE_CREATE_DISJOINT_BIT;
+ CreateImageTest(*this, &image_create_info, "VUID-VkImageCreateInfo-imageCreateFormatFeatures-02260");
+ image_create_info = reset_create_info;
+}
+
+TEST_F(VkLayerTest, InvalidSamplerFilterMinmax) {
+ TEST_DESCRIPTION("Invalid uses of VK_EXT_sampler_filter_minmax.");
+
+ // Enable KHR multiplane req'd extensions
+ bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
+ if (mp_extensions) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME);
+ } else {
+ printf("%s test requires Sampler Filter MinMax extensions, not available. Skipping.\n", kSkipPrefix);
+ return;
+ }
+
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ if (mp_extensions) {
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ } else {
+ printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
+ return;
+ }
+
+ // Enable Ycbcr Conversion Features
+ VkPhysicalDeviceSamplerYcbcrConversionFeatures ycbcr_features = {};
+ ycbcr_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES;
+ ycbcr_features.samplerYcbcrConversion = VK_TRUE;
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &ycbcr_features));
+
+ PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionFunction = nullptr;
+ PFN_vkDestroySamplerYcbcrConversionKHR vkDestroySamplerYcbcrConversionFunction = nullptr;
+
+ if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
+ vkCreateSamplerYcbcrConversionFunction = vk::CreateSamplerYcbcrConversion;
+ vkDestroySamplerYcbcrConversionFunction = vk::DestroySamplerYcbcrConversion;
+ } else {
+ vkCreateSamplerYcbcrConversionFunction =
+ (PFN_vkCreateSamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCreateSamplerYcbcrConversionKHR");
+ vkDestroySamplerYcbcrConversionFunction =
+ (PFN_vkDestroySamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkDestroySamplerYcbcrConversionKHR");
+ }
+
+ if (!vkCreateSamplerYcbcrConversionFunction || !vkDestroySamplerYcbcrConversionFunction) {
+ printf("%s Did not find required device extension %s; test skipped.\n", kSkipPrefix,
+ VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ return;
+ }
+
+ VkSampler sampler;
+
+ // Create Ycbcr conversion
+ VkSamplerYcbcrConversionCreateInfo ycbcr_create_info = {VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
+ NULL,
+ VK_FORMAT_G8_B8R8_2PLANE_420_UNORM,
+ VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,
+ VK_SAMPLER_YCBCR_RANGE_ITU_FULL,
+ {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
+ VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
+ VK_CHROMA_LOCATION_COSITED_EVEN,
+ VK_CHROMA_LOCATION_COSITED_EVEN,
+ VK_FILTER_NEAREST,
+ false};
+ VkSamplerYcbcrConversion conversion;
+ vkCreateSamplerYcbcrConversionFunction(m_device->handle(), &ycbcr_create_info, nullptr, &conversion);
+
+ VkSamplerYcbcrConversionInfo ycbcr_info = {};
+ ycbcr_info.sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO;
+ ycbcr_info.conversion = conversion;
+
+ VkSamplerReductionModeCreateInfo reduction_info = {};
+ reduction_info.sType = VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO;
+ reduction_info.reductionMode = VK_SAMPLER_REDUCTION_MODE_MIN;
+
+ VkSamplerCreateInfo sampler_info = SafeSaneSamplerCreateInfo();
+ sampler_info.pNext = &reduction_info;
+
+ // Wrong mode with a YCbCr Conversion used
+ reduction_info.pNext = &ycbcr_info;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerCreateInfo-None-01647");
+ vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
+ m_errorMonitor->VerifyFound();
+
+ // Wrong mode with compareEnable
+ reduction_info.pNext = nullptr;
+ sampler_info.compareEnable = VK_TRUE;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerCreateInfo-compareEnable-01423");
+ vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
+ m_errorMonitor->VerifyFound();
+
+ vkDestroySamplerYcbcrConversionFunction(m_device->handle(), conversion, nullptr);
}
TEST_F(VkLayerTest, BindImageMemorySwapchain) {
@@ -8323,6 +10386,11 @@
ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ if (IsPlatform(kGalaxyS10)) {
+ printf("%s This test should not run on Galaxy S10\n", kSkipPrefix);
+ return;
+ }
+
if (!AddSwapchainDeviceExtension()) {
printf("%s swapchain extensions not supported, skipping BindSwapchainImageMemory test\n", kSkipPrefix);
return;
@@ -8408,6 +10476,105 @@
DestroySwapchain();
}
+TEST_F(VkLayerTest, ValidSwapchainImage) {
+ TEST_DESCRIPTION("Swapchain images with invalid parameters");
+ const char *vuid = "VUID-VkImageSwapchainCreateInfoKHR-swapchain-00995";
+
+ if (!AddSurfaceInstanceExtension()) {
+ printf("%s surface extensions not supported, skipping test\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ if (IsPlatform(kGalaxyS10)) {
+ printf("%s This test should not run on Galaxy S10\n", kSkipPrefix);
+ return;
+ }
+
+ if (!AddSwapchainDeviceExtension()) {
+ printf("%s swapchain extensions not supported, skipping test\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+ if (!InitSwapchain()) {
+ printf("%s Cannot create surface or swapchain, skipping test\n", kSkipPrefix);
+ return;
+ }
+
+ VkImage image;
+ VkImageSwapchainCreateInfoKHR image_swapchain_create_info = {};
+ image_swapchain_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR;
+ image_swapchain_create_info.pNext = nullptr;
+ image_swapchain_create_info.swapchain = m_swapchain;
+
+ VkImageCreateInfo image_create_info = {};
+ image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_create_info.pNext = &image_swapchain_create_info;
+ image_create_info.flags = 0;
+ image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
+ image_create_info.extent.width = 64;
+ image_create_info.extent.height = 64;
+ image_create_info.extent.depth = 1;
+ image_create_info.mipLevels = 1;
+ image_create_info.arrayLayers = 1;
+ image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
+ image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ VkImageCreateInfo good_create_info = image_create_info;
+
+ // imageType
+ image_create_info = good_create_info;
+ image_create_info.imageType = VK_IMAGE_TYPE_3D;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
+ vk::CreateImage(device(), &image_create_info, NULL, &image);
+ m_errorMonitor->VerifyFound();
+
+ // mipLevels
+ image_create_info = good_create_info;
+ image_create_info.mipLevels = 2;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
+ vk::CreateImage(device(), &image_create_info, NULL, &image);
+ m_errorMonitor->VerifyFound();
+
+ // samples
+ image_create_info = good_create_info;
+ image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
+ vk::CreateImage(device(), &image_create_info, NULL, &image);
+ m_errorMonitor->VerifyFound();
+
+ // tiling
+ image_create_info = good_create_info;
+ image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
+ vk::CreateImage(device(), &image_create_info, NULL, &image);
+ m_errorMonitor->VerifyFound();
+
+ // initialLayout
+ image_create_info = good_create_info;
+ image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
+ vk::CreateImage(device(), &image_create_info, NULL, &image);
+ m_errorMonitor->VerifyFound();
+
+ // flags
+ if (m_device->phy().features().sparseBinding) {
+ image_create_info = good_create_info;
+ image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
+ vk::CreateImage(device(), &image_create_info, NULL, &image);
+ m_errorMonitor->VerifyFound();
+ }
+
+ DestroySwapchain();
+}
+
TEST_F(VkLayerTest, TransferImageToSwapchainWithInvalidLayoutDeviceGroup) {
TEST_DESCRIPTION("Transfer an image to a swapchain's image with a invalid layout between device group");
@@ -8488,7 +10655,7 @@
auto bind_devicegroup_info = lvl_init_struct<VkBindImageMemoryDeviceGroupInfo>();
bind_devicegroup_info.deviceIndexCount = 2;
- std::array<uint32_t, 2> deviceIndices = {0, 0};
+ std::array<uint32_t, 2> deviceIndices = {{0, 0}};
bind_devicegroup_info.pDeviceIndices = deviceIndices.data();
bind_devicegroup_info.splitInstanceBindRegionCount = 0;
bind_devicegroup_info.pSplitInstanceBindRegions = nullptr;
@@ -8596,7 +10763,7 @@
ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
ASSERT_NO_FATAL_FAILURE(InitState());
- if (DeviceIsMockICD() || DeviceSimulation()) {
+ if (IsPlatform(kMockICD) || DeviceSimulation()) {
printf("%s MockICD does not support the necessary memory type, skipping test\n", kSkipPrefix);
return;
}
@@ -8657,7 +10824,7 @@
VkBufferCreateInfo buffer_create_info = {};
buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
buffer_create_info.pNext = NULL;
- buffer_create_info.usage = 0;
+ buffer_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
buffer_create_info.size = 2048;
buffer_create_info.queueFamilyIndexCount = 0;
buffer_create_info.pQueueFamilyIndices = NULL;
@@ -8675,7 +10842,7 @@
image_create_info.arrayLayers = 1;
image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
- image_create_info.usage = 0;
+ image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
image_create_info.flags = 0;
// Create Images and Buffers without any memory backing
@@ -8741,12 +10908,18 @@
}
if (disjoint_support == true) {
- VkMemoryRequirements disjoint_image_memory_req;
- vk::GetImageMemoryRequirements(device(), disjoint_image, &disjoint_image_memory_req);
+ VkImagePlaneMemoryRequirementsInfo image_plane_req = {VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO};
+ image_plane_req.planeAspect = VK_IMAGE_ASPECT_PLANE_2_BIT;
+ VkImageMemoryRequirementsInfo2 mem_req_info2 = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2};
+ mem_req_info2.pNext = &image_plane_req;
+ mem_req_info2.image = disjoint_image;
+ VkMemoryRequirements2 mem_req2 = {VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2};
+
+ vk::GetImageMemoryRequirements2(m_device->device(), &mem_req_info2, &mem_req2);
dedicated_allocate_info.image = disjoint_image;
dedicated_allocate_info.buffer = VK_NULL_HANDLE;
- memory_allocate_info.allocationSize = disjoint_image_memory_req.size;
+ memory_allocate_info.allocationSize = mem_req2.memoryRequirements.size;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkMemoryDedicatedAllocateInfo-image-01797");
vk::AllocateMemory(m_device->device(), &memory_allocate_info, NULL, &device_memory);
m_errorMonitor->VerifyFound();
@@ -8761,14 +10934,26 @@
memory_allocate_info.allocationSize = normal_image_memory_req.size - 1;
dedicated_allocate_info.image = normal_image;
dedicated_allocate_info.buffer = VK_NULL_HANDLE;
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkMemoryDedicatedAllocateInfo-image-01433");
+
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
+ const char *image_vuid = DeviceExtensionEnabled(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)
+ ? "VUID-VkMemoryDedicatedAllocateInfo-image-02964"
+ : "VUID-VkMemoryDedicatedAllocateInfo-image-01433";
+ const char *buffer_vuid = DeviceExtensionEnabled(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)
+ ? "VUID-VkMemoryDedicatedAllocateInfo-buffer-02965"
+ : "VUID-VkMemoryDedicatedAllocateInfo-buffer-01435";
+#else
+ const char *image_vuid = "VUID-VkMemoryDedicatedAllocateInfo-image-01433";
+ const char *buffer_vuid = "VUID-VkMemoryDedicatedAllocateInfo-buffer-01435";
+#endif
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, image_vuid);
vk::AllocateMemory(m_device->device(), &memory_allocate_info, NULL, &device_memory);
m_errorMonitor->VerifyFound();
memory_allocate_info.allocationSize = normal_buffer_memory_req.size - 1;
dedicated_allocate_info.image = VK_NULL_HANDLE;
dedicated_allocate_info.buffer = normal_buffer;
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkMemoryDedicatedAllocateInfo-buffer-01435");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, buffer_vuid);
vk::AllocateMemory(m_device->device(), &memory_allocate_info, NULL, &device_memory);
m_errorMonitor->VerifyFound();
@@ -8908,3 +11093,2853 @@
}
}
}
+
+TEST_F(VkLayerTest, FragmentDensityMapEnabled) {
+ TEST_DESCRIPTION("Validation must check several conditions that apply only when Fragment Density Maps are used.");
+
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
+ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ bool fdmSupported = DeviceExtensionSupported(gpu(), nullptr, VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME);
+ bool fdm2Supported = DeviceExtensionSupported(gpu(), nullptr, VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME);
+
+ // Check extension support
+ if (!(fdmSupported || fdm2Supported)) {
+ printf("%s test requires %s or %s extensions. Skipping.\n", kSkipPrefix, VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME,
+ VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME);
+ return;
+ }
+
+ if (fdmSupported) {
+ m_device_extension_names.push_back(VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME);
+ }
+
+ if (fdm2Supported) {
+ m_device_extension_names.push_back(VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME);
+ }
+
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+ VkPhysicalDeviceFragmentDensityMap2FeaturesEXT density_map2_features =
+ lvl_init_struct<VkPhysicalDeviceFragmentDensityMap2FeaturesEXT>();
+ VkPhysicalDeviceFeatures2KHR features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&density_map2_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+
+ PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
+ (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
+ VkPhysicalDeviceFragmentDensityMap2PropertiesEXT density_map2_properties =
+ lvl_init_struct<VkPhysicalDeviceFragmentDensityMap2PropertiesEXT>();
+ VkPhysicalDeviceProperties2KHR properties2 = lvl_init_struct<VkPhysicalDeviceProperties2KHR>(&density_map2_properties);
+ vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
+
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
+
+ // Test sampler parameters
+
+ VkSamplerCreateInfo sampler_info_ref = SafeSaneSamplerCreateInfo();
+ sampler_info_ref.maxLod = 0.0;
+ sampler_info_ref.flags |= VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT;
+ VkSamplerCreateInfo sampler_info = sampler_info_ref;
+
+ // min max filters must match
+ sampler_info.minFilter = VK_FILTER_LINEAR;
+ sampler_info.magFilter = VK_FILTER_NEAREST;
+ CreateSamplerTest(*this, &sampler_info, "VUID-VkSamplerCreateInfo-flags-02574");
+ sampler_info.minFilter = sampler_info_ref.minFilter;
+ sampler_info.magFilter = sampler_info_ref.magFilter;
+
+ // mipmapMode must be SAMPLER_MIPMAP_MODE_NEAREST
+ sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
+ CreateSamplerTest(*this, &sampler_info, "VUID-VkSamplerCreateInfo-flags-02575");
+ sampler_info.mipmapMode = sampler_info_ref.mipmapMode;
+
+ // minLod and maxLod must be 0.0
+ sampler_info.minLod = 1.0;
+ sampler_info.maxLod = 1.0;
+ CreateSamplerTest(*this, &sampler_info, "VUID-VkSamplerCreateInfo-flags-02576");
+ sampler_info.minLod = sampler_info_ref.minLod;
+ sampler_info.maxLod = sampler_info_ref.maxLod;
+
+ // addressMode must be CLAMP_TO_EDGE or CLAMP_TO_BORDER
+ sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;
+ CreateSamplerTest(*this, &sampler_info, "VUID-VkSamplerCreateInfo-flags-02577");
+ sampler_info.addressModeU = sampler_info_ref.addressModeU;
+
+ sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT;
+ CreateSamplerTest(*this, &sampler_info, "VUID-VkSamplerCreateInfo-flags-02577");
+ sampler_info.addressModeV = sampler_info_ref.addressModeV;
+
+ // some features cannot be enabled for subsampled samplers
+ if (features2.features.samplerAnisotropy == VK_TRUE) {
+ sampler_info.anisotropyEnable = VK_TRUE;
+ CreateSamplerTest(*this, &sampler_info, "VUID-VkSamplerCreateInfo-flags-02578");
+ sampler_info.anisotropyEnable = sampler_info_ref.anisotropyEnable;
+ sampler_info.anisotropyEnable = VK_FALSE;
+ }
+
+ sampler_info.compareEnable = VK_TRUE;
+ CreateSamplerTest(*this, &sampler_info, "VUID-VkSamplerCreateInfo-flags-02579");
+ sampler_info.compareEnable = sampler_info_ref.compareEnable;
+
+ sampler_info.unnormalizedCoordinates = VK_TRUE;
+ CreateSamplerTest(*this, &sampler_info, "VUID-VkSamplerCreateInfo-flags-02580");
+ sampler_info.unnormalizedCoordinates = sampler_info_ref.unnormalizedCoordinates;
+
+ // Test image parameters
+
+ VkImageCreateInfo image_create_info = {};
+ image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_create_info.pNext = NULL;
+ image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ image_create_info.format = VK_FORMAT_R8G8_UNORM;
+ image_create_info.extent.width = 64;
+ image_create_info.extent.height = 64;
+ image_create_info.extent.depth = 1;
+ image_create_info.mipLevels = 1;
+ image_create_info.arrayLayers = 1;
+ image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_create_info.usage = VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT;
+ image_create_info.flags = 0;
+
+ // only VK_IMAGE_TYPE_2D is supported
+ image_create_info.imageType = VK_IMAGE_TYPE_1D;
+ image_create_info.extent.height = 1;
+ CreateImageTest(*this, &image_create_info, "VUID-VkImageCreateInfo-flags-02557");
+
+ // only VK_SAMPLE_COUNT_1_BIT is supported
+ image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
+ CreateImageTest(*this, &image_create_info, "VUID-VkImageCreateInfo-samples-02558");
+
+ // tiling must be VK_IMAGE_TILING_OPTIMAL
+ image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
+ image_create_info.flags = VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT;
+ image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
+ CreateImageTest(*this, &image_create_info, "VUID-VkImageCreateInfo-flags-02565");
+
+ // only 2D
+ image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_create_info.imageType = VK_IMAGE_TYPE_1D;
+ CreateImageTest(*this, &image_create_info, "VUID-VkImageCreateInfo-flags-02566");
+
+ // no cube maps
+ image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ image_create_info.extent.height = 64;
+ image_create_info.arrayLayers = 6;
+ image_create_info.flags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT;
+ CreateImageTest(*this, &image_create_info, "VUID-VkImageCreateInfo-flags-02567");
+
+ // mipLevels must be 1
+ image_create_info.flags = VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT;
+ image_create_info.arrayLayers = 1;
+ image_create_info.mipLevels = 2;
+ CreateImageTest(*this, &image_create_info, "VUID-VkImageCreateInfo-flags-02568");
+
+ // Test image view parameters
+
+ // create a valid density map image
+ image_create_info.flags = 0;
+ image_create_info.mipLevels = 1;
+ image_create_info.usage = VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT;
+ VkImageObj densityImage(m_device);
+ densityImage.init(&image_create_info);
+ ASSERT_TRUE(densityImage.initialized());
+
+ VkImageViewCreateInfo ivci = {};
+ ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
+ ivci.image = densityImage.handle();
+ ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
+ ivci.format = VK_FORMAT_R8G8_UNORM;
+ ivci.subresourceRange.layerCount = 1;
+ ivci.subresourceRange.baseMipLevel = 0;
+ ivci.subresourceRange.levelCount = 1;
+ ivci.subresourceRange.baseArrayLayer = 0;
+ ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+
+ // density maps can't be sparse (or protected)
+ if (m_device->phy().features().sparseResidencyImage2D) {
+ image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT;
+ image_create_info.usage = VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT;
+ VkImageObj image(m_device);
+ image.init(&image_create_info);
+ ASSERT_TRUE(image.initialized());
+
+ ivci.image = image.handle();
+ CreateImageViewTest(*this, &ivci, "VUID-VkImageViewCreateInfo-flags-04116");
+ }
+
+ if (fdm2Supported) {
+ if (!density_map2_features.fragmentDensityMapDeferred) {
+ ivci.flags = VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT;
+ ivci.image = densityImage.handle();
+ CreateImageViewTest(*this, &ivci, "VUID-VkImageViewCreateInfo-flags-03567");
+ } else {
+ ivci.flags = VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DEFERRED_BIT_EXT;
+ ivci.flags |= VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT;
+ ivci.image = densityImage.handle();
+ CreateImageViewTest(*this, &ivci, "VUID-VkImageViewCreateInfo-flags-03568");
+ }
+ if (density_map2_properties.maxSubsampledArrayLayers < properties2.properties.limits.maxImageArrayLayers) {
+ image_create_info.flags = VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT;
+ image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
+ image_create_info.arrayLayers = density_map2_properties.maxSubsampledArrayLayers + 1;
+ VkImageObj image(m_device);
+ image.init(&image_create_info);
+ ASSERT_TRUE(image.initialized());
+ ivci.image = image.handle();
+ ivci.flags = 0;
+ ivci.subresourceRange.layerCount = density_map2_properties.maxSubsampledArrayLayers + 1;
+ CreateImageViewTest(*this, &ivci, "VUID-VkImageViewCreateInfo-image-03569");
+ }
+ }
+}
+
+TEST_F(VkLayerTest, FragmentDensityMapDisabled) {
+ TEST_DESCRIPTION("Checks for when the fragment density map features are not enabled.");
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ bool fdmSupported = DeviceExtensionSupported(gpu(), nullptr, VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME);
+ bool fdm2Supported = DeviceExtensionSupported(gpu(), nullptr, VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME);
+
+ // Check extension support
+ if (!(fdmSupported || fdm2Supported)) {
+ printf("%s test requires %s or %s extensions. Skipping.\n", kSkipPrefix, VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME,
+ VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ VkImageCreateInfo image_create_info = {};
+ image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_create_info.pNext = NULL;
+ image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ image_create_info.format = VK_FORMAT_R8G8_UNORM;
+ image_create_info.extent.width = 64;
+ image_create_info.extent.height = 64;
+ image_create_info.extent.depth = 1;
+ image_create_info.mipLevels = 1;
+ image_create_info.arrayLayers = 1;
+ image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
+ image_create_info.flags = 0;
+
+ VkImageObj image2D(m_device);
+ image2D.init(&image_create_info);
+ ASSERT_TRUE(image2D.initialized());
+
+ VkImageViewCreateInfo ivci = {};
+ ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
+ ivci.image = image2D.handle();
+ ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
+ ivci.format = VK_FORMAT_R8G8_UNORM;
+ ivci.subresourceRange.layerCount = 1;
+ ivci.subresourceRange.baseMipLevel = 0;
+ ivci.subresourceRange.levelCount = 1;
+ ivci.subresourceRange.baseArrayLayer = 0;
+ ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+
+ // Flags must not be set if the feature is not enabled
+ ivci.flags = VK_IMAGE_VIEW_CREATE_FRAGMENT_DENSITY_MAP_DYNAMIC_BIT_EXT;
+ CreateImageViewTest(*this, &ivci, "VUID-VkImageViewCreateInfo-flags-02572");
+}
+
+TEST_F(VkLayerTest, AstcDecodeMode) {
+ TEST_DESCRIPTION("Tests for VUs for VK_EXT_astc_decode_mode");
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
+ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME);
+ } else {
+ printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_ASTC_DECODE_MODE_EXTENSION_NAME);
+ return;
+ }
+
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+
+ VkPhysicalDeviceASTCDecodeFeaturesEXT astc_decode_features = lvl_init_struct<VkPhysicalDeviceASTCDecodeFeaturesEXT>();
+ astc_decode_features.pNext = nullptr;
+ VkPhysicalDeviceFeatures2KHR features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&astc_decode_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+ if (!features2.features.textureCompressionASTC_LDR) {
+ printf("%s textureCompressionASTC_LDR feature not supported, skipping tests\n", kSkipPrefix);
+ return;
+ }
+ // Disable feature
+ astc_decode_features.decodeModeSharedExponent = VK_FALSE;
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
+
+ const VkFormat rgba_format = VK_FORMAT_R8G8B8A8_UNORM;
+ const VkFormat ldr_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
+
+ VkImageObj image(m_device);
+ image.Init(128, 128, 1, rgba_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
+ ASSERT_TRUE(image.initialized());
+ VkImageObj astc_image(m_device);
+ astc_image.Init(128, 128, 1, ldr_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
+ ASSERT_TRUE(astc_image.initialized());
+
+ VkImageViewASTCDecodeModeEXT astc_decode_mode = {};
+ astc_decode_mode.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT;
+ astc_decode_mode.pNext = nullptr;
+ astc_decode_mode.decodeMode = VK_FORMAT_R16G16B16A16_SFLOAT;
+
+ VkImageView image_view;
+ VkImageViewCreateInfo image_view_create_info = {};
+ image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
+ image_view_create_info.pNext = &astc_decode_mode;
+ image_view_create_info.image = image.handle();
+ image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
+ image_view_create_info.format = rgba_format;
+ image_view_create_info.subresourceRange.layerCount = 1;
+ image_view_create_info.subresourceRange.baseMipLevel = 0;
+ image_view_create_info.subresourceRange.levelCount = 1;
+ image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+
+ // image view format is not ASTC
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageViewASTCDecodeModeEXT-format-04084");
+ vk::CreateImageView(m_device->device(), &image_view_create_info, nullptr, &image_view);
+ m_errorMonitor->VerifyFound();
+
+ // Non-valid decodeMode
+ image_view_create_info.image = astc_image.handle();
+ image_view_create_info.format = ldr_format;
+ astc_decode_mode.decodeMode = ldr_format;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageViewASTCDecodeModeEXT-decodeMode-02230");
+ vk::CreateImageView(m_device->device(), &image_view_create_info, nullptr, &image_view);
+ m_errorMonitor->VerifyFound();
+
+ // decodeModeSharedExponent not enabled
+ astc_decode_mode.decodeMode = VK_FORMAT_E5B9G9R9_UFLOAT_PACK32;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageViewASTCDecodeModeEXT-decodeMode-02231");
+ vk::CreateImageView(m_device->device(), &image_view_create_info, nullptr, &image_view);
+ m_errorMonitor->VerifyFound();
+}
+
+TEST_F(VkLayerTest, CustomBorderColor) {
+ TEST_DESCRIPTION("Tests for VUs for VK_EXT_custom_border_color");
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
+ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME);
+ } else {
+ printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME);
+ return;
+ }
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+ VkPhysicalDeviceCustomBorderColorFeaturesEXT border_color_features =
+ lvl_init_struct<VkPhysicalDeviceCustomBorderColorFeaturesEXT>();
+ VkPhysicalDeviceFeatures2KHR features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&border_color_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+ if (!border_color_features.customBorderColors) {
+ printf("%s Custom border color feature not supported, skipping tests\n", kSkipPrefix);
+ return;
+ }
+ // Disable without format
+ border_color_features.customBorderColorWithoutFormat = 0;
+
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
+
+ VkSampler sampler;
+ VkSamplerCreateInfo sampler_info = SafeSaneSamplerCreateInfo();
+ sampler_info.borderColor = VK_BORDER_COLOR_INT_CUSTOM_EXT;
+ // No SCBCCreateInfo in pNext
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerCreateInfo-borderColor-04011");
+ vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
+ m_errorMonitor->VerifyFound();
+
+ VkSamplerCustomBorderColorCreateInfoEXT custom_color_cinfo = {};
+ custom_color_cinfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT;
+ custom_color_cinfo.format = VK_FORMAT_R32_SFLOAT;
+ sampler_info.pNext = &custom_color_cinfo;
+ // Format mismatch
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerCustomBorderColorCreateInfoEXT-format-04013");
+ vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
+ m_errorMonitor->VerifyFound();
+
+ custom_color_cinfo.format = VK_FORMAT_UNDEFINED;
+ // Format undefined with no customBorderColorWithoutFormat
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerCustomBorderColorCreateInfoEXT-format-04014");
+ vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
+ m_errorMonitor->VerifyFound();
+
+ custom_color_cinfo.format = VK_FORMAT_R8G8B8A8_UINT;
+ m_errorMonitor->ExpectSuccess();
+ vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
+ m_errorMonitor->VerifyNotFound();
+
+ VkDescriptorSetLayoutBinding dsl_binding = {0, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, &sampler};
+ VkDescriptorSetLayoutCreateInfo ds_layout_ci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, NULL, 0, 1, &dsl_binding};
+ VkDescriptorSetLayout ds_layout;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkDescriptorSetLayoutBinding-pImmutableSamplers-04009");
+ vk::CreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
+ m_errorMonitor->VerifyFound();
+
+ PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
+ (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
+ assert(vkGetPhysicalDeviceProperties2KHR != nullptr);
+ VkPhysicalDeviceCustomBorderColorPropertiesEXT custom_properties =
+ lvl_init_struct<VkPhysicalDeviceCustomBorderColorPropertiesEXT>();
+ auto prop2 = lvl_init_struct<VkPhysicalDeviceProperties2KHR>(&custom_properties);
+ vkGetPhysicalDeviceProperties2KHR(gpu(), &prop2);
+ if (custom_properties.maxCustomBorderColorSamplers <= 0xFFFF) {
+ VkSampler samplers[0xFFFF];
+ // Still have one custom border color sampler from above, so this should exceed max
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerCreateInfo-None-04012");
+ if (prop2.properties.limits.maxSamplerAllocationCount <= custom_properties.maxCustomBorderColorSamplers) {
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
+ "Number of currently valid sampler objects is not less than the maximum allowed");
+ }
+ for (uint32_t i = 0; i < custom_properties.maxCustomBorderColorSamplers; i++) {
+ vk::CreateSampler(m_device->device(), &sampler_info, NULL, &samplers[i]);
+ }
+ m_errorMonitor->VerifyFound();
+ for (uint32_t i = 0; i < custom_properties.maxCustomBorderColorSamplers - 1; i++) {
+ vk::DestroySampler(m_device->device(), samplers[i], nullptr);
+ }
+ }
+ vk::DestroySampler(m_device->device(), sampler, nullptr);
+}
+
+TEST_F(VkLayerTest, CustomBorderColorFormatUndefined) {
+ TEST_DESCRIPTION("Tests for VUID-VkSamplerCustomBorderColorCreateInfoEXT-format-04015");
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
+ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME);
+ } else {
+ printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME);
+ return;
+ }
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+ VkPhysicalDeviceCustomBorderColorFeaturesEXT border_color_features =
+ lvl_init_struct<VkPhysicalDeviceCustomBorderColorFeaturesEXT>();
+ VkPhysicalDeviceFeatures2KHR features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&border_color_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+ if (!border_color_features.customBorderColors || !border_color_features.customBorderColorWithoutFormat) {
+ printf("%s Custom border color feature not supported, skipping tests\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
+ ASSERT_NO_FATAL_FAILURE(InitViewport());
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+ VkSampler sampler;
+ VkSamplerCreateInfo sampler_info = SafeSaneSamplerCreateInfo();
+ sampler_info.borderColor = VK_BORDER_COLOR_INT_CUSTOM_EXT;
+ VkSamplerCustomBorderColorCreateInfoEXT custom_color_cinfo = {};
+ custom_color_cinfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT;
+ custom_color_cinfo.format = VK_FORMAT_UNDEFINED;
+ sampler_info.pNext = &custom_color_cinfo;
+ m_errorMonitor->ExpectSuccess();
+ vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
+ m_errorMonitor->VerifyNotFound();
+
+ VkImageObj image(m_device);
+ image.Init(32, 32, 1, VK_FORMAT_B4G4R4A4_UNORM_PACK16, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
+ image.Layout(VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
+ OneOffDescriptorSet descriptor_set(m_device,
+ {
+ {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_ALL, nullptr},
+ });
+ const VkPipelineLayoutObj pipeline_layout(m_device, {&descriptor_set.layout_});
+ vk_testing::ImageView view;
+ auto image_view_create_info = SafeSaneImageViewCreateInfo(image, VK_FORMAT_B4G4R4A4_UNORM_PACK16, VK_IMAGE_ASPECT_COLOR_BIT);
+ view.init(*m_device, image_view_create_info);
+
+ VkDescriptorImageInfo img_info = {};
+ img_info.sampler = sampler;
+ img_info.imageView = view.handle();
+ img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+
+ VkWriteDescriptorSet descriptor_writes[2] = {};
+ descriptor_writes[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ descriptor_writes[0].dstSet = descriptor_set.set_;
+ descriptor_writes[0].dstBinding = 0;
+ descriptor_writes[0].descriptorCount = 1;
+ descriptor_writes[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+ descriptor_writes[0].pImageInfo = &img_info;
+
+ vk::UpdateDescriptorSets(m_device->device(), 1, descriptor_writes, 0, NULL);
+ char const *fsSource =
+ "#version 450\n"
+ "\n"
+ "layout(set=0, binding=0) uniform sampler2D s;\n"
+ "layout(location=0) out vec4 x;\n"
+ "void main(){\n"
+ " x = texture(s, vec2(1));\n"
+ "}\n";
+ VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
+ VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
+ VkPipelineObj pipe(m_device);
+ pipe.AddShader(&vs);
+ pipe.AddShader(&fs);
+ pipe.AddDefaultColorAttachment();
+ pipe.CreateVKPipeline(pipeline_layout.handle(), renderPass());
+ m_commandBuffer->begin();
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
+ &descriptor_set.set_, 0, NULL);
+ VkViewport viewport = m_viewports[0];
+ VkRect2D scissor = m_scissors[0];
+ vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
+ vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerCustomBorderColorCreateInfoEXT-format-04015");
+ m_commandBuffer->Draw(3, 1, 0, 0);
+ m_errorMonitor->VerifyFound();
+ vk::CmdEndRenderPass(m_commandBuffer->handle());
+ m_commandBuffer->end();
+
+ vk::DestroySampler(m_device->device(), sampler, nullptr);
+}
+
+TEST_F(VkLayerTest, InvalidExportExternalImageHandleType) {
+ TEST_DESCRIPTION("Test exporting memory with mismatching handleTypes.");
+
+#ifdef _WIN32
+ const auto ext_mem_extension_name = VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME;
+ const auto handle_type = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR;
+#else
+ const auto ext_mem_extension_name = VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME;
+ const auto handle_type = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR;
+#endif
+
+ // Check for external memory instance extensions
+ if (InstanceExtensionSupported(VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME);
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s External memory extensions not supported, skipping test\n", kSkipPrefix);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ bool bind_memory2 = DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ if (DeviceExtensionSupported(gpu(), nullptr, ext_mem_extension_name)) {
+ m_device_extension_names.push_back(ext_mem_extension_name);
+ m_device_extension_names.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
+ if (bind_memory2) {
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ }
+ } else {
+ printf("%s %s extension not supported, skipping test\n", kSkipPrefix, ext_mem_extension_name);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ VkPhysicalDeviceMemoryProperties phys_mem_props;
+ vk::GetPhysicalDeviceMemoryProperties(gpu(), &phys_mem_props);
+
+ // Create Export Image
+ VkImage image_export = VK_NULL_HANDLE;
+ VkExternalMemoryImageCreateInfo external_image_info = {};
+ external_image_info.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO;
+ external_image_info.pNext = nullptr;
+ external_image_info.handleTypes = handle_type;
+ VkImageCreateInfo image_info = {};
+ image_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_info.pNext = &external_image_info;
+ image_info.imageType = VK_IMAGE_TYPE_2D;
+ image_info.arrayLayers = 1;
+ image_info.extent = {64, 64, 1};
+ image_info.format = VK_FORMAT_R8G8B8A8_UNORM;
+ image_info.mipLevels = 1;
+ image_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ image_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
+ vk::CreateImage(device(), &image_info, NULL, &image_export);
+
+ // Create export memory with different handleType
+ VkExportMemoryAllocateInfo export_memory_info = {};
+ export_memory_info.sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO;
+ export_memory_info.pNext = nullptr;
+ export_memory_info.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT_KHR;
+
+ VkMemoryAllocateInfo alloc_info = {};
+ alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ alloc_info.pNext = &export_memory_info;
+
+ VkMemoryRequirements mem_reqs;
+ vk::GetImageMemoryRequirements(m_device->device(), image_export, &mem_reqs);
+ alloc_info.allocationSize = mem_reqs.size;
+ VkMemoryPropertyFlagBits property = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
+ alloc_info.memoryTypeIndex = phys_mem_props.memoryTypeCount + 1;
+ for (uint32_t i = 0; i < phys_mem_props.memoryTypeCount; i++) {
+ if ((mem_reqs.memoryTypeBits & (1 << i)) && ((phys_mem_props.memoryTypes[i].propertyFlags & property) == property)) {
+ alloc_info.memoryTypeIndex = i;
+ break;
+ }
+ }
+ if (alloc_info.memoryTypeIndex >= phys_mem_props.memoryTypeCount) {
+ printf("%s No valid memory type index could be found; skipped.\n", kSkipPrefix);
+ vk::DestroyImage(device(), image_export, nullptr);
+ return;
+ }
+
+ VkDeviceMemory memory = VK_NULL_HANDLE;
+ vk::AllocateMemory(device(), &alloc_info, NULL, &memory);
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindImageMemory-memory-02728");
+ vk::BindImageMemory(device(), image_export, memory, 0);
+ m_errorMonitor->VerifyFound();
+
+ if (bind_memory2 == true) {
+ PFN_vkBindImageMemory2KHR vkBindImageMemory2Function =
+ (PFN_vkBindImageMemory2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkBindImageMemory2KHR");
+
+ VkBindImageMemoryInfo bind_image_info = {};
+ bind_image_info.sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO;
+ bind_image_info.pNext = nullptr;
+ bind_image_info.image = image_export;
+ bind_image_info.memory = memory;
+ bind_image_info.memoryOffset = 0;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBindImageMemoryInfo-handleTypes-02793");
+ vkBindImageMemory2Function(device(), 1, &bind_image_info);
+ m_errorMonitor->VerifyFound();
+ }
+
+ vk::FreeMemory(device(), memory, nullptr);
+ vk::DestroyImage(device(), image_export, nullptr);
+}
+
+TEST_F(VkLayerTest, InvalidExportExternalBufferHandleType) {
+ TEST_DESCRIPTION("Test exporting memory with mismatching handleTypes.");
+
+#ifdef _WIN32
+ const auto ext_mem_extension_name = VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME;
+ const auto handle_type = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR;
+#else
+ const auto ext_mem_extension_name = VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME;
+ const auto handle_type = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR;
+#endif
+
+ // Check for external memory instance extensions
+ if (InstanceExtensionSupported(VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME);
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s External memory extensions not supported, skipping test\n", kSkipPrefix);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ bool bind_memory2 = DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ if (DeviceExtensionSupported(gpu(), nullptr, ext_mem_extension_name)) {
+ m_device_extension_names.push_back(ext_mem_extension_name);
+ m_device_extension_names.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
+ if (bind_memory2) {
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ }
+ } else {
+ printf("%s %s extension not supported, skipping test\n", kSkipPrefix, ext_mem_extension_name);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ VkPhysicalDeviceMemoryProperties phys_mem_props;
+ vk::GetPhysicalDeviceMemoryProperties(gpu(), &phys_mem_props);
+
+ // Create Export Buffer
+ VkBuffer buffer_export = VK_NULL_HANDLE;
+ VkExternalMemoryBufferCreateInfo external_buffer_info = {};
+ external_buffer_info.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO;
+ external_buffer_info.pNext = nullptr;
+ external_buffer_info.handleTypes = handle_type;
+ VkBufferCreateInfo buffer_info = {};
+ buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ buffer_info.pNext = &external_buffer_info;
+ buffer_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+ buffer_info.size = 4096;
+ vk::CreateBuffer(device(), &buffer_info, NULL, &buffer_export);
+
+ // Create export memory with different handleType
+ VkExportMemoryAllocateInfo export_memory_info = {};
+ export_memory_info.sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO;
+ export_memory_info.pNext = nullptr;
+ export_memory_info.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT_KHR;
+
+ VkMemoryAllocateInfo alloc_info = {};
+ alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ alloc_info.pNext = &export_memory_info;
+
+ VkMemoryRequirements mem_reqs;
+ vk::GetBufferMemoryRequirements(m_device->device(), buffer_export, &mem_reqs);
+ alloc_info.allocationSize = mem_reqs.size;
+ VkMemoryPropertyFlagBits property = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
+ alloc_info.memoryTypeIndex = phys_mem_props.memoryTypeCount + 1;
+ for (uint32_t i = 0; i < phys_mem_props.memoryTypeCount; i++) {
+ if ((mem_reqs.memoryTypeBits & (1 << i)) && ((phys_mem_props.memoryTypes[i].propertyFlags & property) == property)) {
+ alloc_info.memoryTypeIndex = i;
+ break;
+ }
+ }
+ if (alloc_info.memoryTypeIndex >= phys_mem_props.memoryTypeCount) {
+ printf("%s No valid memory type index could be found; skipped.\n", kSkipPrefix);
+ vk::DestroyBuffer(device(), buffer_export, nullptr);
+ return;
+ }
+
+ VkDeviceMemory memory = VK_NULL_HANDLE;
+ vk::AllocateMemory(device(), &alloc_info, NULL, &memory);
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindBufferMemory-memory-02726");
+ vk::BindBufferMemory(device(), buffer_export, memory, 0);
+ m_errorMonitor->VerifyFound();
+
+ if (bind_memory2 == true) {
+ PFN_vkBindBufferMemory2KHR vkBindBufferMemory2Function =
+ (PFN_vkBindBufferMemory2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkBindBufferMemory2KHR");
+
+ VkBindBufferMemoryInfo bind_buffer_info = {};
+ bind_buffer_info.sType = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO;
+ bind_buffer_info.pNext = nullptr;
+ bind_buffer_info.buffer = buffer_export;
+ bind_buffer_info.memory = memory;
+ bind_buffer_info.memoryOffset = 0;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBindBufferMemoryInfo-handleTypes-02791");
+ vkBindBufferMemory2Function(device(), 1, &bind_buffer_info);
+ m_errorMonitor->VerifyFound();
+ }
+
+ vk::FreeMemory(device(), memory, nullptr);
+ vk::DestroyBuffer(device(), buffer_export, nullptr);
+}
+
+TEST_F(VkSyncValTest, SyncBufferCopyHazards) {
+ ASSERT_NO_FATAL_FAILURE(InitSyncValFramework());
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_AMD_BUFFER_MARKER_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_AMD_BUFFER_MARKER_EXTENSION_NAME);
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
+ bool has_amd_buffer_maker = DeviceExtensionEnabled(VK_AMD_BUFFER_MARKER_EXTENSION_NAME);
+
+ VkBufferObj buffer_a;
+ VkBufferObj buffer_b;
+ VkBufferObj buffer_c;
+ VkMemoryPropertyFlags mem_prop = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
+ buffer_a.init_as_src_and_dst(*m_device, 256, mem_prop);
+ buffer_b.init_as_src_and_dst(*m_device, 256, mem_prop);
+ buffer_c.init_as_src_and_dst(*m_device, 256, mem_prop);
+
+ VkBufferCopy region = {0, 0, 256};
+ VkBufferCopy front2front = {0, 0, 128};
+ VkBufferCopy front2back = {0, 128, 128};
+ VkBufferCopy back2back = {128, 128, 128};
+
+ auto cb = m_commandBuffer->handle();
+ m_commandBuffer->begin();
+
+ vk::CmdCopyBuffer(cb, buffer_a.handle(), buffer_b.handle(), 1, ®ion);
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_READ");
+ vk::CmdCopyBuffer(cb, buffer_c.handle(), buffer_a.handle(), 1, ®ion);
+ m_errorMonitor->VerifyFound();
+
+ // Use the barrier to clean up the WAW, and try again. (and show that validation is accounting for the barrier effect too.)
+ auto buffer_barrier = lvl_init_struct<VkBufferMemoryBarrier>();
+ buffer_barrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
+ buffer_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ buffer_barrier.buffer = buffer_a.handle();
+ buffer_barrier.offset = 0;
+ buffer_barrier.size = 256;
+ vk::CmdPipelineBarrier(cb, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 1, &buffer_barrier, 0,
+ nullptr);
+
+ m_errorMonitor->ExpectSuccess();
+ vk::CmdCopyBuffer(cb, buffer_c.handle(), buffer_a.handle(), 1, &front2front);
+ vk::CmdCopyBuffer(cb, buffer_c.handle(), buffer_a.handle(), 1, &back2back);
+ m_errorMonitor->VerifyNotFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ vk::CmdCopyBuffer(cb, buffer_c.handle(), buffer_a.handle(), 1, &front2back);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ vk::CmdCopyBuffer(cb, buffer_c.handle(), buffer_b.handle(), 1, ®ion);
+ m_errorMonitor->VerifyFound();
+
+ // NOTE: Since the previous command skips in validation, the state update is never done, and the validation layer thus doesn't
+ // record the write operation to b. So we'll need to repeat it successfully to set up for the *next* test.
+
+ // Use the barrier to clean up the WAW, and try again. (and show that validation is accounting for the barrier effect too.)
+ auto mem_barrier = lvl_init_struct<VkMemoryBarrier>();
+ mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ vk::CmdPipelineBarrier(cb, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1, &mem_barrier, 0, nullptr, 0,
+ nullptr);
+ m_errorMonitor->ExpectSuccess();
+
+ vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_c.handle(), buffer_b.handle(), 1, ®ion);
+ m_errorMonitor->VerifyNotFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; // Protect C but not B
+ mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ vk::CmdPipelineBarrier(cb, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1, &mem_barrier, 0, nullptr, 0,
+ nullptr);
+ vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_b.handle(), buffer_c.handle(), 1, ®ion);
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->end();
+
+ // CmdFillBuffer
+ m_errorMonitor->ExpectSuccess();
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+ vk::CmdFillBuffer(m_commandBuffer->handle(), buffer_a.handle(), 0, 256, 1);
+ m_commandBuffer->end();
+ m_errorMonitor->VerifyNotFound();
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+ vk::CmdCopyBuffer(cb, buffer_b.handle(), buffer_a.handle(), 1, ®ion);
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ vk::CmdFillBuffer(m_commandBuffer->handle(), buffer_a.handle(), 0, 256, 1);
+ m_errorMonitor->VerifyFound();
+ m_commandBuffer->end();
+
+ // CmdUpdateBuffer
+ int i = 10;
+ m_errorMonitor->ExpectSuccess();
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+ vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer_a.handle(), 0, sizeof(i), &i);
+ m_commandBuffer->end();
+ m_errorMonitor->VerifyNotFound();
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+ vk::CmdCopyBuffer(cb, buffer_b.handle(), buffer_a.handle(), 1, ®ion);
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer_a.handle(), 0, sizeof(i), &i);
+ m_errorMonitor->VerifyFound();
+ m_commandBuffer->end();
+
+ // CmdWriteBufferMarkerAMD
+ if (has_amd_buffer_maker) {
+ auto fpCmdWriteBufferMarkerAMD =
+ (PFN_vkCmdWriteBufferMarkerAMD)vk::GetDeviceProcAddr(m_device->device(), "vkCmdWriteBufferMarkerAMD");
+ if (!fpCmdWriteBufferMarkerAMD) {
+ printf("%s Test requires unsupported vkCmdWriteBufferMarkerAMD feature. Skipped.\n", kSkipPrefix);
+ } else {
+ m_errorMonitor->ExpectSuccess();
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+ fpCmdWriteBufferMarkerAMD(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, buffer_a.handle(), 0, 1);
+ m_commandBuffer->end();
+ m_errorMonitor->VerifyNotFound();
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+ vk::CmdCopyBuffer(cb, buffer_b.handle(), buffer_a.handle(), 1, ®ion);
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ fpCmdWriteBufferMarkerAMD(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, buffer_a.handle(), 0, 1);
+ m_errorMonitor->VerifyFound();
+ m_commandBuffer->end();
+ }
+ } else {
+ printf("%s Test requires unsupported vkCmdWriteBufferMarkerAMD feature. Skipped.\n", kSkipPrefix);
+ }
+}
+
+TEST_F(VkSyncValTest, SyncCopyOptimalImageHazards) {
+ ASSERT_NO_FATAL_FAILURE(InitSyncValFramework());
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
+
+ VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+ VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
+ VkImageObj image_a(m_device);
+ auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 2, format, usage, VK_IMAGE_TILING_OPTIMAL);
+ image_a.Init(image_ci);
+ ASSERT_TRUE(image_a.initialized());
+
+ VkImageObj image_b(m_device);
+ image_b.Init(image_ci);
+ ASSERT_TRUE(image_b.initialized());
+
+ VkImageObj image_c(m_device);
+ image_c.Init(image_ci);
+ ASSERT_TRUE(image_c.initialized());
+
+ VkImageSubresourceLayers layers_all{VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 2};
+ VkImageSubresourceLayers layers_0{VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
+ VkImageSubresourceLayers layers_1{VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 1};
+ VkImageSubresourceRange full_subresource_range{VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 2};
+ VkOffset3D zero_offset{0, 0, 0};
+ VkOffset3D half_offset{64, 64, 0};
+ VkExtent3D full_extent{128, 128, 1}; // <-- image type is 2D
+ VkExtent3D half_extent{64, 64, 1}; // <-- image type is 2D
+
+ VkImageCopy full_region = {layers_all, zero_offset, layers_all, zero_offset, full_extent};
+ VkImageCopy region_0_to_0 = {layers_0, zero_offset, layers_0, zero_offset, full_extent};
+ VkImageCopy region_0_to_1 = {layers_0, zero_offset, layers_1, zero_offset, full_extent};
+ VkImageCopy region_1_to_1 = {layers_1, zero_offset, layers_1, zero_offset, full_extent};
+ VkImageCopy region_0_front = {layers_0, zero_offset, layers_0, zero_offset, half_extent};
+ VkImageCopy region_0_back = {layers_0, half_offset, layers_0, half_offset, half_extent};
+
+ m_commandBuffer->begin();
+
+ image_c.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+ image_b.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+ image_a.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+
+ auto cb = m_commandBuffer->handle();
+
+ vk::CmdCopyImage(cb, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &full_region);
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_READ");
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &full_region);
+ m_errorMonitor->VerifyFound();
+
+ // Use the barrier to clean up the WAW, and try again. (and show that validation is accounting for the barrier effect too.)
+ auto image_barrier = lvl_init_struct<VkImageMemoryBarrier>();
+ image_barrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
+ image_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ image_barrier.image = image_a.handle();
+ image_barrier.subresourceRange = full_subresource_range;
+ image_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
+ image_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
+ vk::CmdPipelineBarrier(cb, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1,
+ &image_barrier);
+
+ m_errorMonitor->ExpectSuccess();
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion_0_to_0);
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion_1_to_1);
+ m_errorMonitor->VerifyNotFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion_0_to_1);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &full_region);
+ m_errorMonitor->VerifyFound();
+
+ // NOTE: Since the previous command skips in validation, the state update is never done, and the validation layer thus doesn't
+ // record the write operation to b. So we'll need to repeat it successfully to set up for the *next* test.
+
+ // Use the barrier to clean up the WAW, and try again. (and show that validation is accounting for the barrier effect too.)
+ auto mem_barrier = lvl_init_struct<VkMemoryBarrier>();
+ mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ vk::CmdPipelineBarrier(cb, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1, &mem_barrier, 0, nullptr, 0,
+ nullptr);
+ m_errorMonitor->ExpectSuccess();
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &full_region);
+ m_errorMonitor->VerifyNotFound();
+
+ // Use barrier to protect last reader, but not last writer...
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; // Protects C but not B
+ mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ vk::CmdPipelineBarrier(cb, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1, &mem_barrier, 0, nullptr, 0,
+ nullptr);
+ vk::CmdCopyImage(cb, image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &full_region);
+ m_errorMonitor->VerifyFound();
+
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion_0_front);
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion_0_front);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->ExpectSuccess();
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion_0_back);
+ m_errorMonitor->VerifyNotFound();
+
+ m_commandBuffer->end();
+
+ // CmdResolveImage
+ VkImageFormatProperties formProps = {{0, 0, 0}, 0, 0, 0, 0};
+ vk::GetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D,
+ VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &formProps);
+
+ if (!(formProps.sampleCounts & VK_SAMPLE_COUNT_2_BIT)) {
+ printf("%s CmdResolveImage Test requires unsupported VK_SAMPLE_COUNT_2_BIT feature. Skipped.\n", kSkipPrefix);
+ } else {
+ m_errorMonitor->ExpectSuccess();
+ VkImageObj image_s2_a(m_device), image_s2_b(m_device);
+ image_ci.samples = VK_SAMPLE_COUNT_2_BIT;
+ image_s2_a.Init(image_ci);
+ ASSERT_TRUE(image_s2_a.initialized());
+
+ image_s2_b.Init(image_ci);
+ ASSERT_TRUE(image_s2_b.initialized());
+
+ VkImageResolve r_full_region = {layers_all, zero_offset, layers_all, zero_offset, full_extent};
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+ image_s2_a.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+ image_s2_b.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+ vk::CmdResolveImage(cb, image_s2_a.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ &r_full_region);
+ m_commandBuffer->end();
+ m_errorMonitor->VerifyNotFound();
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+ vk::CmdCopyImage(cb, image_s2_b.handle(), VK_IMAGE_LAYOUT_GENERAL, image_s2_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ &full_region);
+ vk::CmdCopyImage(cb, image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &full_region);
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ vk::CmdResolveImage(cb, image_s2_a.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ &r_full_region);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_READ");
+ vk::CmdResolveImage(cb, image_s2_b.handle(), VK_IMAGE_LAYOUT_GENERAL, image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ &r_full_region);
+ m_errorMonitor->VerifyFound();
+ m_commandBuffer->end();
+ }
+}
+
+TEST_F(VkSyncValTest, SyncCopyOptimalMultiPlanarHazards) {
+ // TODO: Add code to enable sync validation
+ // Enable KHR multiplane req'd extensions
+ bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
+ VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
+ if (mp_extensions) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ }
+ ASSERT_NO_FATAL_FAILURE(InitSyncValFramework());
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ if (mp_extensions) {
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ } else {
+ printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+ VkFormat format = VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM;
+ VkImageObj image_a(m_device);
+ const auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 2, format, usage, VK_IMAGE_TILING_OPTIMAL);
+ // Verify format
+ bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), image_ci,
+ VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
+ if (!supported) {
+ printf("%s Multiplane image format not supported. Skipping test.\n", kSkipPrefix);
+ return; // Assume there's low ROI on searching for different mp formats
+ }
+
+ image_a.Init(image_ci);
+ VkImageObj image_b(m_device);
+ image_b.Init(image_ci);
+ VkImageObj image_c(m_device);
+ image_c.Init(image_ci);
+
+ VkImageSubresourceLayers layer_all_plane0{VK_IMAGE_ASPECT_PLANE_0_BIT_KHR, 0, 0, 2};
+ VkImageSubresourceLayers layer0_plane0{VK_IMAGE_ASPECT_PLANE_0_BIT_KHR, 0, 0, 1};
+ VkImageSubresourceLayers layer0_plane1{VK_IMAGE_ASPECT_PLANE_1_BIT_KHR, 0, 0, 1};
+ VkImageSubresourceLayers layer1_plane1{VK_IMAGE_ASPECT_PLANE_1_BIT_KHR, 0, 1, 1};
+ VkImageSubresourceRange full_subresource_range{
+ VK_IMAGE_ASPECT_PLANE_0_BIT_KHR | VK_IMAGE_ASPECT_PLANE_1_BIT_KHR | VK_IMAGE_ASPECT_PLANE_2_BIT_KHR, 0, 1, 0, 2};
+ VkOffset3D zero_offset{0, 0, 0};
+ VkOffset3D one_four_offset{32, 32, 0};
+ VkExtent3D full_extent{128, 128, 1}; // <-- image type is 2D
+ VkExtent3D half_extent{64, 64, 1}; // <-- image type is 2D
+ VkExtent3D one_four_extent{32, 32, 1}; // <-- image type is 2D
+
+ VkImageCopy region_all_plane0_to_all_plane0 = {layer_all_plane0, zero_offset, layer_all_plane0, zero_offset, full_extent};
+ VkImageCopy region_layer0_plane0_to_layer0_plane0 = {layer0_plane0, zero_offset, layer0_plane0, zero_offset, full_extent};
+ VkImageCopy region_layer0_plane0_to_layer0_plane1 = {layer0_plane0, zero_offset, layer0_plane1, zero_offset, half_extent};
+ VkImageCopy region_layer1_plane1_to_layer1_plane1_front = {layer1_plane1, zero_offset, layer1_plane1, zero_offset,
+ one_four_extent};
+ VkImageCopy region_layer1_plane1_to_layer1_plane1_back = {layer1_plane1, one_four_offset, layer1_plane1, one_four_offset,
+ one_four_extent};
+
+ m_commandBuffer->begin();
+
+ image_c.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+ image_b.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+ image_a.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+
+ auto cb = m_commandBuffer->handle();
+
+ vk::CmdCopyImage(cb, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_all_plane0_to_all_plane0);
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_READ");
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_all_plane0_to_all_plane0);
+ m_errorMonitor->VerifyFound();
+
+ // Use the barrier to clean up the WAW, and try again. (and show that validation is accounting for the barrier effect too.)
+ auto image_barrier = lvl_init_struct<VkImageMemoryBarrier>();
+ image_barrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
+ image_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ image_barrier.image = image_a.handle();
+ image_barrier.subresourceRange = full_subresource_range;
+ image_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
+ image_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
+ vk::CmdPipelineBarrier(cb, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1,
+ &image_barrier);
+
+ m_errorMonitor->ExpectSuccess();
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_layer0_plane0_to_layer0_plane0);
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_layer0_plane0_to_layer0_plane1);
+ m_errorMonitor->VerifyNotFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_layer0_plane0_to_layer0_plane1);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_all_plane0_to_all_plane0);
+ m_errorMonitor->VerifyFound();
+
+ // NOTE: Since the previous command skips in validation, the state update is never done, and the validation layer thus doesn't
+ // record the write operation to b. So we'll need to repeat it successfully to set up for the *next* test.
+
+ // Use the barrier to clean up the WAW, and try again. (and show that validation is accounting for the barrier effect too.)
+ auto mem_barrier = lvl_init_struct<VkMemoryBarrier>();
+ mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ vk::CmdPipelineBarrier(cb, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1, &mem_barrier, 0, nullptr, 0,
+ nullptr);
+ m_errorMonitor->ExpectSuccess();
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_all_plane0_to_all_plane0);
+ m_errorMonitor->VerifyNotFound();
+
+ // Use barrier to protect last reader, but not last writer...
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; // Protects C but not B
+ mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ vk::CmdPipelineBarrier(cb, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1, &mem_barrier, 0, nullptr, 0,
+ nullptr);
+ vk::CmdCopyImage(cb, image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_all_plane0_to_all_plane0);
+ m_errorMonitor->VerifyFound();
+
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_layer1_plane1_to_layer1_plane1_front);
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_layer1_plane1_to_layer1_plane1_front);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->ExpectSuccess();
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_layer1_plane1_to_layer1_plane1_back);
+ m_errorMonitor->VerifyNotFound();
+
+ m_commandBuffer->end();
+}
+
+TEST_F(VkSyncValTest, SyncCopyLinearImageHazards) {
+ ASSERT_NO_FATAL_FAILURE(InitSyncValFramework());
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+ VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
+ VkImageObj image_a(m_device);
+ const auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, format, usage, VK_IMAGE_TILING_LINEAR);
+ image_a.Init(image_ci);
+ VkImageObj image_b(m_device);
+ image_b.Init(image_ci);
+ VkImageObj image_c(m_device);
+ image_c.Init(image_ci);
+
+ VkImageSubresourceLayers layers_all{VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
+ VkImageSubresourceRange full_subresource_range{VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
+ VkOffset3D zero_offset{0, 0, 0};
+ VkOffset3D half_offset{64, 64, 0};
+ VkExtent3D full_extent{128, 128, 1}; // <-- image type is 2D
+ VkExtent3D half_extent{64, 64, 1}; // <-- image type is 2D
+
+ VkImageCopy full_region = {layers_all, zero_offset, layers_all, zero_offset, full_extent};
+ VkImageCopy region_front = {layers_all, zero_offset, layers_all, zero_offset, half_extent};
+ VkImageCopy region_back = {layers_all, half_offset, layers_all, half_offset, half_extent};
+
+ m_commandBuffer->begin();
+
+ image_c.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+ image_b.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+ image_a.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+
+ auto cb = m_commandBuffer->handle();
+
+ vk::CmdCopyImage(cb, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &full_region);
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_READ");
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &full_region);
+ m_errorMonitor->VerifyFound();
+
+ // Use the barrier to clean up the WAW, and try again. (and show that validation is accounting for the barrier effect too.)
+ auto image_barrier = lvl_init_struct<VkImageMemoryBarrier>();
+ image_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ image_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ image_barrier.image = image_b.handle();
+ image_barrier.subresourceRange = full_subresource_range;
+ image_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
+ image_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
+ vk::CmdPipelineBarrier(cb, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1,
+ &image_barrier);
+
+ m_errorMonitor->ExpectSuccess();
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &full_region);
+ m_errorMonitor->VerifyNotFound();
+
+ // Use barrier to protect last reader, but not last writer...
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ image_barrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; // Protects C but not B
+ image_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ vk::CmdPipelineBarrier(cb, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1,
+ &image_barrier);
+ vk::CmdCopyImage(cb, image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &full_region);
+ m_errorMonitor->VerifyFound();
+
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion_front);
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion_front);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->ExpectSuccess();
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion_back);
+ m_errorMonitor->VerifyNotFound();
+}
+
+TEST_F(VkSyncValTest, SyncCopyLinearMultiPlanarHazards) {
+ // TODO: Add code to enable sync validation
+ // Enable KHR multiplane req'd extensions
+ bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
+ VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
+ if (mp_extensions) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ }
+ ASSERT_NO_FATAL_FAILURE(InitSyncValFramework());
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ if (mp_extensions) {
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ } else {
+ printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+ VkFormat format = VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM;
+ VkImageObj image_a(m_device);
+ const auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, format, usage, VK_IMAGE_TILING_LINEAR);
+ // Verify format
+ bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), image_ci,
+ VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
+ if (!supported) {
+ printf("%s Multiplane image format not supported. Skipping test.\n", kSkipPrefix);
+ return; // Assume there's low ROI on searching for different mp formats
+ }
+
+ image_a.Init(image_ci);
+ VkImageObj image_b(m_device);
+ image_b.Init(image_ci);
+ VkImageObj image_c(m_device);
+ image_c.Init(image_ci);
+
+ VkImageSubresourceLayers layer_all_plane0{VK_IMAGE_ASPECT_PLANE_0_BIT_KHR, 0, 0, 1};
+ VkImageSubresourceLayers layer_all_plane1{VK_IMAGE_ASPECT_PLANE_1_BIT_KHR, 0, 0, 1};
+ VkImageSubresourceRange full_subresource_range{
+ VK_IMAGE_ASPECT_PLANE_0_BIT_KHR | VK_IMAGE_ASPECT_PLANE_1_BIT_KHR | VK_IMAGE_ASPECT_PLANE_2_BIT_KHR, 0, 1, 0, 1};
+ VkOffset3D zero_offset{0, 0, 0};
+ VkOffset3D one_four_offset{32, 32, 0};
+ VkExtent3D full_extent{128, 128, 1}; // <-- image type is 2D
+ VkExtent3D half_extent{64, 64, 1}; // <-- image type is 2D
+ VkExtent3D one_four_extent{32, 32, 1}; // <-- image type is 2D
+
+ VkImageCopy region_plane0_to_plane0 = {layer_all_plane0, zero_offset, layer_all_plane0, zero_offset, full_extent};
+ VkImageCopy region_plane0_to_plane1 = {layer_all_plane0, zero_offset, layer_all_plane1, zero_offset, half_extent};
+ VkImageCopy region_plane1_to_plane1_front = {layer_all_plane1, zero_offset, layer_all_plane1, zero_offset, one_four_extent};
+ VkImageCopy region_plane1_to_plane1_back = {layer_all_plane1, one_four_offset, layer_all_plane1, one_four_offset,
+ one_four_extent};
+
+ m_commandBuffer->begin();
+
+ image_c.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+ image_b.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+ image_a.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+
+ auto cb = m_commandBuffer->handle();
+
+ vk::CmdCopyImage(cb, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_plane0_to_plane0);
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_READ");
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_plane0_to_plane0);
+ m_errorMonitor->VerifyFound();
+
+ // Use the barrier to clean up the WAW, and try again. (and show that validation is accounting for the barrier effect too.)
+ auto image_barrier = lvl_init_struct<VkImageMemoryBarrier>();
+ image_barrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
+ image_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ image_barrier.image = image_a.handle();
+ image_barrier.subresourceRange = full_subresource_range;
+ image_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
+ image_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
+ vk::CmdPipelineBarrier(cb, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1,
+ &image_barrier);
+
+ m_errorMonitor->ExpectSuccess();
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_plane0_to_plane0);
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_plane0_to_plane1);
+ m_errorMonitor->VerifyNotFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_plane0_to_plane1);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_plane0_to_plane0);
+ m_errorMonitor->VerifyFound();
+
+ // NOTE: Since the previous command skips in validation, the state update is never done, and the validation layer thus doesn't
+ // record the write operation to b. So we'll need to repeat it successfully to set up for the *next* test.
+
+ // Use the barrier to clean up the WAW, and try again. (and show that validation is accounting for the barrier effect too.)
+ auto mem_barrier = lvl_init_struct<VkMemoryBarrier>();
+ mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ vk::CmdPipelineBarrier(cb, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1, &mem_barrier, 0, nullptr, 0,
+ nullptr);
+ m_errorMonitor->ExpectSuccess();
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_plane0_to_plane0);
+ m_errorMonitor->VerifyNotFound();
+
+ // Use barrier to protect last reader, but not last writer...
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; // Protects C but not B
+ mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ vk::CmdPipelineBarrier(cb, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1, &mem_barrier, 0, nullptr, 0,
+ nullptr);
+ vk::CmdCopyImage(cb, image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_plane0_to_plane0);
+ m_errorMonitor->VerifyFound();
+
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_plane1_to_plane1_front);
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_plane1_to_plane1_front);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->ExpectSuccess();
+ vk::CmdCopyImage(cb, image_c.handle(), VK_IMAGE_LAYOUT_GENERAL, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_plane1_to_plane1_back);
+ m_errorMonitor->VerifyNotFound();
+
+ m_commandBuffer->end();
+}
+
+TEST_F(VkSyncValTest, SyncCopyBufferImageHazards) {
+ ASSERT_NO_FATAL_FAILURE(InitSyncValFramework());
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ VkBufferObj buffer_a, buffer_b;
+ VkMemoryPropertyFlags mem_prop = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
+ buffer_a.init_as_src_and_dst(*m_device, 2048, mem_prop);
+ buffer_b.init_as_src_and_dst(*m_device, 2048, mem_prop);
+
+ VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+ VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
+ VkImageObj image_a(m_device), image_b(m_device);
+ const auto image_ci = VkImageObj::ImageCreateInfo2D(32, 32, 1, 2, format, usage, VK_IMAGE_TILING_OPTIMAL);
+ image_a.Init(image_ci);
+ image_b.Init(image_ci);
+
+ VkImageSubresourceLayers layers_0{VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
+ VkImageSubresourceLayers layers_1{VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 1};
+ VkOffset3D zero_offset{0, 0, 0};
+ VkOffset3D half_offset{16, 16, 0};
+ VkExtent3D half_extent{16, 16, 1}; // <-- image type is 2D
+
+ VkBufferImageCopy region_buffer_front_image_0_front = {0, 16, 16, layers_0, zero_offset, half_extent};
+ VkBufferImageCopy region_buffer_front_image_1_front = {0, 16, 16, layers_1, zero_offset, half_extent};
+ VkBufferImageCopy region_buffer_front_image_1_back = {0, 16, 16, layers_1, half_offset, half_extent};
+ VkBufferImageCopy region_buffer_back_image_0_front = {1024, 16, 16, layers_0, zero_offset, half_extent};
+ VkBufferImageCopy region_buffer_back_image_0_back = {1024, 16, 16, layers_0, half_offset, half_extent};
+ VkBufferImageCopy region_buffer_back_image_1_front = {1024, 16, 16, layers_1, zero_offset, half_extent};
+ VkBufferImageCopy region_buffer_back_image_1_back = {1024, 16, 16, layers_1, half_offset, half_extent};
+
+ m_commandBuffer->begin();
+ image_b.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+ image_a.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+
+ auto cb = m_commandBuffer->handle();
+ vk::CmdCopyBufferToImage(cb, buffer_a.handle(), image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_buffer_front_image_0_front);
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ vk::CmdCopyBufferToImage(cb, buffer_a.handle(), image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_buffer_front_image_0_front);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_READ");
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ vk::CmdCopyImageToBuffer(cb, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_a.handle(), 1,
+ ®ion_buffer_front_image_0_front);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ vk::CmdCopyImageToBuffer(cb, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_a.handle(), 1,
+ ®ion_buffer_back_image_0_front);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_READ");
+ vk::CmdCopyImageToBuffer(cb, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_a.handle(), 1,
+ ®ion_buffer_front_image_1_front);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_READ");
+ vk::CmdCopyImageToBuffer(cb, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_a.handle(), 1,
+ ®ion_buffer_front_image_1_back);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->ExpectSuccess();
+ vk::CmdCopyImageToBuffer(cb, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_a.handle(), 1, ®ion_buffer_back_image_0_back);
+ m_errorMonitor->VerifyNotFound();
+
+ auto buffer_barrier = lvl_init_struct<VkBufferMemoryBarrier>();
+ buffer_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ buffer_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ buffer_barrier.buffer = buffer_a.handle();
+ buffer_barrier.offset = 1024;
+ buffer_barrier.size = 2048;
+ vk::CmdPipelineBarrier(cb, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 1, &buffer_barrier, 0,
+ nullptr);
+
+ m_errorMonitor->ExpectSuccess();
+ vk::CmdCopyImageToBuffer(cb, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_a.handle(), 1,
+ ®ion_buffer_back_image_1_front);
+ m_errorMonitor->VerifyNotFound();
+
+ vk::CmdPipelineBarrier(cb, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 1, &buffer_barrier, 0,
+ nullptr);
+
+ m_errorMonitor->ExpectSuccess();
+ vk::CmdCopyImageToBuffer(cb, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_a.handle(), 1, ®ion_buffer_back_image_1_back);
+ m_errorMonitor->VerifyNotFound();
+
+ vk::CmdCopyImageToBuffer(cb, image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_b.handle(), 1,
+ ®ion_buffer_front_image_0_front);
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ vk::CmdCopyImageToBuffer(cb, image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_b.handle(), 1,
+ ®ion_buffer_front_image_0_front);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_READ");
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ vk::CmdCopyBufferToImage(cb, buffer_b.handle(), image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_buffer_front_image_0_front);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_READ");
+ vk::CmdCopyBufferToImage(cb, buffer_b.handle(), image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_buffer_back_image_0_front);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ vk::CmdCopyBufferToImage(cb, buffer_b.handle(), image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_buffer_front_image_1_front);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ vk::CmdCopyBufferToImage(cb, buffer_b.handle(), image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_buffer_front_image_1_back);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->ExpectSuccess();
+ vk::CmdCopyBufferToImage(cb, buffer_b.handle(), image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion_buffer_back_image_0_back);
+ m_errorMonitor->VerifyNotFound();
+
+ buffer_barrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
+ buffer_barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
+ buffer_barrier.buffer = buffer_b.handle();
+ buffer_barrier.offset = 1024;
+ buffer_barrier.size = 2048;
+ vk::CmdPipelineBarrier(cb, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 1, &buffer_barrier, 0,
+ nullptr);
+
+ m_errorMonitor->ExpectSuccess();
+ vk::CmdCopyBufferToImage(cb, buffer_b.handle(), image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_buffer_back_image_1_front);
+ m_errorMonitor->VerifyNotFound();
+
+ vk::CmdPipelineBarrier(cb, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 1, &buffer_barrier, 0,
+ nullptr);
+
+ m_errorMonitor->ExpectSuccess();
+ vk::CmdCopyBufferToImage(cb, buffer_b.handle(), image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion_buffer_back_image_1_back);
+ m_errorMonitor->VerifyNotFound();
+
+ m_commandBuffer->end();
+}
+
+TEST_F(VkSyncValTest, SyncBlitImageHazards) {
+ ASSERT_NO_FATAL_FAILURE(InitSyncValFramework());
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+ VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
+ VkImageObj image_a(m_device), image_b(m_device);
+ const auto image_ci = VkImageObj::ImageCreateInfo2D(32, 32, 1, 2, format, usage, VK_IMAGE_TILING_OPTIMAL);
+ image_a.Init(image_ci);
+ image_b.Init(image_ci);
+
+ VkImageSubresourceLayers layers_0{VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
+ VkImageSubresourceLayers layers_1{VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 1};
+ VkOffset3D zero_offset{0, 0, 0};
+ VkOffset3D half_0_offset{16, 16, 0};
+ VkOffset3D half_1_offset{16, 16, 1};
+ VkOffset3D full_offset{32, 32, 1};
+ VkImageBlit region_0_front_1_front = {layers_0, {zero_offset, half_1_offset}, layers_1, {zero_offset, half_1_offset}};
+ VkImageBlit region_1_front_0_front = {layers_1, {zero_offset, half_1_offset}, layers_0, {zero_offset, half_1_offset}};
+ VkImageBlit region_1_back_0_back = {layers_1, {half_0_offset, full_offset}, layers_0, {half_0_offset, full_offset}};
+
+ m_commandBuffer->begin();
+ image_b.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+ image_a.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+
+ auto cb = m_commandBuffer->handle();
+
+ vk::CmdBlitImage(cb, image_a.image(), VK_IMAGE_LAYOUT_GENERAL, image_b.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_0_front_1_front, VK_FILTER_NEAREST);
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ vk::CmdBlitImage(cb, image_a.image(), VK_IMAGE_LAYOUT_GENERAL, image_b.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_0_front_1_front, VK_FILTER_NEAREST);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_READ");
+ vk::CmdBlitImage(cb, image_b.image(), VK_IMAGE_LAYOUT_GENERAL, image_a.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_1_front_0_front, VK_FILTER_NEAREST);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->ExpectSuccess();
+ vk::CmdBlitImage(cb, image_b.image(), VK_IMAGE_LAYOUT_GENERAL, image_a.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ ®ion_1_back_0_back, VK_FILTER_NEAREST);
+ m_errorMonitor->VerifyNotFound();
+
+ m_commandBuffer->end();
+}
+
+TEST_F(VkSyncValTest, SyncRenderPassBeginTransitionHazard) {
+ ASSERT_NO_FATAL_FAILURE(InitSyncValFramework());
+ ASSERT_NO_FATAL_FAILURE(InitState());
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget(2));
+
+ // Render Target Information
+ auto width = static_cast<uint32_t>(m_width);
+ auto height = static_cast<uint32_t>(m_height);
+ auto *rt_0 = m_renderTargets[0].get();
+ auto *rt_1 = m_renderTargets[1].get();
+
+ // Other buffers with which to interact
+ VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+ VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
+ VkImageObj image_a(m_device), image_b(m_device);
+ const auto image_ci = VkImageObj::ImageCreateInfo2D(width, height, 1, 1, format, usage, VK_IMAGE_TILING_OPTIMAL);
+ image_a.Init(image_ci);
+ image_b.Init(image_ci);
+
+ VkOffset3D zero_offset{0, 0, 0};
+ VkExtent3D full_extent{width, height, 1}; // <-- image type is 2D
+ VkImageSubresourceLayers layer_color{VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
+ VkImageCopy region_to_copy = {layer_color, zero_offset, layer_color, zero_offset, full_extent};
+
+ auto cb = m_commandBuffer->handle();
+
+ m_errorMonitor->ExpectSuccess();
+ m_commandBuffer->begin();
+ image_b.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+ image_a.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+ rt_0->SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+ rt_1->SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+
+ rt_0->SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+ vk::CmdCopyImage(cb, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, rt_0->handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion_to_copy);
+ m_errorMonitor->VerifyNotFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo); // This fails so the driver call is skip and no end is valid
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->ExpectSuccess();
+ // Use the barrier to clean up the WAW, and try again. (and show that validation is accounting for the barrier effect too.)
+ VkImageSubresourceRange rt_full_subresource_range{VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
+ auto image_barrier = lvl_init_struct<VkImageMemoryBarrier>();
+ image_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ image_barrier.dstAccessMask = 0;
+ image_barrier.image = rt_0->handle();
+ image_barrier.subresourceRange = rt_full_subresource_range;
+ image_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
+ image_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
+ vk::CmdPipelineBarrier(cb, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0, 0, nullptr, 0, nullptr, 1,
+ &image_barrier);
+ vk::CmdCopyImage(cb, rt_1->handle(), VK_IMAGE_LAYOUT_GENERAL, image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion_to_copy);
+ m_errorMonitor->VerifyNotFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_READ");
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo); // This fails so the driver call is skip and no end is valid
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->ExpectSuccess();
+ // A global execution barrier that the implict external dependency can chain with should work...
+ vk::CmdPipelineBarrier(cb, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, 0, 0, nullptr, 0, nullptr, 0,
+ nullptr);
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ m_commandBuffer->EndRenderPass();
+ m_errorMonitor->VerifyNotFound();
+}
+
+TEST_F(VkSyncValTest, SyncCmdDispatchDrawHazards) {
+ // TODO: Add code to enable sync validation
+ SetTargetApiVersion(VK_API_VERSION_1_2);
+
+ // Enable VK_KHR_draw_indirect_count for KHR variants
+ ASSERT_NO_FATAL_FAILURE(InitSyncValFramework());
+ VkPhysicalDeviceVulkan12Features features12 = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, nullptr};
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
+ if (DeviceValidationVersion() >= VK_API_VERSION_1_2) {
+ features12.drawIndirectCount = VK_TRUE;
+ }
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features12, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
+ bool has_khr_indirect = DeviceExtensionEnabled(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ VkImageUsageFlags image_usage_combine = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT |
+ VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+ VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
+ VkImageObj image_c_a(m_device), image_c_b(m_device);
+ const auto image_c_ci = VkImageObj::ImageCreateInfo2D(16, 16, 1, 1, format, image_usage_combine, VK_IMAGE_TILING_OPTIMAL);
+ image_c_a.Init(image_c_ci);
+ image_c_b.Init(image_c_ci);
+
+ VkImageView imageview_c = image_c_a.targetView(format);
+ VkImageUsageFlags image_usage_storage =
+ VK_IMAGE_USAGE_STORAGE_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+ VkImageObj image_s_a(m_device), image_s_b(m_device);
+ const auto image_s_ci = VkImageObj::ImageCreateInfo2D(16, 16, 1, 1, format, image_usage_storage, VK_IMAGE_TILING_OPTIMAL);
+ image_s_a.Init(image_s_ci);
+ image_s_b.Init(image_s_ci);
+ image_s_a.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+ image_s_b.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+
+ VkImageView imageview_s = image_s_a.targetView(format);
+
+ VkSampler sampler_s, sampler_c;
+ VkSamplerCreateInfo sampler_ci = SafeSaneSamplerCreateInfo();
+ VkResult err = vk::CreateSampler(m_device->device(), &sampler_ci, nullptr, &sampler_s);
+ ASSERT_VK_SUCCESS(err);
+ err = vk::CreateSampler(m_device->device(), &sampler_ci, nullptr, &sampler_c);
+ ASSERT_VK_SUCCESS(err);
+
+ VkBufferObj buffer_a, buffer_b;
+ VkMemoryPropertyFlags mem_prop = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
+ VkBufferUsageFlags buffer_usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT |
+ VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+ buffer_a.init(*m_device, buffer_a.create_info(2048, buffer_usage, nullptr), mem_prop);
+ buffer_b.init(*m_device, buffer_b.create_info(2048, buffer_usage, nullptr), mem_prop);
+
+ VkBufferView bufferview;
+ auto bvci = lvl_init_struct<VkBufferViewCreateInfo>();
+ bvci.buffer = buffer_a.handle();
+ bvci.format = VK_FORMAT_R32_SFLOAT;
+ bvci.offset = 0;
+ bvci.range = VK_WHOLE_SIZE;
+
+ err = vk::CreateBufferView(m_device->device(), &bvci, NULL, &bufferview);
+ ASSERT_VK_SUCCESS(err);
+
+ OneOffDescriptorSet descriptor_set(m_device,
+ {
+ {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr},
+ {1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_ALL, nullptr},
+ {2, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_ALL, nullptr},
+ {3, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr},
+ });
+
+ descriptor_set.WriteDescriptorBufferInfo(0, buffer_a.handle(), 2048);
+ descriptor_set.WriteDescriptorImageInfo(1, imageview_c, sampler_c, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
+ VK_IMAGE_LAYOUT_GENERAL);
+ descriptor_set.WriteDescriptorImageInfo(2, imageview_s, sampler_s, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, VK_IMAGE_LAYOUT_GENERAL);
+ descriptor_set.WriteDescriptorBufferView(3, bufferview);
+ descriptor_set.UpdateDescriptorSets();
+
+ // Dispatch
+ std::string csSource =
+ "#version 450\n"
+ "layout(set=0, binding=0) uniform foo { float x; } ub0;\n"
+ "layout(set=0, binding=1) uniform sampler2D cis1;\n"
+ "layout(set=0, binding=2, rgba8) uniform readonly image2D si2;\n"
+ "layout(set=0, binding=3, r32f) uniform readonly imageBuffer stb3;\n"
+ "void main(){\n"
+ " vec4 vColor4;\n"
+ " vColor4.x = ub0.x;\n"
+ " vColor4 = texture(cis1, vec2(0));\n"
+ " vColor4 = imageLoad(si2, ivec2(0));\n"
+ " vColor4 = imageLoad(stb3, 0);\n"
+ "}\n";
+
+ CreateComputePipelineHelper pipe(*this);
+ pipe.InitInfo();
+ pipe.cs_.reset(new VkShaderObj(m_device, csSource.c_str(), VK_SHADER_STAGE_COMPUTE_BIT, this));
+ pipe.InitState();
+ pipe.pipeline_layout_ = VkPipelineLayoutObj(m_device, {&descriptor_set.layout_});
+ pipe.CreateComputePipeline();
+
+ m_commandBuffer->begin();
+
+ VkBufferCopy buffer_region = {0, 0, 2048};
+ vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_b.handle(), buffer_a.handle(), 1, &buffer_region);
+
+ VkImageSubresourceLayers layer{VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
+ VkOffset3D zero_offset{0, 0, 0};
+ VkExtent3D full_extent{16, 16, 1};
+ VkImageCopy image_region = {layer, zero_offset, layer, zero_offset, full_extent};
+ vk::CmdCopyImage(m_commandBuffer->handle(), image_c_b.handle(), VK_IMAGE_LAYOUT_GENERAL, image_c_a.handle(),
+ VK_IMAGE_LAYOUT_GENERAL, 1, &image_region);
+ vk::CmdCopyImage(m_commandBuffer->handle(), image_s_b.handle(), VK_IMAGE_LAYOUT_GENERAL, image_s_a.handle(),
+ VK_IMAGE_LAYOUT_GENERAL, 1, &image_region);
+
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_COMPUTE, pipe.pipeline_);
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_COMPUTE, pipe.pipeline_layout_.handle(), 0, 1,
+ &descriptor_set.set_, 0, nullptr);
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ vk::CmdDispatch(m_commandBuffer->handle(), 1, 1, 1);
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->end();
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_COMPUTE, pipe.pipeline_);
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_COMPUTE, pipe.pipeline_layout_.handle(), 0, 1,
+ &descriptor_set.set_, 0, nullptr);
+ vk::CmdDispatch(m_commandBuffer->handle(), 1, 1, 1);
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_READ");
+ vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_b.handle(), buffer_a.handle(), 1, &buffer_region);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_READ");
+ vk::CmdCopyImage(m_commandBuffer->handle(), image_c_b.handle(), VK_IMAGE_LAYOUT_GENERAL, image_c_a.handle(),
+ VK_IMAGE_LAYOUT_GENERAL, 1, &image_region);
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->end();
+ m_commandBuffer->reset();
+
+ // DispatchIndirect
+ m_errorMonitor->ExpectSuccess();
+ VkBufferObj buffer_dispatchIndirect, buffer_dispatchIndirect2;
+ buffer_usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+ buffer_dispatchIndirect.init(
+ *m_device, buffer_dispatchIndirect.create_info(sizeof(VkDispatchIndirectCommand), buffer_usage, nullptr), mem_prop);
+ buffer_dispatchIndirect2.init(
+ *m_device, buffer_dispatchIndirect2.create_info(sizeof(VkDispatchIndirectCommand), buffer_usage, nullptr), mem_prop);
+ m_commandBuffer->begin();
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_COMPUTE, pipe.pipeline_);
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_COMPUTE, pipe.pipeline_layout_.handle(), 0, 1,
+ &descriptor_set.set_, 0, nullptr);
+ vk::CmdDispatchIndirect(m_commandBuffer->handle(), buffer_dispatchIndirect.handle(), 0);
+ m_commandBuffer->end();
+ m_errorMonitor->VerifyNotFound();
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+
+ buffer_region = {0, 0, sizeof(VkDispatchIndirectCommand)};
+ vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_dispatchIndirect2.handle(), buffer_dispatchIndirect.handle(), 1,
+ &buffer_region);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_COMPUTE, pipe.pipeline_);
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_COMPUTE, pipe.pipeline_layout_.handle(), 0, 1,
+ &descriptor_set.set_, 0, nullptr);
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ vk::CmdDispatchIndirect(m_commandBuffer->handle(), buffer_dispatchIndirect.handle(), 0);
+ m_errorMonitor->VerifyFound();
+ m_commandBuffer->end();
+
+ // Draw
+ m_errorMonitor->ExpectSuccess();
+ const float vbo_data[3] = {1.f, 0.f, 1.f};
+ VkVertexInputAttributeDescription VertexInputAttributeDescription = {0, 0, VK_FORMAT_R32G32B32_SFLOAT, sizeof(vbo_data)};
+ VkVertexInputBindingDescription VertexInputBindingDescription = {0, sizeof(vbo_data), VK_VERTEX_INPUT_RATE_VERTEX};
+ VkBufferObj vbo, vbo2;
+ buffer_usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+ vbo.init(*m_device, vbo.create_info(sizeof(vbo_data), buffer_usage, nullptr), mem_prop);
+ vbo2.init(*m_device, vbo2.create_info(sizeof(vbo_data), buffer_usage, nullptr), mem_prop);
+
+ VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
+ VkShaderObj fs(m_device, csSource.c_str(), VK_SHADER_STAGE_FRAGMENT_BIT, this);
+
+ CreatePipelineHelper g_pipe(*this);
+ g_pipe.InitInfo();
+ g_pipe.InitState();
+ g_pipe.vi_ci_.pVertexBindingDescriptions = &VertexInputBindingDescription;
+ g_pipe.vi_ci_.vertexBindingDescriptionCount = 1;
+ g_pipe.vi_ci_.pVertexAttributeDescriptions = &VertexInputAttributeDescription;
+ g_pipe.vi_ci_.vertexAttributeDescriptionCount = 1;
+ g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
+ g_pipe.pipeline_layout_ = VkPipelineLayoutObj(m_device, {&descriptor_set.layout_});
+ ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ VkDeviceSize offset = 0;
+ vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
+
+ VkViewport viewport = {0, 0, 16, 16, 0, 1};
+ vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
+ VkRect2D scissor = {{0, 0}, {16, 16}};
+ vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
+
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
+ &descriptor_set.set_, 0, nullptr);
+ vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
+ m_commandBuffer->EndRenderPass();
+ m_commandBuffer->end();
+ m_errorMonitor->VerifyNotFound();
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+
+ buffer_region = {0, 0, sizeof(vbo_data)};
+ vk::CmdCopyBuffer(m_commandBuffer->handle(), vbo2.handle(), vbo.handle(), 1, &buffer_region);
+
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
+ vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
+ vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
+ &descriptor_set.set_, 0, nullptr);
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->EndRenderPass();
+ m_commandBuffer->end();
+
+ // DrawIndexed
+ m_errorMonitor->ExpectSuccess();
+ const float ibo_data[3] = {0.f, 0.f, 0.f};
+ VkBufferObj ibo, ibo2;
+ buffer_usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+ ibo.init(*m_device, ibo.create_info(sizeof(ibo_data), buffer_usage, nullptr), mem_prop);
+ ibo2.init(*m_device, ibo2.create_info(sizeof(ibo_data), buffer_usage, nullptr), mem_prop);
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
+ vk::CmdBindIndexBuffer(m_commandBuffer->handle(), ibo.handle(), 0, VK_INDEX_TYPE_UINT16);
+ vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
+ vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
+
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
+ &descriptor_set.set_, 0, nullptr);
+ m_commandBuffer->DrawIndexed(3, 1, 0, 0, 0);
+ m_commandBuffer->EndRenderPass();
+ m_commandBuffer->end();
+ m_errorMonitor->VerifyNotFound();
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+
+ buffer_region = {0, 0, sizeof(ibo_data)};
+ vk::CmdCopyBuffer(m_commandBuffer->handle(), ibo2.handle(), ibo.handle(), 1, &buffer_region);
+
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
+ vk::CmdBindIndexBuffer(m_commandBuffer->handle(), ibo.handle(), 0, VK_INDEX_TYPE_UINT16);
+ vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
+ vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
+ &descriptor_set.set_, 0, nullptr);
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ m_commandBuffer->DrawIndexed(3, 1, 0, 0, 0);
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->EndRenderPass();
+ m_commandBuffer->end();
+
+ // DrawIndirect
+ m_errorMonitor->ExpectSuccess();
+ VkBufferObj buffer_drawIndirect, buffer_drawIndirect2;
+ buffer_usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+ buffer_drawIndirect.init(*m_device, buffer_drawIndirect.create_info(sizeof(VkDrawIndirectCommand), buffer_usage, nullptr),
+ mem_prop);
+ buffer_drawIndirect2.init(*m_device, buffer_drawIndirect2.create_info(sizeof(VkDrawIndirectCommand), buffer_usage, nullptr),
+ mem_prop);
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
+ vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
+ vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
+
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
+ &descriptor_set.set_, 0, nullptr);
+ vk::CmdDrawIndirect(m_commandBuffer->handle(), buffer_drawIndirect.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
+ m_commandBuffer->EndRenderPass();
+ m_commandBuffer->end();
+ m_errorMonitor->VerifyNotFound();
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+
+ buffer_region = {0, 0, sizeof(VkDrawIndirectCommand)};
+ vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_drawIndirect2.handle(), buffer_drawIndirect.handle(), 1, &buffer_region);
+
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
+ vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
+ vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
+ &descriptor_set.set_, 0, nullptr);
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ vk::CmdDrawIndirect(m_commandBuffer->handle(), buffer_drawIndirect.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->EndRenderPass();
+ m_commandBuffer->end();
+
+ // DrawIndexedIndirect
+ m_errorMonitor->ExpectSuccess();
+ VkBufferObj buffer_drawIndexedIndirect, buffer_drawIndexedIndirect2;
+ buffer_usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+ buffer_drawIndexedIndirect.init(
+ *m_device, buffer_drawIndexedIndirect.create_info(sizeof(VkDrawIndexedIndirectCommand), buffer_usage, nullptr), mem_prop);
+ buffer_drawIndexedIndirect2.init(
+ *m_device, buffer_drawIndexedIndirect2.create_info(sizeof(VkDrawIndexedIndirectCommand), buffer_usage, nullptr), mem_prop);
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
+ vk::CmdBindIndexBuffer(m_commandBuffer->handle(), ibo.handle(), 0, VK_INDEX_TYPE_UINT16);
+ vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
+ vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
+
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
+ &descriptor_set.set_, 0, nullptr);
+ vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), buffer_drawIndirect.handle(), 0, 1, sizeof(VkDrawIndexedIndirectCommand));
+ m_commandBuffer->EndRenderPass();
+ m_commandBuffer->end();
+ m_errorMonitor->VerifyNotFound();
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+
+ buffer_region = {0, 0, sizeof(VkDrawIndexedIndirectCommand)};
+ vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_drawIndexedIndirect2.handle(), buffer_drawIndexedIndirect.handle(), 1,
+ &buffer_region);
+
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
+ vk::CmdBindIndexBuffer(m_commandBuffer->handle(), ibo.handle(), 0, VK_INDEX_TYPE_UINT16);
+ vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
+ vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
+ &descriptor_set.set_, 0, nullptr);
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), buffer_drawIndexedIndirect.handle(), 0, 1,
+ sizeof(VkDrawIndexedIndirectCommand));
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->EndRenderPass();
+ m_commandBuffer->end();
+
+ if (has_khr_indirect) {
+ // DrawIndirectCount
+ auto fpCmdDrawIndirectCountKHR =
+ (PFN_vkCmdDrawIndirectCount)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndirectCountKHR");
+ if (!fpCmdDrawIndirectCountKHR) {
+ printf("%s Test requires unsupported vkCmdDrawIndirectCountKHR feature. Skipped.\n", kSkipPrefix);
+ } else {
+ m_errorMonitor->ExpectSuccess();
+ VkBufferObj buffer_count, buffer_count2;
+ buffer_usage =
+ VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+ buffer_count.init(*m_device, buffer_count.create_info(sizeof(uint32_t), buffer_usage, nullptr), mem_prop);
+ buffer_count2.init(*m_device, buffer_count2.create_info(sizeof(uint32_t), buffer_usage, nullptr), mem_prop);
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
+ vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
+ vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
+
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(),
+ 0, 1, &descriptor_set.set_, 0, nullptr);
+ fpCmdDrawIndirectCountKHR(m_commandBuffer->handle(), buffer_drawIndirect.handle(), 0, buffer_count.handle(), 0, 1,
+ sizeof(VkDrawIndirectCommand));
+ m_commandBuffer->EndRenderPass();
+ m_commandBuffer->end();
+ m_errorMonitor->VerifyNotFound();
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+
+ buffer_region = {0, 0, sizeof(uint32_t)};
+ vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_count2.handle(), buffer_count.handle(), 1, &buffer_region);
+
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
+ vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
+ vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(),
+ 0, 1, &descriptor_set.set_, 0, nullptr);
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ fpCmdDrawIndirectCountKHR(m_commandBuffer->handle(), buffer_drawIndirect.handle(), 0, buffer_count.handle(), 0, 1,
+ sizeof(VkDrawIndirectCommand));
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->EndRenderPass();
+ m_commandBuffer->end();
+ }
+
+ // DrawIndexedIndirectCount
+ auto fpCmdDrawIndexIndirectCountKHR =
+ (PFN_vkCmdDrawIndirectCount)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndexedIndirectCountKHR");
+ if (!fpCmdDrawIndexIndirectCountKHR) {
+ printf("%s Test requires unsupported vkCmdDrawIndexedIndirectCountKHR feature. Skipped.\n", kSkipPrefix);
+ } else {
+ m_errorMonitor->ExpectSuccess();
+ VkBufferObj buffer_count, buffer_count2;
+ buffer_usage =
+ VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+ buffer_count.init(*m_device, buffer_count.create_info(sizeof(uint32_t), buffer_usage, nullptr), mem_prop);
+ buffer_count2.init(*m_device, buffer_count2.create_info(sizeof(uint32_t), buffer_usage, nullptr), mem_prop);
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
+ vk::CmdBindIndexBuffer(m_commandBuffer->handle(), ibo.handle(), 0, VK_INDEX_TYPE_UINT16);
+ vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
+ vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
+
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(),
+ 0, 1, &descriptor_set.set_, 0, nullptr);
+ fpCmdDrawIndexIndirectCountKHR(m_commandBuffer->handle(), buffer_drawIndexedIndirect.handle(), 0, buffer_count.handle(),
+ 0, 1, sizeof(VkDrawIndexedIndirectCommand));
+ m_commandBuffer->EndRenderPass();
+ m_commandBuffer->end();
+ m_errorMonitor->VerifyNotFound();
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+
+ buffer_region = {0, 0, sizeof(uint32_t)};
+ vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_count2.handle(), buffer_count.handle(), 1, &buffer_region);
+
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
+ vk::CmdBindIndexBuffer(m_commandBuffer->handle(), ibo.handle(), 0, VK_INDEX_TYPE_UINT16);
+ vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
+ vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(),
+ 0, 1, &descriptor_set.set_, 0, nullptr);
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-READ_AFTER_WRITE");
+ fpCmdDrawIndexIndirectCountKHR(m_commandBuffer->handle(), buffer_drawIndexedIndirect.handle(), 0, buffer_count.handle(),
+ 0, 1, sizeof(VkDrawIndexedIndirectCommand));
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->EndRenderPass();
+ m_commandBuffer->end();
+ }
+ } else {
+ printf("%s Test requires unsupported vkCmdDrawIndirectCountKHR & vkDrawIndexedIndirectCountKHR feature. Skipped.\n",
+ kSkipPrefix);
+ }
+}
+
+TEST_F(VkSyncValTest, SyncCmdClear) {
+ ASSERT_NO_FATAL_FAILURE(InitSyncValFramework());
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
+ // CmdClearColorImage
+ m_errorMonitor->ExpectSuccess();
+ VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+ VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
+ VkImageObj image_a(m_device), image_b(m_device);
+ auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, format, usage, VK_IMAGE_TILING_OPTIMAL);
+ image_a.Init(image_ci);
+ image_b.Init(image_ci);
+
+ VkImageSubresourceLayers layers_all{VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
+ VkOffset3D zero_offset{0, 0, 0};
+ VkExtent3D full_extent{128, 128, 1}; // <-- image type is 2D
+ VkImageSubresourceRange full_subresource_range{VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
+
+ VkImageCopy full_region = {layers_all, zero_offset, layers_all, zero_offset, full_extent};
+
+ m_commandBuffer->begin();
+
+ image_b.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+ image_a.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+
+ auto cb = m_commandBuffer->handle();
+ VkClearColorValue ccv = {};
+ vk::CmdClearColorImage(m_commandBuffer->handle(), image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &full_subresource_range);
+ m_commandBuffer->end();
+ m_errorMonitor->VerifyNotFound();
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+ vk::CmdCopyImage(cb, image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &full_region);
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_READ");
+ vk::CmdClearColorImage(m_commandBuffer->handle(), image_a.handle(), VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &full_subresource_range);
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ vk::CmdClearColorImage(m_commandBuffer->handle(), image_b.handle(), VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &full_subresource_range);
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->end();
+
+ // CmdClearDepthStencilImage
+ format = FindSupportedDepthStencilFormat(gpu());
+ if (!format) {
+ printf("%s No Depth + Stencil format found. Skipped.\n", kSkipPrefix);
+ return;
+ }
+ m_errorMonitor->ExpectSuccess();
+ VkImageObj image_ds_a(m_device), image_ds_b(m_device);
+ image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, format, usage, VK_IMAGE_TILING_OPTIMAL);
+ image_ds_a.Init(image_ci);
+ image_ds_b.Init(image_ci);
+
+ const VkImageAspectFlags ds_aspect = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
+ image_ds_a.SetLayout(ds_aspect, VK_IMAGE_LAYOUT_GENERAL);
+ image_ds_b.SetLayout(ds_aspect, VK_IMAGE_LAYOUT_GENERAL);
+
+ m_commandBuffer->begin();
+ const VkClearDepthStencilValue clear_value = {};
+ VkImageSubresourceRange ds_range = {ds_aspect, 0, 1, 0, 1};
+
+ vk::CmdClearDepthStencilImage(cb, image_ds_a.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1, &ds_range);
+ m_commandBuffer->end();
+ m_errorMonitor->VerifyNotFound();
+
+ VkImageSubresourceLayers ds_layers_all{ds_aspect, 0, 0, 1};
+ VkImageCopy ds_full_region = {ds_layers_all, zero_offset, ds_layers_all, zero_offset, full_extent};
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+ vk::CmdCopyImage(cb, image_ds_a.handle(), VK_IMAGE_LAYOUT_GENERAL, image_ds_b.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ &ds_full_region);
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_READ");
+ vk::CmdClearDepthStencilImage(m_commandBuffer->handle(), image_ds_a.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
+ &ds_range);
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ vk::CmdClearDepthStencilImage(m_commandBuffer->handle(), image_ds_b.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
+ &ds_range);
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->end();
+}
+
+TEST_F(VkSyncValTest, SyncCmdQuery) {
+ // CmdCopyQueryPoolResults
+ m_errorMonitor->ExpectSuccess();
+ ASSERT_NO_FATAL_FAILURE(InitSyncValFramework());
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
+ if (IsPlatform(kNexusPlayer)) {
+ printf("%s This test should not run on Nexus Player\n", kSkipPrefix);
+ return;
+ }
+ if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
+ printf("%s Queue family needs to have multiple queues to run this test.\n", kSkipPrefix);
+ return;
+ }
+ uint32_t queue_count;
+ vk::GetPhysicalDeviceQueueFamilyProperties(gpu(), &queue_count, NULL);
+ VkQueueFamilyProperties *queue_props = new VkQueueFamilyProperties[queue_count];
+ vk::GetPhysicalDeviceQueueFamilyProperties(gpu(), &queue_count, queue_props);
+ if (queue_props[m_device->graphics_queue_node_index_].timestampValidBits == 0) {
+ printf("%s Device graphic queue has timestampValidBits of 0, skipping.\n", kSkipPrefix);
+ return;
+ }
+
+ VkQueryPool query_pool;
+ VkQueryPoolCreateInfo query_pool_create_info{};
+ query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
+ query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
+ query_pool_create_info.queryCount = 1;
+ vk::CreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
+
+ VkBufferObj buffer_a, buffer_b;
+ VkMemoryPropertyFlags mem_prop = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
+ buffer_a.init_as_src_and_dst(*m_device, 256, mem_prop);
+ buffer_b.init_as_src_and_dst(*m_device, 256, mem_prop);
+
+ VkBufferCopy region = {0, 0, 256};
+
+ auto cb = m_commandBuffer->handle();
+ m_commandBuffer->begin();
+ vk::CmdResetQueryPool(cb, query_pool, 0, 1);
+ vk::CmdWriteTimestamp(cb, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
+ vk::CmdCopyQueryPoolResults(cb, query_pool, 0, 1, buffer_a.handle(), 0, 0, VK_QUERY_RESULT_WAIT_BIT);
+ m_commandBuffer->end();
+ m_errorMonitor->VerifyNotFound();
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+ vk::CmdCopyBuffer(cb, buffer_a.handle(), buffer_b.handle(), 1, ®ion);
+ vk::CmdResetQueryPool(cb, query_pool, 0, 1);
+ vk::CmdWriteTimestamp(cb, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_READ");
+ vk::CmdCopyQueryPoolResults(cb, query_pool, 0, 1, buffer_a.handle(), 0, 256, VK_QUERY_RESULT_WAIT_BIT);
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ vk::CmdCopyQueryPoolResults(cb, query_pool, 0, 1, buffer_b.handle(), 0, 256, VK_QUERY_RESULT_WAIT_BIT);
+ m_commandBuffer->end();
+ m_errorMonitor->VerifyFound();
+
+ // TODO:Track VkQueryPool
+ // TODO:CmdWriteTimestamp
+ vk::DestroyQueryPool(m_device->device(), query_pool, nullptr);
+}
+
+TEST_F(VkSyncValTest, SyncCmdDrawDepthStencil) {
+ ASSERT_NO_FATAL_FAILURE(InitSyncValFramework());
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
+ m_errorMonitor->ExpectSuccess();
+
+ const auto format_ds = FindSupportedDepthStencilFormat(gpu());
+ if (!format_ds) {
+ printf("%s No Depth + Stencil format found. Skipped.\n", kSkipPrefix);
+ return;
+ }
+ const auto format_dp = FindSupportedDepthOnlyFormat(gpu());
+ if (!format_dp) {
+ printf("%s No only Depth format found. Skipped.\n", kSkipPrefix);
+ return;
+ }
+ const auto format_st = FindSupportedStencilOnlyFormat(gpu());
+ if (!format_st) {
+ printf("%s No only Stencil format found. Skipped.\n", kSkipPrefix);
+ return;
+ }
+
+ VkDepthStencilObj image_ds(m_device), image_dp(m_device), image_st(m_device);
+ image_ds.Init(m_device, 16, 16, format_ds);
+ image_dp.Init(m_device, 16, 16, format_dp);
+ image_st.Init(m_device, 16, 16, format_st);
+
+ VkRenderpassObj rp_ds(m_device, format_ds, true), rp_dp(m_device, format_dp, true), rp_st(m_device, format_st, true);
+
+ VkFramebuffer fb_ds, fb_dp, fb_st;
+ VkFramebufferCreateInfo fbci = {
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp_ds.handle(), 1, image_ds.BindInfo(), 16, 16, 1};
+ ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &fbci, nullptr, &fb_ds));
+ fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp_dp.handle(), 1, image_dp.BindInfo(), 16, 16, 1};
+ ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &fbci, nullptr, &fb_dp));
+ fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp_st.handle(), 1, image_st.BindInfo(), 16, 16, 1};
+ ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &fbci, nullptr, &fb_st));
+
+ VkStencilOpState stencil = {};
+ stencil.failOp = VK_STENCIL_OP_KEEP;
+ stencil.passOp = VK_STENCIL_OP_KEEP;
+ stencil.depthFailOp = VK_STENCIL_OP_KEEP;
+ stencil.compareOp = VK_COMPARE_OP_NEVER;
+
+ auto ds_ci = lvl_init_struct<VkPipelineDepthStencilStateCreateInfo>();
+ ds_ci.depthTestEnable = VK_TRUE;
+ ds_ci.depthWriteEnable = VK_TRUE;
+ ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
+ ds_ci.stencilTestEnable = VK_TRUE;
+ ds_ci.front = stencil;
+ ds_ci.back = stencil;
+
+ CreatePipelineHelper g_pipe_ds(*this), g_pipe_dp(*this), g_pipe_st(*this);
+ g_pipe_ds.InitInfo();
+ g_pipe_ds.gp_ci_.renderPass = rp_ds.handle();
+ g_pipe_ds.gp_ci_.pDepthStencilState = &ds_ci;
+ g_pipe_ds.InitState();
+ ASSERT_VK_SUCCESS(g_pipe_ds.CreateGraphicsPipeline());
+ g_pipe_dp.InitInfo();
+ g_pipe_dp.gp_ci_.renderPass = rp_dp.handle();
+ ds_ci.stencilTestEnable = VK_FALSE;
+ g_pipe_dp.gp_ci_.pDepthStencilState = &ds_ci;
+ g_pipe_dp.InitState();
+ ASSERT_VK_SUCCESS(g_pipe_dp.CreateGraphicsPipeline());
+ g_pipe_st.InitInfo();
+ g_pipe_st.gp_ci_.renderPass = rp_st.handle();
+ ds_ci.depthTestEnable = VK_FALSE;
+ ds_ci.stencilTestEnable = VK_TRUE;
+ g_pipe_st.gp_ci_.pDepthStencilState = &ds_ci;
+ g_pipe_st.InitState();
+ ASSERT_VK_SUCCESS(g_pipe_st.CreateGraphicsPipeline());
+
+ m_commandBuffer->begin();
+ m_renderPassBeginInfo.renderArea = {{0, 0}, {16, 16}};
+ m_renderPassBeginInfo.pClearValues = nullptr;
+ m_renderPassBeginInfo.clearValueCount = 0;
+
+ m_renderPassBeginInfo.renderPass = rp_ds.handle();
+ m_renderPassBeginInfo.framebuffer = fb_ds;
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe_ds.pipeline_);
+ vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
+ m_commandBuffer->EndRenderPass();
+
+ m_renderPassBeginInfo.renderPass = rp_dp.handle();
+ m_renderPassBeginInfo.framebuffer = fb_dp;
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe_dp.pipeline_);
+ vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
+ m_commandBuffer->EndRenderPass();
+
+ m_renderPassBeginInfo.renderPass = rp_st.handle();
+ m_renderPassBeginInfo.framebuffer = fb_st;
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe_st.pipeline_);
+ vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
+ m_commandBuffer->EndRenderPass();
+
+ m_commandBuffer->end();
+ m_errorMonitor->VerifyNotFound();
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+
+ VkImageCopy copyRegion;
+ copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
+ copyRegion.srcSubresource.mipLevel = 0;
+ copyRegion.srcSubresource.baseArrayLayer = 0;
+ copyRegion.srcSubresource.layerCount = 1;
+ copyRegion.srcOffset = {0, 0, 0};
+ copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
+ copyRegion.dstSubresource.mipLevel = 0;
+ copyRegion.dstSubresource.baseArrayLayer = 0;
+ copyRegion.dstSubresource.layerCount = 1;
+ copyRegion.dstOffset = {0, 0, 0};
+ copyRegion.extent = {16, 16, 1};
+
+ m_commandBuffer->CopyImage(image_ds.handle(), VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, image_dp.handle(),
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 1, ©Region);
+
+ copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
+ copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
+ m_commandBuffer->CopyImage(image_ds.handle(), VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, image_st.handle(),
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, 1, ©Region);
+ m_renderPassBeginInfo.renderPass = rp_ds.handle();
+ m_renderPassBeginInfo.framebuffer = fb_ds;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_READ");
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ m_errorMonitor->VerifyFound();
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe_ds.pipeline_);
+ vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
+ m_commandBuffer->EndRenderPass();
+
+ m_renderPassBeginInfo.renderPass = rp_dp.handle();
+ m_renderPassBeginInfo.framebuffer = fb_dp;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ m_errorMonitor->VerifyFound();
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe_dp.pipeline_);
+ vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
+ m_commandBuffer->EndRenderPass();
+
+ m_renderPassBeginInfo.renderPass = rp_st.handle();
+ m_renderPassBeginInfo.framebuffer = fb_st;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ m_errorMonitor->VerifyFound();
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe_st.pipeline_);
+ vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
+ m_commandBuffer->EndRenderPass();
+
+ m_commandBuffer->end();
+ vk::DestroyFramebuffer(m_device->device(), fb_ds, nullptr);
+ vk::DestroyFramebuffer(m_device->device(), fb_dp, nullptr);
+ vk::DestroyFramebuffer(m_device->device(), fb_st, nullptr);
+}
+
+TEST_F(VkSyncValTest, SyncRenderPassWithWrongInitialLayout) {
+ ASSERT_NO_FATAL_FAILURE(InitSyncValFramework());
+ ASSERT_NO_FATAL_FAILURE(InitState());
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ VkImageUsageFlags usage_color = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+ VkImageUsageFlags usage_input = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
+ VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
+ VkImageObj image_color(m_device), image_input(m_device);
+ auto image_ci = VkImageObj::ImageCreateInfo2D(32, 32, 1, 1, format, usage_color, VK_IMAGE_TILING_OPTIMAL);
+ image_color.Init(image_ci);
+ image_ci.usage = usage_input;
+ image_input.Init(image_ci);
+ VkImageView attachments[] = {image_color.targetView(format), image_input.targetView(format)};
+
+ const VkAttachmentDescription attachmentDescriptions[] = {
+ // Result attachment
+ {(VkAttachmentDescriptionFlags)0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_CLEAR,
+ VK_ATTACHMENT_STORE_OP_STORE, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_IMAGE_LAYOUT_UNDEFINED, // Here causes DesiredError that SYNC-HAZARD-NONE in BeginRenderPass.
+ // It should be VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
+ // Input attachment
+ {(VkAttachmentDescriptionFlags)0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD,
+ VK_ATTACHMENT_STORE_OP_STORE, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL}};
+
+ const VkAttachmentReference resultAttachmentRef = {0u, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
+ const VkAttachmentReference inputAttachmentRef = {1u, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL};
+
+ const VkSubpassDescription subpassDescription = {(VkSubpassDescriptionFlags)0,
+ VK_PIPELINE_BIND_POINT_GRAPHICS,
+ 1u,
+ &inputAttachmentRef,
+ 1u,
+ &resultAttachmentRef,
+ 0,
+ 0,
+ 0u,
+ 0};
+
+ const VkSubpassDependency subpassDependency = {VK_SUBPASS_EXTERNAL,
+ 0,
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+ VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT,
+ VK_DEPENDENCY_BY_REGION_BIT};
+
+ const VkRenderPassCreateInfo renderPassInfo = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
+ 0,
+ (VkRenderPassCreateFlags)0,
+ 2u,
+ attachmentDescriptions,
+ 1u,
+ &subpassDescription,
+ 1u,
+ &subpassDependency};
+ VkRenderPass rp;
+ ASSERT_VK_SUCCESS(vk::CreateRenderPass(device(), &renderPassInfo, nullptr, &rp));
+
+ VkFramebuffer fb;
+ VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 2, attachments, 32, 32, 1};
+ ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &fbci, nullptr, &fb));
+
+ m_commandBuffer->begin();
+ m_renderPassBeginInfo.renderArea = {{0, 0}, {32, 32}};
+ m_renderPassBeginInfo.renderPass = rp;
+ m_renderPassBeginInfo.framebuffer = fb;
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-NONE");
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ m_errorMonitor->VerifyFound();
+}
+
+TEST_F(VkSyncValTest, SyncRenderPassWithWrongDepthStencilInitialLayout) {
+ ASSERT_NO_FATAL_FAILURE(InitSyncValFramework());
+ ASSERT_NO_FATAL_FAILURE(InitState());
+ if (IsPlatform(kNexusPlayer)) {
+ printf("%s This test should not run on Nexus Player\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ VkFormat color_format = VK_FORMAT_R8G8B8A8_UNORM;
+ VkFormat ds_format = FindSupportedDepthStencilFormat(gpu());
+ if (!ds_format) {
+ printf("%s No Depth + Stencil format found. Skipped.\n", kSkipPrefix);
+ return;
+ }
+ VkImageUsageFlags usage_color = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+ VkImageUsageFlags usage_ds = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
+ VkImageObj image_color(m_device), image_color2(m_device);
+ auto image_ci = VkImageObj::ImageCreateInfo2D(32, 32, 1, 1, color_format, usage_color, VK_IMAGE_TILING_OPTIMAL);
+ image_color.Init(image_ci);
+ image_color2.Init(image_ci);
+ VkDepthStencilObj image_ds(m_device);
+ image_ds.Init(m_device, 32, 32, ds_format, usage_ds);
+
+ const VkAttachmentDescription colorAttachmentDescription = {(VkAttachmentDescriptionFlags)0,
+ color_format,
+ VK_SAMPLE_COUNT_1_BIT,
+ VK_ATTACHMENT_LOAD_OP_CLEAR,
+ VK_ATTACHMENT_STORE_OP_STORE,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE,
+ VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_IMAGE_LAYOUT_UNDEFINED,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
+
+ const VkAttachmentDescription depthStencilAttachmentDescription = {
+ (VkAttachmentDescriptionFlags)0, ds_format, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_CLEAR,
+ VK_ATTACHMENT_STORE_OP_STORE, VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_STORE,
+ VK_IMAGE_LAYOUT_UNDEFINED, // Here causes DesiredError that SYNC-HAZARD-WRITE_AFTER_WRITE in BeginRenderPass.
+ // It should be VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
+
+ std::vector<VkAttachmentDescription> attachmentDescriptions;
+ attachmentDescriptions.push_back(colorAttachmentDescription);
+ attachmentDescriptions.push_back(depthStencilAttachmentDescription);
+
+ const VkAttachmentReference colorAttachmentRef = {0u, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
+
+ const VkAttachmentReference depthStencilAttachmentRef = {1u, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
+
+ const VkSubpassDescription subpassDescription = {(VkSubpassDescriptionFlags)0,
+ VK_PIPELINE_BIND_POINT_GRAPHICS,
+ 0u,
+ 0,
+ 1u,
+ &colorAttachmentRef,
+ 0,
+ &depthStencilAttachmentRef,
+ 0u,
+ 0};
+
+ const VkRenderPassCreateInfo renderPassInfo = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
+ 0,
+ (VkRenderPassCreateFlags)0,
+ (uint32_t)attachmentDescriptions.size(),
+ &attachmentDescriptions[0],
+ 1u,
+ &subpassDescription,
+ 0u,
+ 0};
+ VkRenderPass rp;
+ ASSERT_VK_SUCCESS(vk::CreateRenderPass(device(), &renderPassInfo, nullptr, &rp));
+
+ VkImageView fb_attachments[] = {image_color.targetView(color_format),
+ image_ds.targetView(ds_format, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)};
+ const VkFramebufferCreateInfo fbci = {
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, 0, 0u, rp, 2u, fb_attachments, 32, 32, 1u,
+ };
+ VkFramebuffer fb;
+ ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &fbci, nullptr, &fb));
+ fb_attachments[0] = image_color2.targetView(color_format);
+ VkFramebuffer fb1;
+ ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &fbci, nullptr, &fb1));
+
+ CreatePipelineHelper g_pipe(*this);
+ g_pipe.InitInfo();
+ g_pipe.gp_ci_.renderPass = rp;
+
+ VkStencilOpState stencil = {};
+ stencil.failOp = VK_STENCIL_OP_KEEP;
+ stencil.passOp = VK_STENCIL_OP_KEEP;
+ stencil.depthFailOp = VK_STENCIL_OP_KEEP;
+ stencil.compareOp = VK_COMPARE_OP_NEVER;
+
+ auto ds_ci = lvl_init_struct<VkPipelineDepthStencilStateCreateInfo>();
+ ds_ci.depthTestEnable = VK_TRUE;
+ ds_ci.depthWriteEnable = VK_TRUE;
+ ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
+ ds_ci.stencilTestEnable = VK_TRUE;
+ ds_ci.front = stencil;
+ ds_ci.back = stencil;
+
+ g_pipe.gp_ci_.pDepthStencilState = &ds_ci;
+ g_pipe.InitState();
+ ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
+
+ m_commandBuffer->begin();
+ m_renderPassBeginInfo.renderArea = {{0, 0}, {32, 32}};
+ m_renderPassBeginInfo.renderPass = rp;
+
+ m_renderPassBeginInfo.framebuffer = fb;
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
+ vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
+ m_commandBuffer->EndRenderPass();
+
+ m_renderPassBeginInfo.framebuffer = fb1;
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ m_errorMonitor->VerifyFound();
+}
+
+TEST_F(VkSyncValTest, SyncLayoutTransition) {
+ ASSERT_NO_FATAL_FAILURE(InitSyncValFramework());
+ ASSERT_NO_FATAL_FAILURE(InitState());
+ if (IsPlatform(kNexusPlayer)) {
+ printf("%s This test should not run on Nexus Player\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ VkImageUsageFlags usage_color = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
+ VkImageUsageFlags usage_input = VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+ VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
+ VkImageObj image_color(m_device), image_input(m_device);
+ auto image_ci = VkImageObj::ImageCreateInfo2D(64, 64, 1, 1, format, usage_input, VK_IMAGE_TILING_OPTIMAL);
+ image_input.InitNoLayout(image_ci);
+ image_ci.usage = usage_color;
+ image_color.InitNoLayout(image_ci);
+ VkImageView view_input = image_input.targetView(format);
+ VkImageView view_color = image_color.targetView(format);
+ VkImageView attachments[] = {view_color, view_input};
+
+ const VkAttachmentDescription fbAttachment = {
+ 0u,
+ format,
+ VK_SAMPLE_COUNT_1_BIT,
+ VK_ATTACHMENT_LOAD_OP_CLEAR,
+ VK_ATTACHMENT_STORE_OP_STORE,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE,
+ VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_IMAGE_LAYOUT_UNDEFINED,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ };
+
+ std::vector<VkAttachmentDescription> attachmentDescs;
+ attachmentDescs.push_back(fbAttachment);
+
+ // Add it as a frame buffer attachment.
+ const VkAttachmentDescription inputAttachment = {
+ 0u,
+ format,
+ VK_SAMPLE_COUNT_1_BIT,
+ VK_ATTACHMENT_LOAD_OP_LOAD,
+ VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE,
+ VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
+ VK_IMAGE_LAYOUT_GENERAL,
+ };
+ attachmentDescs.push_back(inputAttachment);
+
+ std::vector<VkAttachmentReference> inputAttachments;
+ const VkAttachmentReference inputRef = {
+ 1u,
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
+ };
+ inputAttachments.push_back(inputRef);
+
+ const VkAttachmentReference colorRef = {
+ 0u,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ };
+ const std::vector<VkAttachmentReference> colorAttachments(1u, colorRef);
+
+ const VkSubpassDescription subpass = {
+ 0u,
+ VK_PIPELINE_BIND_POINT_GRAPHICS,
+ static_cast<uint32_t>(inputAttachments.size()),
+ inputAttachments.data(),
+ static_cast<uint32_t>(colorAttachments.size()),
+ colorAttachments.data(),
+ 0u,
+ nullptr,
+ 0u,
+ nullptr,
+ };
+ const std::vector<VkSubpassDescription> subpasses(1u, subpass);
+
+ const VkRenderPassCreateInfo renderPassInfo = {
+ VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
+ nullptr,
+ 0u,
+ static_cast<uint32_t>(attachmentDescs.size()),
+ attachmentDescs.data(),
+ static_cast<uint32_t>(subpasses.size()),
+ subpasses.data(),
+ 0u,
+ nullptr,
+ };
+ VkRenderPass rp;
+ ASSERT_VK_SUCCESS(vk::CreateRenderPass(device(), &renderPassInfo, nullptr, &rp));
+
+ const VkFramebufferCreateInfo fbci = {
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, 0, 0u, rp, 2u, attachments, 64, 64, 1u,
+ };
+ VkFramebuffer fb;
+ ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &fbci, nullptr, &fb));
+
+ VkSampler sampler = VK_NULL_HANDLE;
+ VkSamplerCreateInfo sampler_info = SafeSaneSamplerCreateInfo();
+ vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
+
+ char const *fsSource =
+ "#version 450\n"
+ "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
+ "void main() {\n"
+ " vec4 color = subpassLoad(x);\n"
+ "}\n";
+
+ VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
+ VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
+
+ CreatePipelineHelper g_pipe(*this);
+ g_pipe.InitInfo();
+ g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
+ g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_ALL_GRAPHICS, nullptr}};
+ g_pipe.InitState();
+ ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
+
+ VkDescriptorImageInfo image_info[1];
+ image_info[0].imageView = view_input;
+ image_info[0].sampler = sampler;
+ image_info[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+
+ VkWriteDescriptorSet descriptor_write[1];
+ descriptor_write[0] = {};
+ descriptor_write[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ descriptor_write[0].dstSet = g_pipe.descriptor_set_->set_;
+ descriptor_write[0].dstBinding = 0;
+ descriptor_write[0].descriptorCount = 1;
+ descriptor_write[0].descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
+ descriptor_write[0].pImageInfo = image_info;
+ descriptor_write[0].pBufferInfo = nullptr;
+ descriptor_write[0].pTexelBufferView = nullptr;
+
+ vk::UpdateDescriptorSets(device(), 1, descriptor_write, 0, NULL);
+
+ m_commandBuffer->begin();
+ auto cb = m_commandBuffer->handle();
+ VkClearColorValue ccv = {};
+ VkImageSubresourceRange full_subresource_range{VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
+
+ const VkImageMemoryBarrier preClearBarrier = {
+ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, 0, 0, VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_UNDEFINED,
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 0, 0, image_input.handle(), full_subresource_range,
+ };
+ vk::CmdPipelineBarrier(cb, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0u, 0u, nullptr, 0u, nullptr, 1u,
+ &preClearBarrier);
+
+ vk::CmdClearColorImage(m_commandBuffer->handle(), image_input.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &ccv, 1,
+ &full_subresource_range);
+
+ const VkImageMemoryBarrier postClearBarrier = {
+ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+ 0,
+ VK_ACCESS_TRANSFER_WRITE_BIT,
+ VK_ACCESS_SHADER_READ_BIT,
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
+ 0,
+ 0,
+ image_input.handle(),
+ full_subresource_range,
+ };
+ vk::CmdPipelineBarrier(cb, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0u, 0u, nullptr, 0u, nullptr,
+ 1u, &postClearBarrier);
+
+ m_renderPassBeginInfo.renderArea = {{0, 0}, {64, 64}};
+ m_renderPassBeginInfo.renderPass = rp;
+ m_renderPassBeginInfo.framebuffer = fb;
+
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
+ &g_pipe.descriptor_set_->set_, 0, nullptr);
+
+ // Positive test for ordering rules between load and input attachment usage
+ m_errorMonitor->ExpectSuccess();
+ vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
+
+ // Positive test for store ordering vs. input attachment and dependency *to* external for layout transition
+ m_commandBuffer->EndRenderPass();
+ m_errorMonitor->VerifyNotFound();
+
+ // Catch a conflict with the input attachment final layout transition
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "SYNC-HAZARD-WRITE_AFTER_WRITE");
+ vk::CmdClearColorImage(m_commandBuffer->handle(), image_input.handle(), VK_IMAGE_LAYOUT_GENERAL, &ccv, 1,
+ &full_subresource_range);
+ m_errorMonitor->VerifyFound();
+}
diff --git a/tests/vklayertests_command.cpp b/tests/vklayertests_command.cpp
index eec3203..673ff48 100644
--- a/tests/vklayertests_command.cpp
+++ b/tests/vklayertests_command.cpp
@@ -149,7 +149,7 @@
VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1, &img_barrier);
secondary.end();
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-image-02635");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-image-04073");
vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
m_errorMonitor->VerifyFound();
@@ -739,6 +739,22 @@
m_errorMonitor->VerifyFound();
}
+TEST_F(VkLayerTest, CommandBufferPrimaryFlags) {
+ ASSERT_NO_FATAL_FAILURE(Init());
+
+ // Calls AllocateCommandBuffers
+ VkCommandBufferObj commandBuffer(m_device, m_commandPool);
+
+ VkCommandBufferBeginInfo cmd_buf_info = {};
+ cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
+ cmd_buf_info.pNext = NULL;
+ cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-02840");
+ vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
+ m_errorMonitor->VerifyFound();
+}
+
TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
// Call CmdClearAttachmentss outside of an active RenderPass
@@ -788,6 +804,38 @@
m_errorMonitor->VerifyFound();
}
+TEST_F(VkLayerTest, ClearColorAttachmentsZeroExtent) {
+ TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a rect2D extent of zero.");
+
+ ASSERT_NO_FATAL_FAILURE(Init());
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ m_commandBuffer->begin();
+ vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
+
+ VkClearAttachment color_attachment;
+ color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ color_attachment.clearValue.color.float32[0] = 0;
+ color_attachment.clearValue.color.float32[1] = 0;
+ color_attachment.clearValue.color.float32[2] = 0;
+ color_attachment.clearValue.color.float32[3] = 0;
+ color_attachment.colorAttachment = 0;
+ VkClearRect clear_rect = {};
+ clear_rect.rect.offset = {0, 0};
+ clear_rect.baseArrayLayer = 0;
+ clear_rect.layerCount = 1;
+
+ clear_rect.rect.extent = {0, 1};
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02682");
+ vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
+ m_errorMonitor->VerifyFound();
+
+ clear_rect.rect.extent = {1, 0};
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02683");
+ vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
+ m_errorMonitor->VerifyFound();
+}
+
TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a primary command buffer (should only be secondary)");
@@ -1227,7 +1275,21 @@
TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
TEST_DESCRIPTION(
"Try to copy between images with the source subresource having a different layerCount than the destination subresource");
- ASSERT_NO_FATAL_FAILURE(Init());
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ bool maintenance1 = false;
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ maintenance1 = true;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ VkFormat image_format = VK_FORMAT_B8G8R8A8_UNORM;
+ VkFormatProperties format_props;
+ vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
+ if ((format_props.optimalTilingFeatures & (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)) == 0) {
+ printf("%s Transfer for format is not supported.\n", kSkipPrefix);
+ return;
+ }
// Create two images to copy between
VkImageObj src_image_obj(m_device);
@@ -1237,7 +1299,7 @@
image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
image_create_info.pNext = NULL;
image_create_info.imageType = VK_IMAGE_TYPE_2D;
- image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
+ image_create_info.format = image_format;
image_create_info.extent.width = 32;
image_create_info.extent.height = 32;
image_create_info.extent.depth = 1;
@@ -1276,7 +1338,8 @@
copyRegion.extent.height = 1;
copyRegion.extent.depth = 1;
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
+ const char *vuid = (maintenance1 == true) ? "VUID-VkImageCopy-extent-00140" : "VUID-VkImageCopy-layerCount-00138";
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
m_commandBuffer->CopyImage(src_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
©Region);
m_errorMonitor->VerifyFound();
@@ -1346,6 +1409,17 @@
// start recording
m_commandBuffer->begin();
+ VkMemoryBarrier mem_barriers[3];
+ mem_barriers[0] = lvl_init_struct<VkMemoryBarrier>();
+ mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ mem_barriers[1] = lvl_init_struct<VkMemoryBarrier>();
+ mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
+ mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ mem_barriers[2] = lvl_init_struct<VkMemoryBarrier>();
+ mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
+
// Mip level copies that work - 5 levels
m_errorMonitor->ExpectSuccess();
@@ -1353,29 +1427,50 @@
region.imageExtent = {32, 32, 1};
region.imageSubresource.mipLevel = 0;
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1, ®ion);
+
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
+ &mem_barriers[2], 0, nullptr, 0, nullptr);
vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion);
// Mip 2 should fit in 64b buffer - 64 texels @ 1b each
region.imageExtent = {8, 8, 1};
region.imageSubresource.mipLevel = 2;
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1, ®ion);
+
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
+ &mem_barriers[1], 0, nullptr, 0, nullptr);
vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion);
// Mip 3 should fit in 16b buffer - 16 texels @ 1b each
region.imageExtent = {4, 4, 1};
region.imageSubresource.mipLevel = 3;
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, ®ion);
+
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
+ &mem_barriers[1], 0, nullptr, 0, nullptr);
vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion);
// Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
region.imageExtent = {2, 2, 1};
region.imageSubresource.mipLevel = 4;
+
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
+ &mem_barriers[0], 0, nullptr, 0, nullptr);
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, ®ion);
+
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
+ &mem_barriers[1], 0, nullptr, 0, nullptr);
vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion);
region.imageExtent = {1, 1, 1};
region.imageSubresource.mipLevel = 5;
+
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
+ &mem_barriers[0], 0, nullptr, 0, nullptr);
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, ®ion);
+
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
+ &mem_barriers[1], 0, nullptr, 0, nullptr);
vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion);
m_errorMonitor->VerifyNotFound();
@@ -1387,19 +1482,20 @@
vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion);
m_errorMonitor->VerifyFound();
+ std::string vuid;
+ bool ycbcr = (DeviceExtensionEnabled(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME) ||
+ (DeviceValidationVersion() >= VK_API_VERSION_1_1));
+
// Copy width < compressed block size, but not the full mip width
region.imageExtent = {1, 2, 1};
region.imageSubresource.mipLevel = 4;
- m_errorMonitor->SetDesiredFailureMsg(
- kErrorBit,
- "VUID-VkBufferImageCopy-imageExtent-00207"); // width not a multiple of compressed block width
+ vuid = ycbcr ? "VUID-VkBufferImageCopy-None-01739" : "VUID-VkBufferImageCopy-imageExtent-00207";
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // width not a multiple of compressed block width
m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
"VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, ®ion);
m_errorMonitor->VerifyFound();
- m_errorMonitor->SetDesiredFailureMsg(
- kErrorBit,
- "VUID-VkBufferImageCopy-imageExtent-00207"); // width not a multiple of compressed block width
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // width not a multiple of compressed block width
m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
"VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion);
@@ -1407,16 +1503,13 @@
// Copy height < compressed block size but not the full mip height
region.imageExtent = {2, 1, 1};
- m_errorMonitor->SetDesiredFailureMsg(
- kErrorBit,
- "VUID-VkBufferImageCopy-imageExtent-00208"); // height not a multiple of compressed block width
+ vuid = ycbcr ? "VUID-VkBufferImageCopy-None-01740" : "VUID-VkBufferImageCopy-imageExtent-00208";
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // height not a multiple of compressed block width
m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
"VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, ®ion);
m_errorMonitor->VerifyFound();
- m_errorMonitor->SetDesiredFailureMsg(
- kErrorBit,
- "VUID-VkBufferImageCopy-imageExtent-00208"); // height not a multiple of compressed block width
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // height not a multiple of compressed block width
m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
"VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion);
@@ -1425,14 +1518,13 @@
// Offsets must be multiple of compressed block size
region.imageOffset = {1, 1, 0};
region.imageExtent = {1, 1, 1};
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
- "VUID-VkBufferImageCopy-imageOffset-00205"); // imageOffset not a multiple of block size
+ vuid = ycbcr ? "VUID-VkBufferImageCopy-None-01737" : "VUID-VkBufferImageCopy-imageOffset-00205";
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // imageOffset not a multiple of block size
m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
"VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, ®ion);
m_errorMonitor->VerifyFound();
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
- "VUID-VkBufferImageCopy-imageOffset-00205"); // imageOffset not a multiple of block size
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // imageOffset not a multiple of block size
m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
"VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ®ion);
@@ -1443,25 +1535,28 @@
region.imageExtent = {3, 4, 1};
region.imageSubresource.mipLevel = 2;
m_errorMonitor->ExpectSuccess();
+
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
+ &mem_barriers[0], 0, nullptr, 0, nullptr);
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
®ion);
+
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
+ &mem_barriers[1], 0, nullptr, 0, nullptr);
vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
®ion);
m_errorMonitor->VerifyNotFound();
// Offset + extent width < mip width and not a multiple of block width - should fail
region.imageExtent = {3, 3, 1};
- m_errorMonitor->SetDesiredFailureMsg(
- kErrorBit,
- "VUID-VkBufferImageCopy-imageExtent-00208"); // offset+extent not a multiple of block width
+ vuid = ycbcr ? "VUID-VkBufferImageCopy-None-01740" : "VUID-VkBufferImageCopy-imageExtent-00208";
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // offset+extent not a multiple of block width
m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
"VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
®ion);
m_errorMonitor->VerifyFound();
- m_errorMonitor->SetDesiredFailureMsg(
- kErrorBit,
- "VUID-VkBufferImageCopy-imageExtent-00208"); // offset+extent not a multiple of block width
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // offset+extent not a multiple of block width
m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
"VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
@@ -1603,6 +1698,17 @@
region.imageExtent = {64, 64, 1};
region.bufferOffset = 0;
+ VkMemoryBarrier mem_barriers[3];
+ mem_barriers[0] = lvl_init_struct<VkMemoryBarrier>();
+ mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ mem_barriers[1] = lvl_init_struct<VkMemoryBarrier>();
+ mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
+ mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ mem_barriers[2] = lvl_init_struct<VkMemoryBarrier>();
+ mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
+
if (missing_rgba_support) {
printf("%s R8G8B8A8_UINT transfer unsupported - skipping RGBA tests.\n", kSkipPrefix);
@@ -1627,17 +1733,29 @@
m_errorMonitor->ExpectSuccess();
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
®ion);
+
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
+ &mem_barriers[2], 0, nullptr, 0, nullptr);
vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
®ion);
region.imageOffset.x = 16; // 16k copy, offset requires larger image
+
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
+ &mem_barriers[0], 0, nullptr, 0, nullptr);
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
®ion);
region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
+
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
+ &mem_barriers[1], 0, nullptr, 0, nullptr);
vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
®ion);
region.imageOffset.x = 0;
region.imageExtent.height = 64;
region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
+
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
+ &mem_barriers[1], 0, nullptr, 0, nullptr);
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
®ion);
m_errorMonitor->VerifyNotFound();
@@ -1806,6 +1924,8 @@
m_errorMonitor->VerifyNotFound();
m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
+ &mem_barriers[0], 0, nullptr, 0, nullptr);
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
buffer_256k.handle(), 1, &ds_region);
m_errorMonitor->VerifyNotFound();
@@ -1826,9 +1946,9 @@
m_errorMonitor->SetDesiredFailureMsg(
kErrorBit,
- "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 3b depth per texel, pack (loose) into 256k buffer
+ "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 3b depth per texel, pack (loose) into 128k buffer
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- buffer_256k.handle(), 1, &ds_region);
+ buffer_128k.handle(), 1, &ds_region);
m_errorMonitor->VerifyFound();
m_errorMonitor->SetDesiredFailureMsg(
@@ -1842,16 +1962,22 @@
ds_region.bufferOffset = 0;
ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
+ &mem_barriers[0], 0, nullptr, 0, nullptr);
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
buffer_64k.handle(), 1, &ds_region);
m_errorMonitor->VerifyNotFound();
m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
+ &mem_barriers[0], 0, nullptr, 0, nullptr);
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
buffer_64k.handle(), 1, &ds_region);
m_errorMonitor->VerifyNotFound();
m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
+ &mem_barriers[0], 0, nullptr, 0, nullptr);
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
buffer_64k.handle(), 1, &ds_region);
m_errorMonitor->VerifyNotFound();
@@ -1934,8 +2060,10 @@
printf("%s No compressed formats transfers bits are supported - block compression tests skipped.\n", kSkipPrefix);
} else {
ASSERT_TRUE(image_16k_4x4comp.initialized());
-
+ std::string vuid;
// Just fits
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
+ &mem_barriers[0], 0, nullptr, 0, nullptr);
m_errorMonitor->ExpectSuccess();
region.imageExtent = {128, 128, 1};
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
@@ -1951,9 +2079,8 @@
region.bufferOffset = 0;
// extents that are not a multiple of compressed block size
- m_errorMonitor->SetDesiredFailureMsg(
- kErrorBit,
- "VUID-VkBufferImageCopy-imageExtent-00207"); // extent width not a multiple of block size
+ vuid = mp_extensions ? "VUID-VkBufferImageCopy-None-01739" : "VUID-VkBufferImageCopy-imageExtent-00207";
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // extent width not a multiple of block size
m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
"VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
region.imageExtent.width = 66;
@@ -1962,9 +2089,8 @@
m_errorMonitor->VerifyFound();
region.imageExtent.width = 128;
- m_errorMonitor->SetDesiredFailureMsg(
- kErrorBit,
- "VUID-VkBufferImageCopy-imageExtent-00208"); // extent height not a multiple of block size
+ vuid = mp_extensions ? "VUID-VkBufferImageCopy-None-01740" : "VUID-VkBufferImageCopy-imageExtent-00208";
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // extent height not a multiple of block size
m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
"VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
region.imageExtent.height = 2;
@@ -1979,20 +2105,26 @@
m_errorMonitor->ExpectSuccess();
region.imageExtent.width = 66;
region.imageOffset.x = 64;
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
+ &mem_barriers[0], 0, nullptr, 0, nullptr);
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
buffer_16k.handle(), 1, ®ion);
region.imageExtent.width = 16;
region.imageOffset.x = 0;
region.imageExtent.height = 2;
region.imageOffset.y = 128;
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
+ &mem_barriers[0], 0, nullptr, 0, nullptr);
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
buffer_16k.handle(), 1, ®ion);
m_errorMonitor->VerifyNotFound();
region.imageOffset = {0, 0, 0};
// buffer offset must be a multiple of texel block size (16)
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferOffset-00206");
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferOffset-00193");
+ vuid = mp_extensions ? "VUID-VkBufferImageCopy-None-01738" : "VUID-VkBufferImageCopy-bufferOffset-00206";
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
+ vuid = mp_extensions ? "VUID-VkBufferImageCopy-bufferOffset-01558" : "VUID-VkBufferImageCopy-bufferOffset-00193";
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
region.imageExtent = {64, 64, 1};
region.bufferOffset = 24;
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
@@ -2000,7 +2132,8 @@
m_errorMonitor->VerifyFound();
// rowlength not a multiple of block width (4)
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferRowLength-00203");
+ vuid = mp_extensions ? "VUID-VkBufferImageCopy-None-01735" : "VUID-VkBufferImageCopy-bufferRowLength-00203";
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
region.bufferOffset = 0;
region.bufferRowLength = 130;
region.bufferImageHeight = 0;
@@ -2009,7 +2142,8 @@
m_errorMonitor->VerifyFound();
// imageheight not a multiple of block height (4)
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferImageHeight-00204");
+ vuid = mp_extensions ? "VUID-VkBufferImageCopy-None-01736" : "VUID-VkBufferImageCopy-bufferImageHeight-00204";
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
region.bufferRowLength = 0;
region.bufferImageHeight = 130;
vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
@@ -2051,6 +2185,8 @@
// Copies into a mutli-planar image aspect properly
m_errorMonitor->ExpectSuccess();
mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
+ &mem_barriers[2], 0, nullptr, 0, nullptr);
vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
m_errorMonitor->VerifyNotFound();
@@ -2068,6 +2204,15 @@
vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
m_errorMonitor->VerifyFound();
+
+ // buffer offset must be a multiple of texel block size for VK_FORMAT_R8G8_UNORM (2)
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferOffset-01559");
+ mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
+ mp_region.bufferOffset = 5;
+ mp_region.imageExtent = {8, 8, 1};
+ vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
+ VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
+ m_errorMonitor->VerifyFound();
}
}
}
@@ -2100,15 +2245,6 @@
VkBufferObj buffer2;
VkMemoryPropertyFlags reqs2 = 0;
buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
- VkBufferImageCopy region2 = {};
- region2.bufferRowLength = 128;
- region2.bufferImageHeight = 128;
- region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
- // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
- region2.imageSubresource.layerCount = 1;
- region2.imageExtent.height = 4;
- region2.imageExtent.width = 4;
- region2.imageExtent.depth = 1;
m_commandBuffer->begin();
// Image must have offset.z of 0 and extent.depth of 1
@@ -2141,14 +2277,6 @@
®ion);
m_errorMonitor->VerifyFound();
- // BufferOffset must be a multiple of 4
- // Introduce failure by setting bufferOffset to a value not divisible by 4
- region2.bufferOffset = 6;
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferOffset-00194");
- vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer2.handle(), image2.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
- ®ion2);
- m_errorMonitor->VerifyFound();
-
// BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
region.bufferOffset = 0;
region.imageExtent.height = 128;
@@ -2202,6 +2330,12 @@
// Image copy tests where format type and extents don't match
ASSERT_NO_FATAL_FAILURE(Init());
+ // Tests are designed to run without Maintenance1 which was promoted in 1.1
+ if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
+ printf("%s Tests for 1.0 only, test skipped.\n", kSkipPrefix);
+ return;
+ }
+
VkImageCreateInfo ci;
ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
ci.pNext = NULL;
@@ -2359,7 +2493,7 @@
// 3D texture accessing an array layer other than 0. VU 09c0011a
copy_region.extent = {4, 4, 1};
copy_region.srcSubresource.baseArrayLayer = 1;
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-srcImage-00141");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-srcImage-00139");
m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
"VUID-vkCmdCopyImage-srcSubresource-01698"); // also 'too many layers'
m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
@@ -2883,7 +3017,7 @@
copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-srcImage-01556");
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "dest image depth/stencil formats"); // also
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
©_region);
m_errorMonitor->VerifyFound();
@@ -2891,7 +3025,7 @@
copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-dstImage-01557");
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "dest image depth/stencil formats"); // also
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
m_commandBuffer->CopyImage(sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
©_region);
m_errorMonitor->VerifyFound();
@@ -3084,26 +3218,26 @@
}
ASSERT_NO_FATAL_FAILURE(InitState());
- // Try to use G8_B8R8_2PLANE_420_UNORM because need 2-plane format for some tests and likely supported due to copy support
- // being required with samplerYcbcrConversion feature
+ // Try to use VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM because need multi-plane format for some tests and likely supported due to
+ // copy support being required with samplerYcbcrConversion feature
VkFormatProperties props = {0, 0, 0};
bool missing_format_support = false;
- vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &props);
+ vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, &props);
missing_format_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
if (missing_format_support == true) {
- printf("%s VK_FORMAT_G8_B8R8_2PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
+ printf("%s VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
return;
}
// 128^2 texels in plane_0 and 64^2 texels in plane_1
VkImageObj src_image(m_device);
VkImageObj dst_image(m_device);
- src_image.Init(128, 128, 1, VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
+ src_image.Init(128, 128, 1, VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
ASSERT_TRUE(src_image.initialized());
- dst_image.Init(128, 128, 1, VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
+ dst_image.Init(128, 128, 1, VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
ASSERT_TRUE(dst_image.initialized());
VkImageCopy copy_region = {};
@@ -3136,10 +3270,16 @@
©_region);
m_errorMonitor->VerifyNotFound();
+ VkMemoryBarrier mem_barrier = lvl_init_struct<VkMemoryBarrier>();
+ mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+
// Should be able to do a 64x64 copy from plane 0 -> Plane 1
copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
m_errorMonitor->ExpectSuccess();
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
+ &mem_barrier, 0, nullptr, 0, nullptr);
m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
©_region);
m_errorMonitor->VerifyNotFound();
@@ -3148,6 +3288,8 @@
copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
m_errorMonitor->ExpectSuccess();
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
+ &mem_barrier, 0, nullptr, 0, nullptr);
m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
©_region);
m_errorMonitor->VerifyNotFound();
@@ -3157,6 +3299,8 @@
copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
m_errorMonitor->ExpectSuccess();
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
+ &mem_barrier, 0, nullptr, 0, nullptr);
m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
©_region);
m_errorMonitor->VerifyNotFound();
@@ -3199,8 +3343,10 @@
}
TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
- VkResult err;
- bool pass;
+ if (!EnableDeviceProfileLayer()) {
+ printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
+ return;
+ }
// Enable KHR multiplane req'd extensions
bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
@@ -3221,104 +3367,184 @@
}
ASSERT_NO_FATAL_FAILURE(InitState());
- const char *vuid = (mp_extensions) ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
+ PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
+ PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
- // Create two images of different types and try to copy between them
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
- VkImage srcImage;
- VkImage dstImage;
- VkDeviceMemory srcMem;
- VkDeviceMemory destMem;
- VkMemoryRequirements memReqs;
+ // Load required functions
+ if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
+ printf("%s Failed to device profile layer.\n", kSkipPrefix);
+ return;
+ }
+
+ // Set transfer for all potential used formats
+ VkFormatProperties format_props;
+ fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, &format_props);
+ format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
+ fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, format_props);
+
+ fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, &format_props);
+ format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
+ fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, format_props);
VkImageCreateInfo image_create_info = {};
image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
image_create_info.pNext = NULL;
image_create_info.imageType = VK_IMAGE_TYPE_2D;
- image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
image_create_info.extent.width = 32;
image_create_info.extent.height = 32;
image_create_info.extent.depth = 1;
image_create_info.mipLevels = 1;
image_create_info.arrayLayers = 1;
image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
- image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
- image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
+ image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
image_create_info.flags = 0;
- err = vk::CreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
- ASSERT_VK_SUCCESS(err);
+ image_create_info.format = VK_FORMAT_R8_UNORM;
+ VkImageObj image_8b_unorm(m_device);
+ image_8b_unorm.init(&image_create_info);
- image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
- // Introduce failure by creating second image with a different-sized format.
- image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
- VkFormatProperties properties;
- vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_create_info.format, &properties);
- if ((properties.linearTilingFeatures & VK_FORMAT_R5G5B5A1_UNORM_PACK16) == 0) {
- vk::DestroyImage(m_device->device(), srcImage, NULL);
- printf("%s Image format not supported; skipped.\n", kSkipPrefix);
- return;
+ image_create_info.format = VK_FORMAT_R8_UINT;
+ VkImageObj image_8b_uint(m_device);
+ image_8b_uint.init(&image_create_info);
+
+ // First try to test two single plane mismatch
+ {
+ fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, &format_props);
+ format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
+ fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, format_props);
+
+ image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
+ VkImageObj image_32b_unorm(m_device);
+ image_32b_unorm.init(&image_create_info);
+
+ m_commandBuffer->begin();
+ VkImageCopy copyRegion;
+ copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ copyRegion.srcSubresource.mipLevel = 0;
+ copyRegion.srcSubresource.baseArrayLayer = 0;
+ copyRegion.srcSubresource.layerCount = 1;
+ copyRegion.srcOffset.x = 0;
+ copyRegion.srcOffset.y = 0;
+ copyRegion.srcOffset.z = 0;
+ copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ copyRegion.dstSubresource.mipLevel = 0;
+ copyRegion.dstSubresource.baseArrayLayer = 0;
+ copyRegion.dstSubresource.layerCount = 1;
+ copyRegion.dstOffset.x = 0;
+ copyRegion.dstOffset.y = 0;
+ copyRegion.dstOffset.z = 0;
+ copyRegion.extent.width = 1;
+ copyRegion.extent.height = 1;
+ copyRegion.extent.depth = 1;
+
+ // Sanity check between two 8bit formats
+ m_errorMonitor->ExpectSuccess();
+ m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
+ VK_IMAGE_LAYOUT_GENERAL, 1, ©Region);
+ m_errorMonitor->VerifyNotFound();
+
+ const char *vuid = (mp_extensions) ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
+ m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_32b_unorm.handle(),
+ VK_IMAGE_LAYOUT_GENERAL, 1, ©Region);
+ m_errorMonitor->VerifyFound();
+
+ // Swap src and dst
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
+ m_commandBuffer->CopyImage(image_32b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
+ VK_IMAGE_LAYOUT_GENERAL, 1, ©Region);
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->end();
}
- err = vk::CreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
- ASSERT_VK_SUCCESS(err);
+ // DstImage is a mismatched plane of a multi-planar format
+ if (mp_extensions == false) {
+ printf("%s No multi-planar support; section of tests skipped.\n", kSkipPrefix);
+ } else {
+ fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &format_props);
+ format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
+ fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, format_props);
- // Allocate memory
- VkMemoryAllocateInfo memAlloc = {};
- memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
- memAlloc.pNext = NULL;
- memAlloc.allocationSize = 0;
- memAlloc.memoryTypeIndex = 0;
+ image_create_info.format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
+ VkImageObj image_8b_16b_420_unorm(m_device);
+ image_8b_16b_420_unorm.init(&image_create_info);
- vk::GetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
- memAlloc.allocationSize = memReqs.size;
- pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
- ASSERT_TRUE(pass);
- err = vk::AllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
- ASSERT_VK_SUCCESS(err);
+ m_commandBuffer->begin();
+ VkImageCopy copyRegion;
+ copyRegion.srcSubresource.mipLevel = 0;
+ copyRegion.srcSubresource.baseArrayLayer = 0;
+ copyRegion.srcSubresource.layerCount = 1;
+ copyRegion.srcOffset.x = 0;
+ copyRegion.srcOffset.y = 0;
+ copyRegion.srcOffset.z = 0;
+ copyRegion.dstSubresource.mipLevel = 0;
+ copyRegion.dstSubresource.baseArrayLayer = 0;
+ copyRegion.dstSubresource.layerCount = 1;
+ copyRegion.dstOffset.x = 0;
+ copyRegion.dstOffset.y = 0;
+ copyRegion.dstOffset.z = 0;
+ copyRegion.extent.width = 1;
+ copyRegion.extent.height = 1;
+ copyRegion.extent.depth = 1;
- vk::GetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
- memAlloc.allocationSize = memReqs.size;
- pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
- ASSERT_TRUE(pass);
- err = vk::AllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
- ASSERT_VK_SUCCESS(err);
+ // First test single-plane -> multi-plan
+ copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
- err = vk::BindImageMemory(m_device->device(), srcImage, srcMem, 0);
- ASSERT_VK_SUCCESS(err);
- err = vk::BindImageMemory(m_device->device(), dstImage, destMem, 0);
- ASSERT_VK_SUCCESS(err);
+ // Plane 0 is VK_FORMAT_R8_UNORM so this should succeed
+ m_errorMonitor->ExpectSuccess();
+ m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
+ VK_IMAGE_LAYOUT_GENERAL, 1, ©Region);
+ m_errorMonitor->VerifyNotFound();
- m_commandBuffer->begin();
- VkImageCopy copyRegion;
- copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
- copyRegion.srcSubresource.mipLevel = 0;
- copyRegion.srcSubresource.baseArrayLayer = 0;
- copyRegion.srcSubresource.layerCount = 1;
- copyRegion.srcOffset.x = 0;
- copyRegion.srcOffset.y = 0;
- copyRegion.srcOffset.z = 0;
- copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
- copyRegion.dstSubresource.mipLevel = 0;
- copyRegion.dstSubresource.baseArrayLayer = 0;
- copyRegion.dstSubresource.layerCount = 1;
- copyRegion.dstOffset.x = 0;
- copyRegion.dstOffset.y = 0;
- copyRegion.dstOffset.z = 0;
- copyRegion.extent.width = 1;
- copyRegion.extent.height = 1;
- copyRegion.extent.depth = 1;
- m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, ©Region);
- m_commandBuffer->end();
+ image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
+ VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
- m_errorMonitor->VerifyFound();
+ // Make sure no false postiives if Compatible format
+ m_errorMonitor->ExpectSuccess();
+ m_commandBuffer->CopyImage(image_8b_uint.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
+ VK_IMAGE_LAYOUT_GENERAL, 1, ©Region);
+ m_errorMonitor->VerifyNotFound();
- vk::DestroyImage(m_device->device(), dstImage, NULL);
- vk::FreeMemory(m_device->device(), destMem, NULL);
- vk::DestroyImage(m_device->device(), srcImage, NULL);
- vk::FreeMemory(m_device->device(), srcMem, NULL);
+ // Plane 1 is VK_FORMAT_R8G8_UNORM so this should fail
+ copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
+ m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
+ VK_IMAGE_LAYOUT_GENERAL, 1, ©Region);
+ m_errorMonitor->VerifyFound();
- // TODO: Add proper support for VUID 01549 to copy between single and multi-planar formats that are not compatible
+ // Same tests but swap src and dst
+ copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
+ copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+
+ image_8b_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_ACCESS_TRANSFER_READ_BIT,
+ VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
+ image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
+ VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
+
+ m_errorMonitor->ExpectSuccess();
+ m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
+ VK_IMAGE_LAYOUT_GENERAL, 1, ©Region);
+ m_errorMonitor->VerifyNotFound();
+
+ image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
+ VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
+
+ m_errorMonitor->ExpectSuccess();
+ m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
+ VK_IMAGE_LAYOUT_GENERAL, 1, ©Region);
+ m_errorMonitor->VerifyNotFound();
+
+ copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
+ m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
+ VK_IMAGE_LAYOUT_GENERAL, 1, ©Region);
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->end();
+ }
}
TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
@@ -3365,7 +3591,7 @@
copyRegion.extent.height = 1;
copyRegion.extent.depth = 1;
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdCopyImage called with unmatched source and dest image depth");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00135");
m_commandBuffer->CopyImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
©Region);
m_commandBuffer->end();
@@ -3462,20 +3688,56 @@
TEST_F(VkLayerTest, CopyImageAspectMismatch) {
TEST_DESCRIPTION("Image copies with aspect mask errors");
- SetTargetApiVersion(VK_API_VERSION_1_1);
- ASSERT_NO_FATAL_FAILURE(Init());
+
+ if (!EnableDeviceProfileLayer()) {
+ printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
+ return;
+ }
+
+ bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
+ if (mp_extensions) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ if (mp_extensions) {
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
+ PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
+
+ if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
+ printf("%s Required extensions are not avaiable.\n", kSkipPrefix);
+ return;
+ }
+
auto ds_format = FindSupportedDepthStencilFormat(gpu());
if (!ds_format) {
printf("%s Couldn't find depth stencil format.\n", kSkipPrefix);
return;
}
- VkFormatProperties properties;
- vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
- if (properties.optimalTilingFeatures == 0) {
- printf("%s Image format VK_FORMAT_D32_SFLOAT not supported; skipped.\n", kSkipPrefix);
- return;
- }
+ // Add Transfer support for all used formats
+ VkFormatProperties formatProps;
+ fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, &formatProps);
+ formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
+ fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
+ fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_D32_SFLOAT, &formatProps);
+ formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
+ fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
+ fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, &formatProps);
+ formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
+ fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, formatProps);
+
VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
color_image.Init(128, 128, 1, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
depth_image.Init(128, 128, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
@@ -3510,9 +3772,7 @@
// Src and dest aspect masks don't match
copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
- bool ycbcr = (DeviceExtensionEnabled(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME) ||
- (DeviceValidationVersion() >= VK_API_VERSION_1_1));
- std::string vuid = (ycbcr ? "VUID-VkImageCopy-srcImage-01551" : "VUID-VkImageCopy-aspectMask-00137");
+ const char *vuid = mp_extensions ? "VUID-VkImageCopy-srcImage-01551" : "VUID-VkImageCopy-aspectMask-00137";
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
vk::CmdCopyImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
VK_IMAGE_LAYOUT_GENERAL, 1, ©Region);
@@ -3561,11 +3821,12 @@
copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
+ const char *compatible_vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
// Aspect mask doesn't match source image format
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-aspectMask-00142");
// Again redundant but unavoidable
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "unmatched source and dest image depth/stencil formats");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
VK_IMAGE_LAYOUT_GENERAL, 1, ©Region);
m_errorMonitor->VerifyFound();
@@ -3575,7 +3836,7 @@
copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-aspectMask-00143");
// Again redundant but unavoidable
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "unmatched source and dest image depth/stencil formats");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
VK_IMAGE_LAYOUT_GENERAL, 1, ©Region);
m_errorMonitor->VerifyFound();
@@ -3584,7 +3845,7 @@
}
TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdResolveImage called with source sample count less than 2.");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00257");
ASSERT_NO_FATAL_FAILURE(Init());
@@ -3640,7 +3901,7 @@
}
TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdResolveImage called with dest sample count greater than 1.");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00259");
ASSERT_NO_FATAL_FAILURE(Init());
@@ -3702,7 +3963,7 @@
}
TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
- m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdResolveImage called with unmatched source and dest formats.");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-01386");
ASSERT_NO_FATAL_FAILURE(Init());
@@ -3766,7 +4027,7 @@
}
TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
- m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdResolveImage called with unmatched source and dest image types.");
+ m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "UNASSIGNED-CoreValidation-DrawState-MismatchedImageType");
ASSERT_NO_FATAL_FAILURE(Init());
@@ -3999,6 +4260,95 @@
m_commandBuffer->end();
}
+TEST_F(VkLayerTest, ResolveImageImageType) {
+ ASSERT_NO_FATAL_FAILURE(Init());
+ // Create images of different types and try to resolve between them
+ VkImageObj srcImage2D(m_device);
+ VkImageObj dstImage1D(m_device);
+ VkImageObj dstImage3D(m_device);
+
+ VkImageCreateInfo image_create_info = {};
+ image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_create_info.pNext = NULL;
+ image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
+ image_create_info.extent.width = 32;
+ image_create_info.extent.height = 1;
+ image_create_info.extent.depth = 1;
+ image_create_info.mipLevels = 1;
+ image_create_info.arrayLayers = 4; // more than 1 to not trip other validation
+ image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
+ image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_create_info.usage =
+ VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+ // Note: Some implementations expect color attachment usage for any
+ // multisample surface
+ image_create_info.flags = 0;
+
+ image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ srcImage2D.init(&image_create_info);
+ ASSERT_TRUE(srcImage2D.initialized());
+
+ image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_create_info.imageType = VK_IMAGE_TYPE_1D;
+ dstImage1D.init(&image_create_info);
+ ASSERT_TRUE(dstImage1D.initialized());
+
+ image_create_info.imageType = VK_IMAGE_TYPE_3D;
+ image_create_info.extent.height = 16;
+ image_create_info.extent.depth = 16;
+ image_create_info.arrayLayers = 1;
+ dstImage3D.init(&image_create_info);
+ ASSERT_TRUE(dstImage3D.initialized());
+
+ m_commandBuffer->begin();
+
+ VkImageResolve resolveRegion;
+ resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ resolveRegion.srcSubresource.mipLevel = 0;
+ resolveRegion.srcSubresource.baseArrayLayer = 0;
+ resolveRegion.srcSubresource.layerCount = 1;
+ resolveRegion.srcOffset.x = 0;
+ resolveRegion.srcOffset.y = 0;
+ resolveRegion.srcOffset.z = 0;
+ resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ resolveRegion.dstSubresource.mipLevel = 0;
+ resolveRegion.dstSubresource.baseArrayLayer = 0;
+ resolveRegion.dstSubresource.layerCount = 1;
+ resolveRegion.dstOffset.x = 0;
+ resolveRegion.dstOffset.y = 0;
+ resolveRegion.dstOffset.z = 0;
+ resolveRegion.extent.width = 1;
+ resolveRegion.extent.height = 1;
+ resolveRegion.extent.depth = 1;
+
+ // non-zero value baseArrayLayer
+ resolveRegion.srcSubresource.baseArrayLayer = 2;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageResolve-srcImage-00268");
+ m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ &resolveRegion);
+ m_errorMonitor->VerifyFound();
+ resolveRegion.srcSubresource.baseArrayLayer = 0;
+
+ // Set height with 1D dstImage
+ resolveRegion.extent.height = 2;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageResolve-dstImage-00276");
+ m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ &resolveRegion);
+ m_errorMonitor->VerifyFound();
+ resolveRegion.extent.height = 1;
+
+ // Set depth with 1D dstImage and 2D srcImage
+ resolveRegion.extent.depth = 2;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageResolve-dstImage-00278");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageResolve-srcImage-00273");
+ m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
+ &resolveRegion);
+ m_errorMonitor->VerifyFound();
+ resolveRegion.extent.depth = 1;
+
+ m_commandBuffer->end();
+}
+
TEST_F(VkLayerTest, ClearImageErrors) {
TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and ClearDepthStencilImage with a color image.");
@@ -4051,14 +4401,13 @@
const VkImageSubresourceRange ds_range = vk_testing::Image::subresource_range(ds_image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdClearColorImage called with depth/stencil image.");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00007");
vk::CmdClearColorImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &color_range);
m_errorMonitor->VerifyFound();
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
- "vkCmdClearColorImage called with image created without VK_IMAGE_USAGE_TRANSFER_DST_BIT");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00002");
vk::CmdClearColorImage(m_commandBuffer->handle(), color_image_no_transfer.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
&color_range);
@@ -4066,7 +4415,7 @@
m_errorMonitor->VerifyFound();
// Call CmdClearDepthStencilImage with color image
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdClearDepthStencilImage called without a depth/stencil image.");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-00014");
vk::CmdClearDepthStencilImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
&clear_value, 1, &ds_range);
@@ -4162,12 +4511,6 @@
vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
m_errorMonitor->VerifyFound();
- // Validate that we've tracked the changes from the secondary CB correctly
- m_errorMonitor->ExpectSuccess();
- pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL);
- m_errorMonitor->VerifyNotFound();
- m_commandBuffer->end();
-
m_commandBuffer->reset();
secondary.reset();
@@ -5029,6 +5372,58 @@
vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
}
+TEST_F(VkLayerTest, DrawIndirectCountFeature) {
+ TEST_DESCRIPTION("Test covered valid usage for the 1.2 drawIndirectCount feature");
+
+ SetTargetApiVersion(VK_API_VERSION_1_2);
+ ASSERT_NO_FATAL_FAILURE(Init());
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+ if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
+ printf("%s Tests requires Vulkan 1.2+, skipping test\n", kSkipPrefix);
+ return;
+ }
+
+ VkBufferObj indirect_buffer;
+ indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
+ VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
+
+ VkBufferObj indexed_indirect_buffer;
+ indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
+ VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
+
+ VkBufferObj count_buffer;
+ count_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
+
+ VkBufferObj index_buffer;
+ index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
+
+ CreatePipelineHelper pipe(*this);
+ pipe.InitInfo();
+ pipe.InitState();
+ pipe.CreateGraphicsPipeline();
+
+ // Make calls to valid commands but without the drawIndirectCount feature set
+ m_commandBuffer->begin();
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-None-02836");
+ vk::CmdDrawIndirectCount(m_commandBuffer->handle(), indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
+ sizeof(VkDrawIndirectCommand));
+ m_errorMonitor->VerifyFound();
+
+ vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-None-02837");
+ vk::CmdDrawIndexedIndirectCount(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
+ sizeof(VkDrawIndexedIndirectCommand));
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->EndRenderPass();
+ m_commandBuffer->end();
+}
+
TEST_F(VkLayerTest, ExclusiveScissorNV) {
TEST_DESCRIPTION("Test VK_NV_scissor_exclusive with multiViewport disabled.");
@@ -5106,13 +5501,7 @@
{"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02028",
"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
- {1,
- viewports,
- 1,
- scissors,
- 1,
- nullptr,
- {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-pDynamicStates-02030"}},
+ {1, viewports, 1, scissors, 1, nullptr, {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04056"}},
};
for (const auto &test_case : test_cases) {
@@ -5218,7 +5607,7 @@
}
}
- if (DeviceIsMockICD() || DeviceSimulation()) {
+ if (IsPlatform(kMockICD) || DeviceSimulation()) {
printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
return;
}
@@ -5327,42 +5716,42 @@
m_commandBuffer->begin();
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-02107");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04095");
vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
m_errorMonitor->VerifyFound();
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-02108");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04096");
vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
m_errorMonitor->VerifyFound();
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-02109");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04095");
vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
m_errorMonitor->VerifyFound();
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-02110");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04096");
vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
m_errorMonitor->VerifyFound();
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-02111");
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-02113");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04095");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04095");
vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
m_errorMonitor->VerifyFound();
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-02112");
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-02114");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04096");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04096");
vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV,
VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
m_errorMonitor->VerifyFound();
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-02115");
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-02117");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04095");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04095");
vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0,
0, nullptr, 0, nullptr, 0, nullptr);
m_errorMonitor->VerifyFound();
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-02116");
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-02118");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04096");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04096");
vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0,
0, nullptr, 0, nullptr, 0, nullptr);
m_errorMonitor->VerifyFound();
@@ -5611,3 +6000,574 @@
vkCreateSamplerYcbcrConversionFunction(m_device->handle(), &ycbcr_create_info, nullptr, &conversions);
m_errorMonitor->VerifyFound();
}
+
+TEST_F(VkLayerTest, TransformFeedbackFeatureEnabled) {
+ TEST_DESCRIPTION("VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled");
+
+ if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
+ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
+ printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
+ return;
+ }
+ m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
+
+ {
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+
+ auto tf_features = lvl_init_struct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
+ auto pd_features = lvl_init_struct<VkPhysicalDeviceFeatures2>(&tf_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
+
+ if (!tf_features.transformFeedback) {
+ printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
+ return;
+ }
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ {
+ auto vkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(
+ m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
+ ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
+
+ auto info = lvl_init_struct<VkBufferCreateInfo>();
+ info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
+ info.size = 4;
+ VkBufferObj buffer;
+ buffer.init(*m_device, info);
+ VkDeviceSize offsets[1]{};
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-transformFeedback-02355");
+ vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer.handle(), offsets, nullptr);
+ m_errorMonitor->VerifyFound();
+ }
+
+ {
+ auto vkCmdBeginTransformFeedbackEXT =
+ (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
+ ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-transformFeedback-02366");
+ vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
+ m_errorMonitor->VerifyFound();
+ }
+
+ {
+ auto vkCmdEndTransformFeedbackEXT =
+ (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
+ ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-transformFeedback-02374");
+ m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-None-02375");
+ vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
+ m_errorMonitor->VerifyFound();
+ }
+}
+
+TEST_F(VkLayerTest, TransformFeedbackCmdBindTransformFeedbackBuffersEXT) {
+ TEST_DESCRIPTION("Submit invalid arguments to vkCmdBindTransformFeedbackBuffersEXT");
+
+ if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
+ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
+ printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
+ return;
+ }
+ m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
+
+ {
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+
+ auto tf_features = lvl_init_struct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
+ auto pd_features = lvl_init_struct<VkPhysicalDeviceFeatures2>(&tf_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
+
+ if (!tf_features.transformFeedback) {
+ printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ auto vkCmdBindTransformFeedbackBuffersEXT =
+ (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
+ ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
+
+ {
+ auto tf_properties = lvl_init_struct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
+ auto pd_properties = lvl_init_struct<VkPhysicalDeviceProperties2>(&tf_properties);
+ vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
+
+ auto info = lvl_init_struct<VkBufferCreateInfo>();
+ info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
+ info.size = 8;
+ VkBufferObj const buffer_obj(*m_device, info);
+
+ // Request a firstBinding that is too large.
+ {
+ auto const firstBinding = tf_properties.maxTransformFeedbackBuffers;
+ VkDeviceSize const offsets[1]{};
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02356");
+ m_errorMonitor->SetUnexpectedError("VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
+ vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), firstBinding, 1, &buffer_obj.handle(), offsets,
+ nullptr);
+ m_errorMonitor->VerifyFound();
+ }
+
+ // Request too many bindings.
+ if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
+ auto const bindingCount = tf_properties.maxTransformFeedbackBuffers + 1;
+ std::vector<VkBuffer> buffers(bindingCount, buffer_obj.handle());
+
+ std::vector<VkDeviceSize> offsets(bindingCount);
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
+ vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, bindingCount, buffers.data(), offsets.data(),
+ nullptr);
+ m_errorMonitor->VerifyFound();
+ }
+
+ // Request a size that is larger than the maximum size.
+ if (tf_properties.maxTransformFeedbackBufferSize < std::numeric_limits<VkDeviceSize>::max()) {
+ VkDeviceSize const offsets[1]{};
+ VkDeviceSize const sizes[1]{tf_properties.maxTransformFeedbackBufferSize + 1};
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSize-02361");
+ vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
+ m_errorMonitor->VerifyFound();
+ }
+ }
+
+ {
+ auto info = lvl_init_struct<VkBufferCreateInfo>();
+ info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
+ info.size = 8;
+ VkBufferObj const buffer_obj(*m_device, info);
+
+ // Request an offset that is too large.
+ {
+ VkDeviceSize const offsets[1]{info.size + 4};
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02358");
+ vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
+ m_errorMonitor->VerifyFound();
+ }
+
+ // Request an offset that is not a multiple of 4.
+ {
+ VkDeviceSize const offsets[1]{1};
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02359");
+ vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
+ m_errorMonitor->VerifyFound();
+ }
+
+ // Request a size that is larger than the buffer's size.
+ {
+ VkDeviceSize const offsets[1]{};
+ VkDeviceSize const sizes[1]{info.size + 1};
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-02362");
+ m_errorMonitor->SetUnexpectedError("VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02363");
+ vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
+ m_errorMonitor->VerifyFound();
+ }
+
+ // Request an offset and size whose sum is larger than the buffer's size.
+ {
+ VkDeviceSize const offsets[1]{4};
+ VkDeviceSize const sizes[1]{info.size - 3};
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02363");
+ vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
+ m_errorMonitor->VerifyFound();
+ }
+
+ // Bind while transform feedback is active.
+ {
+ auto vkCmdBeginTransformFeedbackEXT =
+ (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
+ ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
+ vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
+
+ VkDeviceSize const offsets[1]{};
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-None-02365");
+ vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
+ m_errorMonitor->VerifyFound();
+
+ auto vkCmdEndTransformFeedbackEXT =
+ (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
+ ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
+ vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
+ }
+ }
+
+ // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT.
+ {
+ auto info = lvl_init_struct<VkBufferCreateInfo>();
+ // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
+ info.size = 4;
+ VkBufferObj const buffer_obj(*m_device, info);
+
+ VkDeviceSize const offsets[1]{};
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02360");
+ vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
+ m_errorMonitor->VerifyFound();
+ }
+
+ // Don't bind memory.
+ {
+ VkBuffer buffer{};
+ {
+ auto vkCreateBuffer = (PFN_vkCreateBuffer)vk::GetDeviceProcAddr(m_device->device(), "vkCreateBuffer");
+ ASSERT_TRUE(vkCreateBuffer != nullptr);
+
+ auto info = lvl_init_struct<VkBufferCreateInfo>();
+ info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
+ info.size = 4;
+ vkCreateBuffer(m_device->device(), &info, nullptr, &buffer);
+ }
+
+ VkDeviceSize const offsets[1]{};
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02364");
+ vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer, offsets, nullptr);
+ m_errorMonitor->VerifyFound();
+ }
+}
+
+TEST_F(VkLayerTest, TransformFeedbackCmdBeginTransformFeedbackEXT) {
+ TEST_DESCRIPTION("Submit invalid arguments to vkCmdBeginTransformFeedbackEXT");
+
+ if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
+ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
+ printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
+ return;
+ }
+ m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
+
+ {
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+
+ auto tf_features = lvl_init_struct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
+ auto pd_features = lvl_init_struct<VkPhysicalDeviceFeatures2>(&tf_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
+
+ if (!tf_features.transformFeedback) {
+ printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ auto vkCmdBeginTransformFeedbackEXT =
+ (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
+ ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
+
+ {
+ auto tf_properties = lvl_init_struct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
+ auto pd_properties = lvl_init_struct<VkPhysicalDeviceProperties2>(&tf_properties);
+ vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
+
+ // Request a firstCounterBuffer that is too large.
+ {
+ auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02368");
+ m_errorMonitor->SetUnexpectedError("VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
+ vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
+ m_errorMonitor->VerifyFound();
+ }
+
+ // Request too many buffers.
+ if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
+ auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
+ vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
+ m_errorMonitor->VerifyFound();
+ }
+ }
+
+ // Request an out-of-bounds location.
+ {
+ auto info = lvl_init_struct<VkBufferCreateInfo>();
+ info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
+ info.size = 4;
+ VkBufferObj const buffer_obj(*m_device, info);
+
+ VkDeviceSize const offsets[1]{1};
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-02370");
+ vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
+ m_errorMonitor->VerifyFound();
+ }
+
+ // Request specific offsets without specifying buffers.
+ {
+ VkDeviceSize const offsets[1]{};
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffer-02371");
+ vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
+ m_errorMonitor->VerifyFound();
+ }
+
+ // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
+ {
+ auto info = lvl_init_struct<VkBufferCreateInfo>();
+ // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
+ info.size = 4;
+ VkBufferObj const buffer_obj(*m_device, info);
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffers-02372");
+ vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
+ m_errorMonitor->VerifyFound();
+ }
+
+ // Begin while transform feedback is active.
+ {
+ vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02367");
+ vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
+ m_errorMonitor->VerifyFound();
+
+ auto vkCmdEndTransformFeedbackEXT =
+ (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
+ ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
+
+ vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
+ }
+}
+
+TEST_F(VkLayerTest, TransformFeedbackCmdEndTransformFeedbackEXT) {
+ TEST_DESCRIPTION("Submit invalid arguments to vkCmdEndTransformFeedbackEXT");
+
+ if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
+ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
+ printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
+ return;
+ }
+ m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
+
+ {
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+
+ auto tf_features = lvl_init_struct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
+ auto pd_features = lvl_init_struct<VkPhysicalDeviceFeatures2>(&tf_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
+
+ if (!tf_features.transformFeedback) {
+ printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ auto vkCmdEndTransformFeedbackEXT =
+ (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
+ ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
+
+ {
+ // Activate transform feedback.
+ auto vkCmdBeginTransformFeedbackEXT =
+ (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
+ ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
+ vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
+
+ {
+ auto tf_properties = lvl_init_struct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
+ auto pd_properties = lvl_init_struct<VkPhysicalDeviceProperties2>(&tf_properties);
+ vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
+
+ // Request a firstCounterBuffer that is too large.
+ {
+ auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02376");
+ m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
+ vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
+ m_errorMonitor->VerifyFound();
+ }
+
+ // Request too many buffers.
+ if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
+ auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
+ vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
+ m_errorMonitor->VerifyFound();
+ }
+ }
+
+ // Request an out-of-bounds location.
+ {
+ auto info = lvl_init_struct<VkBufferCreateInfo>();
+ info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
+ info.size = 4;
+ VkBufferObj const buffer_obj(*m_device, info);
+
+ VkDeviceSize const offsets[1]{1};
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-02378");
+ vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
+ m_errorMonitor->VerifyFound();
+ }
+
+ // Request specific offsets without specifying buffers.
+ {
+ VkDeviceSize const offsets[1]{};
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffer-02379");
+ vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
+ m_errorMonitor->VerifyFound();
+ }
+
+ // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
+ {
+ auto info = lvl_init_struct<VkBufferCreateInfo>();
+ // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
+ info.size = 4;
+ VkBufferObj const buffer_obj(*m_device, info);
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffers-02380");
+ vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
+ m_errorMonitor->VerifyFound();
+ }
+ }
+
+ // End while transform feedback is inactive.
+ {
+ vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-None-02375");
+ vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
+ m_errorMonitor->VerifyFound();
+ }
+}
+
+TEST_F(VkLayerTest, UnprotectedIndirectCommands) {
+ TEST_DESCRIPTION("Test making indirect commands in unprotected command buffers");
+
+ // protect memory added in VK 1.1
+ SetTargetApiVersion(VK_API_VERSION_1_1);
+
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
+ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+
+ auto protected_memory_features = lvl_init_struct<VkPhysicalDeviceProtectedMemoryFeatures>();
+ auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+
+ if (protected_memory_features.protectedMemory == VK_FALSE) {
+ printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
+ return;
+ };
+
+ // Turns m_commandBuffer into a protected command buffer
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_PROTECTED_BIT));
+
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+ if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
+ printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
+ return;
+ }
+
+ VkBufferObj indirect_buffer;
+ indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
+ VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
+
+ VkBufferObj indexed_indirect_buffer;
+ indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
+ VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
+
+ VkBufferObj index_buffer;
+ index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
+
+ CreatePipelineHelper pipe(*this);
+ pipe.InitInfo();
+ pipe.InitState();
+ pipe.CreateGraphicsPipeline();
+
+ m_commandBuffer->begin();
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-commandBuffer-02711");
+ vk::CmdDrawIndirect(m_commandBuffer->handle(), indirect_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
+ m_errorMonitor->VerifyFound();
+
+ vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711");
+ vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, 1,
+ sizeof(VkDrawIndexedIndirectCommand));
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->EndRenderPass();
+ m_commandBuffer->end();
+}
diff --git a/tests/vklayertests_descriptor_renderpass_framebuffer.cpp b/tests/vklayertests_descriptor_renderpass_framebuffer.cpp
index 5f88338..f1d0eef 100644
--- a/tests/vklayertests_descriptor_renderpass_framebuffer.cpp
+++ b/tests/vklayertests_descriptor_renderpass_framebuffer.cpp
@@ -27,1531 +27,11 @@
#include "cast_utils.h"
#include "layer_validation_tests.h"
-TEST_F(VkLayerTest, GpuValidationArrayOOBGraphicsShaders) {
+TEST_F(VkLayerTest, ValidationArrayOOBRayTracingShaders) {
TEST_DESCRIPTION(
- "GPU validation: Verify detection of out-of-bounds descriptor array indexing and use of uninitialized descriptors.");
-
- VkValidationFeatureEnableEXT enables[] = {VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT};
- VkValidationFeaturesEXT features = {};
- features.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
- features.enabledValidationFeatureCount = 1;
- features.pEnabledValidationFeatures = enables;
- bool descriptor_indexing = CheckDescriptorIndexingSupportAndInitFramework(this, m_instance_extension_names,
- m_device_extension_names, &features, m_errorMonitor);
- if (DeviceIsMockICD() || DeviceSimulation()) {
- printf("%s GPU-Assisted validation test requires a driver that can draw.\n", kSkipPrefix);
- return;
- }
-
- VkPhysicalDeviceFeatures2KHR features2 = {};
- auto indexing_features = lvl_init_struct<VkPhysicalDeviceDescriptorIndexingFeaturesEXT>();
- if (descriptor_indexing) {
- PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
- (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
- ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
-
- features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&indexing_features);
- vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
-
- if (!indexing_features.runtimeDescriptorArray || !indexing_features.descriptorBindingSampledImageUpdateAfterBind ||
- !indexing_features.descriptorBindingPartiallyBound || !indexing_features.descriptorBindingVariableDescriptorCount ||
- !indexing_features.shaderSampledImageArrayNonUniformIndexing ||
- !indexing_features.shaderStorageBufferArrayNonUniformIndexing) {
- printf("Not all descriptor indexing features supported, skipping descriptor indexing tests\n");
- descriptor_indexing = false;
- }
- }
-
- VkCommandPoolCreateFlags pool_flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
- ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, pool_flags));
- if (m_device->props.apiVersion < VK_API_VERSION_1_1) {
- printf("%s GPU-Assisted validation test requires Vulkan 1.1+.\n", kSkipPrefix);
- return;
- }
- ASSERT_NO_FATAL_FAILURE(InitViewport());
- ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-
- // Make a uniform buffer to be passed to the shader that contains the invalid array index.
- uint32_t qfi = 0;
- VkBufferCreateInfo bci = {};
- bci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
- bci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
- bci.size = 1024;
- bci.queueFamilyIndexCount = 1;
- bci.pQueueFamilyIndices = &qfi;
- VkBufferObj buffer0;
- VkMemoryPropertyFlags mem_props = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
- buffer0.init(*m_device, bci, mem_props);
-
- bci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
- // Make another buffer to populate the buffer array to be indexed
- VkBufferObj buffer1;
- buffer1.init(*m_device, bci, mem_props);
-
- void *layout_pnext = nullptr;
- void *allocate_pnext = nullptr;
- auto pool_create_flags = 0;
- auto layout_create_flags = 0;
- VkDescriptorBindingFlagsEXT ds_binding_flags[2] = {};
- VkDescriptorSetLayoutBindingFlagsCreateInfoEXT layout_createinfo_binding_flags[1] = {};
- if (descriptor_indexing) {
- ds_binding_flags[0] = 0;
- ds_binding_flags[1] = VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT | VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT;
-
- layout_createinfo_binding_flags[0].sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT;
- layout_createinfo_binding_flags[0].pNext = NULL;
- layout_createinfo_binding_flags[0].bindingCount = 2;
- layout_createinfo_binding_flags[0].pBindingFlags = ds_binding_flags;
- layout_create_flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT;
- pool_create_flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT;
- layout_pnext = layout_createinfo_binding_flags;
- }
-
- // Prepare descriptors
- OneOffDescriptorSet descriptor_set(m_device,
- {
- {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr},
- {1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 6, VK_SHADER_STAGE_ALL, nullptr},
- },
- layout_create_flags, layout_pnext, pool_create_flags);
-
- VkDescriptorSetVariableDescriptorCountAllocateInfoEXT variable_count = {};
- uint32_t desc_counts;
- if (descriptor_indexing) {
- layout_create_flags = 0;
- pool_create_flags = 0;
- ds_binding_flags[1] =
- VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT | VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT;
- desc_counts = 6; // We'll reserve 8 spaces in the layout, but the descriptor will only use 6
- variable_count.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT;
- variable_count.descriptorSetCount = 1;
- variable_count.pDescriptorCounts = &desc_counts;
- allocate_pnext = &variable_count;
- }
-
- OneOffDescriptorSet descriptor_set_variable(m_device,
- {
- {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr},
- {1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 8, VK_SHADER_STAGE_ALL, nullptr},
- },
- layout_create_flags, layout_pnext, pool_create_flags, allocate_pnext);
-
- const VkPipelineLayoutObj pipeline_layout(m_device, {&descriptor_set.layout_});
- const VkPipelineLayoutObj pipeline_layout_variable(m_device, {&descriptor_set_variable.layout_});
- VkTextureObj texture(m_device, nullptr);
- VkSamplerObj sampler(m_device);
-
- VkDescriptorBufferInfo buffer_info[1] = {};
- buffer_info[0].buffer = buffer0.handle();
- buffer_info[0].offset = 0;
- buffer_info[0].range = sizeof(uint32_t);
-
- VkDescriptorImageInfo image_info[6] = {};
- for (int i = 0; i < 6; i++) {
- image_info[i] = texture.DescriptorImageInfo();
- image_info[i].sampler = sampler.handle();
- image_info[i].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
- }
-
- VkWriteDescriptorSet descriptor_writes[2] = {};
- descriptor_writes[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
- descriptor_writes[0].dstSet = descriptor_set.set_; // descriptor_set;
- descriptor_writes[0].dstBinding = 0;
- descriptor_writes[0].descriptorCount = 1;
- descriptor_writes[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
- descriptor_writes[0].pBufferInfo = buffer_info;
- descriptor_writes[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
- descriptor_writes[1].dstSet = descriptor_set.set_; // descriptor_set;
- descriptor_writes[1].dstBinding = 1;
- if (descriptor_indexing)
- descriptor_writes[1].descriptorCount = 5; // Intentionally don't write index 5
- else
- descriptor_writes[1].descriptorCount = 6;
- descriptor_writes[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
- descriptor_writes[1].pImageInfo = image_info;
- vk::UpdateDescriptorSets(m_device->device(), 2, descriptor_writes, 0, NULL);
- if (descriptor_indexing) {
- descriptor_writes[0].dstSet = descriptor_set_variable.set_;
- descriptor_writes[1].dstSet = descriptor_set_variable.set_;
- vk::UpdateDescriptorSets(m_device->device(), 2, descriptor_writes, 0, NULL);
- }
-
- ds_binding_flags[0] = 0;
- ds_binding_flags[1] = VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT;
-
- // Resources for buffer tests
- OneOffDescriptorSet descriptor_set_buffer(m_device,
- {
- {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr},
- {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 6, VK_SHADER_STAGE_ALL, nullptr},
- },
- 0, layout_pnext, 0);
-
- const VkPipelineLayoutObj pipeline_layout_buffer(m_device, {&descriptor_set_buffer.layout_});
-
- VkDescriptorBufferInfo buffer_test_buffer_info[7] = {};
- buffer_test_buffer_info[0].buffer = buffer0.handle();
- buffer_test_buffer_info[0].offset = 0;
- buffer_test_buffer_info[0].range = sizeof(uint32_t);
-
- for (int i = 1; i < 7; i++) {
- buffer_test_buffer_info[i].buffer = buffer1.handle();
- buffer_test_buffer_info[i].offset = 0;
- buffer_test_buffer_info[i].range = 4 * sizeof(float);
- }
-
- if (descriptor_indexing) {
- VkWriteDescriptorSet buffer_descriptor_writes[2] = {};
- buffer_descriptor_writes[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
- buffer_descriptor_writes[0].dstSet = descriptor_set_buffer.set_; // descriptor_set;
- buffer_descriptor_writes[0].dstBinding = 0;
- buffer_descriptor_writes[0].descriptorCount = 1;
- buffer_descriptor_writes[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
- buffer_descriptor_writes[0].pBufferInfo = buffer_test_buffer_info;
- buffer_descriptor_writes[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
- buffer_descriptor_writes[1].dstSet = descriptor_set_buffer.set_; // descriptor_set;
- buffer_descriptor_writes[1].dstBinding = 1;
- buffer_descriptor_writes[1].descriptorCount = 5; // Intentionally don't write index 5
- buffer_descriptor_writes[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
- buffer_descriptor_writes[1].pBufferInfo = &buffer_test_buffer_info[1];
- vk::UpdateDescriptorSets(m_device->device(), 2, buffer_descriptor_writes, 0, NULL);
- }
-
- // Shader programs for array OOB test in vertex stage:
- // - The vertex shader fetches the invalid index from the uniform buffer and uses it to make an invalid index into another
- // array.
- char const *vsSource_vert =
- "#version 450\n"
- "\n"
- "layout(std140, set = 0, binding = 0) uniform foo { uint tex_index[1]; } uniform_index_buffer;\n"
- "layout(set = 0, binding = 1) uniform sampler2D tex[6];\n"
- "vec2 vertices[3];\n"
- "void main(){\n"
- " vertices[0] = vec2(-1.0, -1.0);\n"
- " vertices[1] = vec2( 1.0, -1.0);\n"
- " vertices[2] = vec2( 0.0, 1.0);\n"
- " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
- " gl_Position += 1e-30 * texture(tex[uniform_index_buffer.tex_index[0]], vec2(0, 0));\n"
- "}\n";
- char const *fsSource_vert =
- "#version 450\n"
- "\n"
- "layout(set = 0, binding = 1) uniform sampler2D tex[6];\n"
- "layout(location = 0) out vec4 uFragColor;\n"
- "void main(){\n"
- " uFragColor = texture(tex[0], vec2(0, 0));\n"
- "}\n";
-
- // Shader programs for array OOB test in fragment stage:
- // - The vertex shader fetches the invalid index from the uniform buffer and passes it to the fragment shader.
- // - The fragment shader makes the invalid array access.
- char const *vsSource_frag =
- "#version 450\n"
- "\n"
- "layout(std140, binding = 0) uniform foo { uint tex_index[1]; } uniform_index_buffer;\n"
- "layout(location = 0) out flat uint index;\n"
- "vec2 vertices[3];\n"
- "void main(){\n"
- " vertices[0] = vec2(-1.0, -1.0);\n"
- " vertices[1] = vec2( 1.0, -1.0);\n"
- " vertices[2] = vec2( 0.0, 1.0);\n"
- " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
- " index = uniform_index_buffer.tex_index[0];\n"
- "}\n";
- char const *fsSource_frag =
- "#version 450\n"
- "\n"
- "layout(set = 0, binding = 1) uniform sampler2D tex[6];\n"
- "layout(location = 0) out vec4 uFragColor;\n"
- "layout(location = 0) in flat uint index;\n"
- "void main(){\n"
- " uFragColor = texture(tex[index], vec2(0, 0));\n"
- "}\n";
- char const *fsSource_frag_runtime =
- "#version 450\n"
- "#extension GL_EXT_nonuniform_qualifier : enable\n"
- "\n"
- "layout(set = 0, binding = 1) uniform sampler2D tex[];\n"
- "layout(location = 0) out vec4 uFragColor;\n"
- "layout(location = 0) in flat uint index;\n"
- "void main(){\n"
- " uFragColor = texture(tex[index], vec2(0, 0));\n"
- "}\n";
- char const *fsSource_buffer =
- "#version 450\n"
- "#extension GL_EXT_nonuniform_qualifier : enable\n "
- "\n"
- "layout(set = 0, binding = 1) buffer foo { vec4 val; } colors[];\n"
- "layout(location = 0) out vec4 uFragColor;\n"
- "layout(location = 0) in flat uint index;\n"
- "void main(){\n"
- " uFragColor = colors[index].val;\n"
- "}\n";
- char const *gsSource =
- "#version 450\n"
- "#extension GL_EXT_nonuniform_qualifier : enable\n "
- "layout(triangles) in;\n"
- "layout(triangle_strip, max_vertices=3) out;\n"
- "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
- "layout(std140, set = 0, binding = 0) uniform ufoo { uint index; } uniform_index_buffer;\n"
- "layout(set = 0, binding = 1) buffer bfoo { vec4 val; } adds[];\n"
- "void main() {\n"
- " gl_Position = gs_in[0].x + adds[uniform_index_buffer.index].val.x;\n"
- " EmitVertex();\n"
- "}\n";
- static const char *tesSource =
- "#version 450\n"
- "#extension GL_EXT_nonuniform_qualifier : enable\n "
- "layout(std140, set = 0, binding = 0) uniform ufoo { uint index; } uniform_index_buffer;\n"
- "layout(set = 0, binding = 1) buffer bfoo { vec4 val; } adds[];\n"
- "layout(triangles, equal_spacing, cw) in;\n"
- "void main() {\n"
- " gl_Position = adds[uniform_index_buffer.index].val;\n"
- "}\n";
-
- struct TestCase {
- char const *vertex_source;
- char const *fragment_source;
- char const *geometry_source;
- char const *tess_ctrl_source;
- char const *tess_eval_source;
- bool debug;
- const VkPipelineLayoutObj *pipeline_layout;
- const OneOffDescriptorSet *descriptor_set;
- uint32_t index;
- char const *expected_error;
- };
-
- std::vector<TestCase> tests;
- tests.push_back({vsSource_vert, fsSource_vert, nullptr, nullptr, nullptr, false, &pipeline_layout, &descriptor_set, 25,
- "Index of 25 used to index descriptor array of length 6."});
- tests.push_back({vsSource_frag, fsSource_frag, nullptr, nullptr, nullptr, false, &pipeline_layout, &descriptor_set, 25,
- "Index of 25 used to index descriptor array of length 6."});
-#if !defined(ANDROID)
- // The Android test framework uses shaderc for online compilations. Even when configured to compile with debug info,
- // shaderc seems to drop the OpLine instructions from the shader binary. This causes the following two tests to fail
- // on Android platforms. Skip these tests until the shaderc issue is understood/resolved.
- tests.push_back({vsSource_vert, fsSource_vert, nullptr, nullptr, nullptr, true, &pipeline_layout, &descriptor_set, 25,
- "gl_Position += 1e-30 * texture(tex[uniform_index_buffer.tex_index[0]], vec2(0, 0));"});
- tests.push_back({vsSource_frag, fsSource_frag, nullptr, nullptr, nullptr, true, &pipeline_layout, &descriptor_set, 25,
- "uFragColor = texture(tex[index], vec2(0, 0));"});
-#endif
- if (descriptor_indexing) {
- tests.push_back({vsSource_frag, fsSource_frag_runtime, nullptr, nullptr, nullptr, false, &pipeline_layout, &descriptor_set,
- 25, "Index of 25 used to index descriptor array of length 6."});
- tests.push_back({vsSource_frag, fsSource_frag_runtime, nullptr, nullptr, nullptr, false, &pipeline_layout, &descriptor_set,
- 5, "Descriptor index 5 is uninitialized"});
- // Pick 6 below because it is less than the maximum specified, but more than the actual specified
- tests.push_back({vsSource_frag, fsSource_frag_runtime, nullptr, nullptr, nullptr, false, &pipeline_layout_variable,
- &descriptor_set_variable, 6, "Index of 6 used to index descriptor array of length 6."});
- tests.push_back({vsSource_frag, fsSource_frag_runtime, nullptr, nullptr, nullptr, false, &pipeline_layout_variable,
- &descriptor_set_variable, 5, "Descriptor index 5 is uninitialized"});
- tests.push_back({vsSource_frag, fsSource_buffer, nullptr, nullptr, nullptr, false, &pipeline_layout_buffer,
- &descriptor_set_buffer, 25, "Index of 25 used to index descriptor array of length 6."});
- tests.push_back({vsSource_frag, fsSource_buffer, nullptr, nullptr, nullptr, false, &pipeline_layout_buffer,
- &descriptor_set_buffer, 5, "Descriptor index 5 is uninitialized"});
- if (m_device->phy().features().geometryShader) {
- // OOB Geometry
- tests.push_back({bindStateVertShaderText, bindStateFragShaderText, gsSource, nullptr, nullptr, false,
- &pipeline_layout_buffer, &descriptor_set_buffer, 25, "Stage = Geometry"});
- // Uninitialized Geometry
- tests.push_back({bindStateVertShaderText, bindStateFragShaderText, gsSource, nullptr, nullptr, false,
- &pipeline_layout_buffer, &descriptor_set_buffer, 5, "Stage = Geometry"});
- }
- if (m_device->phy().features().tessellationShader) {
- tests.push_back({bindStateVertShaderText, bindStateFragShaderText, nullptr, bindStateTscShaderText, tesSource, false,
- &pipeline_layout_buffer, &descriptor_set_buffer, 25, "Stage = Tessellation Eval"});
- tests.push_back({bindStateVertShaderText, bindStateFragShaderText, nullptr, bindStateTscShaderText, tesSource, false,
- &pipeline_layout_buffer, &descriptor_set_buffer, 5, "Stage = Tessellation Eval"});
- }
- }
-
- VkViewport viewport = m_viewports[0];
- VkRect2D scissors = m_scissors[0];
-
- VkSubmitInfo submit_info = {};
- submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
- submit_info.commandBufferCount = 1;
- submit_info.pCommandBuffers = &m_commandBuffer->handle();
-
- for (const auto &iter : tests) {
- VkResult err;
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, iter.expected_error);
- VkShaderObj vs(m_device, iter.vertex_source, VK_SHADER_STAGE_VERTEX_BIT, this, "main", iter.debug);
- VkShaderObj fs(m_device, iter.fragment_source, VK_SHADER_STAGE_FRAGMENT_BIT, this, "main", iter.debug);
- VkShaderObj *gs = nullptr;
- VkShaderObj *tcs = nullptr;
- VkShaderObj *tes = nullptr;
- VkPipelineObj pipe(m_device);
- pipe.AddShader(&vs);
- pipe.AddShader(&fs);
- if (iter.geometry_source) {
- gs = new VkShaderObj(m_device, iter.geometry_source, VK_SHADER_STAGE_GEOMETRY_BIT, this, "main", iter.debug);
- pipe.AddShader(gs);
- }
- if (iter.tess_ctrl_source && iter.tess_eval_source) {
- tcs = new VkShaderObj(m_device, iter.tess_ctrl_source, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this, "main",
- iter.debug);
- tes = new VkShaderObj(m_device, iter.tess_eval_source, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this, "main",
- iter.debug);
- pipe.AddShader(tcs);
- pipe.AddShader(tes);
- VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
- VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
- VkPipelineTessellationDomainOriginStateCreateInfo tessellationDomainOriginStateInfo = {
- VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO, VK_NULL_HANDLE,
- VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT};
-
- VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
- &tessellationDomainOriginStateInfo, 0, 3};
- pipe.SetTessellation(&tsci);
- pipe.SetInputAssembly(&iasci);
- }
- pipe.AddDefaultColorAttachment();
- err = pipe.CreateVKPipeline(iter.pipeline_layout->handle(), renderPass());
- ASSERT_VK_SUCCESS(err);
- m_commandBuffer->begin();
- m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
- vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
- vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, iter.pipeline_layout->handle(), 0, 1,
- &iter.descriptor_set->set_, 0, nullptr);
- vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
- vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissors);
- vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
- vk::CmdEndRenderPass(m_commandBuffer->handle());
- m_commandBuffer->end();
- uint32_t *data = (uint32_t *)buffer0.memory().map();
- data[0] = iter.index;
- buffer0.memory().unmap();
-
- vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
- vk::QueueWaitIdle(m_device->m_queue);
- m_errorMonitor->VerifyFound();
- if (gs) {
- delete gs;
- }
- if (tcs && tes) {
- delete tcs;
- delete tes;
- }
- }
- auto c_queue = m_device->GetDefaultComputeQueue();
- if (c_queue && descriptor_indexing) {
- char const *csSource =
- "#version 450\n"
- "#extension GL_EXT_nonuniform_qualifier : enable\n "
- "layout(set = 0, binding = 0) uniform ufoo { uint index; } u_index;"
- "layout(set = 0, binding = 1) buffer StorageBuffer {\n"
- " uint data;\n"
- "} Data[];\n"
- "void main() {\n"
- " Data[(u_index.index - 1)].data = Data[u_index.index].data;\n"
- "}\n";
-
- auto shader_module = new VkShaderObj(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
-
- VkPipelineShaderStageCreateInfo stage;
- stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
- stage.pNext = nullptr;
- stage.flags = 0;
- stage.stage = VK_SHADER_STAGE_COMPUTE_BIT;
- stage.module = shader_module->handle();
- stage.pName = "main";
- stage.pSpecializationInfo = nullptr;
-
- // CreateComputePipelines
- VkComputePipelineCreateInfo pipeline_info = {};
- pipeline_info.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO;
- pipeline_info.pNext = nullptr;
- pipeline_info.flags = 0;
- pipeline_info.layout = pipeline_layout_buffer.handle();
- pipeline_info.basePipelineHandle = VK_NULL_HANDLE;
- pipeline_info.basePipelineIndex = -1;
- pipeline_info.stage = stage;
-
- VkPipeline c_pipeline;
- vk::CreateComputePipelines(device(), VK_NULL_HANDLE, 1, &pipeline_info, nullptr, &c_pipeline);
- VkCommandBufferBeginInfo begin_info = {};
- VkCommandBufferInheritanceInfo hinfo = {};
- hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
- begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
- begin_info.pInheritanceInfo = &hinfo;
-
- m_commandBuffer->begin(&begin_info);
- vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_COMPUTE, c_pipeline);
- vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_COMPUTE, pipeline_layout_buffer.handle(), 0, 1,
- &descriptor_set_buffer.set_, 0, nullptr);
- vk::CmdDispatch(m_commandBuffer->handle(), 1, 1, 1);
- m_commandBuffer->end();
-
- // Uninitialized
- uint32_t *data = (uint32_t *)buffer0.memory().map();
- data[0] = 5;
- buffer0.memory().unmap();
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Stage = Compute");
- vk::QueueSubmit(c_queue->handle(), 1, &submit_info, VK_NULL_HANDLE);
- vk::QueueWaitIdle(m_device->m_queue);
- m_errorMonitor->VerifyFound();
- // Out of Bounds
- data = (uint32_t *)buffer0.memory().map();
- data[0] = 25;
- buffer0.memory().unmap();
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Stage = Compute");
- vk::QueueSubmit(c_queue->handle(), 1, &submit_info, VK_NULL_HANDLE);
- vk::QueueWaitIdle(m_device->m_queue);
- m_errorMonitor->VerifyFound();
- vk::DestroyPipeline(m_device->handle(), c_pipeline, NULL);
- vk::DestroyShaderModule(m_device->handle(), shader_module->handle(), NULL);
- }
- return;
-}
-
-TEST_F(VkLayerTest, GpuBufferDeviceAddressOOB) {
- bool supported = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
- m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
-
- VkValidationFeatureEnableEXT enables[] = {VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT};
- VkValidationFeaturesEXT features = {};
- features.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
- features.enabledValidationFeatureCount = 1;
- features.pEnabledValidationFeatures = enables;
- InitFramework(m_errorMonitor, &features);
-
- if (DeviceIsMockICD() || DeviceSimulation()) {
- printf("%s GPU-Assisted validation test requires a driver that can draw.\n", kSkipPrefix);
- return;
- }
-
- supported = supported && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME);
- m_device_extension_names.push_back(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME);
-
- VkPhysicalDeviceFeatures2KHR features2 = {};
- auto bda_features = lvl_init_struct<VkPhysicalDeviceBufferDeviceAddressFeaturesKHR>();
- PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
- (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
- ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
-
- features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&bda_features);
- vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
- supported = supported && bda_features.bufferDeviceAddress;
-
- if (!supported) {
- printf("%s Buffer Device Address feature not supported, skipping test\n", kSkipPrefix);
- return;
- }
- VkCommandPoolCreateFlags pool_flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
- ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, pool_flags));
- if (m_device->props.apiVersion < VK_API_VERSION_1_1) {
- printf("%s GPU-Assisted validation test requires Vulkan 1.1+.\n", kSkipPrefix);
- return;
- }
- ASSERT_NO_FATAL_FAILURE(InitViewport());
- ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-
- // Make a uniform buffer to be passed to the shader that contains the pointer and write count
- uint32_t qfi = 0;
- VkBufferCreateInfo bci = {};
- bci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
- bci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
- bci.size = 8;
- bci.queueFamilyIndexCount = 1;
- bci.pQueueFamilyIndices = &qfi;
- VkBufferObj buffer0;
- VkMemoryPropertyFlags mem_props = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
- buffer0.init(*m_device, bci, mem_props);
-
- // Make another buffer to write to
- bci.usage = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR;
- bci.size = 64; // Buffer should be 16*4 = 64 bytes
- VkBuffer buffer1;
- vk::CreateBuffer(device(), &bci, NULL, &buffer1);
- VkMemoryRequirements buffer_mem_reqs = {};
- vk::GetBufferMemoryRequirements(device(), buffer1, &buffer_mem_reqs);
- VkMemoryAllocateInfo buffer_alloc_info = {};
- buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
- buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
- m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
- VkMemoryAllocateFlagsInfo alloc_flags = {VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO};
- alloc_flags.flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR;
- buffer_alloc_info.pNext = &alloc_flags;
- VkDeviceMemory buffer_mem;
- VkResult err = vk::AllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
- ASSERT_VK_SUCCESS(err);
- vk::BindBufferMemory(m_device->device(), buffer1, buffer_mem, 0);
-
- // Get device address of buffer to write to
- VkBufferDeviceAddressInfoKHR bda_info = {};
- bda_info.sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_KHR;
- bda_info.buffer = buffer1;
- auto vkGetBufferDeviceAddressKHR =
- (PFN_vkGetBufferDeviceAddressKHR)vk::GetDeviceProcAddr(m_device->device(), "vkGetBufferDeviceAddressKHR");
- ASSERT_TRUE(vkGetBufferDeviceAddressKHR != nullptr);
- auto pBuffer = vkGetBufferDeviceAddressKHR(m_device->device(), &bda_info);
-
- OneOffDescriptorSet descriptor_set(m_device, {{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}});
-
- const VkPipelineLayoutObj pipeline_layout(m_device, {&descriptor_set.layout_});
- VkDescriptorBufferInfo buffer_test_buffer_info[2] = {};
- buffer_test_buffer_info[0].buffer = buffer0.handle();
- buffer_test_buffer_info[0].offset = 0;
- buffer_test_buffer_info[0].range = sizeof(uint32_t);
-
- VkWriteDescriptorSet descriptor_writes[1] = {};
- descriptor_writes[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
- descriptor_writes[0].dstSet = descriptor_set.set_;
- descriptor_writes[0].dstBinding = 0;
- descriptor_writes[0].descriptorCount = 1;
- descriptor_writes[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
- descriptor_writes[0].pBufferInfo = buffer_test_buffer_info;
- vk::UpdateDescriptorSets(m_device->device(), 1, descriptor_writes, 0, NULL);
-
- char const *shader_source =
- "#version 450\n"
- "#extension GL_EXT_buffer_reference : enable\n "
- "layout(buffer_reference, buffer_reference_align = 16) buffer bufStruct;\n"
- "layout(set = 0, binding = 0) uniform ufoo {\n"
- " bufStruct data;\n"
- " int nWrites;\n"
- "} u_info;\n"
- "layout(buffer_reference, std140) buffer bufStruct {\n"
- " int a[4];\n"
- "};\n"
- "void main() {\n"
- " for (int i=0; i < u_info.nWrites; ++i) {\n"
- " u_info.data.a[i] = 0xdeadca71;\n"
- " }\n"
- "}\n";
- VkShaderObj vs(m_device, shader_source, VK_SHADER_STAGE_VERTEX_BIT, this, "main", true);
-
- VkViewport viewport = m_viewports[0];
- VkRect2D scissors = m_scissors[0];
-
- VkSubmitInfo submit_info = {};
- submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
- submit_info.commandBufferCount = 1;
- submit_info.pCommandBuffers = &m_commandBuffer->handle();
-
- VkPipelineObj pipe(m_device);
- pipe.AddShader(&vs);
- pipe.AddDefaultColorAttachment();
- err = pipe.CreateVKPipeline(pipeline_layout.handle(), renderPass());
- ASSERT_VK_SUCCESS(err);
-
- VkCommandBufferBeginInfo begin_info = {};
- VkCommandBufferInheritanceInfo hinfo = {};
- hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
- begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
- begin_info.pInheritanceInfo = &hinfo;
-
- m_commandBuffer->begin(&begin_info);
- m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
- vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
- vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
- &descriptor_set.set_, 0, nullptr);
- vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
- vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissors);
- vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
- vk::CmdEndRenderPass(m_commandBuffer->handle());
- m_commandBuffer->end();
-
- // Starting address too low
- VkDeviceAddress *data = (VkDeviceAddress *)buffer0.memory().map();
- data[0] = pBuffer - 16;
- data[1] = 4;
- buffer0.memory().unmap();
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "access out of bounds");
- err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
- ASSERT_VK_SUCCESS(err);
- err = vk::QueueWaitIdle(m_device->m_queue);
- ASSERT_VK_SUCCESS(err);
- m_errorMonitor->VerifyFound();
-
- // Run past the end
- data = (VkDeviceAddress *)buffer0.memory().map();
- data[0] = pBuffer;
- data[1] = 5;
- buffer0.memory().unmap();
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "access out of bounds");
- err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
- ASSERT_VK_SUCCESS(err);
- err = vk::QueueWaitIdle(m_device->m_queue);
- ASSERT_VK_SUCCESS(err);
- m_errorMonitor->VerifyFound();
-
- // Positive test - stay inside buffer
- m_errorMonitor->ExpectSuccess();
- data = (VkDeviceAddress *)buffer0.memory().map();
- data[0] = pBuffer;
- data[1] = 4;
- buffer0.memory().unmap();
- err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
- ASSERT_VK_SUCCESS(err);
- err = vk::QueueWaitIdle(m_device->m_queue);
- ASSERT_VK_SUCCESS(err);
- m_errorMonitor->VerifyNotFound();
- vk::DestroyBuffer(m_device->handle(), buffer1, NULL);
- vk::FreeMemory(m_device->handle(), buffer_mem, NULL);
-}
-
-TEST_F(VkLayerTest, GpuValidationArrayOOBRayTracingShaders) {
- TEST_DESCRIPTION(
- "GPU validation: Verify detection of out-of-bounds descriptor array indexing and use of uninitialized descriptors for "
+ "Core validation: Verify detection of out-of-bounds descriptor array indexing and use of uninitialized descriptors for "
"ray tracing shaders.");
-
- std::array<const char *, 1> required_instance_extensions = {VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME};
- for (auto instance_extension : required_instance_extensions) {
- if (InstanceExtensionSupported(instance_extension)) {
- m_instance_extension_names.push_back(instance_extension);
- } else {
- printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix, instance_extension);
- return;
- }
- }
-
- VkValidationFeatureEnableEXT validation_feature_enables[] = {VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT};
- VkValidationFeaturesEXT validation_features = {};
- validation_features.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
- validation_features.enabledValidationFeatureCount = 1;
- validation_features.pEnabledValidationFeatures = validation_feature_enables;
- bool descriptor_indexing = CheckDescriptorIndexingSupportAndInitFramework(
- this, m_instance_extension_names, m_device_extension_names, &validation_features, m_errorMonitor);
-
- if (DeviceIsMockICD() || DeviceSimulation()) {
- printf("%s Test not supported by MockICD, skipping tests\n", kSkipPrefix);
- return;
- }
-
- std::array<const char *, 2> required_device_extensions = {VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME,
- VK_NV_RAY_TRACING_EXTENSION_NAME};
- for (auto device_extension : required_device_extensions) {
- if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
- m_device_extension_names.push_back(device_extension);
- } else {
- printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
- return;
- }
- }
-
- VkPhysicalDeviceFeatures2KHR features2 = {};
- auto indexing_features = lvl_init_struct<VkPhysicalDeviceDescriptorIndexingFeaturesEXT>();
- if (descriptor_indexing) {
- PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
- (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
- ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
-
- features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&indexing_features);
- vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
-
- if (!indexing_features.runtimeDescriptorArray || !indexing_features.descriptorBindingPartiallyBound ||
- !indexing_features.descriptorBindingSampledImageUpdateAfterBind ||
- !indexing_features.descriptorBindingVariableDescriptorCount) {
- printf("Not all descriptor indexing features supported, skipping descriptor indexing tests\n");
- descriptor_indexing = false;
- }
- }
- VkCommandPoolCreateFlags pool_flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
- ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, pool_flags));
-
- PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
- (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
- ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
-
- auto ray_tracing_properties = lvl_init_struct<VkPhysicalDeviceRayTracingPropertiesNV>();
- auto properties2 = lvl_init_struct<VkPhysicalDeviceProperties2KHR>(&ray_tracing_properties);
- vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
- if (ray_tracing_properties.maxTriangleCount == 0) {
- printf("%s Did not find required ray tracing properties; skipped.\n", kSkipPrefix);
- return;
- }
-
- VkQueue ray_tracing_queue = m_device->m_queue;
- uint32_t ray_tracing_queue_family_index = 0;
-
- // If supported, run on the compute only queue.
- uint32_t compute_only_queue_family_index = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
- if (compute_only_queue_family_index != UINT32_MAX) {
- const auto &compute_only_queues = m_device->queue_family_queues(compute_only_queue_family_index);
- if (!compute_only_queues.empty()) {
- ray_tracing_queue = compute_only_queues[0]->handle();
- ray_tracing_queue_family_index = compute_only_queue_family_index;
- }
- }
-
- VkCommandPoolObj ray_tracing_command_pool(m_device, ray_tracing_queue_family_index,
- VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
- VkCommandBufferObj ray_tracing_command_buffer(m_device, &ray_tracing_command_pool);
-
- struct AABB {
- float min_x;
- float min_y;
- float min_z;
- float max_x;
- float max_y;
- float max_z;
- };
-
- const std::vector<AABB> aabbs = {{-1.0f, -1.0f, -1.0f, +1.0f, +1.0f, +1.0f}};
-
- struct VkGeometryInstanceNV {
- float transform[12];
- uint32_t instanceCustomIndex : 24;
- uint32_t mask : 8;
- uint32_t instanceOffset : 24;
- uint32_t flags : 8;
- uint64_t accelerationStructureHandle;
- };
-
- VkDeviceSize aabb_buffer_size = sizeof(AABB) * aabbs.size();
- VkBufferObj aabb_buffer;
- aabb_buffer.init(*m_device, aabb_buffer_size, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
- VK_BUFFER_USAGE_RAY_TRACING_BIT_NV, {ray_tracing_queue_family_index});
-
- uint8_t *mapped_aabb_buffer_data = (uint8_t *)aabb_buffer.memory().map();
- std::memcpy(mapped_aabb_buffer_data, (uint8_t *)aabbs.data(), static_cast<std::size_t>(aabb_buffer_size));
- aabb_buffer.memory().unmap();
-
- VkGeometryNV geometry = {};
- geometry.sType = VK_STRUCTURE_TYPE_GEOMETRY_NV;
- geometry.geometryType = VK_GEOMETRY_TYPE_AABBS_NV;
- geometry.geometry.triangles = {};
- geometry.geometry.triangles.sType = VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV;
- geometry.geometry.aabbs = {};
- geometry.geometry.aabbs.sType = VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV;
- geometry.geometry.aabbs.aabbData = aabb_buffer.handle();
- geometry.geometry.aabbs.numAABBs = static_cast<uint32_t>(aabbs.size());
- geometry.geometry.aabbs.offset = 0;
- geometry.geometry.aabbs.stride = static_cast<VkDeviceSize>(sizeof(AABB));
- geometry.flags = 0;
-
- VkAccelerationStructureInfoNV bot_level_as_info = {};
- bot_level_as_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
- bot_level_as_info.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV;
- bot_level_as_info.instanceCount = 0;
- bot_level_as_info.geometryCount = 1;
- bot_level_as_info.pGeometries = &geometry;
-
- VkAccelerationStructureCreateInfoNV bot_level_as_create_info = {};
- bot_level_as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
- bot_level_as_create_info.info = bot_level_as_info;
-
- VkAccelerationStructureObj bot_level_as(*m_device, bot_level_as_create_info);
-
- const std::vector<VkGeometryInstanceNV> instances = {
- VkGeometryInstanceNV{
- {
- // clang-format off
- 1.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 1.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 1.0f, 0.0f,
- // clang-format on
- },
- 0,
- 0xFF,
- 0,
- VK_GEOMETRY_INSTANCE_TRIANGLE_CULL_DISABLE_BIT_NV,
- bot_level_as.opaque_handle(),
- },
- };
-
- VkDeviceSize instance_buffer_size = sizeof(VkGeometryInstanceNV) * instances.size();
- VkBufferObj instance_buffer;
- instance_buffer.init(*m_device, instance_buffer_size,
- VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
- VK_BUFFER_USAGE_RAY_TRACING_BIT_NV, {ray_tracing_queue_family_index});
-
- uint8_t *mapped_instance_buffer_data = (uint8_t *)instance_buffer.memory().map();
- std::memcpy(mapped_instance_buffer_data, (uint8_t *)instances.data(), static_cast<std::size_t>(instance_buffer_size));
- instance_buffer.memory().unmap();
-
- VkAccelerationStructureInfoNV top_level_as_info = {};
- top_level_as_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
- top_level_as_info.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV;
- top_level_as_info.instanceCount = 1;
- top_level_as_info.geometryCount = 0;
-
- VkAccelerationStructureCreateInfoNV top_level_as_create_info = {};
- top_level_as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
- top_level_as_create_info.info = top_level_as_info;
-
- VkAccelerationStructureObj top_level_as(*m_device, top_level_as_create_info);
-
- VkDeviceSize scratch_buffer_size = std::max(bot_level_as.build_scratch_memory_requirements().memoryRequirements.size,
- top_level_as.build_scratch_memory_requirements().memoryRequirements.size);
- VkBufferObj scratch_buffer;
- scratch_buffer.init(*m_device, scratch_buffer_size, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_RAY_TRACING_BIT_NV);
-
- ray_tracing_command_buffer.begin();
-
- // Build bot level acceleration structure
- ray_tracing_command_buffer.BuildAccelerationStructure(&bot_level_as, scratch_buffer.handle());
-
- // Barrier to prevent using scratch buffer for top level build before bottom level build finishes
- VkMemoryBarrier memory_barrier = {};
- memory_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
- memory_barrier.srcAccessMask = VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_NV | VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_NV;
- memory_barrier.dstAccessMask = VK_ACCESS_ACCELERATION_STRUCTURE_READ_BIT_NV | VK_ACCESS_ACCELERATION_STRUCTURE_WRITE_BIT_NV;
- ray_tracing_command_buffer.PipelineBarrier(VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_NV,
- VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_NV, 0, 1, &memory_barrier, 0,
- nullptr, 0, nullptr);
-
- // Build top level acceleration structure
- ray_tracing_command_buffer.BuildAccelerationStructure(&top_level_as, scratch_buffer.handle(), instance_buffer.handle());
-
- ray_tracing_command_buffer.end();
-
- VkSubmitInfo submit_info = {};
- submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
- submit_info.commandBufferCount = 1;
- submit_info.pCommandBuffers = &ray_tracing_command_buffer.handle();
- vk::QueueSubmit(ray_tracing_queue, 1, &submit_info, VK_NULL_HANDLE);
- vk::QueueWaitIdle(ray_tracing_queue);
- m_errorMonitor->VerifyNotFound();
-
- VkTextureObj texture(m_device, nullptr);
- VkSamplerObj sampler(m_device);
-
- VkDeviceSize storage_buffer_size = 1024;
- VkBufferObj storage_buffer;
- storage_buffer.init(*m_device, storage_buffer_size, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
- VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, {ray_tracing_queue_family_index});
-
- VkDeviceSize shader_binding_table_buffer_size = ray_tracing_properties.shaderGroupHandleSize * 4ull;
- VkBufferObj shader_binding_table_buffer;
- shader_binding_table_buffer.init(*m_device, shader_binding_table_buffer_size,
- VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
- VK_BUFFER_USAGE_RAY_TRACING_BIT_NV, {ray_tracing_queue_family_index});
-
- // Setup descriptors!
- const VkShaderStageFlags kAllRayTracingStages = VK_SHADER_STAGE_RAYGEN_BIT_NV | VK_SHADER_STAGE_ANY_HIT_BIT_NV |
- VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV | VK_SHADER_STAGE_MISS_BIT_NV |
- VK_SHADER_STAGE_INTERSECTION_BIT_NV | VK_SHADER_STAGE_CALLABLE_BIT_NV;
-
- void *layout_pnext = nullptr;
- void *allocate_pnext = nullptr;
- VkDescriptorPoolCreateFlags pool_create_flags = 0;
- VkDescriptorSetLayoutCreateFlags layout_create_flags = 0;
- VkDescriptorBindingFlagsEXT ds_binding_flags[3] = {};
- VkDescriptorSetLayoutBindingFlagsCreateInfoEXT layout_createinfo_binding_flags[1] = {};
- if (descriptor_indexing) {
- ds_binding_flags[0] = 0;
- ds_binding_flags[1] = 0;
- ds_binding_flags[2] = VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT | VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT;
-
- layout_createinfo_binding_flags[0].sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT;
- layout_createinfo_binding_flags[0].pNext = NULL;
- layout_createinfo_binding_flags[0].bindingCount = 3;
- layout_createinfo_binding_flags[0].pBindingFlags = ds_binding_flags;
- layout_create_flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT;
- pool_create_flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT;
- layout_pnext = layout_createinfo_binding_flags;
- }
-
- // Prepare descriptors
- OneOffDescriptorSet ds(m_device,
- {
- {0, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV, 1, kAllRayTracingStages, nullptr},
- {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, kAllRayTracingStages, nullptr},
- {2, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 6, kAllRayTracingStages, nullptr},
- },
- layout_create_flags, layout_pnext, pool_create_flags);
-
- VkDescriptorSetVariableDescriptorCountAllocateInfoEXT variable_count = {};
- uint32_t desc_counts;
- if (descriptor_indexing) {
- layout_create_flags = 0;
- pool_create_flags = 0;
- ds_binding_flags[2] =
- VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT | VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT;
- desc_counts = 6; // We'll reserve 8 spaces in the layout, but the descriptor will only use 6
- variable_count.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT;
- variable_count.descriptorSetCount = 1;
- variable_count.pDescriptorCounts = &desc_counts;
- allocate_pnext = &variable_count;
- }
-
- OneOffDescriptorSet ds_variable(m_device,
- {
- {0, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV, 1, kAllRayTracingStages, nullptr},
- {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, kAllRayTracingStages, nullptr},
- {2, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 8, kAllRayTracingStages, nullptr},
- },
- layout_create_flags, layout_pnext, pool_create_flags, allocate_pnext);
-
- VkAccelerationStructureNV top_level_as_handle = top_level_as.handle();
- VkWriteDescriptorSetAccelerationStructureNV write_descript_set_as = {};
- write_descript_set_as.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV;
- write_descript_set_as.accelerationStructureCount = 1;
- write_descript_set_as.pAccelerationStructures = &top_level_as_handle;
-
- VkDescriptorBufferInfo descriptor_buffer_info = {};
- descriptor_buffer_info.buffer = storage_buffer.handle();
- descriptor_buffer_info.offset = 0;
- descriptor_buffer_info.range = storage_buffer_size;
-
- VkDescriptorImageInfo descriptor_image_infos[6] = {};
- for (int i = 0; i < 6; i++) {
- descriptor_image_infos[i] = texture.DescriptorImageInfo();
- descriptor_image_infos[i].sampler = sampler.handle();
- descriptor_image_infos[i].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
- }
-
- VkWriteDescriptorSet descriptor_writes[3] = {};
- descriptor_writes[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
- descriptor_writes[0].dstSet = ds.set_;
- descriptor_writes[0].dstBinding = 0;
- descriptor_writes[0].descriptorCount = 1;
- descriptor_writes[0].descriptorType = VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV;
- descriptor_writes[0].pNext = &write_descript_set_as;
-
- descriptor_writes[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
- descriptor_writes[1].dstSet = ds.set_;
- descriptor_writes[1].dstBinding = 1;
- descriptor_writes[1].descriptorCount = 1;
- descriptor_writes[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
- descriptor_writes[1].pBufferInfo = &descriptor_buffer_info;
-
- descriptor_writes[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
- descriptor_writes[2].dstSet = ds.set_;
- descriptor_writes[2].dstBinding = 2;
- if (descriptor_indexing) {
- descriptor_writes[2].descriptorCount = 5; // Intentionally don't write index 5
- } else {
- descriptor_writes[2].descriptorCount = 6;
- }
- descriptor_writes[2].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
- descriptor_writes[2].pImageInfo = descriptor_image_infos;
- vk::UpdateDescriptorSets(m_device->device(), 3, descriptor_writes, 0, NULL);
- if (descriptor_indexing) {
- descriptor_writes[0].dstSet = ds_variable.set_;
- descriptor_writes[1].dstSet = ds_variable.set_;
- descriptor_writes[2].dstSet = ds_variable.set_;
- vk::UpdateDescriptorSets(m_device->device(), 3, descriptor_writes, 0, NULL);
- }
-
- const VkPipelineLayoutObj pipeline_layout(m_device, {&ds.layout_});
- const VkPipelineLayoutObj pipeline_layout_variable(m_device, {&ds_variable.layout_});
-
- const auto SetImagesArrayLength = [](const std::string &shader_template, const std::string &length_str) {
- const std::string to_replace = "IMAGES_ARRAY_LENGTH";
-
- std::string result = shader_template;
- auto position = result.find(to_replace);
- assert(position != std::string::npos);
- result.replace(position, to_replace.length(), length_str);
- return result;
- };
-
- const std::string rgen_source_template = R"(#version 460
- #extension GL_EXT_nonuniform_qualifier : require
- #extension GL_EXT_samplerless_texture_functions : require
- #extension GL_NV_ray_tracing : require
-
- layout(set = 0, binding = 0) uniform accelerationStructureNV topLevelAS;
- layout(set = 0, binding = 1, std430) buffer RayTracingSbo {
- uint rgen_index;
- uint ahit_index;
- uint chit_index;
- uint miss_index;
- uint intr_index;
- uint call_index;
-
- uint rgen_ran;
- uint ahit_ran;
- uint chit_ran;
- uint miss_ran;
- uint intr_ran;
- uint call_ran;
-
- float result1;
- float result2;
- float result3;
- } sbo;
- layout(set = 0, binding = 2) uniform texture2D textures[IMAGES_ARRAY_LENGTH];
-
- layout(location = 0) rayPayloadNV vec3 payload;
- layout(location = 3) callableDataNV vec3 callableData;
-
- void main() {
- sbo.rgen_ran = 1;
-
- executeCallableNV(0, 3);
- sbo.result1 = callableData.x;
-
- vec3 origin = vec3(0.0f, 0.0f, -2.0f);
- vec3 direction = vec3(0.0f, 0.0f, 1.0f);
-
- traceNV(topLevelAS, gl_RayFlagsNoneNV, 0xFF, 0, 1, 0, origin, 0.001, direction, 10000.0, 0);
- sbo.result2 = payload.x;
-
- traceNV(topLevelAS, gl_RayFlagsNoneNV, 0xFF, 0, 1, 0, origin, 0.001, -direction, 10000.0, 0);
- sbo.result3 = payload.x;
-
- if (sbo.rgen_index > 0) {
- // OOB here:
- sbo.result3 = texelFetch(textures[sbo.rgen_index], ivec2(0, 0), 0).x;
- }
- }
- )";
-
- const std::string rgen_source = SetImagesArrayLength(rgen_source_template, "6");
- const std::string rgen_source_runtime = SetImagesArrayLength(rgen_source_template, "");
-
- const std::string ahit_source_template = R"(#version 460
- #extension GL_EXT_nonuniform_qualifier : require
- #extension GL_EXT_samplerless_texture_functions : require
- #extension GL_NV_ray_tracing : require
-
- layout(set = 0, binding = 1, std430) buffer StorageBuffer {
- uint rgen_index;
- uint ahit_index;
- uint chit_index;
- uint miss_index;
- uint intr_index;
- uint call_index;
-
- uint rgen_ran;
- uint ahit_ran;
- uint chit_ran;
- uint miss_ran;
- uint intr_ran;
- uint call_ran;
-
- float result1;
- float result2;
- float result3;
- } sbo;
- layout(set = 0, binding = 2) uniform texture2D textures[IMAGES_ARRAY_LENGTH];
-
- hitAttributeNV vec3 hitValue;
-
- layout(location = 0) rayPayloadInNV vec3 payload;
-
- void main() {
- sbo.ahit_ran = 2;
-
- payload = vec3(0.1234f);
-
- if (sbo.ahit_index > 0) {
- // OOB here:
- payload.x = texelFetch(textures[sbo.ahit_index], ivec2(0, 0), 0).x;
- }
- }
- )";
- const std::string ahit_source = SetImagesArrayLength(ahit_source_template, "6");
- const std::string ahit_source_runtime = SetImagesArrayLength(ahit_source_template, "");
-
- const std::string chit_source_template = R"(#version 460
- #extension GL_EXT_nonuniform_qualifier : require
- #extension GL_EXT_samplerless_texture_functions : require
- #extension GL_NV_ray_tracing : require
-
- layout(set = 0, binding = 1, std430) buffer RayTracingSbo {
- uint rgen_index;
- uint ahit_index;
- uint chit_index;
- uint miss_index;
- uint intr_index;
- uint call_index;
-
- uint rgen_ran;
- uint ahit_ran;
- uint chit_ran;
- uint miss_ran;
- uint intr_ran;
- uint call_ran;
-
- float result1;
- float result2;
- float result3;
- } sbo;
- layout(set = 0, binding = 2) uniform texture2D textures[IMAGES_ARRAY_LENGTH];
-
- layout(location = 0) rayPayloadInNV vec3 payload;
-
- hitAttributeNV vec3 attribs;
-
- void main() {
- sbo.chit_ran = 3;
-
- payload = attribs;
- if (sbo.chit_index > 0) {
- // OOB here:
- payload.x = texelFetch(textures[sbo.chit_index], ivec2(0, 0), 0).x;
- }
- }
- )";
- const std::string chit_source = SetImagesArrayLength(chit_source_template, "6");
- const std::string chit_source_runtime = SetImagesArrayLength(chit_source_template, "");
-
- const std::string miss_source_template = R"(#version 460
- #extension GL_EXT_nonuniform_qualifier : enable
- #extension GL_EXT_samplerless_texture_functions : require
- #extension GL_NV_ray_tracing : require
-
- layout(set = 0, binding = 1, std430) buffer RayTracingSbo {
- uint rgen_index;
- uint ahit_index;
- uint chit_index;
- uint miss_index;
- uint intr_index;
- uint call_index;
-
- uint rgen_ran;
- uint ahit_ran;
- uint chit_ran;
- uint miss_ran;
- uint intr_ran;
- uint call_ran;
-
- float result1;
- float result2;
- float result3;
- } sbo;
- layout(set = 0, binding = 2) uniform texture2D textures[IMAGES_ARRAY_LENGTH];
-
- layout(location = 0) rayPayloadInNV vec3 payload;
-
- void main() {
- sbo.miss_ran = 4;
-
- payload = vec3(1.0, 0.0, 0.0);
-
- if (sbo.miss_index > 0) {
- // OOB here:
- payload.x = texelFetch(textures[sbo.miss_index], ivec2(0, 0), 0).x;
- }
- }
- )";
- const std::string miss_source = SetImagesArrayLength(miss_source_template, "6");
- const std::string miss_source_runtime = SetImagesArrayLength(miss_source_template, "");
-
- const std::string intr_source_template = R"(#version 460
- #extension GL_EXT_nonuniform_qualifier : require
- #extension GL_EXT_samplerless_texture_functions : require
- #extension GL_NV_ray_tracing : require
-
- layout(set = 0, binding = 1, std430) buffer StorageBuffer {
- uint rgen_index;
- uint ahit_index;
- uint chit_index;
- uint miss_index;
- uint intr_index;
- uint call_index;
-
- uint rgen_ran;
- uint ahit_ran;
- uint chit_ran;
- uint miss_ran;
- uint intr_ran;
- uint call_ran;
-
- float result1;
- float result2;
- float result3;
- } sbo;
- layout(set = 0, binding = 2) uniform texture2D textures[IMAGES_ARRAY_LENGTH];
-
- hitAttributeNV vec3 hitValue;
-
- void main() {
- sbo.intr_ran = 5;
-
- hitValue = vec3(0.0f, 0.5f, 0.0f);
-
- reportIntersectionNV(1.0f, 0);
-
- if (sbo.intr_index > 0) {
- // OOB here:
- hitValue.x = texelFetch(textures[sbo.intr_index], ivec2(0, 0), 0).x;
- }
- }
- )";
- const std::string intr_source = SetImagesArrayLength(intr_source_template, "6");
- const std::string intr_source_runtime = SetImagesArrayLength(intr_source_template, "");
-
- const std::string call_source_template = R"(#version 460
- #extension GL_EXT_nonuniform_qualifier : require
- #extension GL_EXT_samplerless_texture_functions : require
- #extension GL_NV_ray_tracing : require
-
- layout(set = 0, binding = 1, std430) buffer StorageBuffer {
- uint rgen_index;
- uint ahit_index;
- uint chit_index;
- uint miss_index;
- uint intr_index;
- uint call_index;
-
- uint rgen_ran;
- uint ahit_ran;
- uint chit_ran;
- uint miss_ran;
- uint intr_ran;
- uint call_ran;
-
- float result1;
- float result2;
- float result3;
- } sbo;
- layout(set = 0, binding = 2) uniform texture2D textures[IMAGES_ARRAY_LENGTH];
-
- layout(location = 3) callableDataInNV vec3 callableData;
-
- void main() {
- sbo.call_ran = 6;
-
- callableData = vec3(0.1234f);
-
- if (sbo.call_index > 0) {
- // OOB here:
- callableData.x = texelFetch(textures[sbo.call_index], ivec2(0, 0), 0).x;
- }
- }
- )";
- const std::string call_source = SetImagesArrayLength(call_source_template, "6");
- const std::string call_source_runtime = SetImagesArrayLength(call_source_template, "");
-
- struct TestCase {
- const std::string &rgen_shader_source;
- const std::string &ahit_shader_source;
- const std::string &chit_shader_source;
- const std::string &miss_shader_source;
- const std::string &intr_shader_source;
- const std::string &call_shader_source;
- bool variable_length;
- uint32_t rgen_index;
- uint32_t ahit_index;
- uint32_t chit_index;
- uint32_t miss_index;
- uint32_t intr_index;
- uint32_t call_index;
- const char *expected_error;
- };
-
- std::vector<TestCase> tests;
- tests.push_back({rgen_source, ahit_source, chit_source, miss_source, intr_source, call_source, false, 25, 0, 0, 0, 0, 0,
- "Index of 25 used to index descriptor array of length 6."});
- tests.push_back({rgen_source, ahit_source, chit_source, miss_source, intr_source, call_source, false, 0, 25, 0, 0, 0, 0,
- "Index of 25 used to index descriptor array of length 6."});
- tests.push_back({rgen_source, ahit_source, chit_source, miss_source, intr_source, call_source, false, 0, 0, 25, 0, 0, 0,
- "Index of 25 used to index descriptor array of length 6."});
- tests.push_back({rgen_source, ahit_source, chit_source, miss_source, intr_source, call_source, false, 0, 0, 0, 25, 0, 0,
- "Index of 25 used to index descriptor array of length 6."});
- tests.push_back({rgen_source, ahit_source, chit_source, miss_source, intr_source, call_source, false, 0, 0, 0, 0, 25, 0,
- "Index of 25 used to index descriptor array of length 6."});
- tests.push_back({rgen_source, ahit_source, chit_source, miss_source, intr_source, call_source, false, 0, 0, 0, 0, 0, 25,
- "Index of 25 used to index descriptor array of length 6."});
-
- if (descriptor_indexing) {
- tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
- call_source_runtime, true, 25, 0, 0, 0, 0, 0, "Index of 25 used to index descriptor array of length 6."});
- tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
- call_source_runtime, true, 0, 25, 0, 0, 0, 0, "Index of 25 used to index descriptor array of length 6."});
- tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
- call_source_runtime, true, 0, 0, 25, 0, 0, 0, "Index of 25 used to index descriptor array of length 6."});
- tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
- call_source_runtime, true, 0, 0, 0, 25, 0, 0, "Index of 25 used to index descriptor array of length 6."});
- tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
- call_source_runtime, true, 0, 0, 0, 0, 25, 0, "Index of 25 used to index descriptor array of length 6."});
- tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
- call_source_runtime, true, 0, 0, 0, 0, 0, 25, "Index of 25 used to index descriptor array of length 6."});
-
- // For this group, 6 is less than max specified (max specified is 8) but more than actual specified (actual specified is 5)
- tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
- call_source_runtime, true, 6, 0, 0, 0, 0, 0, "Index of 6 used to index descriptor array of length 6."});
- tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
- call_source_runtime, true, 0, 6, 0, 0, 0, 0, "Index of 6 used to index descriptor array of length 6."});
- tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
- call_source_runtime, true, 0, 0, 6, 0, 0, 0, "Index of 6 used to index descriptor array of length 6."});
- tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
- call_source_runtime, true, 0, 0, 0, 6, 0, 0, "Index of 6 used to index descriptor array of length 6."});
- tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
- call_source_runtime, true, 0, 0, 0, 0, 6, 0, "Index of 6 used to index descriptor array of length 6."});
- tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
- call_source_runtime, true, 0, 0, 0, 0, 0, 6, "Index of 6 used to index descriptor array of length 6."});
-
- tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
- call_source_runtime, true, 5, 0, 0, 0, 0, 0, "Descriptor index 5 is uninitialized."});
- tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
- call_source_runtime, true, 0, 5, 0, 0, 0, 0, "Descriptor index 5 is uninitialized."});
- tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
- call_source_runtime, true, 0, 0, 5, 0, 0, 0, "Descriptor index 5 is uninitialized."});
- tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
- call_source_runtime, true, 0, 0, 0, 5, 0, 0, "Descriptor index 5 is uninitialized."});
- tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
- call_source_runtime, true, 0, 0, 0, 0, 5, 0, "Descriptor index 5 is uninitialized."});
- tests.push_back({rgen_source_runtime, ahit_source_runtime, chit_source_runtime, miss_source_runtime, intr_source_runtime,
- call_source_runtime, true, 0, 0, 0, 0, 0, 5, "Descriptor index 5 is uninitialized."});
- }
-
- PFN_vkCreateRayTracingPipelinesNV vkCreateRayTracingPipelinesNV = reinterpret_cast<PFN_vkCreateRayTracingPipelinesNV>(
- vk::GetDeviceProcAddr(m_device->handle(), "vkCreateRayTracingPipelinesNV"));
- ASSERT_TRUE(vkCreateRayTracingPipelinesNV != nullptr);
-
- PFN_vkGetRayTracingShaderGroupHandlesNV vkGetRayTracingShaderGroupHandlesNV =
- reinterpret_cast<PFN_vkGetRayTracingShaderGroupHandlesNV>(
- vk::GetDeviceProcAddr(m_device->handle(), "vkGetRayTracingShaderGroupHandlesNV"));
- ASSERT_TRUE(vkGetRayTracingShaderGroupHandlesNV != nullptr);
-
- PFN_vkCmdTraceRaysNV vkCmdTraceRaysNV =
- reinterpret_cast<PFN_vkCmdTraceRaysNV>(vk::GetDeviceProcAddr(m_device->handle(), "vkCmdTraceRaysNV"));
- ASSERT_TRUE(vkCmdTraceRaysNV != nullptr);
-
- // Iteration 0 tests with no descriptor set bound (to sanity test "draw" validation). Iteration 1
- // tests what's in the test case vector.
- for (int i = 0; i < 2; ++i) {
- for (const auto &test : tests) {
- if (i == 1) {
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test.expected_error);
- }
-
- VkShaderObj rgen_shader(m_device, test.rgen_shader_source.c_str(), VK_SHADER_STAGE_RAYGEN_BIT_NV, this, "main");
- VkShaderObj ahit_shader(m_device, test.ahit_shader_source.c_str(), VK_SHADER_STAGE_ANY_HIT_BIT_NV, this, "main");
- VkShaderObj chit_shader(m_device, test.chit_shader_source.c_str(), VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV, this, "main");
- VkShaderObj miss_shader(m_device, test.miss_shader_source.c_str(), VK_SHADER_STAGE_MISS_BIT_NV, this, "main");
- VkShaderObj intr_shader(m_device, test.intr_shader_source.c_str(), VK_SHADER_STAGE_INTERSECTION_BIT_NV, this, "main");
- VkShaderObj call_shader(m_device, test.call_shader_source.c_str(), VK_SHADER_STAGE_CALLABLE_BIT_NV, this, "main");
-
- VkPipelineShaderStageCreateInfo stage_create_infos[6] = {};
- stage_create_infos[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
- stage_create_infos[0].stage = VK_SHADER_STAGE_RAYGEN_BIT_NV;
- stage_create_infos[0].module = rgen_shader.handle();
- stage_create_infos[0].pName = "main";
-
- stage_create_infos[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
- stage_create_infos[1].stage = VK_SHADER_STAGE_ANY_HIT_BIT_NV;
- stage_create_infos[1].module = ahit_shader.handle();
- stage_create_infos[1].pName = "main";
-
- stage_create_infos[2].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
- stage_create_infos[2].stage = VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV;
- stage_create_infos[2].module = chit_shader.handle();
- stage_create_infos[2].pName = "main";
-
- stage_create_infos[3].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
- stage_create_infos[3].stage = VK_SHADER_STAGE_MISS_BIT_NV;
- stage_create_infos[3].module = miss_shader.handle();
- stage_create_infos[3].pName = "main";
-
- stage_create_infos[4].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
- stage_create_infos[4].stage = VK_SHADER_STAGE_INTERSECTION_BIT_NV;
- stage_create_infos[4].module = intr_shader.handle();
- stage_create_infos[4].pName = "main";
-
- stage_create_infos[5].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
- stage_create_infos[5].stage = VK_SHADER_STAGE_CALLABLE_BIT_NV;
- stage_create_infos[5].module = call_shader.handle();
- stage_create_infos[5].pName = "main";
-
- VkRayTracingShaderGroupCreateInfoNV group_create_infos[4] = {};
- group_create_infos[0].sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV;
- group_create_infos[0].type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV;
- group_create_infos[0].generalShader = 0; // rgen
- group_create_infos[0].closestHitShader = VK_SHADER_UNUSED_NV;
- group_create_infos[0].anyHitShader = VK_SHADER_UNUSED_NV;
- group_create_infos[0].intersectionShader = VK_SHADER_UNUSED_NV;
-
- group_create_infos[1].sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV;
- group_create_infos[1].type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV;
- group_create_infos[1].generalShader = 3; // miss
- group_create_infos[1].closestHitShader = VK_SHADER_UNUSED_NV;
- group_create_infos[1].anyHitShader = VK_SHADER_UNUSED_NV;
- group_create_infos[1].intersectionShader = VK_SHADER_UNUSED_NV;
-
- group_create_infos[2].sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV;
- group_create_infos[2].type = VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_NV;
- group_create_infos[2].generalShader = VK_SHADER_UNUSED_NV;
- group_create_infos[2].closestHitShader = 2;
- group_create_infos[2].anyHitShader = 1;
- group_create_infos[2].intersectionShader = 4;
-
- group_create_infos[3].sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV;
- group_create_infos[3].type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_NV;
- group_create_infos[3].generalShader = 5; // call
- group_create_infos[3].closestHitShader = VK_SHADER_UNUSED_NV;
- group_create_infos[3].anyHitShader = VK_SHADER_UNUSED_NV;
- group_create_infos[3].intersectionShader = VK_SHADER_UNUSED_NV;
-
- VkRayTracingPipelineCreateInfoNV pipeline_ci = {};
- pipeline_ci.sType = VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV;
- pipeline_ci.stageCount = 6;
- pipeline_ci.pStages = stage_create_infos;
- pipeline_ci.groupCount = 4;
- pipeline_ci.pGroups = group_create_infos;
- pipeline_ci.maxRecursionDepth = 2;
- pipeline_ci.layout = test.variable_length ? pipeline_layout_variable.handle() : pipeline_layout.handle();
-
- VkPipeline pipeline = VK_NULL_HANDLE;
- ASSERT_VK_SUCCESS(
- vkCreateRayTracingPipelinesNV(m_device->handle(), VK_NULL_HANDLE, 1, &pipeline_ci, nullptr, &pipeline));
-
- std::vector<uint8_t> shader_binding_table_data;
- shader_binding_table_data.resize(static_cast<std::size_t>(shader_binding_table_buffer_size), 0);
- ASSERT_VK_SUCCESS(vkGetRayTracingShaderGroupHandlesNV(m_device->handle(), pipeline, 0, 4,
- static_cast<std::size_t>(shader_binding_table_buffer_size),
- shader_binding_table_data.data()));
-
- uint8_t *mapped_shader_binding_table_data = (uint8_t *)shader_binding_table_buffer.memory().map();
- std::memcpy(mapped_shader_binding_table_data, shader_binding_table_data.data(), shader_binding_table_data.size());
- shader_binding_table_buffer.memory().unmap();
-
- ray_tracing_command_buffer.begin();
-
- vk::CmdBindPipeline(ray_tracing_command_buffer.handle(), VK_PIPELINE_BIND_POINT_RAY_TRACING_NV, pipeline);
-
- if (i == 1) {
- vk::CmdBindDescriptorSets(ray_tracing_command_buffer.handle(), VK_PIPELINE_BIND_POINT_RAY_TRACING_NV,
- test.variable_length ? pipeline_layout_variable.handle() : pipeline_layout.handle(), 0, 1,
- test.variable_length ? &ds_variable.set_ : &ds.set_, 0, nullptr);
- } else {
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysNV-None-02697");
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-DescriptorSetNotBound");
- }
-
- vkCmdTraceRaysNV(ray_tracing_command_buffer.handle(), shader_binding_table_buffer.handle(),
- ray_tracing_properties.shaderGroupHandleSize * 0ull, shader_binding_table_buffer.handle(),
- ray_tracing_properties.shaderGroupHandleSize * 1ull, ray_tracing_properties.shaderGroupHandleSize,
- shader_binding_table_buffer.handle(), ray_tracing_properties.shaderGroupHandleSize * 2ull,
- ray_tracing_properties.shaderGroupHandleSize, shader_binding_table_buffer.handle(),
- ray_tracing_properties.shaderGroupHandleSize * 3ull, ray_tracing_properties.shaderGroupHandleSize,
- /*width=*/1, /*height=*/1, /*depth=*/1);
-
- ray_tracing_command_buffer.end();
-
- // Update the index of the texture that the shaders should read
- uint32_t *mapped_storage_buffer_data = (uint32_t *)storage_buffer.memory().map();
- mapped_storage_buffer_data[0] = test.rgen_index;
- mapped_storage_buffer_data[1] = test.ahit_index;
- mapped_storage_buffer_data[2] = test.chit_index;
- mapped_storage_buffer_data[3] = test.miss_index;
- mapped_storage_buffer_data[4] = test.intr_index;
- mapped_storage_buffer_data[5] = test.call_index;
- mapped_storage_buffer_data[6] = 0;
- mapped_storage_buffer_data[7] = 0;
- mapped_storage_buffer_data[8] = 0;
- mapped_storage_buffer_data[9] = 0;
- mapped_storage_buffer_data[10] = 0;
- mapped_storage_buffer_data[11] = 0;
- storage_buffer.memory().unmap();
-
- vk::QueueSubmit(ray_tracing_queue, 1, &submit_info, VK_NULL_HANDLE);
- vk::QueueWaitIdle(ray_tracing_queue);
- m_errorMonitor->VerifyFound();
-
- mapped_storage_buffer_data = (uint32_t *)storage_buffer.memory().map();
- if (i == 1) {
- ASSERT_TRUE(mapped_storage_buffer_data[6] == 1);
- ASSERT_TRUE(mapped_storage_buffer_data[7] == 2);
- ASSERT_TRUE(mapped_storage_buffer_data[8] == 3);
- ASSERT_TRUE(mapped_storage_buffer_data[9] == 4);
- ASSERT_TRUE(mapped_storage_buffer_data[10] == 5);
- ASSERT_TRUE(mapped_storage_buffer_data[11] == 6);
- }
- storage_buffer.memory().unmap();
-
- vk::DestroyPipeline(m_device->handle(), pipeline, nullptr);
- }
- }
+ OOBRayTracingShadersTestBody(false);
}
TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
@@ -1812,7 +292,7 @@
img_barrier.subresourceRange.levelCount = 1;
m_commandBuffer->begin();
vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-image-02635");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-image-04073");
vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
&img_barrier);
@@ -1865,7 +345,7 @@
ASSERT_NO_FATAL_FAILURE(InitState());
- if (m_device->props.apiVersion >= VK_API_VERSION_1_1) {
+ if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
maintenance2Supported = true;
}
@@ -2240,6 +720,32 @@
attach_desc.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
}
}
+
+ // Test invalid layouts for color formats
+ attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
+ attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
+ attach_desc.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
+ TestRenderPassCreate(m_errorMonitor, m_device->device(), &rpci, rp2Supported, "VUID-VkAttachmentDescription-format-03280",
+ "VUID-VkAttachmentDescription2-format-03294");
+
+ attach_desc.initialLayout = VK_IMAGE_LAYOUT_GENERAL;
+ attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
+ TestRenderPassCreate(m_errorMonitor, m_device->device(), &rpci, rp2Supported, "VUID-VkAttachmentDescription-format-03282",
+ "VUID-VkAttachmentDescription2-format-03296");
+
+ // Test invalid layouts for depth/stencil format
+ if (depth_stencil_format) {
+ attach_desc.format = depth_stencil_format;
+ attach_desc.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+ attach_desc.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
+ TestRenderPassCreate(m_errorMonitor, m_device->device(), &rpci, rp2Supported, "VUID-VkAttachmentDescription-format-03281",
+ "VUID-VkAttachmentDescription2-format-03295");
+
+ attach_desc.initialLayout = VK_IMAGE_LAYOUT_GENERAL;
+ attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+ TestRenderPassCreate(m_errorMonitor, m_device->device(), &rpci, rp2Supported, "VUID-VkAttachmentDescription-format-03283",
+ "VUID-VkAttachmentDescription2-format-03297");
+ }
}
TEST_F(VkLayerTest, RenderPassCreateAttachmentsMisc) {
@@ -2256,6 +762,12 @@
bool rp2Supported = CheckCreateRenderPass2Support(this, m_device_extension_names);
ASSERT_NO_FATAL_FAILURE(InitState());
+ const VkFormat ds_format = FindSupportedDepthStencilFormat(gpu());
+ if (ds_format == VK_FORMAT_UNDEFINED) {
+ printf("%s No Depth + Stencil format found rest of tests skipped.\n", kSkipPrefix);
+ return;
+ }
+
std::vector<VkAttachmentDescription> attachments = {
// input attachments
{0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
@@ -2268,7 +780,7 @@
VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
// depth attachment
- {0, VK_FORMAT_D24_UNORM_S8_UINT, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ {0, ds_format, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
// resolve attachment
@@ -2689,14 +1201,16 @@
VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, &rpiaaci, 0, 1, &attach, 1, &subpass, 0, nullptr};
// Invalid meta data aspect
- m_errorMonitor->SetDesiredFailureMsg(
- kErrorBit, "VUID-VkRenderPassCreateInfo-pNext-01963"); // Cannot/should not avoid getting this one too
+ // Cannot/should not avoid getting the unxpected ones too
+ m_errorMonitor->SetUnexpectedError("VUID-VkRenderPassCreateInfo-pNext-01963");
+ m_errorMonitor->SetUnexpectedError("VUID-VkRenderPassCreateInfo2-attachment-02525");
TestRenderPassCreate(m_errorMonitor, m_device->device(), &rpci, false, "VUID-VkInputAttachmentAspectReference-aspectMask-01964",
nullptr);
// Aspect not present
iaar.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
- TestRenderPassCreate(m_errorMonitor, m_device->device(), &rpci, false, "VUID-VkRenderPassCreateInfo-pNext-01963", nullptr);
+ TestRenderPassCreate(m_errorMonitor, m_device->device(), &rpci, false, "VUID-VkRenderPassCreateInfo-pNext-01963",
+ "VUID-VkRenderPassCreateInfo2-attachment-02525");
// Invalid subpass index
iaar.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
@@ -2716,7 +1230,7 @@
if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
} else {
- printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME);
+ printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
return;
}
@@ -2725,8 +1239,13 @@
if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME)) {
m_device_extension_names.push_back(VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME);
} else {
- printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME);
- return;
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME);
+ } else {
+ printf("%s Neither extension %s nor %s is not supported.\n", kSkipPrefix, VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME,
+ VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME);
+ return;
+ }
}
ASSERT_NO_FATAL_FAILURE(InitState());
@@ -2907,14 +1426,17 @@
VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR, nullptr, 0, 1, &attach_desc, 1, &subpass, 0, nullptr, 0, nullptr};
// Test for aspect mask of 0
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubpassDescription2-pInputAttachments-02897");
TestRenderPass2KHRCreate(m_errorMonitor, m_device->device(), &rpci2, "VUID-VkSubpassDescription2-attachment-02800");
// Test for invalid aspect mask bits
reference.aspectMask = 0x40000000; // invalid VkImageAspectFlagBits value
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubpassDescription2-pInputAttachments-02897");
TestRenderPass2KHRCreate(m_errorMonitor, m_device->device(), &rpci2, "VUID-VkSubpassDescription2-attachment-02799");
// Test for invalid use of VK_IMAGE_ASPECT_METADATA_BIT
reference.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubpassDescription2-pInputAttachments-02897");
TestRenderPass2KHRCreate(m_errorMonitor, m_device->device(), &rpci2, "VUID-VkSubpassDescription2-attachment-02801");
}
@@ -2938,7 +1460,7 @@
VkPhysicalDeviceFeatures features = {0};
ASSERT_NO_FATAL_FAILURE(InitState(&features));
- if (m_device->props.apiVersion >= VK_API_VERSION_1_1) {
+ if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
multiviewSupported = true;
}
@@ -3029,6 +1551,18 @@
TestRenderPassCreate(m_errorMonitor, m_device->device(), &rpci, rp2_supported, "VUID-VkSubpassDependency-srcSubpass-00867",
"VUID-VkSubpassDependency2-srcSubpass-03087");
+ // framebuffer space stages in self dependency with region bit
+ dependency = {0, 0, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, 0, 0, 0};
+
+ TestRenderPassCreate(m_errorMonitor, m_device->device(), &rpci, rp2_supported, "VUID-VkSubpassDependency-srcSubpass-02243",
+ "VUID-VkSubpassDependency2-srcSubpass-02245");
+
+ // Same test but make sure the logical invalid order does not trip other VUID since both are framebuffer space stages
+ dependency = {0, 0, VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT, VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT, 0, 0, 0};
+
+ TestRenderPassCreate(m_errorMonitor, m_device->device(), &rpci, rp2_supported, "VUID-VkSubpassDependency-srcSubpass-02243",
+ "VUID-VkSubpassDependency2-srcSubpass-02245");
+
// Source access mask mismatch with source stage mask
dependency = {0, 1, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, VK_ACCESS_UNIFORM_READ_BIT, 0, 0};
@@ -3084,7 +1618,8 @@
pViewOffsets[0] = 1;
rpmvci.dependencyCount = 1;
- TestRenderPassCreate(m_errorMonitor, m_device->device(), &rpci, false, "VUID-VkRenderPassCreateInfo-pNext-01930", nullptr);
+ TestRenderPassCreate(m_errorMonitor, m_device->device(), &rpci, false, "VUID-VkRenderPassCreateInfo-pNext-01930",
+ "VUID-VkSubpassDependency2-viewOffset-02530");
rpmvci.dependencyCount = 0;
@@ -3356,7 +1891,7 @@
ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
- if (m_device->props.apiVersion >= VK_API_VERSION_1_1) {
+ if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
maintenance2Supported = true;
}
@@ -3591,6 +2126,20 @@
ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
+ PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
+ (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
+ assert(vkGetPhysicalDeviceProperties2KHR != nullptr);
+
+ VkPhysicalDeviceSampleLocationsPropertiesEXT sample_locations_props =
+ lvl_init_struct<VkPhysicalDeviceSampleLocationsPropertiesEXT>();
+ VkPhysicalDeviceProperties2KHR prop2 = lvl_init_struct<VkPhysicalDeviceProperties2KHR>(&sample_locations_props);
+ vkGetPhysicalDeviceProperties2KHR(gpu(), &prop2);
+
+ if ((sample_locations_props.sampleLocationSampleCounts & VK_SAMPLE_COUNT_1_BIT) == 0) {
+ printf("%s VK_SAMPLE_COUNT_1_BIT sampleLocationSampleCounts is not supported.\n", kSkipPrefix);
+ return;
+ }
+
// Create a depth stencil image view
VkImageObj image(m_device);
@@ -3671,6 +2220,260 @@
vk::DestroyImageView(m_device->device(), dsv, nullptr);
}
+TEST_F(VkLayerTest, InvalidSampleLocations) {
+ TEST_DESCRIPTION("Test invalid cases of VK_EXT_sample_location");
+
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_SAMPLE_LOCATIONS_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_EXT_SAMPLE_LOCATIONS_EXTENSION_NAME);
+ } else {
+ printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_EXT_SAMPLE_LOCATIONS_EXTENSION_NAME);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState());
+ ASSERT_NO_FATAL_FAILURE(InitViewport());
+
+ PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
+ (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
+ assert(vkGetPhysicalDeviceProperties2KHR != nullptr);
+ PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT vkGetPhysicalDeviceMultisamplePropertiesEXT =
+ (PFN_vkGetPhysicalDeviceMultisamplePropertiesEXT)vk::GetInstanceProcAddr(instance(),
+ "vkGetPhysicalDeviceMultisamplePropertiesEXT");
+ assert(vkGetPhysicalDeviceMultisamplePropertiesEXT != nullptr);
+ PFN_vkCmdSetSampleLocationsEXT vkCmdSetSampleLocationsEXT =
+ (PFN_vkCmdSetSampleLocationsEXT)vk::GetInstanceProcAddr(instance(), "vkCmdSetSampleLocationsEXT");
+ assert(vkCmdSetSampleLocationsEXT != nullptr);
+
+ VkPhysicalDeviceSampleLocationsPropertiesEXT sample_locations_props =
+ lvl_init_struct<VkPhysicalDeviceSampleLocationsPropertiesEXT>();
+ VkPhysicalDeviceProperties2KHR prop2 = lvl_init_struct<VkPhysicalDeviceProperties2KHR>(&sample_locations_props);
+ vkGetPhysicalDeviceProperties2KHR(gpu(), &prop2);
+
+ if ((sample_locations_props.sampleLocationSampleCounts & VK_SAMPLE_COUNT_1_BIT) == 0) {
+ printf("%s VK_SAMPLE_COUNT_1_BIT sampleLocationSampleCounts is not supported.\n", kSkipPrefix);
+ return;
+ }
+
+ const bool support_64_sample_count = ((sample_locations_props.sampleLocationSampleCounts & VK_SAMPLE_COUNT_64_BIT) != 0);
+
+ VkImageCreateInfo image_create_info = {};
+ image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_create_info.pNext = NULL;
+ image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ image_create_info.extent.width = 128;
+ image_create_info.extent.height = 128;
+ image_create_info.extent.depth = 1;
+ image_create_info.mipLevels = 1;
+ image_create_info.arrayLayers = 1;
+ image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
+
+ // If S8_UINT is supported, check not having depth with sample location compatible bit
+ VkFormatProperties format_properties;
+ vk::GetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_S8_UINT, &format_properties);
+ if ((format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) != 0) {
+ image_create_info.flags = VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT;
+ image_create_info.format = VK_FORMAT_S8_UINT;
+ VkImage temp_image;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCreateInfo-flags-01533");
+ vk::CreateImage(m_device->device(), &image_create_info, nullptr, &temp_image);
+ m_errorMonitor->VerifyFound();
+ }
+
+ const VkFormat depth_format = FindSupportedDepthStencilFormat(gpu());
+ if (depth_format == VK_FORMAT_UNDEFINED) {
+ printf("%s No Depth + Stencil format found rest of tests skipped.\n", kSkipPrefix);
+ return;
+ }
+
+ image_create_info.flags = 0; // image will not have needed flag
+ image_create_info.format = depth_format;
+ VkImageObj depth_image(m_device);
+ depth_image.init(&image_create_info);
+ ASSERT_TRUE(depth_image.initialized());
+ VkImageView depth_image_view = depth_image.targetView(depth_format, VK_IMAGE_ASPECT_DEPTH_BIT);
+
+ VkImageObj color_image(m_device);
+ color_image.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
+ ASSERT_TRUE(color_image.initialized());
+ VkImageView color_image_view = color_image.targetView(VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_ASPECT_COLOR_BIT);
+
+ VkAttachmentDescription descriptions[2] = {
+ {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
+ {0, depth_format, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}};
+ m_renderPass_attachments.push_back(descriptions[0]);
+ m_renderPass_attachments.push_back(descriptions[1]);
+ VkAttachmentReference color_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
+ VkAttachmentReference depth_stencil_ref = {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
+ VkSubpassDescription subpass = {
+ 0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color_ref, nullptr, &depth_stencil_ref, 0, nullptr};
+ m_renderPass_subpasses.push_back(subpass);
+ m_renderPass_info = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descriptions, 1, &subpass, 0, nullptr};
+ vk::CreateRenderPass(m_device->device(), &m_renderPass_info, NULL, &m_renderPass);
+
+ // Create a framebuffer
+ m_framebuffer_attachments.push_back(color_image_view);
+ m_framebuffer_attachments.push_back(depth_image_view);
+ m_framebuffer_info = {
+ VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 2, m_framebuffer_attachments.data(), 128, 128, 1};
+ vk::CreateFramebuffer(m_device->handle(), &m_framebuffer_info, nullptr, &m_framebuffer);
+
+ VkMultisamplePropertiesEXT multisample_prop;
+ vkGetPhysicalDeviceMultisamplePropertiesEXT(gpu(), VK_SAMPLE_COUNT_1_BIT, &multisample_prop);
+ // 1 from VK_SAMPLE_COUNT_1_BIT
+ const uint32_t valid_count =
+ multisample_prop.maxSampleLocationGridSize.width * multisample_prop.maxSampleLocationGridSize.height * 1;
+
+ VkSampleLocationEXT sample_location = {0.5, 0.5};
+ VkSampleLocationsInfoEXT sample_locations_info = {};
+ sample_locations_info.sType = VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT;
+ sample_locations_info.pNext = nullptr;
+ sample_locations_info.sampleLocationsPerPixel = VK_SAMPLE_COUNT_1_BIT;
+ sample_locations_info.sampleLocationGridSize = multisample_prop.maxSampleLocationGridSize;
+ sample_locations_info.sampleLocationsCount = valid_count;
+ sample_locations_info.pSampleLocations = &sample_location;
+
+ VkPipelineSampleLocationsStateCreateInfoEXT sample_location_state = {};
+ sample_location_state.sType = VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT;
+ sample_location_state.pNext = nullptr;
+ sample_location_state.sampleLocationsEnable = VK_TRUE;
+ sample_location_state.sampleLocationsInfo = sample_locations_info;
+
+ VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
+ pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
+ pipe_ms_state_ci.pNext = &sample_location_state;
+ pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
+ pipe_ms_state_ci.sampleShadingEnable = 0;
+ pipe_ms_state_ci.minSampleShading = 1.0;
+ pipe_ms_state_ci.pSampleMask = NULL;
+
+ VkPipelineDepthStencilStateCreateInfo pipe_ds_state_ci = {};
+ pipe_ds_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
+ pipe_ds_state_ci.pNext = nullptr;
+ pipe_ds_state_ci.depthTestEnable = VK_TRUE;
+ pipe_ds_state_ci.stencilTestEnable = VK_FALSE;
+
+ {
+ CreatePipelineHelper pipe(*this);
+ pipe.InitInfo();
+ pipe.pipe_ms_state_ci_ = pipe_ms_state_ci;
+ pipe.InitState();
+ pipe.gp_ci_.pDepthStencilState = &pipe_ds_state_ci;
+
+ // Set invalid grid size width
+ sample_location_state.sampleLocationsInfo.sampleLocationGridSize.width =
+ multisample_prop.maxSampleLocationGridSize.width + 1;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01521");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSampleLocationsInfoEXT-sampleLocationsCount-01527");
+ pipe.CreateGraphicsPipeline();
+ m_errorMonitor->VerifyFound();
+ sample_location_state.sampleLocationsInfo.sampleLocationGridSize.width = multisample_prop.maxSampleLocationGridSize.width;
+
+ // Set invalid grid size height
+ sample_location_state.sampleLocationsInfo.sampleLocationGridSize.height =
+ multisample_prop.maxSampleLocationGridSize.height + 1;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01522");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSampleLocationsInfoEXT-sampleLocationsCount-01527");
+ pipe.CreateGraphicsPipeline();
+ m_errorMonitor->VerifyFound();
+ sample_location_state.sampleLocationsInfo.sampleLocationGridSize.height = multisample_prop.maxSampleLocationGridSize.height;
+
+ // Test to make sure the modulo is correct due to akward wording in spec
+ sample_location_state.sampleLocationsInfo.sampleLocationGridSize.height =
+ multisample_prop.maxSampleLocationGridSize.height * 2;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01522");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSampleLocationsInfoEXT-sampleLocationsCount-01527");
+ pipe.CreateGraphicsPipeline();
+ m_errorMonitor->VerifyFound();
+ sample_location_state.sampleLocationsInfo.sampleLocationGridSize.height = multisample_prop.maxSampleLocationGridSize.height;
+
+ if (multisample_prop.maxSampleLocationGridSize.height > 1) {
+ // Expects there to be no 01522 vuid
+ sample_location_state.sampleLocationsInfo.sampleLocationGridSize.height =
+ multisample_prop.maxSampleLocationGridSize.height / 2;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSampleLocationsInfoEXT-sampleLocationsCount-01527");
+ pipe.CreateGraphicsPipeline();
+ m_errorMonitor->VerifyFound();
+ sample_location_state.sampleLocationsInfo.sampleLocationGridSize.height =
+ multisample_prop.maxSampleLocationGridSize.height;
+ }
+
+ // non-matching rasterizationSamples
+ pipe.pipe_ms_state_ci_.rasterizationSamples = VK_SAMPLE_COUNT_2_BIT;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01523");
+ // if grid size is different
+ m_errorMonitor->SetUnexpectedError("VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01521");
+ m_errorMonitor->SetUnexpectedError("VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01522");
+ m_errorMonitor->SetUnexpectedError("VUID-VkGraphicsPipelineCreateInfo-subpass-00757");
+ pipe.CreateGraphicsPipeline();
+ m_errorMonitor->VerifyFound();
+ pipe.pipe_ms_state_ci_.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
+ }
+
+ // Creates valid pipelines with dynamic state
+ const VkDynamicState dyn_state = VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_EXT;
+ VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
+ dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
+ dyn_state_ci.dynamicStateCount = 1;
+ dyn_state_ci.pDynamicStates = &dyn_state;
+
+ CreatePipelineHelper dynamic_pipe(*this);
+ dynamic_pipe.InitInfo();
+ dynamic_pipe.pipe_ms_state_ci_ = pipe_ms_state_ci;
+ dynamic_pipe.dyn_state_ci_ = dyn_state_ci;
+ dynamic_pipe.InitState();
+ dynamic_pipe.gp_ci_.pDepthStencilState = &pipe_ds_state_ci;
+ dynamic_pipe.CreateGraphicsPipeline();
+
+ VkRenderPassBeginInfo rp_begin = {
+ VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, m_renderPass, m_framebuffer, {{0, 0}, {128, 128}}, 0, nullptr};
+ const float vbo_data[3] = {1.f, 0.f, 1.f};
+ VkConstantBufferObj vbo(m_device, sizeof(vbo_data), (const void *)&vbo_data, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
+
+ m_commandBuffer->begin();
+ m_commandBuffer->BeginRenderPass(rp_begin);
+ m_commandBuffer->BindVertexBuffer(&vbo, 0, 1);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, dynamic_pipe.pipeline_);
+
+ // test trying to use unsupported sample count
+ if (support_64_sample_count == false) {
+ sample_locations_info.sampleLocationsPerPixel = VK_SAMPLE_COUNT_64_BIT;
+ sample_locations_info.sampleLocationsCount = valid_count * 64;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSampleLocationsInfoEXT-sampleLocationsPerPixel-01526");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetSampleLocationsEXT-sampleLocationsPerPixel-01529");
+ vkCmdSetSampleLocationsEXT(m_commandBuffer->handle(), &sample_locations_info);
+ m_errorMonitor->VerifyFound();
+
+ sample_locations_info.sampleLocationsPerPixel = VK_SAMPLE_COUNT_1_BIT;
+ sample_locations_info.sampleLocationsCount = valid_count;
+ }
+
+ // Test invalid sample location count
+ sample_locations_info.sampleLocationsCount = valid_count + 1;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSampleLocationsInfoEXT-sampleLocationsCount-01527");
+ vkCmdSetSampleLocationsEXT(m_commandBuffer->handle(), &sample_locations_info);
+ m_errorMonitor->VerifyFound();
+ sample_locations_info.sampleLocationsCount = valid_count;
+
+ // Test image was never created with VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT
+ vkCmdSetSampleLocationsEXT(m_commandBuffer->handle(), &sample_locations_info);
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-sampleLocationsEnable-02689");
+ m_commandBuffer->Draw(1, 0, 0, 0);
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->EndRenderPass();
+ m_commandBuffer->end();
+}
+
TEST_F(VkLayerTest, RenderPassNextSubpassExcessive) {
TEST_DESCRIPTION("Test that an error is produced when CmdNextSubpass is called too many times in a renderpass instance");
@@ -3774,6 +2577,10 @@
TEST_DESCRIPTION("Delete in-use renderPass.");
ASSERT_NO_FATAL_FAILURE(Init());
+ if (IsPlatform(kNexusPlayer)) {
+ printf("%s This test should not run on Nexus Player\n", kSkipPrefix);
+ return;
+ }
ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
// Create simple renderpass
@@ -3826,19 +2633,7 @@
}
TEST_F(VkLayerTest, FramebufferCreateErrors) {
- TEST_DESCRIPTION(
- "Hit errors when attempting to create a framebuffer :\n"
- " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
- " 2. Use a color image as depthStencil attachment\n"
- " 3. Mismatch framebuffer & renderPass attachment formats\n"
- " 4. Mismatch framebuffer & renderPass attachment #samples\n"
- " 5. Framebuffer attachment w/ non-1 mip-levels\n"
- " 6. Framebuffer with more than 1 layer with a multiview renderpass\n"
- " 7. Framebuffer attachment where dimensions don't match\n"
- " 8. Framebuffer attachment where dimensions don't match\n"
- " 9. Framebuffer attachment w/o identity swizzle\n"
- " 10. framebuffer dimensions exceed physical device limits\n"
- " 11. null pAttachments\n");
+ TEST_DESCRIPTION("VUIDs related to framebuffer creation");
// Check for VK_KHR_get_physical_device_properties2
bool push_physical_device_properties_2_support =
@@ -3853,7 +2648,15 @@
if (push_physical_device_properties_2_support) {
push_fragment_density_support = DeviceExtensionSupported(gpu(), nullptr, VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME);
- if (push_fragment_density_support) m_device_extension_names.push_back(VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME);
+ if (push_fragment_density_support) {
+ m_device_extension_names.push_back(VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME);
+ } else {
+ // for purposes of this test, the two fragment density extensions are identical
+ push_fragment_density_support = DeviceExtensionSupported(gpu(), nullptr, VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME);
+ if (push_fragment_density_support) {
+ m_device_extension_names.push_back(VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME);
+ }
+ }
}
ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, 0));
@@ -3862,7 +2665,7 @@
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkFramebufferCreateInfo-attachmentCount-00876");
bool rp2_supported = CheckCreateRenderPass2Support(this, m_device_extension_names);
- bool multiviewSupported = rp2_supported || (m_device->props.apiVersion >= VK_API_VERSION_1_1);
+ bool multiviewSupported = rp2_supported || (DeviceValidationVersion() >= VK_API_VERSION_1_1);
if (!multiviewSupported && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
@@ -3932,6 +2735,35 @@
}
vk::DestroyRenderPass(m_device->device(), rp_ds, NULL);
+ {
+ VkImageCreateInfo image_ci = {};
+ image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_ci.pNext = NULL;
+ image_ci.imageType = VK_IMAGE_TYPE_3D;
+ image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
+ image_ci.extent.width = 256;
+ image_ci.extent.height = 256;
+ image_ci.extent.depth = 1;
+ image_ci.mipLevels = 1;
+ image_ci.arrayLayers = 1;
+ image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+ image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ image_ci.flags = 0;
+ VkImageObj image(m_device);
+ image.init(&image_ci);
+
+ VkImageView view = image.targetView(VK_FORMAT_D16_UNORM);
+
+ VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
+ VkFramebuffer framebuffer;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkFramebufferCreateInfo-pAttachments-00891");
+ m_errorMonitor->SetUnexpectedError("VUID-VkFramebufferCreateInfo-pAttachments-00880");
+ vk::CreateFramebuffer(m_device->device(), &fci, nullptr, &framebuffer);
+ m_errorMonitor->VerifyFound();
+ }
+
// Create new renderpass with alternate attachment format from fb
attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
subpass.pDepthStencilAttachment = NULL;
@@ -4284,12 +3116,13 @@
TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
VkResult err;
+ SetTargetApiVersion(VK_API_VERSION_1_0);
ASSERT_NO_FATAL_FAILURE(Init());
ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
// This test is valid for Vulkan 1.0 only -- skip if device has an API version greater than 1.0.
- if (m_device->props.apiVersion >= VK_API_VERSION_1_1) {
+ if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
printf("%s Device has apiVersion greater than 1.0 -- skipping Descriptor Set checks.\n", kSkipPrefix);
return;
}
@@ -4615,6 +3448,46 @@
vk::DestroySampler(m_device->device(), sampler, NULL);
}
+TEST_F(VkLayerTest, WriteDescriptorSetIdentitySwizzle) {
+ TEST_DESCRIPTION("Test descriptors that need to have identity swizzle set");
+ ASSERT_NO_FATAL_FAILURE(Init());
+
+ OneOffDescriptorSet descriptor_set(m_device,
+ {
+ {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
+ });
+
+ VkImageObj image_obj(m_device);
+ image_obj.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
+ ASSERT_TRUE(image_obj.initialized());
+ VkImage image = image_obj.image();
+
+ VkImageViewCreateInfo image_view_ci = {};
+ image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
+ image_view_ci.image = image;
+ image_view_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
+ image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
+ image_view_ci.subresourceRange.layerCount = 1;
+ image_view_ci.subresourceRange.baseArrayLayer = 0;
+ image_view_ci.subresourceRange.levelCount = 1;
+ image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+
+ // G and B are swizzled
+ image_view_ci.components.r = VK_COMPONENT_SWIZZLE_R;
+ image_view_ci.components.g = VK_COMPONENT_SWIZZLE_B;
+ image_view_ci.components.b = VK_COMPONENT_SWIZZLE_G;
+ image_view_ci.components.a = VK_COMPONENT_SWIZZLE_A;
+
+ VkImageView image_view;
+ vk::CreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
+ descriptor_set.WriteDescriptorImageInfo(0, image_view, VK_NULL_HANDLE, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT);
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00336");
+ descriptor_set.UpdateDescriptorSets();
+ m_errorMonitor->VerifyFound();
+ vk::DestroyImageView(m_device->device(), image_view, NULL);
+}
+
TEST_F(VkLayerTest, WriteDescriptorSetConsecutiveUpdates) {
TEST_DESCRIPTION(
"Verifies that updates rolling over to next descriptor work correctly by destroying buffer from consecutive update known "
@@ -4717,6 +3590,117 @@
m_errorMonitor->VerifyFound();
}
+TEST_F(VkLayerTest, WriteDescriptorSetYcbcr) {
+ TEST_DESCRIPTION("Attempt to use VkSamplerYcbcrConversion ImageView to update descriptors that are not allowed.");
+
+ // Enable KHR multiplane req'd extensions
+ bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
+ VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
+ if (mp_extensions == true) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ if (mp_extensions == true) {
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ } else {
+ printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
+ return;
+ }
+
+ // Enable Sampler YCbCr Conversion
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2Function =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2Function != nullptr);
+ auto ycbcr_features = lvl_init_struct<VkPhysicalDeviceSamplerYcbcrConversionFeatures>();
+ auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&ycbcr_features);
+ vkGetPhysicalDeviceFeatures2Function(gpu(), &features2);
+ if (ycbcr_features.samplerYcbcrConversion == VK_FALSE) {
+ printf("%s samplerYcbcrConversion feature not supported. Skipped.\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionFunction =
+ (PFN_vkCreateSamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCreateSamplerYcbcrConversionKHR");
+ PFN_vkDestroySamplerYcbcrConversionKHR vkDestroySamplerYcbcrConversionFunction =
+ (PFN_vkDestroySamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkDestroySamplerYcbcrConversionKHR");
+ ASSERT_NE(vkCreateSamplerYcbcrConversionFunction, nullptr);
+ ASSERT_NE(vkDestroySamplerYcbcrConversionFunction, nullptr);
+
+ // Create Ycbcr conversion
+ VkFormat mp_format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM; // guaranteed sampling support
+ VkSamplerYcbcrConversionCreateInfo ycbcr_create_info = {VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
+ NULL,
+ mp_format,
+ VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,
+ VK_SAMPLER_YCBCR_RANGE_ITU_FULL,
+ {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
+ VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
+ VK_CHROMA_LOCATION_COSITED_EVEN,
+ VK_CHROMA_LOCATION_COSITED_EVEN,
+ VK_FILTER_NEAREST,
+ false};
+ VkSamplerYcbcrConversion conversion;
+ vkCreateSamplerYcbcrConversionFunction(m_device->handle(), &ycbcr_create_info, nullptr, &conversion);
+
+ OneOffDescriptorSet descriptor_set(m_device, {
+ {0, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_ALL, nullptr},
+ });
+
+ VkImageObj image_obj(m_device);
+ VkImageCreateInfo image_ci = {VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
+ nullptr,
+ VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT, // need for multi-planar
+ VK_IMAGE_TYPE_2D,
+ mp_format,
+ {64, 64, 1},
+ 1,
+ 1,
+ VK_SAMPLE_COUNT_1_BIT,
+ VK_IMAGE_TILING_OPTIMAL,
+ VK_IMAGE_USAGE_SAMPLED_BIT,
+ VK_SHARING_MODE_EXCLUSIVE,
+ 0,
+ nullptr,
+ VK_IMAGE_LAYOUT_UNDEFINED};
+ image_obj.init(&image_ci);
+ ASSERT_TRUE(image_obj.initialized());
+
+ VkSamplerYcbcrConversionInfo ycbcr_info = {};
+ ycbcr_info.sType = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO;
+ ycbcr_info.pNext = nullptr;
+ ycbcr_info.conversion = conversion;
+
+ VkImageView image_view;
+ VkImageViewCreateInfo image_view_create_info = {};
+ image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
+ image_view_create_info.pNext = &ycbcr_info;
+ image_view_create_info.image = image_obj.handle();
+ image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
+ image_view_create_info.format = mp_format;
+ image_view_create_info.subresourceRange.layerCount = 1;
+ image_view_create_info.subresourceRange.baseMipLevel = 0;
+ image_view_create_info.subresourceRange.levelCount = 1;
+ image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ vk::CreateImageView(m_device->device(), &image_view_create_info, nullptr, &image_view);
+
+ descriptor_set.WriteDescriptorImageInfo(0, image_view, VK_NULL_HANDLE, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE);
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-01946");
+ descriptor_set.UpdateDescriptorSets();
+ m_errorMonitor->VerifyFound();
+
+ vk::DestroyImageView(m_device->device(), image_view, NULL);
+}
+
TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
TEST_DESCRIPTION(
"Attempt to draw with a command buffer that is invalid due to a bound descriptor set with a buffer dependency being "
@@ -5166,7 +4150,7 @@
descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
descriptor_write.pImageInfo = &img_info;
- std::array<VkWriteDescriptorSet, 2> descriptor_writes = {descriptor_write, descriptor_write};
+ std::array<VkWriteDescriptorSet, 2> descriptor_writes = {{descriptor_write, descriptor_write}};
descriptor_writes[1].dstBinding = 1;
descriptor_writes[1].pImageInfo = &img_info1;
@@ -5293,7 +4277,7 @@
kInternal, // Image layout mismatch is *within* a given command buffer
kExternal // Image layout mismatch is with the current state of the image, found at QueueSubmit
};
- std::array<TestType, 2> test_list = {kInternal, kExternal};
+ std::array<TestType, 2> test_list = {{kInternal, kExternal}};
const std::vector<std::string> internal_errors = {"VUID-VkDescriptorImageInfo-imageLayout-00344",
"UNASSIGNED-CoreValidation-DrawState-DescriptorSetNotUpdated"};
const std::vector<std::string> external_errors = {"UNASSIGNED-CoreValidation-DrawState-InvalidImageLayout"};
@@ -5314,6 +4298,7 @@
image->subresource_range(aspect_mask));
cmd_buf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, 0, 0, nullptr, 0,
nullptr, 1, &image_barrier);
+ image->Layout(image_layout);
if (test_type == kExternal) {
// The image layout is external to the command buffer we are recording to test. Submit to push to instance scope.
@@ -5948,7 +4933,7 @@
dsl_bindings[0].binding = 0;
dsl_bindings[0].descriptorType = VkDescriptorType(0);
dsl_bindings[0].descriptorCount = 1;
- dsl_bindings[0].stageFlags = VK_SHADER_STAGE_ALL;
+ dsl_bindings[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
dsl_bindings[0].pImmutableSamplers = NULL;
// Create arrays of layout and descriptor objects
@@ -6358,9 +5343,10 @@
if (!depth_format) {
printf("%s No Depth + Stencil format found. Skipped.\n", kSkipPrefix);
} else {
- OneOffDescriptorSet descriptor_set(m_device, {
- {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_ALL, nullptr},
- });
+ OneOffDescriptorSet descriptor_set(m_device,
+ {
+ {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
+ });
// Create an image to be used for invalid updates
VkImageObj image_obj(m_device);
@@ -6618,7 +5604,7 @@
// imageView
VkResult err;
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00326");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-02996");
ASSERT_NO_FATAL_FAILURE(Init());
OneOffDescriptorSet descriptor_set(m_device,
@@ -7291,6 +6277,130 @@
}
}
+TEST_F(VkLayerTest, InvalidPushDescriptorImageLayout) {
+ TEST_DESCRIPTION("Use a push descriptor with a mismatched image layout.");
+
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s Did not find VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME; skipped.\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
+ } else {
+ printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
+ return;
+ }
+
+ auto push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
+ if (push_descriptor_prop.maxPushDescriptors < 1) {
+ // Some implementations report an invalid maxPushDescriptors of 0
+ printf("%s maxPushDescriptors is zero, skipping tests\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
+ ASSERT_NO_FATAL_FAILURE(InitViewport());
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ VkDescriptorSetLayoutBinding dsl_binding = {};
+ dsl_binding.binding = 0;
+ dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+ dsl_binding.descriptorCount = 1;
+ dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
+ dsl_binding.pImmutableSamplers = NULL;
+
+ const VkDescriptorSetLayoutObj ds_layout(m_device, {dsl_binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
+ auto pipeline_layout = VkPipelineLayoutObj(m_device, {&ds_layout});
+
+ char const *fsSource =
+ "#version 450\n"
+ "\n"
+ "layout(set=0, binding=0) uniform sampler2D tex;\n"
+ "layout(location=0) out vec4 color;\n"
+ "void main(){\n"
+ " color = textureLod(tex, vec2(0.5, 0.5), 0.0);\n"
+ "}\n";
+ VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
+ VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
+ VkPipelineObj pipe(m_device);
+ pipe.SetViewport(m_viewports);
+ pipe.SetScissor(m_scissors);
+ pipe.AddDefaultColorAttachment();
+ pipe.AddShader(&vs);
+ pipe.AddShader(&fs);
+ pipe.CreateVKPipeline(pipeline_layout.handle(), m_renderPass);
+ VkSamplerCreateInfo sampler_ci = SafeSaneSamplerCreateInfo();
+ VkSampler sampler;
+
+ auto err = vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
+ ASSERT_VK_SUCCESS(err);
+ VkImageObj image(m_device);
+ image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
+ VkImageView image_view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
+ image.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
+
+ VkDescriptorImageInfo img_info = {};
+ img_info.sampler = sampler;
+ img_info.imageView = image_view;
+ img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+ VkWriteDescriptorSet descriptor_write = {};
+ descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ descriptor_write.pNext = NULL;
+ descriptor_write.dstSet = 0;
+ descriptor_write.descriptorCount = 1;
+ descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+ descriptor_write.pImageInfo = &img_info;
+ descriptor_write.dstArrayElement = 0;
+ descriptor_write.dstBinding = 0;
+
+ auto vkCmdPushDescriptorSetKHR =
+ (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
+
+ for (uint32_t i = 0; i < 2; i++) {
+ m_commandBuffer->begin();
+ if (i == 1) {
+ // Test path where image layout in command buffer is known at draw time
+ image.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_ACCESS_SHADER_WRITE_BIT,
+ VK_ACCESS_SHADER_WRITE_BIT, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
+ }
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
+ vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
+ &descriptor_write);
+ vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
+ vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
+
+ if (i == 1) {
+ // Test path where image layout in command buffer is known at draw time
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
+ "Image layout specified at vkUpdateDescriptorSet* or vkCmdPushDescriptorSet* "
+ "time doesn't match actual image layout at time descriptor is used");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
+ "with specific layout VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL that doesn't match "
+ "the previous known layout VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL");
+ m_commandBuffer->Draw(1, 1, 0, 0);
+ m_errorMonitor->VerifyFound();
+ break;
+ }
+ m_errorMonitor->SetDesiredFailureMsg(
+ kErrorBit,
+ "to be in layout VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL--instead, current layout is VK_IMAGE_LAYOUT_GENERAL.");
+ m_commandBuffer->Draw(1, 1, 0, 0);
+ m_commandBuffer->EndRenderPass();
+ m_commandBuffer->end();
+
+ m_commandBuffer->QueueCommandBuffer(false);
+ m_errorMonitor->VerifyFound();
+ }
+
+ vk::DestroySampler(m_device->device(), sampler, NULL);
+}
+
TEST_F(VkLayerTest, PushDescriptorSetLayoutWithoutExtension) {
TEST_DESCRIPTION("Create a push descriptor set layout without loading the needed extension.");
ASSERT_NO_FATAL_FAILURE(Init());
@@ -7356,8 +6466,8 @@
ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
- std::array<VkDescriptorBindingFlagsEXT, 2> flags = {VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT,
- VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT};
+ std::array<VkDescriptorBindingFlagsEXT, 2> flags = {
+ {VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT, VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT}};
auto flags_create_info = lvl_init_struct<VkDescriptorSetLayoutBindingFlagsCreateInfoEXT>();
flags_create_info.bindingCount = (uint32_t)flags.size();
flags_create_info.pBindingFlags = flags.data();
@@ -7854,8 +6964,8 @@
return;
}
ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
- std::array<const char *, 2> required_device_extensions = {VK_KHR_MAINTENANCE1_EXTENSION_NAME,
- VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME};
+ std::array<const char *, 2> required_device_extensions = {
+ {VK_KHR_MAINTENANCE1_EXTENSION_NAME, VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME}};
for (auto device_extension : required_device_extensions) {
if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
m_device_extension_names.push_back(device_extension);
@@ -7867,7 +6977,7 @@
// Enable descriptor indexing if supported, but don't require it.
bool supportsDescriptorIndexing = true;
- required_device_extensions = {VK_KHR_MAINTENANCE3_EXTENSION_NAME, VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME};
+ required_device_extensions = {{VK_KHR_MAINTENANCE3_EXTENSION_NAME, VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME}};
for (auto device_extension : required_device_extensions) {
if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
m_device_extension_names.push_back(device_extension);
@@ -7920,6 +7030,11 @@
uint32_t maxBlocks = std::max(inline_uniform_props.maxPerStageDescriptorInlineUniformBlocks,
inline_uniform_props.maxDescriptorSetInlineUniformBlocks);
+ if (maxBlocks > 4096) {
+ printf("Too large of a maximum number of inline uniform blocks, skipping tests\n");
+ return;
+ }
+
for (uint32_t i = 0; i < 1 + maxBlocks; ++i) {
dslb.binding = i;
dslb_vec.push_back(dslb);
@@ -8095,10 +7210,11 @@
TEST_F(VkLayerTest, WrongdstArrayElement) {
ASSERT_NO_FATAL_FAILURE(Init());
- OneOffDescriptorSet descriptor_set(m_device, {
- {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_ALL, nullptr},
- {1, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_ALL, nullptr},
- });
+ OneOffDescriptorSet descriptor_set(m_device,
+ {
+ {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
+ {1, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
+ });
VkImageObj image(m_device);
image.Init(32, 32, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
@@ -8127,10 +7243,11 @@
descriptor_set.UpdateDescriptorSets();
m_errorMonitor->VerifyFound();
- OneOffDescriptorSet descriptor_set2(m_device, {
- {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_ALL, nullptr},
- {1, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_ALL, nullptr},
- });
+ OneOffDescriptorSet descriptor_set2(m_device,
+ {
+ {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
+ {1, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
+ });
descriptor_set2.image_infos.emplace_back(image_info);
descriptor_set2.image_infos.emplace_back(image_info);
@@ -8180,4 +7297,233 @@
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkDescriptorSetLayoutBinding-descriptorType-01510");
vk::CreateDescriptorSetLayout(device(), &ds_layout_ci, NULL, &ds_layout);
m_errorMonitor->VerifyFound();
+}
+
+TEST_F(VkLayerTest, NullDescriptorsDisabled) {
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr));
+
+ OneOffDescriptorSet descriptor_set(m_device, {
+ {0, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_ALL, nullptr},
+ {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr},
+ {2, VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr},
+ });
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-02997");
+ descriptor_set.WriteDescriptorImageInfo(0, VK_NULL_HANDLE, VK_NULL_HANDLE, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE);
+ descriptor_set.UpdateDescriptorSets();
+ descriptor_set.descriptor_writes.clear();
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkDescriptorBufferInfo-buffer-02998");
+ descriptor_set.WriteDescriptorBufferInfo(1, VK_NULL_HANDLE, VK_WHOLE_SIZE, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
+ descriptor_set.UpdateDescriptorSets();
+ descriptor_set.descriptor_writes.clear();
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-02995");
+ VkBufferView buffer_view = VK_NULL_HANDLE;
+ descriptor_set.WriteDescriptorBufferView(2, buffer_view, VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER);
+ descriptor_set.UpdateDescriptorSets();
+ descriptor_set.descriptor_writes.clear();
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->begin();
+ VkBuffer buffer = VK_NULL_HANDLE;
+ VkDeviceSize offset = 0;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindVertexBuffers-pBuffers-04001");
+ vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &buffer, &offset);
+ m_errorMonitor->VerifyFound();
+}
+
+TEST_F(VkLayerTest, NullDescriptorsEnabled) {
+ if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
+ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_ROBUSTNESS_2_EXTENSION_NAME)) {
+ printf("%s Extension %s not supported by device; skipped.\n", kSkipPrefix, VK_EXT_ROBUSTNESS_2_EXTENSION_NAME);
+ return;
+ }
+
+ m_device_extension_names.push_back(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME);
+
+ auto robustness2_features = lvl_init_struct<VkPhysicalDeviceRobustness2FeaturesEXT>();
+ auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&robustness2_features);
+
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+
+ if (!robustness2_features.nullDescriptor) {
+ printf("%s nullDescriptor feature not supported, skipping test\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
+
+ m_errorMonitor->ExpectSuccess();
+
+ OneOffDescriptorSet descriptor_set(m_device, {
+ {0, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_ALL, nullptr},
+ {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr},
+ {2, VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr},
+ });
+
+ descriptor_set.WriteDescriptorImageInfo(0, VK_NULL_HANDLE, VK_NULL_HANDLE, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE);
+ descriptor_set.WriteDescriptorBufferInfo(1, VK_NULL_HANDLE, VK_WHOLE_SIZE, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
+ VkBufferView buffer_view = VK_NULL_HANDLE;
+ descriptor_set.WriteDescriptorBufferView(2, buffer_view, VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER);
+ descriptor_set.UpdateDescriptorSets();
+ descriptor_set.descriptor_writes.clear();
+
+ m_commandBuffer->begin();
+ VkBuffer buffer = VK_NULL_HANDLE;
+ VkDeviceSize offset = 0;
+ vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &buffer, &offset);
+
+ m_errorMonitor->VerifyNotFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkDescriptorBufferInfo-buffer-02999");
+ descriptor_set.WriteDescriptorBufferInfo(1, VK_NULL_HANDLE, 16, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
+ descriptor_set.UpdateDescriptorSets();
+ m_errorMonitor->VerifyFound();
+
+ offset = 1;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindVertexBuffers-pBuffers-04002");
+ vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &buffer, &offset);
+ m_errorMonitor->VerifyFound();
+}
+
+TEST_F(VkLayerTest, RenderPassCreatePotentialFormatFeatures) {
+ TEST_DESCRIPTION("Validate PotentialFormatFeatures in renderpass create");
+
+ // Check for VK_KHR_get_physical_device_properties2
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ }
+
+ if (!EnableDeviceProfileLayer()) {
+ printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ bool rp2Supported = CheckCreateRenderPass2Support(this, m_device_extension_names);
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
+ PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
+
+ // Load required functions
+ if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
+ printf("%s Failed to device profile layer.\n", kSkipPrefix);
+ return;
+ }
+
+ // Set format features from being found
+ const VkFormat validColorFormat = VK_FORMAT_R8G8B8A8_UNORM; // guaranteed to be valid everywhere
+ const VkFormat invalidColorFormat = VK_FORMAT_B8G8R8A8_UNORM;
+ const VkFormat depthFormat = VK_FORMAT_D16_UNORM;
+ VkFormatProperties formatProps;
+ fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), invalidColorFormat, &formatProps);
+ formatProps.linearTilingFeatures = 0;
+ formatProps.optimalTilingFeatures = 0;
+ fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), invalidColorFormat, formatProps);
+ fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), depthFormat, &formatProps);
+ formatProps.linearTilingFeatures = 0;
+ formatProps.optimalTilingFeatures = 0;
+ fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), depthFormat, formatProps);
+
+ VkAttachmentDescription attachments[4] = {
+ {0, validColorFormat, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL},
+ {0, invalidColorFormat, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL},
+ {0, validColorFormat, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL},
+ {0, depthFormat, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL}};
+
+ VkAttachmentReference references[4] = {
+ {0, VK_IMAGE_LAYOUT_GENERAL}, // valid color
+ {1, VK_IMAGE_LAYOUT_GENERAL}, // invalid color
+ {2, VK_IMAGE_LAYOUT_GENERAL}, // valid color multisample
+ {3, VK_IMAGE_LAYOUT_GENERAL} // invalid depth stencil
+ };
+
+ VkSubpassDescription subpass = {};
+ subpass.flags = 0;
+ subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
+ subpass.inputAttachmentCount = 0;
+ subpass.pInputAttachments = nullptr;
+ subpass.colorAttachmentCount = 1;
+ subpass.pColorAttachments = &references[0]; // valid
+ subpass.pResolveAttachments = nullptr;
+ subpass.pDepthStencilAttachment = nullptr;
+ subpass.preserveAttachmentCount = 0;
+ subpass.pPreserveAttachments = nullptr;
+ VkSubpassDescription originalSubpass = subpass;
+
+ VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 4, attachments, 1, &subpass, 0, nullptr};
+
+ // Color attachment
+ subpass.pColorAttachments = &references[1];
+ TestRenderPassCreate(m_errorMonitor, device(), &rpci, rp2Supported, "VUID-VkSubpassDescription-pColorAttachments-02648",
+ "VUID-VkSubpassDescription2-pColorAttachments-02898");
+ subpass = originalSubpass;
+
+ // Input attachment
+ subpass.inputAttachmentCount = 1;
+ subpass.pInputAttachments = &references[1];
+ TestRenderPassCreate(m_errorMonitor, device(), &rpci, rp2Supported, "VUID-VkSubpassDescription-pInputAttachments-02647",
+ "VUID-VkSubpassDescription2-pInputAttachments-02897");
+ subpass = originalSubpass;
+
+ // Depth Stencil attachment
+ subpass.pDepthStencilAttachment = &references[3];
+ TestRenderPassCreate(m_errorMonitor, device(), &rpci, rp2Supported, "VUID-VkSubpassDescription-pDepthStencilAttachment-02650",
+ "VUID-VkSubpassDescription2-pDepthStencilAttachment-02900");
+ subpass = originalSubpass;
+
+ // Resolve attachment
+ subpass.pResolveAttachments = &references[1];
+ subpass.pColorAttachments = &references[2]; // valid
+ // Can't use helper function due to need to set unexpected errors
+ {
+ VkRenderPass render_pass = VK_NULL_HANDLE;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubpassDescription-pResolveAttachments-02649");
+ m_errorMonitor->SetUnexpectedError("VUID-VkSubpassDescription-pResolveAttachments-00850");
+ vk::CreateRenderPass(device(), &rpci, nullptr, &render_pass);
+ m_errorMonitor->VerifyFound();
+
+ if (rp2Supported) {
+ PFN_vkCreateRenderPass2KHR vkCreateRenderPass2KHR =
+ (PFN_vkCreateRenderPass2KHR)vk::GetDeviceProcAddr(device(), "vkCreateRenderPass2KHR");
+ safe_VkRenderPassCreateInfo2 create_info2;
+ ConvertVkRenderPassCreateInfoToV2KHR(rpci, &create_info2);
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubpassDescription2-pResolveAttachments-02899");
+ m_errorMonitor->SetUnexpectedError("VUID-VkSubpassDescription2-pResolveAttachments-03068");
+ vkCreateRenderPass2KHR(device(), create_info2.ptr(), nullptr, &render_pass);
+ m_errorMonitor->VerifyFound();
+
+ // For api version >= 1.2, try core entrypoint
+ PFN_vkCreateRenderPass2 vkCreateRenderPass2 =
+ (PFN_vkCreateRenderPass2)vk::GetDeviceProcAddr(device(), "vkCreateRenderPass2");
+ if (vkCreateRenderPass2) {
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubpassDescription2-pResolveAttachments-02899");
+ m_errorMonitor->SetUnexpectedError("VUID-VkSubpassDescription2-pResolveAttachments-03068");
+ vkCreateRenderPass2(device(), create_info2.ptr(), nullptr, &render_pass);
+ m_errorMonitor->VerifyFound();
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/tests/vklayertests_gpu.cpp b/tests/vklayertests_gpu.cpp
new file mode 100644
index 0000000..b1c92f7
--- /dev/null
+++ b/tests/vklayertests_gpu.cpp
@@ -0,0 +1,1949 @@
+/*
+ * Copyright (c) 2020 The Khronos Group Inc.
+ * Copyright (c) 2020 Valve Corporation
+ * Copyright (c) 2020 LunarG, Inc.
+ * Copyright (c) 2020 Google, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Author: Mark Lobodzinski <mark@lunarg.com>
+ * Author: Tony Barbour <tony@LunarG.com>
+ */
+
+#include "layer_validation_tests.h"
+
+bool VkGpuAssistedLayerTest::InitGpuAssistedFramework(bool request_descriptor_indexing) {
+ VkValidationFeatureEnableEXT enables[] = {VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT};
+ VkValidationFeatureDisableEXT disables[] = {
+ VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT, VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT,
+ VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT, VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT};
+ VkValidationFeaturesEXT features = {};
+ features.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
+ features.enabledValidationFeatureCount = 1;
+ features.disabledValidationFeatureCount = 4;
+ features.pEnabledValidationFeatures = enables;
+ features.pDisabledValidationFeatures = disables;
+
+ if (request_descriptor_indexing) {
+ return CheckDescriptorIndexingSupportAndInitFramework(this, m_instance_extension_names, m_device_extension_names, &features,
+ m_errorMonitor);
+ }
+
+ InitFramework(m_errorMonitor, &features);
+ return false;
+}
+
+TEST_F(VkGpuAssistedLayerTest, GpuValidationArrayOOBGraphicsShaders) {
+ TEST_DESCRIPTION(
+ "GPU validation: Verify detection of out-of-bounds descriptor array indexing and use of uninitialized descriptors.");
+
+ SetTargetApiVersion(VK_API_VERSION_1_1);
+ bool descriptor_indexing = InitGpuAssistedFramework(true);
+
+ if (IsPlatform(kGalaxyS10)) {
+ printf("%s This test should not run on Galaxy S10\n", kSkipPrefix);
+ return;
+ }
+
+ if (IsPlatform(kNexusPlayer)) {
+ printf("%s This test should not run on Nexus Player\n", kSkipPrefix);
+ return;
+ }
+
+ if (IsPlatform(kMockICD) || DeviceSimulation()) {
+ printf("%s GPU-Assisted validation test requires a driver that can draw.\n", kSkipPrefix);
+ return;
+ }
+
+ VkPhysicalDeviceFeatures2KHR features2 = {};
+ auto indexing_features = lvl_init_struct<VkPhysicalDeviceDescriptorIndexingFeaturesEXT>();
+ if (descriptor_indexing) {
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+
+ features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&indexing_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+
+ if (!indexing_features.runtimeDescriptorArray || !indexing_features.descriptorBindingSampledImageUpdateAfterBind ||
+ !indexing_features.descriptorBindingPartiallyBound || !indexing_features.descriptorBindingVariableDescriptorCount ||
+ !indexing_features.shaderSampledImageArrayNonUniformIndexing ||
+ !indexing_features.shaderStorageBufferArrayNonUniformIndexing) {
+ printf("Not all descriptor indexing features supported, skipping descriptor indexing tests\n");
+ descriptor_indexing = false;
+ }
+ }
+
+ VkCommandPoolCreateFlags pool_flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, pool_flags));
+ if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
+ printf("%s GPU-Assisted validation test requires Vulkan 1.1+.\n", kSkipPrefix);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitViewport());
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ // Make a uniform buffer to be passed to the shader that contains the invalid array index.
+ uint32_t qfi = 0;
+ VkBufferCreateInfo bci = {};
+ bci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ bci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
+ bci.size = 1024;
+ bci.queueFamilyIndexCount = 1;
+ bci.pQueueFamilyIndices = &qfi;
+ VkBufferObj buffer0;
+ VkMemoryPropertyFlags mem_props = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
+ buffer0.init(*m_device, bci, mem_props);
+
+ bci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
+ // Make another buffer to populate the buffer array to be indexed
+ VkBufferObj buffer1;
+ buffer1.init(*m_device, bci, mem_props);
+
+ void *layout_pnext = nullptr;
+ void *allocate_pnext = nullptr;
+ auto pool_create_flags = 0;
+ auto layout_create_flags = 0;
+ VkDescriptorBindingFlagsEXT ds_binding_flags[2] = {};
+ VkDescriptorSetLayoutBindingFlagsCreateInfoEXT layout_createinfo_binding_flags[1] = {};
+ if (descriptor_indexing) {
+ ds_binding_flags[0] = 0;
+ ds_binding_flags[1] = VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT | VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT;
+
+ layout_createinfo_binding_flags[0].sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT;
+ layout_createinfo_binding_flags[0].pNext = NULL;
+ layout_createinfo_binding_flags[0].bindingCount = 2;
+ layout_createinfo_binding_flags[0].pBindingFlags = ds_binding_flags;
+ layout_create_flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT;
+ pool_create_flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT;
+ layout_pnext = layout_createinfo_binding_flags;
+ }
+
+ // Prepare descriptors
+ OneOffDescriptorSet descriptor_set(m_device,
+ {
+ {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr},
+ {1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 6, VK_SHADER_STAGE_ALL, nullptr},
+ },
+ layout_create_flags, layout_pnext, pool_create_flags);
+
+ VkDescriptorSetVariableDescriptorCountAllocateInfoEXT variable_count = {};
+ uint32_t desc_counts;
+ if (descriptor_indexing) {
+ layout_create_flags = 0;
+ pool_create_flags = 0;
+ ds_binding_flags[1] =
+ VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT | VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXT;
+ desc_counts = 6; // We'll reserve 8 spaces in the layout, but the descriptor will only use 6
+ variable_count.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT;
+ variable_count.descriptorSetCount = 1;
+ variable_count.pDescriptorCounts = &desc_counts;
+ allocate_pnext = &variable_count;
+ }
+
+ OneOffDescriptorSet descriptor_set_variable(m_device,
+ {
+ {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr},
+ {1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 8, VK_SHADER_STAGE_ALL, nullptr},
+ },
+ layout_create_flags, layout_pnext, pool_create_flags, allocate_pnext);
+
+ const VkPipelineLayoutObj pipeline_layout(m_device, {&descriptor_set.layout_});
+ const VkPipelineLayoutObj pipeline_layout_variable(m_device, {&descriptor_set_variable.layout_});
+ VkTextureObj texture(m_device, nullptr);
+ VkSamplerObj sampler(m_device);
+
+ VkDescriptorBufferInfo buffer_info[1] = {};
+ buffer_info[0].buffer = buffer0.handle();
+ buffer_info[0].offset = 0;
+ buffer_info[0].range = sizeof(uint32_t);
+
+ VkDescriptorImageInfo image_info[6] = {};
+ for (int i = 0; i < 6; i++) {
+ image_info[i] = texture.DescriptorImageInfo();
+ image_info[i].sampler = sampler.handle();
+ image_info[i].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+ }
+
+ VkWriteDescriptorSet descriptor_writes[2] = {};
+ descriptor_writes[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ descriptor_writes[0].dstSet = descriptor_set.set_; // descriptor_set;
+ descriptor_writes[0].dstBinding = 0;
+ descriptor_writes[0].descriptorCount = 1;
+ descriptor_writes[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+ descriptor_writes[0].pBufferInfo = buffer_info;
+ descriptor_writes[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ descriptor_writes[1].dstSet = descriptor_set.set_; // descriptor_set;
+ descriptor_writes[1].dstBinding = 1;
+ if (descriptor_indexing)
+ descriptor_writes[1].descriptorCount = 5; // Intentionally don't write index 5
+ else
+ descriptor_writes[1].descriptorCount = 6;
+ descriptor_writes[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
+ descriptor_writes[1].pImageInfo = image_info;
+ vk::UpdateDescriptorSets(m_device->device(), 2, descriptor_writes, 0, NULL);
+ if (descriptor_indexing) {
+ descriptor_writes[0].dstSet = descriptor_set_variable.set_;
+ descriptor_writes[1].dstSet = descriptor_set_variable.set_;
+ vk::UpdateDescriptorSets(m_device->device(), 2, descriptor_writes, 0, NULL);
+ }
+
+ ds_binding_flags[0] = 0;
+ ds_binding_flags[1] = VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT;
+
+ // Resources for buffer tests
+ OneOffDescriptorSet descriptor_set_buffer(m_device,
+ {
+ {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr},
+ {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 6, VK_SHADER_STAGE_ALL, nullptr},
+ },
+ 0, layout_pnext, 0);
+
+ const VkPipelineLayoutObj pipeline_layout_buffer(m_device, {&descriptor_set_buffer.layout_});
+
+ VkDescriptorBufferInfo buffer_test_buffer_info[7] = {};
+ buffer_test_buffer_info[0].buffer = buffer0.handle();
+ buffer_test_buffer_info[0].offset = 0;
+ buffer_test_buffer_info[0].range = sizeof(uint32_t);
+
+ for (int i = 1; i < 7; i++) {
+ buffer_test_buffer_info[i].buffer = buffer1.handle();
+ buffer_test_buffer_info[i].offset = 0;
+ buffer_test_buffer_info[i].range = 4 * sizeof(float);
+ }
+
+ if (descriptor_indexing) {
+ VkWriteDescriptorSet buffer_descriptor_writes[2] = {};
+ buffer_descriptor_writes[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ buffer_descriptor_writes[0].dstSet = descriptor_set_buffer.set_; // descriptor_set;
+ buffer_descriptor_writes[0].dstBinding = 0;
+ buffer_descriptor_writes[0].descriptorCount = 1;
+ buffer_descriptor_writes[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+ buffer_descriptor_writes[0].pBufferInfo = buffer_test_buffer_info;
+ buffer_descriptor_writes[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ buffer_descriptor_writes[1].dstSet = descriptor_set_buffer.set_; // descriptor_set;
+ buffer_descriptor_writes[1].dstBinding = 1;
+ buffer_descriptor_writes[1].descriptorCount = 5; // Intentionally don't write index 5
+ buffer_descriptor_writes[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
+ buffer_descriptor_writes[1].pBufferInfo = &buffer_test_buffer_info[1];
+ vk::UpdateDescriptorSets(m_device->device(), 2, buffer_descriptor_writes, 0, NULL);
+ }
+
+ // Shader programs for array OOB test in vertex stage:
+ // - The vertex shader fetches the invalid index from the uniform buffer and uses it to make an invalid index into another
+ // array.
+ char const *vsSource_vert =
+ "#version 450\n"
+ "\n"
+ "layout(std140, set = 0, binding = 0) uniform foo { uint tex_index[1]; } uniform_index_buffer;\n"
+ "layout(set = 0, binding = 1) uniform sampler2D tex[6];\n"
+ "vec2 vertices[3];\n"
+ "void main(){\n"
+ " vertices[0] = vec2(-1.0, -1.0);\n"
+ " vertices[1] = vec2( 1.0, -1.0);\n"
+ " vertices[2] = vec2( 0.0, 1.0);\n"
+ " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
+ " gl_Position += 1e-30 * texture(tex[uniform_index_buffer.tex_index[0]], vec2(0, 0));\n"
+ "}\n";
+ char const *fsSource_vert =
+ "#version 450\n"
+ "\n"
+ "layout(set = 0, binding = 1) uniform sampler2D tex[6];\n"
+ "layout(location = 0) out vec4 uFragColor;\n"
+ "void main(){\n"
+ " uFragColor = texture(tex[0], vec2(0, 0));\n"
+ "}\n";
+
+ // Shader programs for array OOB test in fragment stage:
+ // - The vertex shader fetches the invalid index from the uniform buffer and passes it to the fragment shader.
+ // - The fragment shader makes the invalid array access.
+ char const *vsSource_frag =
+ "#version 450\n"
+ "\n"
+ "layout(std140, binding = 0) uniform foo { uint tex_index[1]; } uniform_index_buffer;\n"
+ "layout(location = 0) out flat uint index;\n"
+ "vec2 vertices[3];\n"
+ "void main(){\n"
+ " vertices[0] = vec2(-1.0, -1.0);\n"
+ " vertices[1] = vec2( 1.0, -1.0);\n"
+ " vertices[2] = vec2( 0.0, 1.0);\n"
+ " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
+ " index = uniform_index_buffer.tex_index[0];\n"
+ "}\n";
+ char const *fsSource_frag =
+ "#version 450\n"
+ "\n"
+ "layout(set = 0, binding = 1) uniform sampler2D tex[6];\n"
+ "layout(location = 0) out vec4 uFragColor;\n"
+ "layout(location = 0) in flat uint index;\n"
+ "void main(){\n"
+ " uFragColor = texture(tex[index], vec2(0, 0));\n"
+ "}\n";
+ char const *fsSource_frag_runtime =
+ "#version 450\n"
+ "#extension GL_EXT_nonuniform_qualifier : enable\n"
+ "\n"
+ "layout(set = 0, binding = 1) uniform sampler2D tex[];\n"
+ "layout(location = 0) out vec4 uFragColor;\n"
+ "layout(location = 0) in flat uint index;\n"
+ "void main(){\n"
+ " uFragColor = texture(tex[index], vec2(0, 0));\n"
+ "}\n";
+ char const *fsSource_buffer =
+ "#version 450\n"
+ "#extension GL_EXT_nonuniform_qualifier : enable\n "
+ "\n"
+ "layout(set = 0, binding = 1) buffer foo { vec4 val; } colors[];\n"
+ "layout(location = 0) out vec4 uFragColor;\n"
+ "layout(location = 0) in flat uint index;\n"
+ "void main(){\n"
+ " uFragColor = colors[index].val;\n"
+ "}\n";
+ char const *gsSource =
+ "#version 450\n"
+ "#extension GL_EXT_nonuniform_qualifier : enable\n "
+ "layout(triangles) in;\n"
+ "layout(triangle_strip, max_vertices=3) out;\n"
+ "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
+ "layout(std140, set = 0, binding = 0) uniform ufoo { uint index; } uniform_index_buffer;\n"
+ "layout(set = 0, binding = 1) buffer bfoo { vec4 val; } adds[];\n"
+ "void main() {\n"
+ " gl_Position = gs_in[0].x + adds[uniform_index_buffer.index].val.x;\n"
+ " EmitVertex();\n"
+ "}\n";
+ static const char *tesSource =
+ "#version 450\n"
+ "#extension GL_EXT_nonuniform_qualifier : enable\n "
+ "layout(std140, set = 0, binding = 0) uniform ufoo { uint index; } uniform_index_buffer;\n"
+ "layout(set = 0, binding = 1) buffer bfoo { vec4 val; } adds[];\n"
+ "layout(triangles, equal_spacing, cw) in;\n"
+ "void main() {\n"
+ " gl_Position = adds[uniform_index_buffer.index].val;\n"
+ "}\n";
+
+ struct TestCase {
+ char const *vertex_source;
+ char const *fragment_source;
+ char const *geometry_source;
+ char const *tess_ctrl_source;
+ char const *tess_eval_source;
+ bool debug;
+ const VkPipelineLayoutObj *pipeline_layout;
+ const OneOffDescriptorSet *descriptor_set;
+ uint32_t index;
+ char const *expected_error;
+ };
+
+ std::vector<TestCase> tests;
+ tests.push_back({vsSource_vert, fsSource_vert, nullptr, nullptr, nullptr, false, &pipeline_layout, &descriptor_set, 25,
+ "Index of 25 used to index descriptor array of length 6."});
+ tests.push_back({vsSource_frag, fsSource_frag, nullptr, nullptr, nullptr, false, &pipeline_layout, &descriptor_set, 25,
+ "Index of 25 used to index descriptor array of length 6."});
+#if !defined(ANDROID)
+ // The Android test framework uses shaderc for online compilations. Even when configured to compile with debug info,
+ // shaderc seems to drop the OpLine instructions from the shader binary. This causes the following two tests to fail
+ // on Android platforms. Skip these tests until the shaderc issue is understood/resolved.
+ tests.push_back({vsSource_vert, fsSource_vert, nullptr, nullptr, nullptr, true, &pipeline_layout, &descriptor_set, 25,
+ "gl_Position += 1e-30 * texture(tex[uniform_index_buffer.tex_index[0]], vec2(0, 0));"});
+ tests.push_back({vsSource_frag, fsSource_frag, nullptr, nullptr, nullptr, true, &pipeline_layout, &descriptor_set, 25,
+ "uFragColor = texture(tex[index], vec2(0, 0));"});
+#endif
+ if (descriptor_indexing) {
+ tests.push_back({vsSource_frag, fsSource_frag_runtime, nullptr, nullptr, nullptr, false, &pipeline_layout, &descriptor_set,
+ 25, "Index of 25 used to index descriptor array of length 6."});
+ tests.push_back({vsSource_frag, fsSource_frag_runtime, nullptr, nullptr, nullptr, false, &pipeline_layout, &descriptor_set,
+ 5, "Descriptor index 5 is uninitialized"});
+ // Pick 6 below because it is less than the maximum specified, but more than the actual specified
+ tests.push_back({vsSource_frag, fsSource_frag_runtime, nullptr, nullptr, nullptr, false, &pipeline_layout_variable,
+ &descriptor_set_variable, 6, "Index of 6 used to index descriptor array of length 6."});
+ tests.push_back({vsSource_frag, fsSource_frag_runtime, nullptr, nullptr, nullptr, false, &pipeline_layout_variable,
+ &descriptor_set_variable, 5, "Descriptor index 5 is uninitialized"});
+ tests.push_back({vsSource_frag, fsSource_buffer, nullptr, nullptr, nullptr, false, &pipeline_layout_buffer,
+ &descriptor_set_buffer, 25, "Index of 25 used to index descriptor array of length 6."});
+ tests.push_back({vsSource_frag, fsSource_buffer, nullptr, nullptr, nullptr, false, &pipeline_layout_buffer,
+ &descriptor_set_buffer, 5, "Descriptor index 5 is uninitialized"});
+ if (m_device->phy().features().geometryShader) {
+ // OOB Geometry
+ tests.push_back({bindStateVertShaderText, bindStateFragShaderText, gsSource, nullptr, nullptr, false,
+ &pipeline_layout_buffer, &descriptor_set_buffer, 25, "Stage = Geometry"});
+ // Uninitialized Geometry
+ tests.push_back({bindStateVertShaderText, bindStateFragShaderText, gsSource, nullptr, nullptr, false,
+ &pipeline_layout_buffer, &descriptor_set_buffer, 5, "Stage = Geometry"});
+ }
+ if (m_device->phy().features().tessellationShader) {
+ tests.push_back({bindStateVertShaderText, bindStateFragShaderText, nullptr, bindStateTscShaderText, tesSource, false,
+ &pipeline_layout_buffer, &descriptor_set_buffer, 25, "Stage = Tessellation Eval"});
+ tests.push_back({bindStateVertShaderText, bindStateFragShaderText, nullptr, bindStateTscShaderText, tesSource, false,
+ &pipeline_layout_buffer, &descriptor_set_buffer, 5, "Stage = Tessellation Eval"});
+ }
+ }
+
+ VkViewport viewport = m_viewports[0];
+ VkRect2D scissors = m_scissors[0];
+
+ VkSubmitInfo submit_info = {};
+ submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ submit_info.commandBufferCount = 1;
+ submit_info.pCommandBuffers = &m_commandBuffer->handle();
+
+ for (const auto &iter : tests) {
+ VkResult err;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, iter.expected_error);
+ VkShaderObj vs(m_device, iter.vertex_source, VK_SHADER_STAGE_VERTEX_BIT, this, "main", iter.debug);
+ VkShaderObj fs(m_device, iter.fragment_source, VK_SHADER_STAGE_FRAGMENT_BIT, this, "main", iter.debug);
+ VkShaderObj *gs = nullptr;
+ VkShaderObj *tcs = nullptr;
+ VkShaderObj *tes = nullptr;
+ VkPipelineObj pipe(m_device);
+ pipe.AddShader(&vs);
+ pipe.AddShader(&fs);
+ if (iter.geometry_source) {
+ gs = new VkShaderObj(m_device, iter.geometry_source, VK_SHADER_STAGE_GEOMETRY_BIT, this, "main", iter.debug);
+ pipe.AddShader(gs);
+ }
+ if (iter.tess_ctrl_source && iter.tess_eval_source) {
+ tcs = new VkShaderObj(m_device, iter.tess_ctrl_source, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this, "main",
+ iter.debug);
+ tes = new VkShaderObj(m_device, iter.tess_eval_source, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this, "main",
+ iter.debug);
+ pipe.AddShader(tcs);
+ pipe.AddShader(tes);
+ VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
+ VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
+ VkPipelineTessellationDomainOriginStateCreateInfo tessellationDomainOriginStateInfo = {
+ VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO, VK_NULL_HANDLE,
+ VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT};
+
+ VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO,
+ &tessellationDomainOriginStateInfo, 0, 3};
+ pipe.SetTessellation(&tsci);
+ pipe.SetInputAssembly(&iasci);
+ }
+ pipe.AddDefaultColorAttachment();
+ err = pipe.CreateVKPipeline(iter.pipeline_layout->handle(), renderPass());
+ ASSERT_VK_SUCCESS(err);
+ m_commandBuffer->begin();
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, iter.pipeline_layout->handle(), 0, 1,
+ &iter.descriptor_set->set_, 0, nullptr);
+ vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
+ vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissors);
+ vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
+ vk::CmdEndRenderPass(m_commandBuffer->handle());
+ m_commandBuffer->end();
+ uint32_t *data = (uint32_t *)buffer0.memory().map();
+ data[0] = iter.index;
+ buffer0.memory().unmap();
+
+ vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
+ vk::QueueWaitIdle(m_device->m_queue);
+ m_errorMonitor->VerifyFound();
+ if (gs) {
+ delete gs;
+ }
+ if (tcs && tes) {
+ delete tcs;
+ delete tes;
+ }
+ }
+ auto c_queue = m_device->GetDefaultComputeQueue();
+ if (c_queue && descriptor_indexing) {
+ char const *csSource =
+ "#version 450\n"
+ "#extension GL_EXT_nonuniform_qualifier : enable\n "
+ "layout(set = 0, binding = 0) uniform ufoo { uint index; } u_index;"
+ "layout(set = 0, binding = 1) buffer StorageBuffer {\n"
+ " uint data;\n"
+ "} Data[];\n"
+ "void main() {\n"
+ " Data[(u_index.index - 1)].data = Data[u_index.index].data;\n"
+ "}\n";
+
+ auto shader_module = new VkShaderObj(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
+
+ VkPipelineShaderStageCreateInfo stage;
+ stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+ stage.pNext = nullptr;
+ stage.flags = 0;
+ stage.stage = VK_SHADER_STAGE_COMPUTE_BIT;
+ stage.module = shader_module->handle();
+ stage.pName = "main";
+ stage.pSpecializationInfo = nullptr;
+
+ // CreateComputePipelines
+ VkComputePipelineCreateInfo pipeline_info = {};
+ pipeline_info.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO;
+ pipeline_info.pNext = nullptr;
+ pipeline_info.flags = 0;
+ pipeline_info.layout = pipeline_layout_buffer.handle();
+ pipeline_info.basePipelineHandle = VK_NULL_HANDLE;
+ pipeline_info.basePipelineIndex = -1;
+ pipeline_info.stage = stage;
+
+ VkPipeline c_pipeline;
+ vk::CreateComputePipelines(device(), VK_NULL_HANDLE, 1, &pipeline_info, nullptr, &c_pipeline);
+ VkCommandBufferBeginInfo begin_info = {};
+ VkCommandBufferInheritanceInfo hinfo = {};
+ hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
+ begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
+ begin_info.pInheritanceInfo = &hinfo;
+
+ m_commandBuffer->begin(&begin_info);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_COMPUTE, c_pipeline);
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_COMPUTE, pipeline_layout_buffer.handle(), 0, 1,
+ &descriptor_set_buffer.set_, 0, nullptr);
+ vk::CmdDispatch(m_commandBuffer->handle(), 1, 1, 1);
+ m_commandBuffer->end();
+
+ // Uninitialized
+ uint32_t *data = (uint32_t *)buffer0.memory().map();
+ data[0] = 5;
+ buffer0.memory().unmap();
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Stage = Compute");
+ vk::QueueSubmit(c_queue->handle(), 1, &submit_info, VK_NULL_HANDLE);
+ vk::QueueWaitIdle(m_device->m_queue);
+ m_errorMonitor->VerifyFound();
+ // Out of Bounds
+ data = (uint32_t *)buffer0.memory().map();
+ data[0] = 25;
+ buffer0.memory().unmap();
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Stage = Compute");
+ vk::QueueSubmit(c_queue->handle(), 1, &submit_info, VK_NULL_HANDLE);
+ vk::QueueWaitIdle(m_device->m_queue);
+ m_errorMonitor->VerifyFound();
+ vk::DestroyPipeline(m_device->handle(), c_pipeline, NULL);
+ vk::DestroyShaderModule(m_device->handle(), shader_module->handle(), NULL);
+ }
+ return;
+}
+
+TEST_F(VkGpuAssistedLayerTest, GpuBufferDeviceAddressOOB) {
+ SetTargetApiVersion(VK_API_VERSION_1_1);
+ bool supported = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+
+ InitGpuAssistedFramework(false);
+ if (IsPlatform(kMockICD) || DeviceSimulation()) {
+ printf("%s GPU-Assisted validation test requires a driver that can draw.\n", kSkipPrefix);
+ return;
+ }
+
+ supported = supported && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME);
+
+ VkPhysicalDeviceFeatures2KHR features2 = {};
+ auto bda_features = lvl_init_struct<VkPhysicalDeviceBufferDeviceAddressFeaturesKHR>();
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+
+ features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&bda_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+ supported = supported && bda_features.bufferDeviceAddress;
+
+ if (!supported) {
+ printf("%s Buffer Device Address feature not supported, skipping test\n", kSkipPrefix);
+ return;
+ }
+
+ bool mesh_shader_supported = DeviceExtensionSupported(gpu(), nullptr, VK_NV_MESH_SHADER_EXTENSION_NAME);
+ if (mesh_shader_supported) {
+ m_device_extension_names.push_back(VK_NV_MESH_SHADER_EXTENSION_NAME);
+ }
+
+ VkCommandPoolCreateFlags pool_flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, pool_flags));
+ if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
+ printf("%s GPU-Assisted validation test requires Vulkan 1.1+.\n", kSkipPrefix);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitViewport());
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ // Make a uniform buffer to be passed to the shader that contains the pointer and write count
+ uint32_t qfi = 0;
+ VkBufferCreateInfo bci = {};
+ bci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ bci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
+ bci.size = 8;
+ bci.queueFamilyIndexCount = 1;
+ bci.pQueueFamilyIndices = &qfi;
+ VkBufferObj buffer0;
+ VkMemoryPropertyFlags mem_props = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
+ buffer0.init(*m_device, bci, mem_props);
+
+ // Make another buffer to write to
+ bci.usage = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR;
+ bci.size = 64; // Buffer should be 16*4 = 64 bytes
+ VkBuffer buffer1;
+ vk::CreateBuffer(device(), &bci, NULL, &buffer1);
+ VkMemoryRequirements buffer_mem_reqs = {};
+ vk::GetBufferMemoryRequirements(device(), buffer1, &buffer_mem_reqs);
+ VkMemoryAllocateInfo buffer_alloc_info = {};
+ buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
+ m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
+ VkMemoryAllocateFlagsInfo alloc_flags = {VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO};
+ alloc_flags.flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR;
+ buffer_alloc_info.pNext = &alloc_flags;
+ VkDeviceMemory buffer_mem;
+ VkResult err = vk::AllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
+ ASSERT_VK_SUCCESS(err);
+ vk::BindBufferMemory(m_device->device(), buffer1, buffer_mem, 0);
+
+ // Get device address of buffer to write to
+ VkBufferDeviceAddressInfoKHR bda_info = {};
+ bda_info.sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_KHR;
+ bda_info.buffer = buffer1;
+ auto vkGetBufferDeviceAddressKHR =
+ (PFN_vkGetBufferDeviceAddressKHR)vk::GetDeviceProcAddr(m_device->device(), "vkGetBufferDeviceAddressKHR");
+ ASSERT_TRUE(vkGetBufferDeviceAddressKHR != nullptr);
+ auto pBuffer = vkGetBufferDeviceAddressKHR(m_device->device(), &bda_info);
+
+ OneOffDescriptorSet descriptor_set(m_device, {{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}});
+
+ const VkPipelineLayoutObj pipeline_layout(m_device, {&descriptor_set.layout_});
+ VkDescriptorBufferInfo buffer_test_buffer_info[2] = {};
+ buffer_test_buffer_info[0].buffer = buffer0.handle();
+ buffer_test_buffer_info[0].offset = 0;
+ buffer_test_buffer_info[0].range = sizeof(uint32_t);
+
+ VkWriteDescriptorSet descriptor_writes[1] = {};
+ descriptor_writes[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ descriptor_writes[0].dstSet = descriptor_set.set_;
+ descriptor_writes[0].dstBinding = 0;
+ descriptor_writes[0].descriptorCount = 1;
+ descriptor_writes[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+ descriptor_writes[0].pBufferInfo = buffer_test_buffer_info;
+ vk::UpdateDescriptorSets(m_device->device(), 1, descriptor_writes, 0, NULL);
+
+ char const *shader_source =
+ "#version 450\n"
+ "#extension GL_EXT_buffer_reference : enable\n "
+ "layout(buffer_reference, buffer_reference_align = 16) buffer bufStruct;\n"
+ "layout(set = 0, binding = 0) uniform ufoo {\n"
+ " bufStruct data;\n"
+ " int nWrites;\n"
+ "} u_info;\n"
+ "layout(buffer_reference, std140) buffer bufStruct {\n"
+ " int a[4];\n"
+ "};\n"
+ "void main() {\n"
+ " for (int i=0; i < u_info.nWrites; ++i) {\n"
+ " u_info.data.a[i] = 0xdeadca71;\n"
+ " }\n"
+ "}\n";
+ VkShaderObj vs(m_device, shader_source, VK_SHADER_STAGE_VERTEX_BIT, this, "main", true);
+
+ VkViewport viewport = m_viewports[0];
+ VkRect2D scissors = m_scissors[0];
+
+ VkSubmitInfo submit_info = {};
+ submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ submit_info.commandBufferCount = 1;
+ submit_info.pCommandBuffers = &m_commandBuffer->handle();
+
+ VkPipelineObj pipe(m_device);
+ pipe.AddShader(&vs);
+ pipe.AddDefaultColorAttachment();
+ err = pipe.CreateVKPipeline(pipeline_layout.handle(), renderPass());
+ ASSERT_VK_SUCCESS(err);
+
+ VkCommandBufferBeginInfo begin_info = {};
+ VkCommandBufferInheritanceInfo hinfo = {};
+ hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
+ begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
+ begin_info.pInheritanceInfo = &hinfo;
+
+ m_commandBuffer->begin(&begin_info);
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
+ &descriptor_set.set_, 0, nullptr);
+ vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
+ vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissors);
+ vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
+ vk::CmdEndRenderPass(m_commandBuffer->handle());
+ m_commandBuffer->end();
+
+ // Starting address too low
+ VkDeviceAddress *data = (VkDeviceAddress *)buffer0.memory().map();
+ data[0] = pBuffer - 16;
+ data[1] = 4;
+ buffer0.memory().unmap();
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "access out of bounds");
+ err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
+ ASSERT_VK_SUCCESS(err);
+ err = vk::QueueWaitIdle(m_device->m_queue);
+ ASSERT_VK_SUCCESS(err);
+ m_errorMonitor->VerifyFound();
+
+ // Run past the end
+ data = (VkDeviceAddress *)buffer0.memory().map();
+ data[0] = pBuffer;
+ data[1] = 5;
+ buffer0.memory().unmap();
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "access out of bounds");
+ err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
+ ASSERT_VK_SUCCESS(err);
+ err = vk::QueueWaitIdle(m_device->m_queue);
+ ASSERT_VK_SUCCESS(err);
+ m_errorMonitor->VerifyFound();
+
+ // Positive test - stay inside buffer
+ m_errorMonitor->ExpectSuccess();
+ data = (VkDeviceAddress *)buffer0.memory().map();
+ data[0] = pBuffer;
+ data[1] = 4;
+ buffer0.memory().unmap();
+ err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
+ ASSERT_VK_SUCCESS(err);
+ err = vk::QueueWaitIdle(m_device->m_queue);
+ ASSERT_VK_SUCCESS(err);
+ m_errorMonitor->VerifyNotFound();
+
+ if (mesh_shader_supported) {
+ const unsigned push_constant_range_count = 1;
+ VkPushConstantRange push_constant_ranges[push_constant_range_count] = {};
+ push_constant_ranges[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
+ push_constant_ranges[0].offset = 0;
+ push_constant_ranges[0].size = 2 * sizeof(VkDeviceAddress);
+
+ VkPipelineLayout mesh_pipeline_layout;
+ VkPipelineLayoutCreateInfo pipelineLayoutCreateInfo[1] = {};
+ pipelineLayoutCreateInfo[0].sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
+ pipelineLayoutCreateInfo[0].pNext = NULL;
+ pipelineLayoutCreateInfo[0].pushConstantRangeCount = push_constant_range_count;
+ pipelineLayoutCreateInfo[0].pPushConstantRanges = push_constant_ranges;
+ pipelineLayoutCreateInfo[0].setLayoutCount = 0;
+ pipelineLayoutCreateInfo[0].pSetLayouts = nullptr;
+ vk::CreatePipelineLayout(m_device->handle(), pipelineLayoutCreateInfo, NULL, &mesh_pipeline_layout);
+
+ char const *mesh_shader_source =
+ "#version 460\n"
+ "#extension GL_NV_mesh_shader : require\n"
+ "#extension GL_EXT_buffer_reference : enable\n"
+ "layout(buffer_reference, buffer_reference_align = 16) buffer bufStruct;\n"
+ "layout(push_constant) uniform ufoo {\n"
+ " bufStruct data;\n"
+ " int nWrites;\n"
+ "} u_info;\n"
+ "layout(buffer_reference, std140) buffer bufStruct {\n"
+ " int a[4];\n"
+ "};\n"
+
+ "layout(local_size_x = 32) in;\n"
+ "layout(max_vertices = 64, max_primitives = 126) out;\n"
+ "layout(triangles) out;\n"
+
+ "uint invocationID = gl_LocalInvocationID.x;\n"
+ "void main() {\n"
+ " if (invocationID == 0) {\n"
+ " for (int i=0; i < u_info.nWrites; ++i) {\n"
+ " u_info.data.a[i] = 0xdeadca71;\n"
+ " }\n"
+ " }\n"
+ "}\n";
+ VkShaderObj ms(m_device, mesh_shader_source, VK_SHADER_STAGE_MESH_BIT_NV, this, "main", true);
+ VkPipelineObj mesh_pipe(m_device);
+ mesh_pipe.AddShader(&ms);
+ mesh_pipe.AddDefaultColorAttachment();
+ err = mesh_pipe.CreateVKPipeline(mesh_pipeline_layout, renderPass());
+ ASSERT_VK_SUCCESS(err);
+ m_commandBuffer->begin(&begin_info);
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, mesh_pipe.handle());
+ VkDeviceAddress pushConstants[2] = {};
+ pushConstants[0] = pBuffer;
+ pushConstants[1] = 5;
+ vk::CmdPushConstants(m_commandBuffer->handle(), mesh_pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(pushConstants),
+ pushConstants);
+ vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
+ vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissors);
+ vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
+ vk::CmdEndRenderPass(m_commandBuffer->handle());
+ m_commandBuffer->end();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "access out of bounds");
+ err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
+ ASSERT_VK_SUCCESS(err);
+ err = vk::QueueWaitIdle(m_device->m_queue);
+ ASSERT_VK_SUCCESS(err);
+ m_errorMonitor->VerifyFound();
+ }
+
+ vk::DestroyBuffer(m_device->handle(), buffer1, NULL);
+ vk::FreeMemory(m_device->handle(), buffer_mem, NULL);
+}
+
+TEST_F(VkGpuAssistedLayerTest, GpuValidationArrayOOBRayTracingShaders) {
+ TEST_DESCRIPTION(
+ "GPU validation: Verify detection of out-of-bounds descriptor array indexing and use of uninitialized descriptors for "
+ "ray tracing shaders using gpu assited validation.");
+ OOBRayTracingShadersTestBody(true);
+}
+
+TEST_F(VkGpuAssistedLayerTest, GpuBuildAccelerationStructureValidationInvalidHandle) {
+ TEST_DESCRIPTION(
+ "Acceleration structure gpu validation should report an invalid handle when trying to build a top level "
+ "acceleration structure with an invalid handle for a bottom level acceleration structure.");
+
+ if (!InitFrameworkForRayTracingTest(this, false, m_instance_extension_names, m_device_extension_names, m_errorMonitor,
+ /*need_gpu_validation=*/true)) {
+ return;
+ }
+
+ PFN_vkCmdBuildAccelerationStructureNV vkCmdBuildAccelerationStructureNV =
+ reinterpret_cast<PFN_vkCmdBuildAccelerationStructureNV>(
+ vk::GetDeviceProcAddr(m_device->handle(), "vkCmdBuildAccelerationStructureNV"));
+ assert(vkCmdBuildAccelerationStructureNV != nullptr);
+
+ VkBufferObj vbo;
+ VkBufferObj ibo;
+ VkGeometryNV geometry;
+ GetSimpleGeometryForAccelerationStructureTests(*m_device, &vbo, &ibo, &geometry);
+
+ VkAccelerationStructureCreateInfoNV top_level_as_create_info = {};
+ top_level_as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
+ top_level_as_create_info.info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
+ top_level_as_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV;
+ top_level_as_create_info.info.instanceCount = 1;
+ top_level_as_create_info.info.geometryCount = 0;
+
+ VkCommandPoolObj command_pool(m_device, 0, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
+
+ struct VkGeometryInstanceNV {
+ float transform[12];
+ uint32_t instanceCustomIndex : 24;
+ uint32_t mask : 8;
+ uint32_t instanceOffset : 24;
+ uint32_t flags : 8;
+ uint64_t accelerationStructureHandle;
+ };
+
+ VkGeometryInstanceNV instance = {
+ {
+ // clang-format off
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ // clang-format on
+ },
+ 0,
+ 0xFF,
+ 0,
+ VK_GEOMETRY_INSTANCE_TRIANGLE_CULL_DISABLE_BIT_NV,
+ 1234567890, // invalid
+ };
+
+ VkDeviceSize instance_buffer_size = sizeof(VkGeometryInstanceNV);
+ VkBufferObj instance_buffer;
+ instance_buffer.init(*m_device, instance_buffer_size,
+ VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+ VK_BUFFER_USAGE_RAY_TRACING_BIT_NV);
+
+ uint8_t *mapped_instance_buffer_data = (uint8_t *)instance_buffer.memory().map();
+ std::memcpy(mapped_instance_buffer_data, (uint8_t *)&instance, static_cast<std::size_t>(instance_buffer_size));
+ instance_buffer.memory().unmap();
+
+ VkAccelerationStructureObj top_level_as(*m_device, top_level_as_create_info);
+ m_errorMonitor->VerifyNotFound();
+
+ VkBufferObj top_level_as_scratch;
+ top_level_as.create_scratch_buffer(*m_device, &top_level_as_scratch);
+
+ VkCommandBufferObj command_buffer(m_device, &command_pool);
+ command_buffer.begin();
+ vkCmdBuildAccelerationStructureNV(command_buffer.handle(), &top_level_as_create_info.info, instance_buffer.handle(), 0,
+ VK_FALSE, top_level_as.handle(), VK_NULL_HANDLE, top_level_as_scratch.handle(), 0);
+ command_buffer.end();
+
+ m_errorMonitor->SetDesiredFailureMsg(
+ kErrorBit, "Attempted to build top level acceleration structure using invalid bottom level acceleration structure handle");
+
+ VkSubmitInfo submit_info = {};
+ submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ submit_info.commandBufferCount = 1;
+ submit_info.pCommandBuffers = &command_buffer.handle();
+ vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
+ vk::QueueWaitIdle(m_device->m_queue);
+ m_errorMonitor->VerifyFound();
+}
+
+TEST_F(VkGpuAssistedLayerTest, GpuBuildAccelerationStructureValidationBottomLevelNotYetBuilt) {
+ TEST_DESCRIPTION(
+ "Acceleration structure gpu validation should report an invalid handle when trying to build a top level "
+ "acceleration structure with a handle for a bottom level acceleration structure that has not yet been built.");
+
+ if (!InitFrameworkForRayTracingTest(this, false, m_instance_extension_names, m_device_extension_names, m_errorMonitor,
+ /*need_gpu_validation=*/true)) {
+ return;
+ }
+
+ PFN_vkCmdBuildAccelerationStructureNV vkCmdBuildAccelerationStructureNV =
+ reinterpret_cast<PFN_vkCmdBuildAccelerationStructureNV>(
+ vk::GetDeviceProcAddr(m_device->handle(), "vkCmdBuildAccelerationStructureNV"));
+ assert(vkCmdBuildAccelerationStructureNV != nullptr);
+
+ VkBufferObj vbo;
+ VkBufferObj ibo;
+ VkGeometryNV geometry;
+ GetSimpleGeometryForAccelerationStructureTests(*m_device, &vbo, &ibo, &geometry);
+
+ VkAccelerationStructureCreateInfoNV bot_level_as_create_info = {};
+ bot_level_as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
+ bot_level_as_create_info.info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
+ bot_level_as_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV;
+ bot_level_as_create_info.info.instanceCount = 0;
+ bot_level_as_create_info.info.geometryCount = 1;
+ bot_level_as_create_info.info.pGeometries = &geometry;
+
+ VkAccelerationStructureCreateInfoNV top_level_as_create_info = {};
+ top_level_as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
+ top_level_as_create_info.info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
+ top_level_as_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV;
+ top_level_as_create_info.info.instanceCount = 1;
+ top_level_as_create_info.info.geometryCount = 0;
+
+ VkCommandPoolObj command_pool(m_device, 0, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
+
+ struct VkGeometryInstanceNV {
+ float transform[12];
+ uint32_t instanceCustomIndex : 24;
+ uint32_t mask : 8;
+ uint32_t instanceOffset : 24;
+ uint32_t flags : 8;
+ uint64_t accelerationStructureHandle;
+ };
+
+ VkAccelerationStructureObj bot_level_as_never_built(*m_device, bot_level_as_create_info);
+ m_errorMonitor->VerifyNotFound();
+
+ VkGeometryInstanceNV instance = {
+ {
+ // clang-format off
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ // clang-format on
+ },
+ 0,
+ 0xFF,
+ 0,
+ VK_GEOMETRY_INSTANCE_TRIANGLE_CULL_DISABLE_BIT_NV,
+ bot_level_as_never_built.opaque_handle(),
+ };
+
+ VkDeviceSize instance_buffer_size = sizeof(VkGeometryInstanceNV);
+ VkBufferObj instance_buffer;
+ instance_buffer.init(*m_device, instance_buffer_size,
+ VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+ VK_BUFFER_USAGE_RAY_TRACING_BIT_NV);
+
+ uint8_t *mapped_instance_buffer_data = (uint8_t *)instance_buffer.memory().map();
+ std::memcpy(mapped_instance_buffer_data, (uint8_t *)&instance, static_cast<std::size_t>(instance_buffer_size));
+ instance_buffer.memory().unmap();
+
+ VkAccelerationStructureObj top_level_as(*m_device, top_level_as_create_info);
+ m_errorMonitor->VerifyNotFound();
+
+ VkBufferObj top_level_as_scratch;
+ top_level_as.create_scratch_buffer(*m_device, &top_level_as_scratch);
+
+ VkCommandBufferObj command_buffer(m_device, &command_pool);
+ command_buffer.begin();
+ vkCmdBuildAccelerationStructureNV(command_buffer.handle(), &top_level_as_create_info.info, instance_buffer.handle(), 0,
+ VK_FALSE, top_level_as.handle(), VK_NULL_HANDLE, top_level_as_scratch.handle(), 0);
+ command_buffer.end();
+
+ m_errorMonitor->SetDesiredFailureMsg(
+ kErrorBit, "Attempted to build top level acceleration structure using invalid bottom level acceleration structure handle");
+
+ VkSubmitInfo submit_info = {};
+ submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ submit_info.commandBufferCount = 1;
+ submit_info.pCommandBuffers = &command_buffer.handle();
+ vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
+ vk::QueueWaitIdle(m_device->m_queue);
+ m_errorMonitor->VerifyFound();
+}
+
+TEST_F(VkGpuAssistedLayerTest, GpuBuildAccelerationStructureValidationBottomLevelDestroyed) {
+ TEST_DESCRIPTION(
+ "Acceleration structure gpu validation should report an invalid handle when trying to build a top level "
+ "acceleration structure with a handle for a destroyed bottom level acceleration structure.");
+
+ if (!InitFrameworkForRayTracingTest(this, false, m_instance_extension_names, m_device_extension_names, m_errorMonitor,
+ /*need_gpu_validation=*/true)) {
+ return;
+ }
+
+ PFN_vkCmdBuildAccelerationStructureNV vkCmdBuildAccelerationStructureNV =
+ reinterpret_cast<PFN_vkCmdBuildAccelerationStructureNV>(
+ vk::GetDeviceProcAddr(m_device->handle(), "vkCmdBuildAccelerationStructureNV"));
+ assert(vkCmdBuildAccelerationStructureNV != nullptr);
+
+ VkBufferObj vbo;
+ VkBufferObj ibo;
+ VkGeometryNV geometry;
+ GetSimpleGeometryForAccelerationStructureTests(*m_device, &vbo, &ibo, &geometry);
+
+ VkAccelerationStructureCreateInfoNV bot_level_as_create_info = {};
+ bot_level_as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
+ bot_level_as_create_info.info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
+ bot_level_as_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV;
+ bot_level_as_create_info.info.instanceCount = 0;
+ bot_level_as_create_info.info.geometryCount = 1;
+ bot_level_as_create_info.info.pGeometries = &geometry;
+
+ VkAccelerationStructureCreateInfoNV top_level_as_create_info = {};
+ top_level_as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
+ top_level_as_create_info.info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
+ top_level_as_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV;
+ top_level_as_create_info.info.instanceCount = 1;
+ top_level_as_create_info.info.geometryCount = 0;
+
+ VkCommandPoolObj command_pool(m_device, 0, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
+
+ struct VkGeometryInstanceNV {
+ float transform[12];
+ uint32_t instanceCustomIndex : 24;
+ uint32_t mask : 8;
+ uint32_t instanceOffset : 24;
+ uint32_t flags : 8;
+ uint64_t accelerationStructureHandle;
+ };
+
+ uint64_t destroyed_bot_level_as_handle = 0;
+ {
+ VkAccelerationStructureObj destroyed_bot_level_as(*m_device, bot_level_as_create_info);
+ m_errorMonitor->VerifyNotFound();
+
+ destroyed_bot_level_as_handle = destroyed_bot_level_as.opaque_handle();
+
+ VkBufferObj bot_level_as_scratch;
+ destroyed_bot_level_as.create_scratch_buffer(*m_device, &bot_level_as_scratch);
+
+ VkCommandBufferObj command_buffer(m_device, &command_pool);
+ command_buffer.begin();
+ vkCmdBuildAccelerationStructureNV(command_buffer.handle(), &bot_level_as_create_info.info, VK_NULL_HANDLE, 0, VK_FALSE,
+ destroyed_bot_level_as.handle(), VK_NULL_HANDLE, bot_level_as_scratch.handle(), 0);
+ command_buffer.end();
+
+ VkSubmitInfo submit_info = {};
+ submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ submit_info.commandBufferCount = 1;
+ submit_info.pCommandBuffers = &command_buffer.handle();
+ vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
+ vk::QueueWaitIdle(m_device->m_queue);
+ m_errorMonitor->VerifyNotFound();
+
+ // vk::DestroyAccelerationStructureNV called on destroyed_bot_level_as during destruction.
+ }
+
+ VkGeometryInstanceNV instance = {
+ {
+ // clang-format off
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ // clang-format on
+ },
+ 0,
+ 0xFF,
+ 0,
+ VK_GEOMETRY_INSTANCE_TRIANGLE_CULL_DISABLE_BIT_NV,
+ destroyed_bot_level_as_handle,
+ };
+
+ VkDeviceSize instance_buffer_size = sizeof(VkGeometryInstanceNV);
+ VkBufferObj instance_buffer;
+ instance_buffer.init(*m_device, instance_buffer_size,
+ VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+ VK_BUFFER_USAGE_RAY_TRACING_BIT_NV);
+
+ uint8_t *mapped_instance_buffer_data = (uint8_t *)instance_buffer.memory().map();
+ std::memcpy(mapped_instance_buffer_data, (uint8_t *)&instance, static_cast<std::size_t>(instance_buffer_size));
+ instance_buffer.memory().unmap();
+
+ VkAccelerationStructureObj top_level_as(*m_device, top_level_as_create_info);
+ m_errorMonitor->VerifyNotFound();
+
+ VkBufferObj top_level_as_scratch;
+ top_level_as.create_scratch_buffer(*m_device, &top_level_as_scratch);
+
+ VkCommandBufferObj command_buffer(m_device, &command_pool);
+ command_buffer.begin();
+ vkCmdBuildAccelerationStructureNV(command_buffer.handle(), &top_level_as_create_info.info, instance_buffer.handle(), 0,
+ VK_FALSE, top_level_as.handle(), VK_NULL_HANDLE, top_level_as_scratch.handle(), 0);
+ command_buffer.end();
+
+ m_errorMonitor->SetDesiredFailureMsg(
+ kErrorBit, "Attempted to build top level acceleration structure using invalid bottom level acceleration structure handle");
+
+ VkSubmitInfo submit_info = {};
+ submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ submit_info.commandBufferCount = 1;
+ submit_info.pCommandBuffers = &command_buffer.handle();
+ vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
+ vk::QueueWaitIdle(m_device->m_queue);
+ m_errorMonitor->VerifyFound();
+}
+
+TEST_F(VkGpuAssistedLayerTest, GpuBuildAccelerationStructureValidationRestoresState) {
+ TEST_DESCRIPTION("Validate that acceleration structure gpu validation correctly restores compute state.");
+
+ if (!InitFrameworkForRayTracingTest(this, false, m_instance_extension_names, m_device_extension_names, m_errorMonitor,
+ /*need_gpu_validation=*/true, /*need_push_descriptors=*/true)) {
+ return;
+ }
+
+ PFN_vkCmdBuildAccelerationStructureNV vkCmdBuildAccelerationStructureNV =
+ reinterpret_cast<PFN_vkCmdBuildAccelerationStructureNV>(
+ vk::GetDeviceProcAddr(m_device->handle(), "vkCmdBuildAccelerationStructureNV"));
+ assert(vkCmdBuildAccelerationStructureNV != nullptr);
+
+ PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
+ (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdPushDescriptorSetKHR");
+ assert(vkCmdPushDescriptorSetKHR != nullptr);
+
+ VkBufferObj vbo;
+ VkBufferObj ibo;
+ VkGeometryNV geometry;
+ GetSimpleGeometryForAccelerationStructureTests(*m_device, &vbo, &ibo, &geometry);
+
+ VkAccelerationStructureCreateInfoNV top_level_as_create_info = {};
+ top_level_as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
+ top_level_as_create_info.info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
+ top_level_as_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV;
+ top_level_as_create_info.info.instanceCount = 1;
+ top_level_as_create_info.info.geometryCount = 0;
+
+ VkCommandPoolObj command_pool(m_device, 0, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
+
+ struct VkGeometryInstanceNV {
+ float transform[12];
+ uint32_t instanceCustomIndex : 24;
+ uint32_t mask : 8;
+ uint32_t instanceOffset : 24;
+ uint32_t flags : 8;
+ uint64_t accelerationStructureHandle;
+ };
+
+ VkGeometryInstanceNV instance = {
+ {
+ // clang-format off
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ // clang-format on
+ },
+ 0,
+ 0xFF,
+ 0,
+ VK_GEOMETRY_INSTANCE_TRIANGLE_CULL_DISABLE_BIT_NV,
+ 1234567,
+ };
+
+ VkDeviceSize instance_buffer_size = sizeof(VkGeometryInstanceNV);
+ VkBufferObj instance_buffer;
+ instance_buffer.init(*m_device, instance_buffer_size,
+ VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+ VK_BUFFER_USAGE_RAY_TRACING_BIT_NV);
+
+ uint8_t *mapped_instance_buffer_data = (uint8_t *)instance_buffer.memory().map();
+ std::memcpy(mapped_instance_buffer_data, (uint8_t *)&instance, static_cast<std::size_t>(instance_buffer_size));
+ instance_buffer.memory().unmap();
+
+ VkAccelerationStructureObj top_level_as(*m_device, top_level_as_create_info);
+ m_errorMonitor->VerifyNotFound();
+
+ VkBufferObj top_level_as_scratch;
+ top_level_as.create_scratch_buffer(*m_device, &top_level_as_scratch);
+
+ struct ComputeOutput {
+ uint32_t push_constant_value;
+ uint32_t push_descriptor_value;
+ uint32_t normal_descriptor_value;
+ };
+
+ VkBufferObj push_descriptor_buffer;
+ push_descriptor_buffer.init(*m_device, 4, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+ VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
+
+ VkBufferObj normal_descriptor_buffer;
+ normal_descriptor_buffer.init(*m_device, 4, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+ VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
+
+ VkDeviceSize output_descriptor_buffer_size = static_cast<VkDeviceSize>(sizeof(ComputeOutput));
+ VkBufferObj output_descriptor_buffer;
+ output_descriptor_buffer.init(*m_device, output_descriptor_buffer_size,
+ VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+ VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
+
+ const std::string cs_source = R"glsl(#version 450
+ layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+
+ layout(push_constant) uniform PushConstants { uint value; } push_constant;
+ layout(set = 0, binding = 0, std430) buffer PushDescriptorBuffer { uint value; } push_descriptor;
+ layout(set = 1, binding = 0, std430) buffer NormalDescriptorBuffer { uint value; } normal_descriptor;
+
+ layout(set = 2, binding = 0, std430) buffer ComputeOutputBuffer {
+ uint push_constant_value;
+ uint push_descriptor_value;
+ uint normal_descriptor_value;
+ } compute_output;
+
+ void main() {
+ compute_output.push_constant_value = push_constant.value;
+ compute_output.push_descriptor_value = push_descriptor.value;
+ compute_output.normal_descriptor_value = normal_descriptor.value;
+ }
+ )glsl";
+ VkShaderObj cs(m_device, cs_source.c_str(), VK_SHADER_STAGE_COMPUTE_BIT, this);
+
+ OneOffDescriptorSet push_descriptor_set(m_device,
+ {
+ {0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
+ },
+ VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
+ OneOffDescriptorSet normal_descriptor_set(m_device,
+ {
+ {0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
+ });
+ OneOffDescriptorSet output_descriptor_set(m_device,
+ {
+ {0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
+ });
+
+ VkPushConstantRange push_constant_range = {};
+ push_constant_range.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT;
+ push_constant_range.size = 4;
+ push_constant_range.offset = 0;
+
+ const VkPipelineLayoutObj compute_pipeline_layout(m_device,
+ {
+ &push_descriptor_set.layout_,
+ &normal_descriptor_set.layout_,
+ &output_descriptor_set.layout_,
+ },
+ {push_constant_range});
+
+ VkComputePipelineCreateInfo compute_pipeline_ci = {};
+ compute_pipeline_ci.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO;
+ compute_pipeline_ci.layout = compute_pipeline_layout.handle();
+ compute_pipeline_ci.stage = cs.GetStageCreateInfo();
+
+ VkPipeline compute_pipeline;
+ ASSERT_VK_SUCCESS(
+ vk::CreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &compute_pipeline_ci, nullptr, &compute_pipeline));
+
+ normal_descriptor_set.WriteDescriptorBufferInfo(0, normal_descriptor_buffer.handle(), 4, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
+ normal_descriptor_set.UpdateDescriptorSets();
+
+ output_descriptor_set.WriteDescriptorBufferInfo(0, output_descriptor_buffer.handle(), output_descriptor_buffer_size,
+ VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
+ output_descriptor_set.UpdateDescriptorSets();
+
+ // Set input data
+ const uint32_t push_constant_value = 1234567890;
+ const uint32_t push_descriptor_value = 98765432;
+ const uint32_t normal_descriptor_value = 1111111;
+
+ uint32_t *mapped_push_descriptor_buffer_data = (uint32_t *)push_descriptor_buffer.memory().map();
+ *mapped_push_descriptor_buffer_data = push_descriptor_value;
+ push_descriptor_buffer.memory().unmap();
+
+ uint32_t *mapped_normal_descriptor_buffer_data = (uint32_t *)normal_descriptor_buffer.memory().map();
+ *mapped_normal_descriptor_buffer_data = normal_descriptor_value;
+ normal_descriptor_buffer.memory().unmap();
+
+ ComputeOutput *mapped_output_buffer_data = (ComputeOutput *)output_descriptor_buffer.memory().map();
+ mapped_output_buffer_data->push_constant_value = 0;
+ mapped_output_buffer_data->push_descriptor_value = 0;
+ mapped_output_buffer_data->normal_descriptor_value = 0;
+ output_descriptor_buffer.memory().unmap();
+
+ VkDescriptorBufferInfo push_descriptor_buffer_info = {};
+ push_descriptor_buffer_info.buffer = push_descriptor_buffer.handle();
+ push_descriptor_buffer_info.offset = 0;
+ push_descriptor_buffer_info.range = 4;
+ VkWriteDescriptorSet push_descriptor_set_write = {};
+ push_descriptor_set_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ push_descriptor_set_write.descriptorCount = 1;
+ push_descriptor_set_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
+ push_descriptor_set_write.dstBinding = 0;
+ push_descriptor_set_write.pBufferInfo = &push_descriptor_buffer_info;
+
+ VkCommandBufferObj command_buffer(m_device, &command_pool);
+ command_buffer.begin();
+ vk::CmdBindPipeline(command_buffer.handle(), VK_PIPELINE_BIND_POINT_COMPUTE, compute_pipeline);
+ vk::CmdPushConstants(command_buffer.handle(), compute_pipeline_layout.handle(), VK_SHADER_STAGE_COMPUTE_BIT, 0, 4,
+ &push_constant_value);
+ vkCmdPushDescriptorSetKHR(command_buffer.handle(), VK_PIPELINE_BIND_POINT_COMPUTE, compute_pipeline_layout.handle(), 0, 1,
+ &push_descriptor_set_write);
+ vk::CmdBindDescriptorSets(command_buffer.handle(), VK_PIPELINE_BIND_POINT_COMPUTE, compute_pipeline_layout.handle(), 1, 1,
+ &normal_descriptor_set.set_, 0, nullptr);
+ vk::CmdBindDescriptorSets(command_buffer.handle(), VK_PIPELINE_BIND_POINT_COMPUTE, compute_pipeline_layout.handle(), 2, 1,
+ &output_descriptor_set.set_, 0, nullptr);
+
+ vkCmdBuildAccelerationStructureNV(command_buffer.handle(), &top_level_as_create_info.info, instance_buffer.handle(), 0,
+ VK_FALSE, top_level_as.handle(), VK_NULL_HANDLE, top_level_as_scratch.handle(), 0);
+
+ vk::CmdDispatch(command_buffer.handle(), 1, 1, 1);
+ command_buffer.end();
+
+ m_errorMonitor->SetDesiredFailureMsg(
+ kErrorBit, "Attempted to build top level acceleration structure using invalid bottom level acceleration structure handle");
+
+ VkSubmitInfo submit_info = {};
+ submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ submit_info.commandBufferCount = 1;
+ submit_info.pCommandBuffers = &command_buffer.handle();
+ vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
+ vk::QueueWaitIdle(m_device->m_queue);
+
+ m_errorMonitor->VerifyFound();
+
+ mapped_output_buffer_data = (ComputeOutput *)output_descriptor_buffer.memory().map();
+ EXPECT_EQ(mapped_output_buffer_data->push_constant_value, push_constant_value);
+ EXPECT_EQ(mapped_output_buffer_data->push_descriptor_value, push_descriptor_value);
+ EXPECT_EQ(mapped_output_buffer_data->normal_descriptor_value, normal_descriptor_value);
+ output_descriptor_buffer.memory().unmap();
+
+ // Clean up
+ vk::DestroyPipeline(m_device->device(), compute_pipeline, nullptr);
+}
+
+TEST_F(VkGpuAssistedLayerTest, GpuValidationInlineUniformBlockAndMiscGpu) {
+ TEST_DESCRIPTION(
+ "GPU validation: Make sure inline uniform blocks don't generate false validation errors, verify reserved descriptor slot "
+ "and verify pipeline recovery");
+ SetTargetApiVersion(VK_API_VERSION_1_1);
+ m_errorMonitor->ExpectSuccess();
+ VkValidationFeatureEnableEXT enables[] = {VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT,
+ VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT};
+ VkValidationFeaturesEXT features = {};
+ features.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
+ features.enabledValidationFeatureCount = 2;
+ features.pEnabledValidationFeatures = enables;
+ bool descriptor_indexing = CheckDescriptorIndexingSupportAndInitFramework(this, m_instance_extension_names,
+ m_device_extension_names, &features, m_errorMonitor);
+ if (IsPlatform(kMockICD) || DeviceSimulation()) {
+ printf("%s Test not supported by MockICD, skipping tests\n", kSkipPrefix);
+ return;
+ }
+ VkPhysicalDeviceFeatures2KHR features2 = {};
+ auto indexing_features = lvl_init_struct<VkPhysicalDeviceDescriptorIndexingFeaturesEXT>();
+ auto inline_uniform_block_features = lvl_init_struct<VkPhysicalDeviceInlineUniformBlockFeaturesEXT>(&indexing_features);
+ bool inline_uniform_block = DeviceExtensionSupported(gpu(), nullptr, VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME);
+ if (!(descriptor_indexing && inline_uniform_block)) {
+ printf("Descriptor indexing and/or inline uniform block not supported Skipping test\n");
+ return;
+ }
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME);
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+
+ features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&inline_uniform_block_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+ if (!indexing_features.descriptorBindingPartiallyBound || !inline_uniform_block_features.inlineUniformBlock) {
+ printf("Not all features supported, skipping test\n");
+ return;
+ }
+ auto inline_uniform_props = lvl_init_struct<VkPhysicalDeviceInlineUniformBlockPropertiesEXT>();
+ auto prop2 = lvl_init_struct<VkPhysicalDeviceProperties2KHR>(&inline_uniform_props);
+ vk::GetPhysicalDeviceProperties2(gpu(), &prop2);
+
+ VkCommandPoolCreateFlags pool_flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, pool_flags));
+ if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
+ printf("%s GPU-Assisted validation test requires Vulkan 1.1+.\n", kSkipPrefix);
+ return;
+ }
+ auto c_queue = m_device->GetDefaultComputeQueue();
+ if (nullptr == c_queue) {
+ printf("Compute not supported, skipping test\n");
+ return;
+ }
+
+ uint32_t qfi = 0;
+ VkBufferCreateInfo bci = {};
+ bci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ bci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
+ bci.size = 4;
+ bci.queueFamilyIndexCount = 1;
+ bci.pQueueFamilyIndices = &qfi;
+ VkBufferObj buffer0;
+ VkMemoryPropertyFlags mem_props = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
+ buffer0.init(*m_device, bci, mem_props);
+
+ VkDescriptorBindingFlagsEXT ds_binding_flags[2] = {};
+ ds_binding_flags[1] = VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT;
+ VkDescriptorSetLayoutBindingFlagsCreateInfoEXT layout_createinfo_binding_flags[1] = {};
+ layout_createinfo_binding_flags[0].sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT;
+ layout_createinfo_binding_flags[0].pNext = NULL;
+ layout_createinfo_binding_flags[0].bindingCount = 2;
+ layout_createinfo_binding_flags[0].pBindingFlags = ds_binding_flags;
+
+ OneOffDescriptorSet descriptor_set(m_device,
+ {
+ {0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr},
+ {1, VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, 20, VK_SHADER_STAGE_ALL,
+ nullptr}, // 16 bytes for ivec4, 4 more for int
+ },
+ 0, layout_createinfo_binding_flags, 0);
+ const VkPipelineLayoutObj pipeline_layout(m_device, {&descriptor_set.layout_});
+
+ VkDescriptorBufferInfo buffer_info[1] = {};
+ buffer_info[0].buffer = buffer0.handle();
+ buffer_info[0].offset = 0;
+ buffer_info[0].range = sizeof(uint32_t);
+
+ const uint32_t test_data = 0xdeadca7;
+ VkWriteDescriptorSetInlineUniformBlockEXT write_inline_uniform = {};
+ write_inline_uniform.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT;
+ write_inline_uniform.dataSize = 4;
+ write_inline_uniform.pData = &test_data;
+
+ VkWriteDescriptorSet descriptor_writes[2] = {};
+ descriptor_writes[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ descriptor_writes[0].dstSet = descriptor_set.set_;
+ descriptor_writes[0].dstBinding = 0;
+ descriptor_writes[0].descriptorCount = 1;
+ descriptor_writes[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
+ descriptor_writes[0].pBufferInfo = buffer_info;
+
+ descriptor_writes[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ descriptor_writes[1].dstSet = descriptor_set.set_;
+ descriptor_writes[1].dstBinding = 1;
+ descriptor_writes[1].dstArrayElement = 16; // Skip first 16 bytes (dummy)
+ descriptor_writes[1].descriptorCount = 4; // Write 4 bytes to val
+ descriptor_writes[1].descriptorType = VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT;
+ descriptor_writes[1].pNext = &write_inline_uniform;
+ vk::UpdateDescriptorSets(m_device->device(), 2, descriptor_writes, 0, NULL);
+
+ char const *csSource =
+ "#version 450\n"
+ "#extension GL_EXT_nonuniform_qualifier : enable\n "
+ "layout(set = 0, binding = 0) buffer StorageBuffer { uint index; } u_index;"
+ "layout(set = 0, binding = 1) uniform inlineubodef { ivec4 dummy; int val; } inlineubo;\n"
+
+ "void main() {\n"
+ " u_index.index = inlineubo.val;\n"
+ "}\n";
+
+ auto shader_module = new VkShaderObj(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
+
+ VkPipelineShaderStageCreateInfo stage;
+ stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+ stage.pNext = nullptr;
+ stage.flags = 0;
+ stage.stage = VK_SHADER_STAGE_COMPUTE_BIT;
+ stage.module = shader_module->handle();
+ stage.pName = "main";
+ stage.pSpecializationInfo = nullptr;
+
+ // CreateComputePipelines
+ VkComputePipelineCreateInfo pipeline_info = {};
+ pipeline_info.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO;
+ pipeline_info.pNext = nullptr;
+ pipeline_info.flags = 0;
+ pipeline_info.layout = pipeline_layout.handle();
+ pipeline_info.basePipelineHandle = VK_NULL_HANDLE;
+ pipeline_info.basePipelineIndex = -1;
+ pipeline_info.stage = stage;
+
+ VkPipeline c_pipeline;
+ vk::CreateComputePipelines(device(), VK_NULL_HANDLE, 1, &pipeline_info, nullptr, &c_pipeline);
+
+ m_commandBuffer->begin();
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_COMPUTE, c_pipeline);
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_COMPUTE, pipeline_layout.handle(), 0, 1,
+ &descriptor_set.set_, 0, nullptr);
+ vk::CmdDispatch(m_commandBuffer->handle(), 1, 1, 1);
+ m_commandBuffer->end();
+
+ VkSubmitInfo submit_info = {};
+ submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ submit_info.commandBufferCount = 1;
+ submit_info.pCommandBuffers = &m_commandBuffer->handle();
+ vk::QueueSubmit(c_queue->handle(), 1, &submit_info, VK_NULL_HANDLE);
+ vk::QueueWaitIdle(m_device->m_queue);
+ m_errorMonitor->VerifyNotFound();
+ vk::DestroyPipeline(m_device->handle(), c_pipeline, NULL);
+
+ uint32_t *data = (uint32_t *)buffer0.memory().map();
+ ASSERT_TRUE(*data = test_data);
+ *data = 0;
+ buffer0.memory().unmap();
+
+ // Also verify that binding slot reservation is working
+ VkInstanceCreateInfo inst_info = {};
+ VkInstance test_inst;
+ inst_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
+ vk::CreateInstance(&inst_info, NULL, &test_inst);
+ uint32_t gpu_count;
+ VkPhysicalDevice objs[4];
+ vk::EnumeratePhysicalDevices(test_inst, &gpu_count, NULL);
+ if (gpu_count > 4) gpu_count = 4;
+ vk::EnumeratePhysicalDevices(test_inst, &gpu_count, objs);
+ VkPhysicalDeviceProperties properties;
+ vk::GetPhysicalDeviceProperties(objs[0], &properties);
+ if (m_device->props.limits.maxBoundDescriptorSets != properties.limits.maxBoundDescriptorSets - 1)
+ m_errorMonitor->SetError("VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT not functioning as expected");
+ vk::DestroyInstance(test_inst, NULL);
+
+ auto set_count = properties.limits.maxBoundDescriptorSets;
+ // Now be sure that recovery from an unavailable descriptor set works and that uninstrumented shaders are used
+ VkDescriptorSetLayoutBinding dsl_binding[2] = {};
+ dsl_binding[0].binding = 0;
+ dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
+ dsl_binding[0].descriptorCount = 1;
+ dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
+ dsl_binding[1].binding = 1;
+ dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT;
+ dsl_binding[1].descriptorCount = 20;
+ dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
+ VkDescriptorSetLayout *layouts{new VkDescriptorSetLayout[set_count]{}};
+ VkDescriptorSetLayoutCreateInfo dsl_create_info = {};
+ dsl_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
+ dsl_create_info.pNext = layout_createinfo_binding_flags;
+ dsl_create_info.pBindings = dsl_binding;
+ dsl_create_info.bindingCount = 2;
+ for (uint32_t i = 0; i < set_count; i++) {
+ vk::CreateDescriptorSetLayout(m_device->handle(), &dsl_create_info, NULL, &layouts[i]);
+ }
+ VkPipelineLayoutCreateInfo pl_create_info = {};
+ VkPipelineLayout pl_layout;
+ pl_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
+ pl_create_info.setLayoutCount = set_count;
+ pl_create_info.pSetLayouts = layouts;
+ vk::CreatePipelineLayout(m_device->handle(), &pl_create_info, NULL, &pl_layout);
+ pipeline_info.layout = pl_layout;
+ vk::CreateComputePipelines(device(), VK_NULL_HANDLE, 1, &pipeline_info, nullptr, &c_pipeline);
+ m_commandBuffer->begin();
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_COMPUTE, c_pipeline);
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_COMPUTE, pl_layout, 0, 1, &descriptor_set.set_, 0,
+ nullptr);
+ vk::CmdDispatch(m_commandBuffer->handle(), 1, 1, 1);
+ m_commandBuffer->end();
+ vk::QueueSubmit(c_queue->handle(), 1, &submit_info, VK_NULL_HANDLE);
+ vk::QueueWaitIdle(m_device->m_queue);
+ vk::DestroyShaderModule(m_device->handle(), shader_module->handle(), NULL);
+ vk::DestroyPipelineLayout(m_device->handle(), pl_layout, NULL);
+ vk::DestroyPipeline(m_device->handle(), c_pipeline, NULL);
+ for (uint32_t i = 0; i < set_count; i++) {
+ vk::DestroyDescriptorSetLayout(m_device->handle(), layouts[i], NULL);
+ }
+ m_errorMonitor->VerifyNotFound();
+ data = (uint32_t *)buffer0.memory().map();
+ if (*data != test_data) m_errorMonitor->SetError("Pipeline recovery when resources unavailable not functioning as expected");
+ buffer0.memory().unmap();
+ delete[] layouts;
+}
+
+TEST_F(VkGpuAssistedLayerTest, GpuValidationAbort) {
+ TEST_DESCRIPTION("GPU validation: Verify that aborting GPU-AV is safe.");
+
+ SetTargetApiVersion(VK_API_VERSION_1_1);
+ InitGpuAssistedFramework(false);
+ if (IsPlatform(kNexusPlayer)) {
+ printf("%s This test should not run on Nexus Player\n", kSkipPrefix);
+ return;
+ }
+ PFN_vkSetPhysicalDeviceFeaturesEXT fpvkSetPhysicalDeviceFeaturesEXT =
+ (PFN_vkSetPhysicalDeviceFeaturesEXT)vk::GetInstanceProcAddr(instance(), "vkSetPhysicalDeviceFeaturesEXT");
+ PFN_vkGetOriginalPhysicalDeviceFeaturesEXT fpvkGetOriginalPhysicalDeviceFeaturesEXT =
+ (PFN_vkGetOriginalPhysicalDeviceFeaturesEXT)vk::GetInstanceProcAddr(instance(), "vkGetOriginalPhysicalDeviceFeaturesEXT");
+
+ if (!(fpvkSetPhysicalDeviceFeaturesEXT) || !(fpvkGetOriginalPhysicalDeviceFeaturesEXT)) {
+ printf("%s Can't find device_profile_api functions; skipped.\n", kSkipPrefix);
+ return;
+ }
+
+ VkPhysicalDeviceFeatures features = {};
+ fpvkGetOriginalPhysicalDeviceFeaturesEXT(gpu(), &features);
+
+ // Disable features necessary for GPU-AV so initialization aborts
+ features.vertexPipelineStoresAndAtomics = false;
+ features.fragmentStoresAndAtomics = false;
+ fpvkSetPhysicalDeviceFeaturesEXT(gpu(), features);
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "GPU-Assisted Validation disabled");
+ ASSERT_NO_FATAL_FAILURE(InitState());
+ m_errorMonitor->VerifyFound();
+}
+
+TEST_F(VkGpuAssistedLayerTest, ValidationFeatures) {
+ TEST_DESCRIPTION("Validate Validation Features");
+ SetTargetApiVersion(VK_API_VERSION_1_1);
+ VkValidationFeatureEnableEXT enables[] = {VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT};
+ VkValidationFeaturesEXT features = {};
+ features.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
+ features.enabledValidationFeatureCount = 1;
+ features.pEnabledValidationFeatures = enables;
+
+ auto ici = GetInstanceCreateInfo();
+ features.pNext = ici.pNext;
+ ici.pNext = &features;
+ VkInstance instance;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkValidationFeaturesEXT-pEnabledValidationFeatures-02967");
+ vk::CreateInstance(&ici, nullptr, &instance);
+ m_errorMonitor->VerifyFound();
+
+ VkValidationFeatureEnableEXT printf_enables[] = {VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT,
+ VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT};
+ features.pEnabledValidationFeatures = printf_enables;
+ features.enabledValidationFeatureCount = 2;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkValidationFeaturesEXT-pEnabledValidationFeatures-02968");
+ vk::CreateInstance(&ici, nullptr, &instance);
+ m_errorMonitor->VerifyFound();
+}
+
+void VkDebugPrintfTest::InitDebugPrintfFramework() {
+ VkValidationFeatureEnableEXT enables[] = {VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT};
+ VkValidationFeatureDisableEXT disables[] = {
+ VK_VALIDATION_FEATURE_DISABLE_THREAD_SAFETY_EXT, VK_VALIDATION_FEATURE_DISABLE_API_PARAMETERS_EXT,
+ VK_VALIDATION_FEATURE_DISABLE_OBJECT_LIFETIMES_EXT, VK_VALIDATION_FEATURE_DISABLE_CORE_CHECKS_EXT};
+ VkValidationFeaturesEXT features = {};
+ features.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
+ features.enabledValidationFeatureCount = 1;
+ features.disabledValidationFeatureCount = 4;
+ features.pEnabledValidationFeatures = enables;
+ features.pDisabledValidationFeatures = disables;
+
+ InitFramework(m_errorMonitor, &features);
+}
+
+TEST_F(VkDebugPrintfTest, GpuDebugPrintf) {
+ TEST_DESCRIPTION("Verify that calls to debugPrintfEXT are received in debug stream");
+ SetTargetApiVersion(VK_API_VERSION_1_1);
+ m_device_extension_names.push_back(VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME);
+ InitDebugPrintfFramework();
+ if (!DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME)) {
+ printf("%s Extension %s not supported, skipping this pass. \n", kSkipPrefix,
+ VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
+ if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
+ printf("%s GPU-Assisted printf test requires Vulkan 1.1+.\n", kSkipPrefix);
+ return;
+ }
+ auto features = m_device->phy().features();
+ if (!features.vertexPipelineStoresAndAtomics || !features.fragmentStoresAndAtomics) {
+ printf("%s GPU-Assisted printf test requires vertexPipelineStoresAndAtomics and fragmentStoresAndAtomics.\n", kSkipPrefix);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitViewport());
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ if (IsPlatform(kMockICD) || DeviceSimulation()) {
+ printf("%s GPU-Assisted printf test requires a driver that can draw.\n", kSkipPrefix);
+ return;
+ }
+ // Make a uniform buffer to be passed to the shader that contains the test number
+ uint32_t qfi = 0;
+ VkBufferCreateInfo bci = {};
+ bci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ bci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
+ bci.size = 8;
+ bci.queueFamilyIndexCount = 1;
+ bci.pQueueFamilyIndices = &qfi;
+ VkBufferObj buffer0;
+ VkMemoryPropertyFlags mem_props = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
+ buffer0.init(*m_device, bci, mem_props);
+ OneOffDescriptorSet descriptor_set(m_device, {{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}});
+
+ const VkPipelineLayoutObj pipeline_layout(m_device, {&descriptor_set.layout_});
+ VkDescriptorBufferInfo buffer_info[2] = {};
+ buffer_info[0].buffer = buffer0.handle();
+ buffer_info[0].offset = 0;
+ buffer_info[0].range = sizeof(uint32_t);
+
+ VkWriteDescriptorSet descriptor_writes[1] = {};
+ descriptor_writes[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ descriptor_writes[0].dstSet = descriptor_set.set_;
+ descriptor_writes[0].dstBinding = 0;
+ descriptor_writes[0].descriptorCount = 1;
+ descriptor_writes[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
+ descriptor_writes[0].pBufferInfo = buffer_info;
+ vk::UpdateDescriptorSets(m_device->device(), 1, descriptor_writes, 0, NULL);
+
+ char const *shader_source =
+ "#version 450\n"
+ "#extension GL_EXT_debug_printf : enable\n"
+ "layout(set = 0, binding = 0) uniform ufoo {\n"
+ " int whichtest;\n"
+ "} u_info;\n"
+ "void main() {\n"
+ " float myfloat = 3.1415f;\n"
+ " int foo = -135;\n"
+ " if (gl_VertexIndex == 0) {\n"
+ " switch(u_info.whichtest) {\n"
+ " case 0:\n"
+ " debugPrintfEXT(\"Here are two float values %f, %f\", 1.0, myfloat);\n"
+ " break;\n"
+ " case 1:\n"
+ " debugPrintfEXT(\"Here's a smaller float value %1.2f\", myfloat);\n"
+ " break;\n"
+ " case 2:\n"
+ " debugPrintfEXT(\"Here's an integer %i with text before and after it\", foo);\n"
+ " break;\n"
+ " case 3:\n"
+ " foo = 256;\n"
+ " debugPrintfEXT(\"Here's an integer in octal %o and hex 0x%x\", foo, foo);\n"
+ " break;\n"
+ " case 4:\n"
+ " debugPrintfEXT(\"%d is a negative integer\", foo);\n"
+ " break;\n"
+ " case 5:\n"
+ " vec4 floatvec = vec4(1.2f, 2.2f, 3.2f, 4.2f);\n"
+ " debugPrintfEXT(\"Here's a vector of floats %1.2v4f\", floatvec);\n"
+ " break;\n"
+ " case 6:\n"
+ " debugPrintfEXT(\"Here's a float in sn %e\", myfloat);\n"
+ " break;\n"
+ " case 7:\n"
+ " debugPrintfEXT(\"Here's a float in sn %1.2e\", myfloat);\n"
+ " break;\n"
+ " case 8:\n"
+ " debugPrintfEXT(\"Here's a float in shortest %g\", myfloat);\n"
+ " break;\n"
+ " case 9:\n"
+ " debugPrintfEXT(\"Here's a float in hex %1.9a\", myfloat);\n"
+ " break;\n"
+ " case 10:\n"
+ " debugPrintfEXT(\"First printf with a %% and no value\");\n"
+ " debugPrintfEXT(\"Second printf with a value %i\", foo);\n"
+ " break;\n"
+ " }\n"
+ " }\n"
+ " gl_Position = vec4(0.0, 0.0, 0.0, 0.0);\n"
+ "}\n";
+ std::vector<char const *> messages;
+ messages.push_back("Here are two float values 1.000000, 3.141500");
+ messages.push_back("Here's a smaller float value 3.14");
+ messages.push_back("Here's an integer -135 with text before and after it");
+ messages.push_back("Here's an integer in octal 400 and hex 0x100");
+ messages.push_back("-135 is a negative integer");
+ messages.push_back("Here's a vector of floats 1.20, 2.20, 3.20, 4.20");
+ messages.push_back("Here's a float in sn 3.141500e+00");
+ messages.push_back("Here's a float in sn 3.14e+00");
+ messages.push_back("Here's a float in shortest 3.1415");
+ messages.push_back("Here's a float in hex 0x1.921cac000p+1");
+ // Two error messages have to be last in the vector
+ messages.push_back("First printf with a % and no value");
+ messages.push_back("Second printf with a value -135");
+ VkShaderObj vs(m_device, shader_source, VK_SHADER_STAGE_VERTEX_BIT, this, "main", true);
+
+ VkViewport viewport = m_viewports[0];
+ VkRect2D scissors = m_scissors[0];
+
+ VkSubmitInfo submit_info = {};
+ submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ submit_info.commandBufferCount = 1;
+ submit_info.pCommandBuffers = &m_commandBuffer->handle();
+
+ VkPipelineObj pipe(m_device);
+ pipe.AddShader(&vs);
+ pipe.AddDefaultColorAttachment();
+ VkResult err = pipe.CreateVKPipeline(pipeline_layout.handle(), renderPass());
+ ASSERT_VK_SUCCESS(err);
+
+ VkCommandBufferBeginInfo begin_info = {};
+ VkCommandBufferInheritanceInfo hinfo = {};
+ hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
+ begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
+ begin_info.pInheritanceInfo = &hinfo;
+
+ m_commandBuffer->begin(&begin_info);
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
+ &descriptor_set.set_, 0, nullptr);
+ vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
+ vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissors);
+ vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
+ vk::CmdEndRenderPass(m_commandBuffer->handle());
+ m_commandBuffer->end();
+
+ for (uint32_t i = 0; i < messages.size(); i++) {
+ VkDeviceAddress *data = (VkDeviceAddress *)buffer0.memory().map();
+ data[0] = i;
+ buffer0.memory().unmap();
+ m_errorMonitor->SetDesiredFailureMsg(kInformationBit, messages[i]);
+ if (10 == i) {
+ m_errorMonitor->SetDesiredFailureMsg(kInformationBit, messages[i + 1]);
+ i++;
+ }
+ err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
+ ASSERT_VK_SUCCESS(err);
+ err = vk::QueueWaitIdle(m_device->m_queue);
+ ASSERT_VK_SUCCESS(err);
+ m_errorMonitor->VerifyFound();
+ }
+
+ if (features.shaderInt64) {
+ char const *shader_source_int64 =
+ "#version 450\n"
+ "#extension GL_EXT_debug_printf : enable\n"
+ "#extension GL_ARB_gpu_shader_int64 : enable\n"
+ "layout(set = 0, binding = 0) uniform ufoo {\n"
+ " int whichtest;\n"
+ "} u_info;\n"
+ "void main() {\n"
+ " uint64_t bigvar = 0x2000000000000001ul;\n"
+ " if (gl_VertexIndex == 0) {\n"
+ " switch(u_info.whichtest) {\n"
+ " case 0:\n"
+ " debugPrintfEXT(\"Here's an unsigned long 0x%ul\", bigvar);\n"
+ " break;\n"
+ " case 1:\n"
+ " u64vec4 vecul = u64vec4(bigvar, bigvar, bigvar, bigvar);"
+ " debugPrintfEXT(\"Here's a vector of ul %v4ul\", vecul);\n"
+ " break;\n"
+ " }\n"
+ " }\n"
+ " gl_Position = vec4(0.0, 0.0, 0.0, 0.0);\n"
+ "}\n";
+ VkShaderObj vs_int64(m_device, shader_source_int64, VK_SHADER_STAGE_VERTEX_BIT, this, "main", true);
+ VkPipelineObj pipe2(m_device);
+ pipe2.AddShader(&vs_int64);
+ pipe2.AddDefaultColorAttachment();
+ err = pipe2.CreateVKPipeline(pipeline_layout.handle(), renderPass());
+ ASSERT_VK_SUCCESS(err);
+
+ m_commandBuffer->begin(&begin_info);
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe2.handle());
+ vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
+ &descriptor_set.set_, 0, nullptr);
+ vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
+ vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissors);
+ vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
+ vk::CmdEndRenderPass(m_commandBuffer->handle());
+ m_commandBuffer->end();
+
+ VkDeviceAddress *data = (VkDeviceAddress *)buffer0.memory().map();
+ data[0] = 0;
+ buffer0.memory().unmap();
+ m_errorMonitor->SetDesiredFailureMsg(kInformationBit, "Here's an unsigned long 0x2000000000000001");
+ err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
+ ASSERT_VK_SUCCESS(err);
+ err = vk::QueueWaitIdle(m_device->m_queue);
+ ASSERT_VK_SUCCESS(err);
+ m_errorMonitor->VerifyFound();
+ data = (VkDeviceAddress *)buffer0.memory().map();
+ data[0] = 1;
+ buffer0.memory().unmap();
+ m_errorMonitor->SetDesiredFailureMsg(
+ kInformationBit, "Here's a vector of ul 2000000000000001, 2000000000000001, 2000000000000001, 2000000000000001");
+ err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
+ ASSERT_VK_SUCCESS(err);
+ err = vk::QueueWaitIdle(m_device->m_queue);
+ ASSERT_VK_SUCCESS(err);
+ m_errorMonitor->VerifyFound();
+ }
+}
+TEST_F(VkDebugPrintfTest, MeshTaskShadersPrintf) {
+ TEST_DESCRIPTION("Test debug printf in mesh and task shaders.");
+
+ SetTargetApiVersion(VK_API_VERSION_1_1);
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
+ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+ InitDebugPrintfFramework();
+ std::vector<const char *> required_device_extensions = {VK_NV_MESH_SHADER_EXTENSION_NAME,
+ VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME};
+ for (auto device_extension : required_device_extensions) {
+ if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
+ m_device_extension_names.push_back(device_extension);
+ } else {
+ printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
+ return;
+ }
+ }
+
+ if (IsPlatform(kMockICD) || DeviceSimulation()) {
+ printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
+ return;
+ }
+
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+
+ // Create a device that enables mesh_shader
+ auto mesh_shader_features = lvl_init_struct<VkPhysicalDeviceMeshShaderFeaturesNV>();
+ auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ static const char taskShaderText[] =
+ "#version 460\n"
+ "#extension GL_NV_mesh_shader : enable\n"
+ "#extension GL_EXT_debug_printf : enable\n"
+ "layout(local_size_x = 32) in;\n"
+ "uint invocationID = gl_LocalInvocationID.x;\n"
+ "void main() {\n"
+ " if (invocationID == 0) {\n"
+ " gl_TaskCountNV = 1;\n"
+ " debugPrintfEXT(\"hello from task shader\");\n"
+ " }\n"
+ "}\n";
+
+ static const char meshShaderText[] =
+ "#version 450\n"
+ "#extension GL_NV_mesh_shader : require\n"
+ "#extension GL_EXT_debug_printf : enable\n"
+ "layout(local_size_x = 1) in;\n"
+ "layout(max_vertices = 3) out;\n"
+ "layout(max_primitives = 1) out;\n"
+ "layout(triangles) out;\n"
+ "uint invocationID = gl_LocalInvocationID.x;\n"
+ "void main() {\n"
+ " if (invocationID == 0) {\n"
+ " debugPrintfEXT(\"hello from mesh shader\");\n"
+ " }\n"
+ "}\n";
+
+ VkShaderObj ts(m_device, taskShaderText, VK_SHADER_STAGE_TASK_BIT_NV, this);
+ VkShaderObj ms(m_device, meshShaderText, VK_SHADER_STAGE_MESH_BIT_NV, this);
+ VkPipelineLayoutObj pipeline_layout(m_device);
+ VkPipelineObj pipe(m_device);
+ pipe.AddShader(&ts);
+ pipe.AddShader(&ms);
+ pipe.AddDefaultColorAttachment();
+ VkResult err = pipe.CreateVKPipeline(pipeline_layout.handle(), renderPass());
+ ASSERT_VK_SUCCESS(err);
+
+ PFN_vkCmdDrawMeshTasksNV vkCmdDrawMeshTasksNV =
+ (PFN_vkCmdDrawMeshTasksNV)vk::GetInstanceProcAddr(instance(), "vkCmdDrawMeshTasksNV");
+ ASSERT_TRUE(vkCmdDrawMeshTasksNV != nullptr);
+
+ m_commandBuffer->begin();
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
+ vkCmdDrawMeshTasksNV(m_commandBuffer->handle(), 1, 0);
+ m_commandBuffer->end();
+
+ m_errorMonitor->SetDesiredFailureMsg(kInformationBit, "hello from task shader");
+ m_errorMonitor->SetDesiredFailureMsg(kInformationBit, "hello from mesh shader");
+ m_commandBuffer->QueueCommandBuffer();
+ err = vk::QueueWaitIdle(m_device->m_queue);
+ ASSERT_VK_SUCCESS(err);
+ m_errorMonitor->VerifyFound();
+}
diff --git a/tests/vklayertests_imageless_framebuffer.cpp b/tests/vklayertests_imageless_framebuffer.cpp
index ddcdbd1..241f2c4 100644
--- a/tests/vklayertests_imageless_framebuffer.cpp
+++ b/tests/vklayertests_imageless_framebuffer.cpp
@@ -988,7 +988,11 @@
uint32_t attachmentWidth = 512;
uint32_t attachmentHeight = 512;
- VkFormat attachmentFormat = VK_FORMAT_D32_SFLOAT_S8_UINT;
+ VkFormat attachmentFormat = FindSupportedDepthStencilFormat(gpu());
+ if (attachmentFormat == VK_FORMAT_UNDEFINED) {
+ printf("%s Did not find a supported depth stencil format; skipped.\n", kSkipPrefix);
+ return;
+ }
VkAttachmentDescription2KHR attachmentDescriptions[2] = {};
// Depth/stencil attachment
@@ -1063,6 +1067,7 @@
framebufferCreateInfo.layers = 1;
framebufferCreateInfo.renderPass = renderPass;
framebufferCreateInfo.attachmentCount = 2;
+ framebufferCreateInfo.pAttachments = nullptr;
VkFramebuffer framebuffer = VK_NULL_HANDLE;
// Color attachment, mismatched layer count
@@ -1095,5 +1100,47 @@
}
framebufferAttachmentImageInfos[1].layerCount = 2;
+ // Try creating Framebuffer with images, but with invalid image create usage flags
+ VkImageCreateInfo image_create_info = {};
+ image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_create_info.pNext = NULL;
+ image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ image_create_info.format = attachmentFormat;
+ image_create_info.extent.width = attachmentWidth;
+ image_create_info.extent.height = attachmentHeight;
+ image_create_info.extent.depth = 1;
+ image_create_info.mipLevels = 1;
+ image_create_info.arrayLayers = 1;
+ image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
+ image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
+ image_create_info.flags = 0;
+ VkImageObj ds_image(m_device);
+ ds_image.init(&image_create_info);
+ ASSERT_TRUE(ds_image.initialized());
+
+ image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_create_info.usage = 0;
+ VkImageObj ds_resolve_image(m_device);
+ ds_resolve_image.init(&image_create_info);
+ ASSERT_TRUE(ds_resolve_image.initialized());
+
+ VkImageView image_views[2];
+ image_views[0] = ds_image.targetView(attachmentFormat, VK_IMAGE_ASPECT_DEPTH_BIT);
+ image_views[1] = ds_resolve_image.targetView(attachmentFormat, VK_IMAGE_ASPECT_DEPTH_BIT);
+
+ framebufferCreateInfo.pNext = nullptr;
+ framebufferCreateInfo.flags = 0;
+ framebufferCreateInfo.pAttachments = image_views;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkFramebufferCreateInfo-pAttachments-02634");
+ vk::CreateFramebuffer(m_device->device(), &framebufferCreateInfo, nullptr, &framebuffer);
+ m_errorMonitor->VerifyFound();
+ if (framebuffer != VK_NULL_HANDLE) {
+ vk::DestroyFramebuffer(m_device->device(), framebuffer, nullptr);
+ }
+ framebufferCreateInfo.pNext = &framebufferAttachmentsCreateInfo;
+ framebufferCreateInfo.flags = VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT_KHR;
+ framebufferCreateInfo.pAttachments = nullptr;
+
vk::DestroyRenderPass(m_device->device(), renderPass, nullptr);
}
diff --git a/tests/vklayertests_instanceless.cpp b/tests/vklayertests_instanceless.cpp
new file mode 100644
index 0000000..c4fa344
--- /dev/null
+++ b/tests/vklayertests_instanceless.cpp
@@ -0,0 +1,269 @@
+/* Copyright (c) 2020 The Khronos Group Inc.
+ * Copyright (c) 2020 Valve Corporation
+ * Copyright (c) 2020 LunarG, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Instanceless tests
+// Tests of validation of vkCreateInstance and vkDestroyInstance via the pNext debug callback.
+//
+// This set of test should ideally be as complete as possible. Most of the VUs are Implicit (i.e. automatically generated), but any
+// of the parameters could expose a bug or inadequacy in the Loader or the debug extension.
+//
+// Note: testing pCreateInfo pointer, the sType of a debug struct, the debug callback pointer, the ppEnabledLayerNames pointer, and
+// the ppEnabledExtensionNames would require extenally enabled debug layers, so this is currently not performed.
+//
+// TODO: VkDebugReportCallbackCreateInfoEXT::flags and VkDebugUtilsMessengerCreateInfoEXT various Flags could theoretically be
+// tested if the debug extensions are made robust enough
+
+#include <memory>
+#include <vector>
+
+#include "cast_utils.h"
+#include "layer_validation_tests.h"
+
+static VkInstance dummy_instance;
+
+TEST_F(VkLayerTest, InstanceExtensionDependencies) {
+ TEST_DESCRIPTION("Test enabling instance extension without dependencies met.");
+
+ if (!InstanceExtensionSupported(VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME)) {
+ printf("%s Did not find required instance extension %s.\n", kSkipPrefix, VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME);
+ return;
+ }
+ ASSERT_TRUE(InstanceExtensionSupported(VK_KHR_SURFACE_EXTENSION_NAME)); // Driver should always provide dependencies
+
+ Monitor().SetDesiredFailureMsg(kErrorBit, "VUID-vkCreateInstance-ppEnabledExtensionNames-01388");
+ instance_extensions_.push_back(VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME);
+ const auto ici = GetInstanceCreateInfo();
+ vk::CreateInstance(&ici, nullptr, &dummy_instance);
+ Monitor().VerifyFound();
+}
+
+TEST_F(VkLayerTest, InstanceBadStype) {
+ TEST_DESCRIPTION("Test creating instance with bad sType.");
+
+ auto ici = GetInstanceCreateInfo();
+
+ Monitor().SetDesiredFailureMsg(kErrorBit, "VUID-VkInstanceCreateInfo-sType-sType");
+ ici.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
+ vk::CreateInstance(&ici, nullptr, &dummy_instance);
+ Monitor().VerifyFound();
+}
+
+TEST_F(VkLayerTest, InstanceDuplicatePnextStype) {
+ TEST_DESCRIPTION("Test creating instance with duplicate sType in the pNext chain.");
+
+ if (!InstanceExtensionSupported(VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME)) {
+ printf("%s Did not find required instance extension %s.\n", kSkipPrefix, VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME);
+ return;
+ }
+ instance_extensions_.push_back(VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME);
+
+ auto ici = GetInstanceCreateInfo();
+
+ Monitor().SetDesiredFailureMsg(kErrorBit, "VUID-VkInstanceCreateInfo-sType-unique");
+ const VkValidationFeaturesEXT duplicate_pnext = {VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT, ici.pNext};
+ const VkValidationFeaturesEXT first_pnext = {VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT, &duplicate_pnext};
+ ici.pNext = &first_pnext;
+ vk::CreateInstance(&ici, nullptr, &dummy_instance);
+ Monitor().VerifyFound();
+}
+
+TEST_F(VkLayerTest, InstanceFlags) {
+ TEST_DESCRIPTION("Test creating instance with invalid flags.");
+
+ auto ici = GetInstanceCreateInfo();
+
+ Monitor().SetDesiredFailureMsg(kErrorBit, "VUID-VkInstanceCreateInfo-flags-zerobitmask");
+ ici.flags = (VkInstanceCreateFlags)1;
+ vk::CreateInstance(&ici, nullptr, &dummy_instance);
+ Monitor().VerifyFound();
+}
+
+TEST_F(VkLayerTest, InstanceAppInfoBadStype) {
+ TEST_DESCRIPTION("Test creating instance with invalid sType in VkApplicationInfo.");
+
+ auto ici = GetInstanceCreateInfo();
+
+ VkApplicationInfo bad_app_info = {};
+ if (ici.pApplicationInfo) bad_app_info = *ici.pApplicationInfo;
+ bad_app_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
+ ici.pApplicationInfo = &bad_app_info;
+
+ Monitor().SetDesiredFailureMsg(kErrorBit, "VUID-VkApplicationInfo-sType-sType");
+ vk::CreateInstance(&ici, nullptr, &dummy_instance);
+ Monitor().VerifyFound();
+}
+
+TEST_F(VkLayerTest, InstanceValidationFeaturesBadFlags) {
+ TEST_DESCRIPTION("Test creating instance with invalid flags in VkValidationFeaturesEXT.");
+
+ if (!InstanceExtensionSupported(VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME)) {
+ printf("%s Did not find required instance extension %s.\n", kSkipPrefix, VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME);
+ return;
+ }
+ instance_extensions_.push_back(VK_EXT_VALIDATION_FEATURES_EXTENSION_NAME);
+
+ auto ici = GetInstanceCreateInfo();
+
+ // the test framework should not be using VkValidationFeatureEnableEXT itself
+ for (auto traversable_pnext = reinterpret_cast<const VkBaseInStructure*>(ici.pNext); traversable_pnext;
+ traversable_pnext = traversable_pnext->pNext) {
+ ASSERT_NE(traversable_pnext->sType, VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT);
+ }
+
+ VkValidationFeaturesEXT validation_features_template = {};
+ validation_features_template.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
+ validation_features_template.pNext = ici.pNext;
+
+ {
+ const VkValidationFeatureEnableEXT bad_enable = (VkValidationFeatureEnableEXT)0x42;
+ VkValidationFeaturesEXT validation_features = validation_features_template;
+ validation_features.enabledValidationFeatureCount = 1;
+ validation_features.pEnabledValidationFeatures = &bad_enable;
+ ici.pNext = &validation_features;
+
+ // VUID-VkValidationFeaturesEXT-pEnabledValidationFeatures-parameter
+ Monitor().SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-GeneralParameterError-UnrecognizedValue");
+ vk::CreateInstance(&ici, nullptr, &dummy_instance);
+ Monitor().VerifyFound();
+ }
+
+ {
+ const VkValidationFeatureDisableEXT bad_disable = (VkValidationFeatureDisableEXT)0x42;
+ VkValidationFeaturesEXT validation_features = validation_features_template;
+ validation_features.disabledValidationFeatureCount = 1;
+ validation_features.pDisabledValidationFeatures = &bad_disable;
+ ici.pNext = &validation_features;
+
+ // VUID-VkValidationFeaturesEXT-pEnabledValidationFeatures-parameter
+ Monitor().SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-GeneralParameterError-UnrecognizedValue");
+ vk::CreateInstance(&ici, nullptr, &dummy_instance);
+ Monitor().VerifyFound();
+ }
+}
+
+TEST_F(VkLayerTest, InstanceBadValidationFlags) {
+ TEST_DESCRIPTION("Test creating instance with invalid VkValidationFlagsEXT.");
+
+ if (!InstanceExtensionSupported(VK_EXT_VALIDATION_FLAGS_EXTENSION_NAME)) {
+ printf("%s Did not find required instance extension %s.\n", kSkipPrefix, VK_EXT_VALIDATION_FLAGS_EXTENSION_NAME);
+ return;
+ }
+ instance_extensions_.push_back(VK_EXT_VALIDATION_FLAGS_EXTENSION_NAME);
+
+ auto ici = GetInstanceCreateInfo();
+
+ // the test framework should not be using VkValidationFlagsEXT itself
+ for (auto traversable_pnext = reinterpret_cast<const VkBaseInStructure*>(ici.pNext); traversable_pnext;
+ traversable_pnext = traversable_pnext->pNext) {
+ ASSERT_NE(traversable_pnext->sType, VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT);
+ }
+
+ VkValidationFlagsEXT validation_flags_template = {};
+ validation_flags_template.sType = VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT;
+ validation_flags_template.pNext = ici.pNext;
+
+ {
+ const VkValidationCheckEXT bad_disable = (VkValidationCheckEXT)0x42;
+ VkValidationFlagsEXT validation_flags = validation_flags_template;
+ validation_flags.disabledValidationCheckCount = 1;
+ validation_flags.pDisabledValidationChecks = &bad_disable;
+ ici.pNext = &validation_flags;
+
+ // VUID-VkValidationFlagsEXT-pDisabledValidationChecks-parameter
+ Monitor().SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-GeneralParameterError-UnrecognizedValue");
+ vk::CreateInstance(&ici, nullptr, &dummy_instance);
+ Monitor().VerifyFound();
+ }
+
+ {
+ VkValidationFlagsEXT validation_flags = validation_flags_template;
+ validation_flags.disabledValidationCheckCount = 0;
+ ici.pNext = &validation_flags;
+
+ // VUID-VkValidationFlagsEXT-disabledValidationCheckCount-arraylength
+ Monitor().SetDesiredFailureMsg(kErrorBit, "parameter disabledValidationCheckCount must be greater than 0");
+ vk::CreateInstance(&ici, nullptr, &dummy_instance);
+ Monitor().VerifyFound();
+ }
+}
+
+void* VKAPI_PTR DummyAlloc(void*, size_t size, size_t alignment, VkSystemAllocationScope) {
+ size_t space = size + alignment - 1;
+ void* mem_ptr = std::malloc(space);
+ return std::align(alignment, size, mem_ptr, space);
+}
+void VKAPI_PTR DummyFree(void*, void* pMemory) {
+ // just leak it
+}
+void* VKAPI_PTR DummyRealloc(void* pUserData, void* pOriginal, size_t size, size_t alignment,
+ VkSystemAllocationScope allocationScope) {
+ DummyFree(pUserData, pOriginal);
+ return DummyAlloc(pUserData, size, alignment, allocationScope);
+}
+void VKAPI_PTR DummyInfoAlloc(void*, size_t, VkInternalAllocationType, VkSystemAllocationScope) {}
+void VKAPI_PTR DummyInfoFree(void*, size_t, VkInternalAllocationType, VkSystemAllocationScope) {}
+
+TEST_F(VkLayerTest, DestroyInstanceAllocationCallbacksCompatibility) {
+ TEST_DESCRIPTION("Test vkDestroyInstance with incompatible allocation callbacks.");
+
+ const auto ici = GetInstanceCreateInfo();
+ const VkAllocationCallbacks alloc_callbacks = {nullptr, &DummyAlloc, &DummyRealloc,
+ &DummyFree, &DummyInfoAlloc, &DummyInfoFree};
+
+ {
+ VkInstance instance;
+ ASSERT_VK_SUCCESS(vk::CreateInstance(&ici, nullptr, &instance));
+
+ Monitor().SetDesiredFailureMsg(kErrorBit, "VUID-vkDestroyInstance-instance-00631");
+ vk::DestroyInstance(instance, &alloc_callbacks);
+ Monitor().VerifyFound();
+ }
+}
+
+TEST_F(VkLayerTest, DestroyInstanceHandleLeak) {
+ TEST_DESCRIPTION("Test vkDestroyInstance while leaking a VkDevice object.");
+
+ const auto ici = GetInstanceCreateInfo();
+
+ VkInstance instance;
+ ASSERT_VK_SUCCESS(vk::CreateInstance(&ici, nullptr, &instance));
+ uint32_t physical_device_count = 1;
+ VkPhysicalDevice physical_device;
+ const VkResult err = vk::EnumeratePhysicalDevices(instance, &physical_device_count, &physical_device);
+ ASSERT_TRUE(err == VK_SUCCESS || err == VK_INCOMPLETE) << vk_result_string(err);
+ ASSERT_EQ(physical_device_count, 1);
+
+ float dqci_priorities[] = {1.0};
+ VkDeviceQueueCreateInfo dqci = {};
+ dqci.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
+ dqci.queueFamilyIndex = 0;
+ dqci.queueCount = 1;
+ dqci.pQueuePriorities = dqci_priorities;
+
+ VkDeviceCreateInfo dci = {};
+ dci.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
+ dci.queueCreateInfoCount = 1;
+ dci.pQueueCreateInfos = &dqci;
+
+ VkDevice leaked_device;
+ ASSERT_VK_SUCCESS(vk::CreateDevice(physical_device, &dci, nullptr, &leaked_device));
+
+ // VUID-vkDestroyInstance-instance-00629
+ Monitor().SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-ObjectTracker-ObjectLeak");
+ vk::DestroyInstance(instance, nullptr);
+ Monitor().VerifyFound();
+}
\ No newline at end of file
diff --git a/tests/vklayertests_others.cpp b/tests/vklayertests_others.cpp
index cfb61dd..ce71f30 100644
--- a/tests/vklayertests_others.cpp
+++ b/tests/vklayertests_others.cpp
@@ -27,6 +27,374 @@
#include "cast_utils.h"
#include "layer_validation_tests.h"
+class MessageIdFilter {
+ public:
+ MessageIdFilter(const char *filter_string) {
+ local_string = filter_string;
+ filter_string_value.arrayString.pCharArray = local_string.data();
+ filter_string_value.arrayString.count = local_string.size();
+
+ strncpy(filter_setting_val.name, "message_id_filter", sizeof(filter_setting_val.name));
+ filter_setting_val.type = VK_LAYER_SETTING_VALUE_TYPE_STRING_ARRAY_EXT;
+ filter_setting_val.data = filter_string_value;
+ filter_setting = {static_cast<VkStructureType>(VK_STRUCTURE_TYPE_INSTANCE_LAYER_SETTINGS_EXT), nullptr, 1,
+ &filter_setting_val};
+ }
+ VkLayerSettingsEXT *pnext{&filter_setting};
+
+ private:
+ VkLayerSettingValueDataEXT filter_string_value{};
+ VkLayerSettingValueEXT filter_setting_val;
+ VkLayerSettingsEXT filter_setting;
+ std::string local_string;
+};
+
+class CustomStypeList {
+ public:
+ CustomStypeList(const char *stype_id_string) {
+ local_string = stype_id_string;
+ custom_stype_value.arrayString.pCharArray = local_string.data();
+ custom_stype_value.arrayString.count = local_string.size();
+
+ strncpy(custom_stype_setting_val.name, "custom_stype_list", sizeof(custom_stype_setting_val.name));
+ custom_stype_setting_val.type = VK_LAYER_SETTING_VALUE_TYPE_STRING_ARRAY_EXT;
+ custom_stype_setting_val.data = custom_stype_value;
+ custom_stype_setting = {static_cast<VkStructureType>(VK_STRUCTURE_TYPE_INSTANCE_LAYER_SETTINGS_EXT), nullptr, 1,
+ &custom_stype_setting_val};
+ }
+
+ CustomStypeList(const std::vector<uint32_t> &stype_id_array) {
+ local_vector = stype_id_array;
+ custom_stype_value.arrayInt32.pInt32Array = local_vector.data();
+ custom_stype_value.arrayInt32.count = local_vector.size();
+
+ strncpy(custom_stype_setting_val.name, "custom_stype_list", sizeof(custom_stype_setting_val.name));
+ custom_stype_setting_val.type = VK_LAYER_SETTING_VALUE_TYPE_UINT32_ARRAY_EXT;
+ custom_stype_setting_val.data = custom_stype_value;
+ custom_stype_setting = {static_cast<VkStructureType>(VK_STRUCTURE_TYPE_INSTANCE_LAYER_SETTINGS_EXT), nullptr, 1,
+ &custom_stype_setting_val};
+ }
+ VkLayerSettingsEXT *pnext{&custom_stype_setting};
+
+ private:
+ VkLayerSettingValueDataEXT custom_stype_value{};
+ VkLayerSettingValueEXT custom_stype_setting_val;
+ VkLayerSettingsEXT custom_stype_setting;
+ std::string local_string;
+ std::vector<uint32_t> local_vector;
+};
+
+class DuplicateMsgLimit {
+ public:
+ DuplicateMsgLimit(const uint32_t limit) {
+ limit_value.value32 = limit;
+
+ strncpy(limit_setting_val.name, "duplicate_message_limit", sizeof(limit_setting_val.name));
+ limit_setting_val.type = VK_LAYER_SETTING_VALUE_TYPE_UINT32_EXT;
+ limit_setting_val.data = limit_value;
+ limit_setting = {static_cast<VkStructureType>(VK_STRUCTURE_TYPE_INSTANCE_LAYER_SETTINGS_EXT), nullptr, 1,
+ &limit_setting_val};
+ }
+ VkLayerSettingsEXT *pnext{&limit_setting};
+
+ private:
+ VkLayerSettingValueDataEXT limit_value{};
+ VkLayerSettingValueEXT limit_setting_val;
+ VkLayerSettingsEXT limit_setting;
+};
+
+TEST_F(VkLayerTest, CustomStypeStructString) {
+ TEST_DESCRIPTION("Positive Test for ability to specify custom pNext structs using a list (string)");
+
+ // Create a custom structure
+ typedef struct CustomStruct {
+ VkStructureType sType;
+ const void *pNext;
+ uint32_t custom_data;
+ } CustomStruct;
+
+ uint32_t custom_stype = 3000300000;
+ CustomStruct custom_struct;
+ custom_struct.pNext = nullptr;
+ custom_struct.sType = static_cast<VkStructureType>(custom_stype);
+ custom_struct.custom_data = 44;
+
+ // Communicate list of structinfo pairs to layers
+ auto stype_list = CustomStypeList("3000300000,24");
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor, stype_list.pnext));
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ uint32_t queue_family_index = 0;
+ VkBufferCreateInfo buffer_create_info = {};
+ buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ buffer_create_info.size = 1024;
+ buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
+ buffer_create_info.queueFamilyIndexCount = 1;
+ buffer_create_info.pQueueFamilyIndices = &queue_family_index;
+ VkBufferObj buffer;
+ buffer.init(*m_device, buffer_create_info);
+ VkBufferView buffer_view;
+ VkBufferViewCreateInfo bvci = {};
+ bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
+ bvci.pNext = &custom_struct; // Add custom struct through pNext
+ bvci.buffer = buffer.handle();
+ bvci.format = VK_FORMAT_R32_SFLOAT;
+ bvci.range = VK_WHOLE_SIZE;
+
+ m_errorMonitor->ExpectSuccess(kErrorBit);
+ vk::CreateBufferView(m_device->device(), &bvci, NULL, &buffer_view);
+ m_errorMonitor->VerifyNotFound();
+
+ vk::DestroyBufferView(m_device->device(), buffer_view, nullptr);
+}
+
+TEST_F(VkLayerTest, CustomStypeStructArray) {
+ TEST_DESCRIPTION("Positive Test for ability to specify custom pNext structs using a vector of integers");
+
+ // Create a custom structure
+ typedef struct CustomStruct {
+ VkStructureType sType;
+ const void *pNext;
+ uint32_t custom_data;
+ } CustomStruct;
+
+ const uint32_t custom_stype_a = 3000300000;
+ CustomStruct custom_struct_a;
+ custom_struct_a.pNext = nullptr;
+ custom_struct_a.sType = static_cast<VkStructureType>(custom_stype_a);
+ custom_struct_a.custom_data = 44;
+
+ const uint32_t custom_stype_b = 3000300001;
+ CustomStruct custom_struct_b;
+ custom_struct_b.pNext = &custom_struct_a;
+ custom_struct_b.sType = static_cast<VkStructureType>(custom_stype_b);
+ custom_struct_b.custom_data = 88;
+
+ // Communicate list of structinfo pairs to layers, including a duplicate which should get filtered out
+ std::vector<uint32_t> custom_struct_info = {custom_stype_a, sizeof(CustomStruct), custom_stype_b,
+ sizeof(CustomStruct), custom_stype_a, sizeof(CustomStruct)};
+ auto stype_list = CustomStypeList(custom_struct_info);
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor, stype_list.pnext));
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ uint32_t queue_family_index = 0;
+ VkBufferCreateInfo buffer_create_info = {};
+ buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ buffer_create_info.size = 1024;
+ buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
+ buffer_create_info.queueFamilyIndexCount = 1;
+ buffer_create_info.pQueueFamilyIndices = &queue_family_index;
+ VkBufferObj buffer;
+ buffer.init(*m_device, buffer_create_info);
+ VkBufferView buffer_view;
+ VkBufferViewCreateInfo bvci = {};
+ bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
+ bvci.pNext = &custom_struct_b; // Add custom struct through pNext
+ bvci.buffer = buffer.handle();
+ bvci.format = VK_FORMAT_R32_SFLOAT;
+ bvci.range = VK_WHOLE_SIZE;
+
+ m_errorMonitor->ExpectSuccess(kErrorBit);
+ vk::CreateBufferView(m_device->device(), &bvci, NULL, &buffer_view);
+ m_errorMonitor->VerifyNotFound();
+
+ vk::DestroyBufferView(m_device->device(), buffer_view, nullptr);
+}
+
+TEST_F(VkLayerTest, DuplicateMessageLimit) {
+ TEST_DESCRIPTION("Use the duplicate_message_id setting and verify correct operation");
+
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
+ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+
+ auto msg_limit = DuplicateMsgLimit(3);
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor, msg_limit.pnext));
+ ASSERT_NO_FATAL_FAILURE(InitState());
+ PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
+ (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
+
+ // Create an invalid pNext structure to trigger the stateless validation warning
+ VkBaseOutStructure bogus_struct{};
+ bogus_struct.sType = static_cast<VkStructureType>(0x33333333);
+ auto properties2 = lvl_init_struct<VkPhysicalDeviceProperties2KHR>(&bogus_struct);
+
+ // Should get the first three errors just fine
+ m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "VUID-VkPhysicalDeviceProperties2-pNext-pNext");
+ vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
+ m_errorMonitor->VerifyFound();
+ m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "VUID-VkPhysicalDeviceProperties2-pNext-pNext");
+ vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
+ m_errorMonitor->VerifyFound();
+ m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "VUID-VkPhysicalDeviceProperties2-pNext-pNext");
+ vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
+ m_errorMonitor->VerifyFound();
+
+ // Limit should prevent the message from coming through a fourth time
+ m_errorMonitor->ExpectSuccess(kWarningBit);
+ vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
+ m_errorMonitor->VerifyNotFound();
+}
+
+TEST_F(VkLayerTest, MessageIdFilterString) {
+ TEST_DESCRIPTION("Validate that message id string filtering is working");
+
+ // This test would normally produce an unexpected error or two. Use the message filter instead of
+ // the error_monitor's SetUnexpectedError to test the filtering.
+ auto filter_setting = MessageIdFilter("VUID-VkRenderPassCreateInfo-pNext-01963");
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor, filter_setting.pnext));
+
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
+ } else {
+ printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState());
+ VkAttachmentDescription attach = {0,
+ VK_FORMAT_R8G8B8A8_UNORM,
+ VK_SAMPLE_COUNT_1_BIT,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE,
+ VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE,
+ VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_IMAGE_LAYOUT_UNDEFINED,
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL};
+ VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL};
+ VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &ref, 0, nullptr, nullptr, nullptr, 0, nullptr};
+ VkInputAttachmentAspectReference iaar = {0, 0, VK_IMAGE_ASPECT_METADATA_BIT};
+ VkRenderPassInputAttachmentAspectCreateInfo rpiaaci = {VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO,
+ nullptr, 1, &iaar};
+ VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, &rpiaaci, 0, 1, &attach, 1, &subpass, 0, nullptr};
+ m_errorMonitor->SetUnexpectedError("VUID-VkRenderPassCreateInfo2-attachment-02525");
+ TestRenderPassCreate(m_errorMonitor, m_device->device(), &rpci, false, "VUID-VkInputAttachmentAspectReference-aspectMask-01964",
+ nullptr);
+}
+
+TEST_F(VkLayerTest, MessageIdFilterHexInt) {
+ TEST_DESCRIPTION("Validate that message id hex int filtering is working");
+
+ // This test would normally produce an unexpected error or two. Use the message filter instead of
+ // the error_monitor's SetUnexpectedError to test the filtering.
+ auto filter_setting = MessageIdFilter("0xa19880e3");
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor, filter_setting.pnext));
+
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
+ } else {
+ printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState());
+ VkAttachmentDescription attach = {0,
+ VK_FORMAT_R8G8B8A8_UNORM,
+ VK_SAMPLE_COUNT_1_BIT,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE,
+ VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE,
+ VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_IMAGE_LAYOUT_UNDEFINED,
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL};
+ VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL};
+ VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &ref, 0, nullptr, nullptr, nullptr, 0, nullptr};
+ VkInputAttachmentAspectReference iaar = {0, 0, VK_IMAGE_ASPECT_METADATA_BIT};
+ VkRenderPassInputAttachmentAspectCreateInfo rpiaaci = {VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO,
+ nullptr, 1, &iaar};
+ VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, &rpiaaci, 0, 1, &attach, 1, &subpass, 0, nullptr};
+ m_errorMonitor->SetUnexpectedError("VUID-VkRenderPassCreateInfo2-attachment-02525");
+ TestRenderPassCreate(m_errorMonitor, m_device->device(), &rpci, false, "VUID-VkInputAttachmentAspectReference-aspectMask-01964",
+ nullptr);
+}
+
+TEST_F(VkLayerTest, MessageIdFilterInt) {
+ TEST_DESCRIPTION("Validate that message id decimal int filtering is working");
+
+ // This test would normally produce an unexpected error or two. Use the message filter instead of
+ // the error_monitor's SetUnexpectedError to test the filtering.
+ auto filter_setting = MessageIdFilter("2711126243");
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor, filter_setting.pnext));
+
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
+ } else {
+ printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState());
+ VkAttachmentDescription attach = {0,
+ VK_FORMAT_R8G8B8A8_UNORM,
+ VK_SAMPLE_COUNT_1_BIT,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE,
+ VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE,
+ VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_IMAGE_LAYOUT_UNDEFINED,
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL};
+ VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL};
+ VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &ref, 0, nullptr, nullptr, nullptr, 0, nullptr};
+ VkInputAttachmentAspectReference iaar = {0, 0, VK_IMAGE_ASPECT_METADATA_BIT};
+ VkRenderPassInputAttachmentAspectCreateInfo rpiaaci = {VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO,
+ nullptr, 1, &iaar};
+ VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, &rpiaaci, 0, 1, &attach, 1, &subpass, 0, nullptr};
+ m_errorMonitor->SetUnexpectedError("VUID-VkRenderPassCreateInfo2-attachment-02525");
+ TestRenderPassCreate(m_errorMonitor, m_device->device(), &rpci, false, "VUID-VkInputAttachmentAspectReference-aspectMask-01964",
+ nullptr);
+}
+
+struct LayerStatusCheckData {
+ std::function<void(const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData, LayerStatusCheckData *)> callback;
+ ErrorMonitor *error_monitor;
+};
+
+TEST_F(VkLayerTest, LayerInfoMessages) {
+ TEST_DESCRIPTION("Ensure layer prints startup status messages.");
+
+ auto ici = GetInstanceCreateInfo();
+ LayerStatusCheckData callback_data;
+ auto local_callback = [](const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData, LayerStatusCheckData *data) {
+ std::string message(pCallbackData->pMessage);
+ if ((data->error_monitor->GetMessageFlags() & kInformationBit) &&
+ (message.find("UNASSIGNED-khronos-validation-createinstance-status-message") == std::string::npos)) {
+ data->error_monitor->SetError("UNASSIGNED-Khronos-validation-createinstance-status-message-not-found");
+ } else if ((data->error_monitor->GetMessageFlags() & kPerformanceWarningBit) &&
+ (message.find("UNASSIGNED-khronos-Validation-debug-build-warning-message") == std::string::npos)) {
+ data->error_monitor->SetError("UNASSIGNED-khronos-validation-createinstance-debug-warning-message-not-found");
+ }
+ };
+ callback_data.error_monitor = m_errorMonitor;
+ callback_data.callback = local_callback;
+
+ VkInstance local_instance;
+
+ auto callback_create_info = lvl_init_struct<VkDebugUtilsMessengerCreateInfoEXT>();
+ callback_create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT;
+ callback_create_info.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT;
+ callback_create_info.pfnUserCallback = DebugUtilsCallback;
+ callback_create_info.pUserData = &callback_data;
+ ici.pNext = &callback_create_info;
+
+ // Create an instance, error if layer status INFO message not found
+ m_errorMonitor->ExpectSuccess();
+ ASSERT_VK_SUCCESS(vk::CreateInstance(&ici, nullptr, &local_instance));
+ m_errorMonitor->VerifyNotFound();
+ vk::DestroyInstance(local_instance, nullptr);
+
+#ifndef NDEBUG
+ // Create an instance, error if layer DEBUG_BUILD warning message not found
+ callback_create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT;
+ callback_create_info.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
+ m_errorMonitor->ExpectSuccess();
+ ASSERT_VK_SUCCESS(vk::CreateInstance(&ici, nullptr, &local_instance));
+ m_errorMonitor->VerifyNotFound();
+ vk::DestroyInstance(local_instance, nullptr);
+#endif
+}
+
TEST_F(VkLayerTest, RequiredParameter) {
TEST_DESCRIPTION("Specify VK_NULL_HANDLE, NULL, and 0 for required handle, pointer, array, and array count parameters");
@@ -133,6 +501,81 @@
m_errorMonitor->VerifyFound();
}
+TEST_F(VkLayerTest, SpecLinks) {
+ TEST_DESCRIPTION("Test that spec links in a typical error message are well-formed");
+ ASSERT_NO_FATAL_FAILURE(InitFramework());
+
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+#ifdef ANNOTATED_SPEC_LINK
+ bool test_annotated_spec_link = true;
+#else // ANNOTATED_SPEC_LINK
+ bool test_annotated_spec_link = false;
+#endif // ANNOTATED_SPEC_LINK
+
+ std::string spec_version;
+ if (test_annotated_spec_link) {
+ std::string major_version = std::to_string(VK_VERSION_MAJOR(VK_HEADER_VERSION_COMPLETE));
+ std::string minor_version = std::to_string(VK_VERSION_MINOR(VK_HEADER_VERSION_COMPLETE));
+ std::string patch_version = std::to_string(VK_VERSION_PATCH(VK_HEADER_VERSION_COMPLETE));
+ spec_version = "doc/view/" + major_version + "." + minor_version + "." + patch_version + ".0/windows";
+ } else {
+ spec_version = "registry/vulkan/specs";
+ }
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, spec_version);
+ vk::GetPhysicalDeviceFeatures(gpu(), NULL);
+ m_errorMonitor->VerifyFound();
+
+ // Now generate a 'default' message and check the link
+ bool ycbcr_support = (DeviceExtensionEnabled(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME) ||
+ (DeviceValidationVersion() >= VK_API_VERSION_1_1));
+ bool maintenance2_support =
+ (DeviceExtensionEnabled(VK_KHR_MAINTENANCE2_EXTENSION_NAME) || (DeviceValidationVersion() >= VK_API_VERSION_1_1));
+
+ if (!((m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) &&
+ (ycbcr_support ^ maintenance2_support))) {
+ printf("%s Device does not support format and extensions required, skipping test case", kSkipPrefix);
+ return;
+ }
+
+ VkImageCreateInfo imageInfo = {VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,
+ nullptr,
+ 0,
+ VK_IMAGE_TYPE_2D,
+ VK_FORMAT_R8_UINT,
+ {128, 128, 1},
+ 1,
+ 1,
+ VK_SAMPLE_COUNT_1_BIT,
+ VK_IMAGE_TILING_OPTIMAL,
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
+ VK_SHARING_MODE_EXCLUSIVE,
+ 0,
+ nullptr,
+ VK_IMAGE_LAYOUT_UNDEFINED};
+ imageInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
+ VkImageObj mutImage(m_device);
+ mutImage.init(&imageInfo);
+ ASSERT_TRUE(mutImage.initialized());
+
+ VkImageViewCreateInfo imgViewInfo = {};
+ imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
+ imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
+ imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM; // different than createImage
+ imgViewInfo.subresourceRange.layerCount = 1;
+ imgViewInfo.subresourceRange.baseMipLevel = 0;
+ imgViewInfo.subresourceRange.levelCount = 1;
+ imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
+ imgViewInfo.image = mutImage.handle();
+
+ // VUIDs 01759 and 01760 should generate 'default' spec URLs, to search the registry
+ CreateImageViewTest(*this, &imgViewInfo, "Vulkan-Docs/search");
+}
+
TEST_F(VkLayerTest, PnextOnlyStructValidation) {
TEST_DESCRIPTION("See if checks occur on structs ONLY used in pnext chains.");
@@ -300,7 +743,7 @@
// Test parameter_validation layer
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, commandBuffer_name);
- vk::CmdSetScissor(commandBuffer, 1, 1, scissors);
+ vk::CmdSetScissor(commandBuffer, 0, 1, scissors);
m_errorMonitor->VerifyFound();
// Test object_tracker layer
@@ -469,7 +912,7 @@
fpvkCmdInsertDebugUtilsLabelEXT(commandBuffer, &command_label);
// Test parameter_validation layer
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, commandBuffer_name);
- vk::CmdSetScissor(commandBuffer, 1, 1, scissors);
+ vk::CmdSetScissor(commandBuffer, 0, 1, scissors);
m_errorMonitor->VerifyFound();
// Check the label test
@@ -515,8 +958,18 @@
TEST_F(VkLayerTest, InvalidStructPNext) {
TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
ASSERT_NO_FATAL_FAILURE(Init());
+ PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
+ (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
+
m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "value of pCreateInfo->pNext must be NULL");
// Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
// Need to pick a function that has no allowed pNext structure types.
@@ -549,7 +1002,7 @@
physical_device_properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
physical_device_properties2.pNext = &app_info;
- vk::GetPhysicalDeviceProperties2(gpu(), &physical_device_properties2);
+ vkGetPhysicalDeviceProperties2KHR(gpu(), &physical_device_properties2);
m_errorMonitor->VerifyFound();
}
@@ -1238,6 +1691,208 @@
m_errorMonitor->VerifyFound();
}
+TEST_F(VkLayerTest, Features12Extensions) {
+ TEST_DESCRIPTION("Checks that 1.2 features are enabled if extension is passed in.");
+
+ SetTargetApiVersion(VK_API_VERSION_1_2);
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
+ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
+ printf("%s Vulkan12Struct requires Vulkan 1.2+, skipping test\n", kSkipPrefix);
+ return;
+ }
+
+ vk_testing::PhysicalDevice physical_device(gpu());
+ vk_testing::QueueCreateInfoArray queue_info(physical_device.queue_properties());
+ std::vector<VkDeviceQueueCreateInfo> create_queue_infos;
+ auto qci = queue_info.data();
+ for (uint32_t i = 0; i < queue_info.size(); ++i) {
+ if (qci[i].queueCount) {
+ create_queue_infos.push_back(qci[i]);
+ }
+ }
+
+ // Explicity set all tested features to false
+ VkPhysicalDeviceVulkan12Features features12 = {};
+ features12.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
+ features12.pNext = nullptr;
+ features12.drawIndirectCount = VK_FALSE;
+ features12.samplerMirrorClampToEdge = VK_FALSE;
+ features12.descriptorIndexing = VK_FALSE;
+ features12.samplerFilterMinmax = VK_FALSE;
+ features12.shaderOutputViewportIndex = VK_FALSE;
+ features12.shaderOutputLayer = VK_TRUE; // Set true since both shader_viewport features need to true
+
+ std::vector<const char *> device_extensions;
+
+ // Go through each extension and if supported add to list and add failure to check for
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
+ device_extensions.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkDeviceCreateInfo-ppEnabledExtensions-02831");
+ }
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME)) {
+ device_extensions.push_back(VK_KHR_SAMPLER_MIRROR_CLAMP_TO_EDGE_EXTENSION_NAME);
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkDeviceCreateInfo-ppEnabledExtensions-02832");
+ }
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME)) {
+ device_extensions.push_back(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME);
+ device_extensions.push_back(VK_KHR_MAINTENANCE3_EXTENSION_NAME);
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkDeviceCreateInfo-ppEnabledExtensions-02833");
+ }
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME)) {
+ device_extensions.push_back(VK_EXT_SAMPLER_FILTER_MINMAX_EXTENSION_NAME);
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkDeviceCreateInfo-ppEnabledExtensions-02834");
+ }
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_SHADER_VIEWPORT_INDEX_LAYER_EXTENSION_NAME)) {
+ device_extensions.push_back(VK_EXT_SHADER_VIEWPORT_INDEX_LAYER_EXTENSION_NAME);
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkDeviceCreateInfo-ppEnabledExtensions-02835");
+ }
+
+ VkDeviceCreateInfo device_create_info = {};
+ device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
+ device_create_info.pNext = &features12;
+ device_create_info.queueCreateInfoCount = queue_info.size();
+ device_create_info.pQueueCreateInfos = queue_info.data();
+ device_create_info.ppEnabledExtensionNames = device_extensions.data();
+ device_create_info.enabledExtensionCount = device_extensions.size();
+ VkDevice testDevice;
+
+ m_errorMonitor->SetUnexpectedError("Failed to create device chain");
+ vk::CreateDevice(gpu(), &device_create_info, NULL, &testDevice);
+ m_errorMonitor->VerifyFound();
+}
+
+TEST_F(VkLayerTest, FeaturesVariablePointer) {
+ TEST_DESCRIPTION("Checks VK_KHR_variable_pointers features.");
+
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
+ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ std::vector<const char *> device_extensions;
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME) &&
+ DeviceExtensionSupported(gpu(), nullptr, VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME)) {
+ device_extensions.push_back(VK_KHR_VARIABLE_POINTERS_EXTENSION_NAME);
+ device_extensions.push_back(VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME);
+ } else {
+ printf("%s VariablePointer Extension not supported, skipping tests\n", kSkipPrefix);
+ return;
+ }
+
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+
+ // Create a device that enables variablePointers but not variablePointersStorageBuffer
+ auto variable_features = lvl_init_struct<VkPhysicalDeviceVariablePointersFeatures>();
+ auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&variable_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+
+ if (variable_features.variablePointers == VK_FALSE) {
+ printf("%s variablePointer feature not supported, skipping tests\n", kSkipPrefix);
+ return;
+ }
+
+ variable_features.variablePointersStorageBuffer = VK_FALSE;
+
+ vk_testing::PhysicalDevice physical_device(gpu());
+ vk_testing::QueueCreateInfoArray queue_info(physical_device.queue_properties());
+ std::vector<VkDeviceQueueCreateInfo> create_queue_infos;
+ auto qci = queue_info.data();
+ for (uint32_t i = 0; i < queue_info.size(); ++i) {
+ if (qci[i].queueCount) {
+ create_queue_infos.push_back(qci[i]);
+ }
+ }
+
+ VkDeviceCreateInfo device_create_info = {};
+ device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
+ device_create_info.pNext = &features2;
+ device_create_info.queueCreateInfoCount = queue_info.size();
+ device_create_info.pQueueCreateInfos = queue_info.data();
+ device_create_info.ppEnabledExtensionNames = device_extensions.data();
+ device_create_info.enabledExtensionCount = device_extensions.size();
+ VkDevice testDevice;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPhysicalDeviceVariablePointersFeatures-variablePointers-01431");
+ vk::CreateDevice(gpu(), &device_create_info, NULL, &testDevice);
+ m_errorMonitor->VerifyFound();
+}
+
+TEST_F(VkLayerTest, FeaturesMultiview) {
+ TEST_DESCRIPTION("Checks VK_KHR_multiview features.");
+
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
+ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ std::vector<const char *> device_extensions;
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
+ device_extensions.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
+ } else {
+ printf("%s Multiview Extension not supported, skipping tests\n", kSkipPrefix);
+ return;
+ }
+
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+
+ auto multiview_features = lvl_init_struct<VkPhysicalDeviceMultiviewFeatures>();
+ auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&multiview_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+
+ // Set false to trigger VUs
+ multiview_features.multiview = VK_FALSE;
+
+ vk_testing::PhysicalDevice physical_device(gpu());
+ vk_testing::QueueCreateInfoArray queue_info(physical_device.queue_properties());
+ std::vector<VkDeviceQueueCreateInfo> create_queue_infos;
+ auto qci = queue_info.data();
+ for (uint32_t i = 0; i < queue_info.size(); ++i) {
+ if (qci[i].queueCount) {
+ create_queue_infos.push_back(qci[i]);
+ }
+ }
+
+ VkDeviceCreateInfo device_create_info = {};
+ device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
+ device_create_info.pNext = &features2;
+ device_create_info.queueCreateInfoCount = queue_info.size();
+ device_create_info.pQueueCreateInfos = queue_info.data();
+ device_create_info.ppEnabledExtensionNames = device_extensions.data();
+ device_create_info.enabledExtensionCount = device_extensions.size();
+ VkDevice testDevice;
+
+ if ((multiview_features.multiviewGeometryShader == VK_FALSE) && (multiview_features.multiviewTessellationShader == VK_FALSE)) {
+ printf("%s multiviewGeometryShader and multiviewTessellationShader feature not supported, skipping tests\n", kSkipPrefix);
+ return;
+ }
+
+ if (multiview_features.multiviewGeometryShader == VK_TRUE) {
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPhysicalDeviceMultiviewFeatures-multiviewGeometryShader-00580");
+ }
+ if (multiview_features.multiviewTessellationShader == VK_TRUE) {
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPhysicalDeviceMultiviewFeatures-multiviewTessellationShader-00581");
+ }
+ vk::CreateDevice(gpu(), &device_create_info, NULL, &testDevice);
+ m_errorMonitor->VerifyFound();
+}
+
TEST_F(VkLayerTest, BeginQueryOnTimestampPool) {
TEST_DESCRIPTION("Call CmdBeginQuery on a TIMESTAMP query pool.");
@@ -1299,7 +1954,7 @@
if (InstanceExtensionSupported(VK_KHR_DEVICE_GROUP_CREATION_EXTENSION_NAME)) {
m_instance_extension_names.push_back(VK_KHR_DEVICE_GROUP_CREATION_EXTENSION_NAME);
extension_dependency_satisfied = true;
- } else if (m_instance_api_version < VK_API_VERSION_1_1) {
+ } else if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
printf("%s vkAcquireNextImage2KHR not supported, skipping test\n", kSkipPrefix);
return;
}
@@ -1350,7 +2005,13 @@
printf("%s surface extensions not supported, skipping test\n", kSkipPrefix);
return;
}
-
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
+ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
if (!AddSwapchainDeviceExtension()) {
@@ -1358,7 +2019,10 @@
return;
}
- ASSERT_NO_FATAL_FAILURE(InitState());
+ if (!CheckTimelineSemaphoreSupportAndInitState(this)) {
+ printf("%s Timeline semaphore not supported, skipping test\n", kSkipPrefix);
+ return;
+ }
ASSERT_TRUE(InitSwapchain());
VkSemaphoreTypeCreateInfoKHR semaphore_type_create_info{};
@@ -1386,12 +2050,19 @@
TEST_DESCRIPTION("Test vkAcquireNextImage2KHR with VK_NULL_HANDLE semaphore and fence");
SetTargetApiVersion(VK_API_VERSION_1_1);
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
+ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
bool extension_dependency_satisfied = false;
if (InstanceExtensionSupported(VK_KHR_DEVICE_GROUP_CREATION_EXTENSION_NAME)) {
m_instance_extension_names.push_back(VK_KHR_DEVICE_GROUP_CREATION_EXTENSION_NAME);
extension_dependency_satisfied = true;
- } else if (m_instance_api_version < VK_API_VERSION_1_1) {
+ } else if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
printf("%s vkAcquireNextImage2KHR not supported, skipping test\n", kSkipPrefix);
return;
}
@@ -1415,7 +2086,11 @@
return;
}
- ASSERT_NO_FATAL_FAILURE(InitState());
+ if (!CheckTimelineSemaphoreSupportAndInitState(this)) {
+ printf("%s Timeline semaphore not supported, skipping test\n", kSkipPrefix);
+ return;
+ }
+
ASSERT_TRUE(InitSwapchain());
VkSemaphoreTypeCreateInfoKHR semaphore_type_create_info{};
@@ -1463,7 +2138,7 @@
std::vector<VkFenceObj> fences(acquirable_count);
for (uint32_t i = 0; i < acquirable_count; ++i) {
fences[i].init(*m_device, VkFenceObj::create_info());
- uint32_t image_i = i; // WORKAROUND: MockICD does not modify the value, so we have to or the validator state gets corrupted
+ uint32_t image_i;
const auto res = vk::AcquireNextImageKHR(device(), m_swapchain, UINT64_MAX, VK_NULL_HANDLE, fences[i].handle(), &image_i);
ASSERT_TRUE(res == VK_SUCCESS || res == VK_SUBOPTIMAL_KHR);
}
@@ -1488,7 +2163,7 @@
if (InstanceExtensionSupported(VK_KHR_DEVICE_GROUP_CREATION_EXTENSION_NAME)) {
m_instance_extension_names.push_back(VK_KHR_DEVICE_GROUP_CREATION_EXTENSION_NAME);
extension_dependency_satisfied = true;
- } else if (m_instance_api_version < VK_API_VERSION_1_1) {
+ } else if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
printf("%s vkAcquireNextImage2KHR not supported, skipping test\n", kSkipPrefix);
return;
}
@@ -1516,7 +2191,7 @@
std::vector<VkFenceObj> fences(acquirable_count);
for (uint32_t i = 0; i < acquirable_count; ++i) {
fences[i].init(*m_device, VkFenceObj::create_info());
- uint32_t image_i = i; // WORKAROUND: MockICD does not modify the value, so we have to or the validator state gets corrupted
+ uint32_t image_i;
const auto res = vk::AcquireNextImageKHR(device(), m_swapchain, UINT64_MAX, VK_NULL_HANDLE, fences[i].handle(), &image_i);
ASSERT_TRUE(res == VK_SUCCESS || res == VK_SUBOPTIMAL_KHR);
}
@@ -1682,7 +2357,7 @@
if (support_surface) {
// Test VkAcquireNextImageInfoKHR
- uint32_t imageIndex = 0;
+ uint32_t imageIndex;
VkAcquireNextImageInfoKHR acquire_next_image_info = {};
acquire_next_image_info.sType = VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR;
acquire_next_image_info.semaphore = semaphore;
@@ -1710,7 +2385,7 @@
VkDeviceGroupSubmitInfo device_group_submit_info = {};
device_group_submit_info.sType = VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO;
device_group_submit_info.commandBufferCount = 1;
- std::array<uint32_t, 1> command_buffer_device_masks = {0xFFFFFFFF};
+ std::array<uint32_t, 1> command_buffer_device_masks = {{0xFFFFFFFF}};
device_group_submit_info.pCommandBufferDeviceMasks = command_buffer_device_masks.data();
VkSubmitInfo submit_info = {};
@@ -1812,6 +2487,44 @@
m_commandBuffer->QueueCommandBuffer(false);
m_errorMonitor->VerifyFound();
}
+
+ // If there is more than one queue family, create a device with a single queue family, then create a buffer
+ // with SHARING_MODE_CONCURRENT that uses a non-device PDEV queue family.
+ uint32_t queue_count;
+ vk::GetPhysicalDeviceQueueFamilyProperties(gpu(), &queue_count, NULL);
+ VkQueueFamilyProperties *queue_props = new VkQueueFamilyProperties[queue_count];
+ vk::GetPhysicalDeviceQueueFamilyProperties(gpu(), &queue_count, queue_props);
+
+ if (queue_count < 3) {
+ printf("%s Multiple queue families are required to run this test.\n", kSkipPrefix);
+ return;
+ }
+ float priorities = {1.0f};
+ VkDeviceQueueCreateInfo queue_info = {};
+ queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
+ queue_info.queueFamilyIndex = 0;
+ queue_info.queueCount = queue_props->queueCount;
+ queue_info.pQueuePriorities = &priorities;
+ VkDeviceCreateInfo dev_info{};
+ dev_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
+ dev_info.queueCreateInfoCount = 1;
+ dev_info.pQueueCreateInfos = &queue_info;
+ dev_info.enabledLayerCount = 0;
+ dev_info.enabledExtensionCount = m_device_extension_names.size();
+ dev_info.ppEnabledExtensionNames = m_device_extension_names.data();
+
+ // Create a device with a single queue family
+ VkDevice second_device;
+ ASSERT_VK_SUCCESS(vk::CreateDevice(gpu(), &dev_info, nullptr, &second_device));
+
+ // Select Queue family for CONCURRENT buffer that is not owned by device
+ buffCI.queueFamilyIndexCount = 2;
+ qfi[1] = 2;
+ VkBuffer buffer = VK_NULL_HANDLE;
+ m_errorMonitor->ExpectSuccess();
+ vk::CreateBuffer(second_device, &buffCI, NULL, &buffer);
+ m_errorMonitor->VerifyNotFound();
+ vk::DestroyDevice(second_device, nullptr);
}
TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
@@ -1846,42 +2559,147 @@
vk::CreateQueryPool(local_device, &qpci, nullptr, &query_pool);
m_errorMonitor->VerifyFound();
+ qpci.queryType = VK_QUERY_TYPE_OCCLUSION;
+ qpci.queryCount = 0;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkQueryPoolCreateInfo-queryCount-02763");
+ vk::CreateQueryPool(local_device, &qpci, nullptr, &query_pool);
+ m_errorMonitor->VerifyFound();
+
vk::DestroyDevice(local_device, nullptr);
}
-TEST_F(VkLayerTest, UnclosedQuery) {
- TEST_DESCRIPTION("End a command buffer with a query still in progress.");
-
- const char *invalid_query = "VUID-vkEndCommandBuffer-commandBuffer-00061";
+TEST_F(VkLayerTest, InvalidQuerySizes) {
+ TEST_DESCRIPTION("Invalid size of using queries commands.");
ASSERT_NO_FATAL_FAILURE(Init());
- VkEvent event;
- VkEventCreateInfo event_create_info{};
- event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
- vk::CreateEvent(m_device->device(), &event_create_info, nullptr, &event);
+ if (IsPlatform(kPixel2XL)) {
+ printf("%s This test should not run on Pixel 2 XL\n", kSkipPrefix);
+ return;
+ }
+
+ uint32_t queue_count;
+ vk::GetPhysicalDeviceQueueFamilyProperties(gpu(), &queue_count, NULL);
+ VkQueueFamilyProperties *queue_props = new VkQueueFamilyProperties[queue_count];
+ vk::GetPhysicalDeviceQueueFamilyProperties(gpu(), &queue_count, queue_props);
+ const uint32_t timestampValidBits = queue_props[m_device->graphics_queue_node_index_].timestampValidBits;
+
+ VkBufferObj buffer;
+ buffer.init(*m_device, 128, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+ VkMemoryRequirements mem_reqs = {};
+ vk::GetBufferMemoryRequirements(m_device->device(), buffer.handle(), &mem_reqs);
+ const VkDeviceSize buffer_size = mem_reqs.size;
+
+ const uint32_t query_pool_size = 4;
+ VkQueryPool query_pool;
+ VkQueryPoolCreateInfo query_pool_create_info{};
+ query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
+ query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
+ query_pool_create_info.queryCount = query_pool_size;
+ vk::CreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
+
+ m_commandBuffer->begin();
+
+ // firstQuery is too large
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetQueryPool-firstQuery-00796");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetQueryPool-firstQuery-00797");
+ vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, query_pool_size, 1);
+ m_errorMonitor->VerifyFound();
+
+ // sum of firstQuery and queryCount is too large
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetQueryPool-firstQuery-00797");
+ vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 1, query_pool_size);
+ m_errorMonitor->VerifyFound();
+
+ // Actually reset all queries so they can be used
+ m_errorMonitor->ExpectSuccess();
+ vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, query_pool_size);
+ m_errorMonitor->VerifyNotFound();
+
+ vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
+
+ // query index to large
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndQuery-query-00810");
+ vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, query_pool_size);
+ m_errorMonitor->VerifyFound();
+
+ vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
+
+ // firstQuery is too large
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyQueryPoolResults-firstQuery-00820");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyQueryPoolResults-firstQuery-00821");
+ vk::CmdCopyQueryPoolResults(m_commandBuffer->handle(), query_pool, query_pool_size, 1, buffer.handle(), 0, 0, 0);
+ m_errorMonitor->VerifyFound();
+
+ // sum of firstQuery and queryCount is too large
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyQueryPoolResults-firstQuery-00821");
+ vk::CmdCopyQueryPoolResults(m_commandBuffer->handle(), query_pool, 1, query_pool_size, buffer.handle(), 0, 0, 0);
+ m_errorMonitor->VerifyFound();
+
+ // offset larger than buffer size
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyQueryPoolResults-dstOffset-00819");
+ vk::CmdCopyQueryPoolResults(m_commandBuffer->handle(), query_pool, 0, 1, buffer.handle(), buffer_size + 4, 0, 0);
+ m_errorMonitor->VerifyFound();
+
+ // Query is not a timestamp type
+ if (timestampValidBits == 0) {
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWriteTimestamp-timestampValidBits-00829");
+ }
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWriteTimestamp-queryPool-01416");
+ vk::CmdWriteTimestamp(m_commandBuffer->handle(), VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, query_pool, 0);
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->end();
+
+ const size_t out_data_size = 128;
+ uint8_t data[out_data_size];
+
+ // firstQuery is too large
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkGetQueryPoolResults-firstQuery-00813");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkGetQueryPoolResults-firstQuery-00816");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-InvalidQuery");
+ vk::GetQueryPoolResults(m_device->device(), query_pool, query_pool_size, 1, out_data_size, &data, 0, 0);
+ m_errorMonitor->VerifyFound();
+
+ // sum of firstQuery and queryCount is too large
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkGetQueryPoolResults-firstQuery-00816");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-InvalidQuery");
+ vk::GetQueryPoolResults(m_device->device(), query_pool, 1, query_pool_size, out_data_size, &data, 0, 0);
+ m_errorMonitor->VerifyFound();
+
+ vk::DestroyQueryPool(m_device->device(), query_pool, nullptr);
+}
+
+TEST_F(VkLayerTest, UnclosedAndDuplicateQueries) {
+ TEST_DESCRIPTION("End a command buffer with a query still in progress, create nested queries.");
+
+ ASSERT_NO_FATAL_FAILURE(Init());
VkQueue queue = VK_NULL_HANDLE;
vk::GetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
- m_commandBuffer->begin();
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, invalid_query);
-
VkQueryPool query_pool;
VkQueryPoolCreateInfo query_pool_create_info = {};
query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
- query_pool_create_info.queryCount = 1;
+ query_pool_create_info.queryCount = 5;
vk::CreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
+ m_commandBuffer->begin();
+ vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 5);
- vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginQuery-queryPool-01922");
+ vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 1, 0);
+ // Attempt to begin a query that has the same type as an active query
+ vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 3, 0);
+ vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 1);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkEndCommandBuffer-commandBuffer-00061");
vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
-
vk::EndCommandBuffer(m_commandBuffer->handle());
m_errorMonitor->VerifyFound();
vk::DestroyQueryPool(m_device->device(), query_pool, nullptr);
- vk::DestroyEvent(m_device->device(), event, nullptr);
}
TEST_F(VkLayerTest, QueryPreciseBit) {
@@ -2018,11 +2836,11 @@
VkCommandBufferBeginInfo cbbi = {};
cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
vk::BeginCommandBuffer(cmd_buffer, &cbbi);
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-01150");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04090");
vk::CmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
m_errorMonitor->VerifyFound();
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-01151");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04091");
vk::CmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
m_errorMonitor->VerifyFound();
@@ -2030,6 +2848,58 @@
vk::DestroyCommandPool(test_device.handle(), command_pool, NULL);
}
+TEST_F(VkLayerTest, StageMaskHost) {
+ TEST_DESCRIPTION("Test invalid usage of VK_PIPELINE_STAGE_HOST_BIT.");
+ ASSERT_NO_FATAL_FAILURE(Init());
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ VkEvent event;
+ VkEventCreateInfo event_create_info{};
+ event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
+ vk::CreateEvent(m_device->device(), &event_create_info, nullptr, &event);
+
+ m_commandBuffer->begin();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-01149");
+ vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_HOST_BIT);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-01153");
+ vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_HOST_BIT);
+ m_errorMonitor->VerifyFound();
+
+ m_commandBuffer->end();
+
+ VkSemaphoreCreateInfo semaphore_create_info = {};
+ semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
+ VkSemaphore semaphore;
+ ASSERT_VK_SUCCESS(vk::CreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
+
+ VkPipelineStageFlags stage_flags = VK_PIPELINE_STAGE_HOST_BIT;
+ VkSubmitInfo submit_info = {};
+
+ // Signal the semaphore so the next test can wait on it.
+ submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ submit_info.signalSemaphoreCount = 1;
+ submit_info.pSignalSemaphores = &semaphore;
+ vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
+ m_errorMonitor->VerifyNotFound();
+
+ submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ submit_info.signalSemaphoreCount = 0;
+ submit_info.pSignalSemaphores = nullptr;
+ submit_info.waitSemaphoreCount = 1;
+ submit_info.pWaitSemaphores = &semaphore;
+ submit_info.pWaitDstStageMask = &stage_flags;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-00078");
+ vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
+ m_errorMonitor->VerifyFound();
+
+ vk::DestroyEvent(m_device->device(), event, nullptr);
+ vk::DestroySemaphore(m_device->device(), semaphore, nullptr);
+}
+
TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
ASSERT_NO_FATAL_FAILURE(Init());
@@ -2446,6 +3316,18 @@
ASSERT_NO_FATAL_FAILURE(Init());
ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+ uint32_t queue_count;
+ vk::GetPhysicalDeviceQueueFamilyProperties(gpu(), &queue_count, NULL);
+ VkQueueFamilyProperties *queue_props = new VkQueueFamilyProperties[queue_count];
+ vk::GetPhysicalDeviceQueueFamilyProperties(gpu(), &queue_count, queue_props);
+ if (queue_props[m_device->graphics_queue_node_index_].timestampValidBits == 0) {
+ printf("%s Device graphic queue has timestampValidBits of 0, skipping.\n", kSkipPrefix);
+ return;
+ }
+
+ VkBufferObj buffer;
+ buffer.init(*m_device, 128, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+
VkQueryPool query_pool;
VkQueryPoolCreateInfo query_pool_ci{};
query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
@@ -2458,6 +3340,13 @@
m_commandBuffer->begin();
vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
vk::CmdWriteTimestamp(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, query_pool, 0);
+ m_errorMonitor->VerifyNotFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyQueryPoolResults-queryType-00827");
+ vk::CmdCopyQueryPoolResults(m_commandBuffer->handle(), query_pool, 0, 1, buffer.handle(), 0, 8, VK_QUERY_RESULT_PARTIAL_BIT);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->ExpectSuccess();
m_commandBuffer->end();
// Submit cmd buffer and wait for it.
@@ -2683,7 +3572,11 @@
dyn_state_ci.pDynamicStates = dyn_states;
pipe.dyn_state_ci_ = dyn_state_ci;
pipe.InitState();
- pipe.CreateGraphicsPipeline();
+ err = pipe.CreateGraphicsPipeline();
+ if (err != VK_SUCCESS) {
+ printf("%s Unable to compile shader, skipping.\n", kSkipPrefix);
+ return;
+ }
pipe.descriptor_set_->WriteDescriptorBufferView(0, view, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER);
pipe.descriptor_set_->UpdateDescriptorSets();
@@ -2983,8 +3876,8 @@
ASSERT_NO_FATAL_FAILURE(InitViewport());
ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
- std::array<VkDescriptorBindingFlagsEXT, 2> flags = {VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT,
- VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT};
+ std::array<VkDescriptorBindingFlagsEXT, 2> flags = {
+ {VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT, VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT}};
auto flags_create_info = lvl_init_struct<VkDescriptorSetLayoutBindingFlagsCreateInfoEXT>();
flags_create_info.bindingCount = (uint32_t)flags.size();
flags_create_info.pBindingFlags = flags.data();
@@ -3079,23 +3972,6 @@
m_errorMonitor->VerifyFound();
}
-TEST_F(VkLayerTest, InstanceDebugReportCallback) {
- TEST_DESCRIPTION("Test that a pNext-installed debug callback will catch a CreateInstance-time error.");
-
- // This instance extension requires that the VK_KHR_get_surface_capabilities2 also be enabled
- if (!InstanceExtensionSupported(VK_KHR_SURFACE_PROTECTED_CAPABILITIES_EXTENSION_NAME)) {
- printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
- VK_KHR_SURFACE_PROTECTED_CAPABILITIES_EXTENSION_NAME);
- return;
- }
-
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCreateInstance-ppEnabledExtensionNames-01388");
- // Enable the instance extension, but none of the extensions it depends on
- m_instance_extension_names.push_back(VK_KHR_SURFACE_PROTECTED_CAPABILITIES_EXTENSION_NAME);
- ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
- m_errorMonitor->VerifyFound();
-}
-
TEST_F(VkLayerTest, HostQueryResetNotEnabled) {
TEST_DESCRIPTION("Use vkResetQueryPoolEXT without enabling the feature");
@@ -3423,7 +4299,7 @@
}
}
- if (DeviceIsMockICD() || DeviceSimulation()) {
+ if (IsPlatform(kMockICD) || DeviceSimulation()) {
printf("%s Test not supported by MockICD, skipping tests\n", kSkipPrefix);
return;
}
@@ -3468,6 +4344,7 @@
CreateImageTest(*this, &image_create_info, "VUID-VkImageCreateInfo-imageType-02082");
image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ image_create_info.arrayLayers = 6;
// must be single sample
image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
@@ -3499,6 +4376,7 @@
// view type must be 2D or 2D_ARRAY
ivci.viewType = VK_IMAGE_VIEW_TYPE_CUBE;
+ ivci.subresourceRange.layerCount = 6;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageViewCreateInfo-image-02086");
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageViewCreateInfo-image-01003");
result = vk::CreateImageView(m_device->device(), &ivci, nullptr, &view);
@@ -3508,6 +4386,7 @@
view = VK_NULL_HANDLE;
}
ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
+ ivci.subresourceRange.layerCount = 1;
// format must be R8_UINT
ivci.format = VK_FORMAT_R8_UNORM;
@@ -3584,9 +4463,8 @@
vsrisci.shadingRateImageEnable = VK_TRUE;
vsrisci.viewportCount = 1;
};
- CreatePipelineHelper::OneshotTest(
- *this, break_vp, kErrorBit,
- vector<std::string>({"VUID-VkPipelineViewportShadingRateImageStateCreateInfoNV-pDynamicStates-02057"}));
+ CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit,
+ vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04057"}));
}
// Create an image without the SRI bit
@@ -3792,7 +4670,10 @@
// undefined format
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCreateInfo-pNext-01975");
+ // Various extra errors for having VK_FORMAT_UNDEFINED without VkExternalFormatANDROID
m_errorMonitor->SetUnexpectedError("VUID_Undefined");
+ m_errorMonitor->SetUnexpectedError("UNASSIGNED-CoreValidation-Image-FormatNotSupported");
+ m_errorMonitor->SetUnexpectedError("VUID-VkImageCreateInfo-imageCreateMaxMipLevels-02251");
vk::CreateImage(dev, &ici, NULL, &img);
m_errorMonitor->VerifyFound();
reset_img();
@@ -3972,6 +4853,11 @@
SetTargetApiVersion(VK_API_VERSION_1_1);
ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ if (IsPlatform(kGalaxyS10)) {
+ printf("%s This test should not run on Galaxy S10\n", kSkipPrefix);
+ return;
+ }
+
if ((DeviceExtensionSupported(gpu(), nullptr, VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)) &&
// Also skip on devices that advertise AHB, but not the pre-requisite foreign_queue extension
(DeviceExtensionSupported(gpu(), nullptr, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME))) {
@@ -4106,9 +4992,20 @@
mdai.pNext = mai.pNext;
mai.pNext = &mdai;
- // Dedicated allocation with unmatched usage bits
+ // Dedicated allocation with unmatched usage bits for Color
ahb_desc.format = AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
- ahb_desc.usage = AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT;
+ ahb_desc.usage = AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER;
+ ahb_desc.height = 64;
+ recreate_ahb();
+ mai.allocationSize = ahb_props.allocationSize;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkMemoryAllocateInfo-pNext-02390");
+ vk::AllocateMemory(dev, &mai, NULL, &mem_handle);
+ m_errorMonitor->VerifyFound();
+ reset_mem();
+
+ // Dedicated allocation with unmatched usage bits for Depth/Stencil
+ ahb_desc.format = AHARDWAREBUFFER_FORMAT_S8_UINT;
+ ahb_desc.usage = AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER;
ahb_desc.height = 64;
recreate_ahb();
mai.allocationSize = ahb_props.allocationSize;
@@ -4141,6 +5038,7 @@
// ERROR: AHardwareBuffer_allocate() with MIPMAP_COMPLETE fails. It returns -12, NO_MEMORY.
// The problem seems to happen in Pixel 2, not Pixel 3.
printf("%s AHARDWAREBUFFER_USAGE_GPU_MIPMAP_COMPLETE not supported, skipping tests\n", kSkipPrefix);
+ return;
}
// Dedicated allocation with mis-matched dimension
@@ -4148,6 +5046,7 @@
ahb_desc.height = 32;
ahb_desc.width = 128;
recreate_ahb();
+ mai.allocationSize = ahb_props.allocationSize;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkMemoryAllocateInfo-pNext-02388");
vk::AllocateMemory(dev, &mai, NULL, &mem_handle);
m_errorMonitor->VerifyFound();
@@ -4158,6 +5057,7 @@
ahb_desc.height = 64;
ahb_desc.width = 64;
recreate_ahb();
+ mai.allocationSize = ahb_props.allocationSize;
ici.mipLevels = 1;
ici.format = VK_FORMAT_B8G8R8A8_UNORM;
ici.pNext = NULL;
@@ -4200,6 +5100,8 @@
// Export with allocation size non-zero
ahb_desc.usage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
recreate_ahb();
+ mai.allocationSize = ahb_props.allocationSize;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkMemoryDedicatedAllocateInfo-image-02964");
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkMemoryAllocateInfo-pNext-01874");
vk::AllocateMemory(dev, &mai, NULL, &mem_handle);
m_errorMonitor->VerifyFound();
@@ -4232,7 +5134,11 @@
return;
}
- ASSERT_NO_FATAL_FAILURE(InitState());
+ // Enable Ycbcr Conversion Features
+ VkPhysicalDeviceSamplerYcbcrConversionFeatures ycbcr_features = {};
+ ycbcr_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES;
+ ycbcr_features.samplerYcbcrConversion = VK_TRUE;
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &ycbcr_features));
VkDevice dev = m_device->device();
VkSamplerYcbcrConversion ycbcr_conv = VK_NULL_HANDLE;
@@ -4242,7 +5148,8 @@
sycci.ycbcrModel = VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY;
sycci.ycbcrRange = VK_SAMPLER_YCBCR_RANGE_ITU_FULL;
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerYcbcrConversionCreateInfo-format-01904");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerYcbcrConversionCreateInfo-format-04061");
+ m_errorMonitor->SetUnexpectedError("VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01651");
vk::CreateSamplerYcbcrConversion(dev, &sycci, NULL, &ycbcr_conv);
m_errorMonitor->VerifyFound();
@@ -4252,6 +5159,7 @@
sycci.format = VK_FORMAT_R8G8B8A8_UNORM;
sycci.pNext = &efa;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSamplerYcbcrConversionCreateInfo-format-01904");
+ m_errorMonitor->SetUnexpectedError("VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01651");
vk::CreateSamplerYcbcrConversion(dev, &sycci, NULL, &ycbcr_conv);
m_errorMonitor->VerifyFound();
}
@@ -4280,7 +5188,7 @@
ASSERT_NO_FATAL_FAILURE(InitState());
- if ((m_instance_api_version < VK_API_VERSION_1_1) &&
+ if ((DeviceValidationVersion() < VK_API_VERSION_1_1) &&
!InstanceExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
printf("%s %s extension not supported, skipping test\n", kSkipPrefix,
VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
@@ -4315,12 +5223,18 @@
m_errorMonitor->VerifyFound();
}
+#if DISABLEUNTILAHBWORKS
TEST_F(VkLayerTest, AndroidHardwareBufferCreateImageView) {
TEST_DESCRIPTION("Verify AndroidHardwareBuffer image view creation.");
SetTargetApiVersion(VK_API_VERSION_1_1);
ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ if (IsPlatform(kGalaxyS10)) {
+ printf("%s This test should not run on Galaxy S10\n", kSkipPrefix);
+ return;
+ }
+
if ((DeviceExtensionSupported(gpu(), nullptr, VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)) &&
// Also skip on devices that advertise AHB, but not the pre-requisite foreign_queue extension
(DeviceExtensionSupported(gpu(), nullptr, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME))) {
@@ -4362,9 +5276,15 @@
pfn_GetAHBProps(dev, ahb, &ahb_props);
AHardwareBuffer_release(ahb);
+ VkExternalMemoryImageCreateInfo emici = {};
+ emici.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO;
+ emici.pNext = nullptr;
+ emici.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
+
// Give image an external format
VkExternalFormatANDROID efa = {};
efa.sType = VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID;
+ efa.pNext = (void *)&emici;
efa.externalFormat = ahb_fmt_props.externalFormat;
ahb_desc.format = AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
@@ -4387,6 +5307,13 @@
efa_Ycbcr.sType = VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID;
efa_Ycbcr.externalFormat = ahb_fmt_props_Ycbcr.externalFormat;
+ // Need to make sure format has sample bit needed for image usage
+ if ((ahb_fmt_props_Ycbcr.formatFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT) == 0) {
+ printf("%s VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT feature bit not supported for format %" PRIu64 ".", kSkipPrefix,
+ ahb_fmt_props_Ycbcr.externalFormat);
+ return;
+ }
+
// Create the image
VkImage img = VK_NULL_HANDLE;
VkImageCreateInfo ici = {};
@@ -4411,12 +5338,12 @@
mai.memoryTypeIndex = 0;
vk::AllocateMemory(dev, &mai, NULL, &img_mem);
- // It shouldn't use vk::GetImageMemoryRequirements for AndroidHardwareBuffer.
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-vkBindImageMemory-invalid-requirements");
+ // It shouldn't use vk::GetImageMemoryRequirements for imported AndroidHardwareBuffer when memory isn't bound yet
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkGetImageMemoryRequirements-image-04004");
VkMemoryRequirements img_mem_reqs = {};
vk::GetImageMemoryRequirements(m_device->device(), img, &img_mem_reqs);
- vk::BindImageMemory(dev, img, img_mem, 0);
m_errorMonitor->VerifyFound();
+ vk::BindImageMemory(dev, img, img_mem, 0);
// Bind image to memory
vk::DestroyImage(dev, img, NULL);
@@ -4496,6 +5423,7 @@
vk::DestroyImage(dev, img, NULL);
vk::FreeMemory(dev, img_mem, NULL);
}
+#endif // DISABLEUNTILAHBWORKS
TEST_F(VkLayerTest, AndroidHardwareBufferImportBuffer) {
TEST_DESCRIPTION("Verify AndroidHardwareBuffer import as buffer.");
@@ -4503,6 +5431,11 @@
SetTargetApiVersion(VK_API_VERSION_1_1);
ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ if (IsPlatform(kGalaxyS10)) {
+ printf("%s This test should not run on Galaxy S10\n", kSkipPrefix);
+ return;
+ }
+
if ((DeviceExtensionSupported(gpu(), nullptr, VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)) &&
// Also skip on devices that advertise AHB, but not the pre-requisite foreign_queue extension
(DeviceExtensionSupported(gpu(), nullptr, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME))) {
@@ -4542,7 +5475,7 @@
// Allocate an AHardwareBuffer
ahb_desc.format = AHARDWAREBUFFER_FORMAT_BLOB;
- ahb_desc.usage = AHARDWAREBUFFER_USAGE_SENSOR_DIRECT_DATA;
+ ahb_desc.usage = AHARDWAREBUFFER_USAGE_SENSOR_DIRECT_DATA; // non USAGE_GPU_*
ahb_desc.width = 512;
ahb_desc.height = 1;
ahb_desc.layers = 1;
@@ -4587,7 +5520,7 @@
return;
}
- // Import as buffer requires format AHB_FMT_BLOB and usage AHB_USAGE_GPU_DATA_BUFFER
+ // Import as buffer requires usage AHB_USAGE_GPU_DATA_BUFFER
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImportAndroidHardwareBufferInfoANDROID-buffer-01881");
// Also causes "non-dedicated allocation format/usage" error
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkMemoryAllocateInfo-pNext-02384");
@@ -4605,6 +5538,11 @@
SetTargetApiVersion(VK_API_VERSION_1_1);
ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ if (IsPlatform(kGalaxyS10)) {
+ printf("%s This test should not run on Galaxy S10\n", kSkipPrefix);
+ return;
+ }
+
if ((DeviceExtensionSupported(gpu(), nullptr, VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)) &&
// Also skip on devices that advertise AHB, but not the pre-requisite foreign_queue extension
(DeviceExtensionSupported(gpu(), nullptr, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME))) {
@@ -4689,11 +5627,338 @@
vk::DestroyImage(dev, img, NULL);
}
+TEST_F(VkLayerTest, AndroidHardwareBufferInvalidBindBufferMemory) {
+ TEST_DESCRIPTION("Validate binding AndroidHardwareBuffer VkBuffer act same as non-AHB buffers.");
+
+ SetTargetApiVersion(VK_API_VERSION_1_1);
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ if (IsPlatform(kGalaxyS10)) {
+ printf("%s This test should not run on Galaxy S10\n", kSkipPrefix);
+ return;
+ }
+
+ if ((DeviceExtensionSupported(gpu(), nullptr, VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)) &&
+ // Also skip on devices that advertise AHB, but not the pre-requisite foreign_queue extension
+ (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME))) {
+ m_device_extension_names.push_back(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME);
+ } else {
+ printf("%s %s extension not supported, skipping tests\n", kSkipPrefix,
+ VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ // Allocate an AHardwareBuffer
+ AHardwareBuffer *ahb;
+ AHardwareBuffer_Desc ahb_desc = {};
+ ahb_desc.format = AHARDWAREBUFFER_FORMAT_BLOB;
+ ahb_desc.usage = AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER;
+ ahb_desc.width = 64;
+ ahb_desc.height = 1;
+ ahb_desc.layers = 1;
+ ahb_desc.stride = 1;
+ AHardwareBuffer_allocate(&ahb_desc, &ahb);
+
+ VkExternalMemoryBufferCreateInfo ext_buf_info = {};
+ ext_buf_info.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR;
+ ext_buf_info.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
+
+ VkBufferCreateInfo buffer_create_info = {};
+ buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ buffer_create_info.pNext = &ext_buf_info;
+ buffer_create_info.size = 1 << 20; // 1 MB
+ buffer_create_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
+
+ VkBuffer buffer = VK_NULL_HANDLE;
+ vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &buffer);
+
+ // Try to get memory requirements prior to binding memory
+ VkMemoryRequirements mem_reqs;
+ vk::GetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
+
+ VkImportAndroidHardwareBufferInfoANDROID import_ahb_Info = {};
+ import_ahb_Info.sType = VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID;
+ import_ahb_Info.pNext = nullptr;
+ import_ahb_Info.buffer = ahb;
+
+ VkMemoryAllocateInfo memory_info = {};
+ memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ memory_info.pNext = &import_ahb_Info;
+ memory_info.allocationSize = mem_reqs.size + mem_reqs.alignment; // save room for offset
+ bool has_memtype = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &memory_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
+ if (!has_memtype) {
+ printf("%s No invalid memory type index could be found; skipped.\n", kSkipPrefix);
+ AHardwareBuffer_release(ahb);
+ vk::DestroyBuffer(m_device->device(), buffer, nullptr);
+ return;
+ }
+
+ VkDeviceMemory memory = VK_NULL_HANDLE;
+ VkResult result = vk::AllocateMemory(m_device->device(), &memory_info, NULL, &memory);
+ if ((memory == VK_NULL_HANDLE) || (result != VK_SUCCESS)) {
+ printf("%s This test failed to allocate memory for importing\n", kSkipPrefix);
+ return;
+ }
+
+ if (mem_reqs.alignment > 1) {
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindBufferMemory-memoryOffset-01036");
+ vk::BindBufferMemory(device(), buffer, memory, 1);
+ m_errorMonitor->VerifyFound();
+ }
+
+ VkDeviceSize buffer_offset = (mem_reqs.size - 1) & ~(mem_reqs.alignment - 1);
+ if (buffer_offset > 0) {
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindBufferMemory-size-01037");
+ vk::BindBufferMemory(device(), buffer, memory, buffer_offset);
+ m_errorMonitor->VerifyFound();
+ }
+
+ vk::DestroyBuffer(m_device->device(), buffer, nullptr);
+ vk::FreeMemory(m_device->device(), memory, nullptr);
+}
+
+TEST_F(VkLayerTest, AndroidHardwareBufferImportBufferHandleType) {
+ TEST_DESCRIPTION("Don't use proper resource handleType for import buffer");
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ if (IsPlatform(kGalaxyS10)) {
+ printf("%s This test should not run on Galaxy S10\n", kSkipPrefix);
+ return;
+ }
+
+ if ((DeviceExtensionSupported(gpu(), nullptr, VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)) &&
+ // Also skip on devices that advertise AHB, but not the pre-requisite foreign_queue extension
+ (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME))) {
+ m_device_extension_names.push_back(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME);
+ } else {
+ printf("%s %s extension not supported, skipping tests\n", kSkipPrefix,
+ VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ PFN_vkGetAndroidHardwareBufferPropertiesANDROID pfn_GetAHBProps =
+ (PFN_vkGetAndroidHardwareBufferPropertiesANDROID)vk::GetDeviceProcAddr(m_device->device(),
+ "vkGetAndroidHardwareBufferPropertiesANDROID");
+ PFN_vkBindBufferMemory2KHR vkBindBufferMemory2Function =
+ (PFN_vkBindBufferMemory2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkBindBufferMemory2KHR");
+
+ m_errorMonitor->ExpectSuccess();
+
+ AHardwareBuffer *ahb;
+ AHardwareBuffer_Desc ahb_desc = {};
+ ahb_desc.format = AHARDWAREBUFFER_FORMAT_BLOB;
+ ahb_desc.usage = AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER;
+ ahb_desc.width = 64;
+ ahb_desc.height = 1;
+ ahb_desc.layers = 1;
+ ahb_desc.stride = 1;
+ AHardwareBuffer_allocate(&ahb_desc, &ahb);
+
+ // Create buffer without VkExternalMemoryBufferCreateInfo
+ VkBuffer buffer = VK_NULL_HANDLE;
+ VkBufferCreateInfo buffer_create_info = {};
+ buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ buffer_create_info.pNext = nullptr;
+ buffer_create_info.size = 512;
+ buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
+ vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &buffer);
+
+ VkImportAndroidHardwareBufferInfoANDROID import_ahb_Info = {};
+ import_ahb_Info.sType = VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID;
+ import_ahb_Info.pNext = nullptr;
+ import_ahb_Info.buffer = ahb;
+
+ VkAndroidHardwareBufferPropertiesANDROID ahb_props = {};
+ ahb_props.sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID;
+ ahb_props.pNext = nullptr;
+ pfn_GetAHBProps(m_device->device(), ahb, &ahb_props);
+
+ VkMemoryAllocateInfo memory_allocate_info = {};
+ memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ memory_allocate_info.pNext = &import_ahb_Info;
+ memory_allocate_info.allocationSize = ahb_props.allocationSize;
+ // driver won't expose correct memoryType since resource was not created as an import operation
+ // so just need any valid memory type returned from GetAHBInfo
+ for (int i = 0; i < 32; i++) {
+ if (ahb_props.memoryTypeBits & (1 << i)) {
+ memory_allocate_info.memoryTypeIndex = i;
+ break;
+ }
+ }
+
+ VkDeviceMemory memory;
+ vk::AllocateMemory(m_device->device(), &memory_allocate_info, nullptr, &memory);
+ m_errorMonitor->VerifyNotFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindBufferMemory-memory-02986");
+ m_errorMonitor->SetUnexpectedError("VUID-vkBindBufferMemory-memory-01035");
+ vk::BindBufferMemory(m_device->device(), buffer, memory, 0);
+ m_errorMonitor->VerifyFound();
+
+ VkBindBufferMemoryInfo bind_buffer_info = {};
+ bind_buffer_info.sType = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO;
+ bind_buffer_info.pNext = nullptr;
+ bind_buffer_info.buffer = buffer;
+ bind_buffer_info.memory = memory;
+ bind_buffer_info.memoryOffset = 0;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBindBufferMemoryInfo-memory-02988");
+ m_errorMonitor->SetUnexpectedError("VUID-VkBindBufferMemoryInfo-memory-01599");
+ vkBindBufferMemory2Function(m_device->device(), 1, &bind_buffer_info);
+ m_errorMonitor->VerifyFound();
+
+ vk::DestroyBuffer(m_device->device(), buffer, nullptr);
+ vk::FreeMemory(m_device->device(), memory, nullptr);
+}
+
+TEST_F(VkLayerTest, AndroidHardwareBufferImportImageHandleType) {
+ TEST_DESCRIPTION("Don't use proper resource handleType for import image");
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ if (IsPlatform(kGalaxyS10)) {
+ printf("%s This test should not run on Galaxy S10\n", kSkipPrefix);
+ return;
+ }
+
+ if ((DeviceExtensionSupported(gpu(), nullptr, VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)) &&
+ // Also skip on devices that advertise AHB, but not the pre-requisite foreign_queue extension
+ (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME))) {
+ m_device_extension_names.push_back(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME);
+ } else {
+ printf("%s %s extension not supported, skipping tests\n", kSkipPrefix,
+ VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ PFN_vkGetAndroidHardwareBufferPropertiesANDROID pfn_GetAHBProps =
+ (PFN_vkGetAndroidHardwareBufferPropertiesANDROID)vk::GetDeviceProcAddr(m_device->device(),
+ "vkGetAndroidHardwareBufferPropertiesANDROID");
+ PFN_vkBindImageMemory2KHR vkBindImageMemory2Function =
+ (PFN_vkBindImageMemory2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkBindImageMemory2KHR");
+
+ m_errorMonitor->ExpectSuccess();
+
+ AHardwareBuffer *ahb;
+ AHardwareBuffer_Desc ahb_desc = {};
+ ahb_desc.format = AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM;
+ ahb_desc.usage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
+ ahb_desc.width = 64;
+ ahb_desc.height = 64;
+ ahb_desc.layers = 1;
+ ahb_desc.stride = 1;
+ AHardwareBuffer_allocate(&ahb_desc, &ahb);
+
+ // Create buffer without VkExternalMemoryImageCreateInfo
+ VkImage image = VK_NULL_HANDLE;
+ VkImageCreateInfo image_create_info = {};
+ image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_create_info.pNext = nullptr;
+ image_create_info.flags = 0;
+ image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
+ image_create_info.extent = {64, 64, 1};
+ image_create_info.mipLevels = 1;
+ image_create_info.arrayLayers = 1;
+ image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
+ vk::CreateImage(m_device->device(), &image_create_info, nullptr, &image);
+
+ VkMemoryDedicatedAllocateInfo memory_dedicated_info = {};
+ memory_dedicated_info.sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO;
+ memory_dedicated_info.pNext = nullptr;
+ memory_dedicated_info.image = image;
+ memory_dedicated_info.buffer = VK_NULL_HANDLE;
+
+ VkImportAndroidHardwareBufferInfoANDROID import_ahb_Info = {};
+ import_ahb_Info.sType = VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID;
+ import_ahb_Info.pNext = &memory_dedicated_info;
+ import_ahb_Info.buffer = ahb;
+
+ VkAndroidHardwareBufferPropertiesANDROID ahb_props = {};
+ ahb_props.sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID;
+ ahb_props.pNext = nullptr;
+ pfn_GetAHBProps(m_device->device(), ahb, &ahb_props);
+
+ VkMemoryAllocateInfo memory_allocate_info = {};
+ memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ memory_allocate_info.pNext = &import_ahb_Info;
+ memory_allocate_info.allocationSize = ahb_props.allocationSize;
+ // driver won't expose correct memoryType since resource was not created as an import operation
+ // so just need any valid memory type returned from GetAHBInfo
+ for (int i = 0; i < 32; i++) {
+ if (ahb_props.memoryTypeBits & (1 << i)) {
+ memory_allocate_info.memoryTypeIndex = i;
+ break;
+ }
+ }
+
+ VkDeviceMemory memory;
+ vk::AllocateMemory(m_device->device(), &memory_allocate_info, nullptr, &memory);
+ m_errorMonitor->VerifyNotFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindImageMemory-memory-02990");
+ m_errorMonitor->SetUnexpectedError("VUID-vkBindImageMemory-memory-01047");
+ m_errorMonitor->SetUnexpectedError("VUID-vkBindImageMemory-size-01049");
+ vk::BindImageMemory(m_device->device(), image, memory, 0);
+ m_errorMonitor->VerifyFound();
+
+ VkBindImageMemoryInfo bind_image_info = {};
+ bind_image_info.sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO;
+ bind_image_info.pNext = nullptr;
+ bind_image_info.image = image;
+ bind_image_info.memory = memory;
+ bind_image_info.memoryOffset = 0;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBindImageMemoryInfo-memory-02992");
+ m_errorMonitor->SetUnexpectedError("VUID-VkBindImageMemoryInfo-pNext-01617");
+ m_errorMonitor->SetUnexpectedError("VUID-VkBindImageMemoryInfo-pNext-01615");
+ vkBindImageMemory2Function(m_device->device(), 1, &bind_image_info);
+ m_errorMonitor->VerifyFound();
+
+ vk::DestroyImage(m_device->device(), image, nullptr);
+ vk::FreeMemory(m_device->device(), memory, nullptr);
+}
+
#endif // VK_USE_PLATFORM_ANDROID_KHR
TEST_F(VkLayerTest, ValidateStride) {
TEST_DESCRIPTION("Validate Stride.");
ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
+ if (IsPlatform(kPixelC)) {
+ printf("%s This test should not run on Pixel C\n", kSkipPrefix);
+ return;
+ }
ASSERT_NO_FATAL_FAILURE(InitViewport());
ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
@@ -4767,6 +6032,12 @@
m_errorMonitor->VerifyNotFound();
if (m_device->phy().features().multiDrawIndirect) {
+ auto buffer_memory_barrier = buffer.buffer_memory_barrier(
+ VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT, 0, VK_WHOLE_SIZE);
+ m_commandBuffer->PipelineBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT,
+ VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT | VK_PIPELINE_STAGE_VERTEX_INPUT_BIT, 0, 0, nullptr, 1,
+ &buffer_memory_barrier, 0, nullptr);
+
CreatePipelineHelper helper(*this);
helper.InitInfo();
helper.InitState();
@@ -4827,63 +6098,6 @@
DestroySwapchain();
}
-bool InitFrameworkForRayTracingTest(VkRenderFramework *renderFramework, bool isKHR,
- std::vector<const char *> &instance_extension_names,
- std::vector<const char *> &device_extension_names, void *user_data,
- bool need_gpu_validation = false, bool need_push_descriptors = false) {
- const std::array<const char *, 1> required_instance_extensions = {VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME};
- for (const char *required_instance_extension : required_instance_extensions) {
- if (renderFramework->InstanceExtensionSupported(required_instance_extension)) {
- instance_extension_names.push_back(required_instance_extension);
- } else {
- printf("%s %s instance extension not supported, skipping test\n", kSkipPrefix, required_instance_extension);
- return false;
- }
- }
-
- VkValidationFeatureEnableEXT enables[] = {VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT};
- VkValidationFeaturesEXT features = {};
- features.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
- features.enabledValidationFeatureCount = 1;
- features.pEnabledValidationFeatures = enables;
-
- VkValidationFeaturesEXT *enabled_features = need_gpu_validation ? &features : nullptr;
-
- renderFramework->InitFramework(user_data, enabled_features);
-
- if (renderFramework->DeviceIsMockICD() || renderFramework->DeviceSimulation()) {
- printf("%s Test not supported by MockICD, skipping tests\n", kSkipPrefix);
- return false;
- }
-
- std::vector<const char *> required_device_extensions;
- required_device_extensions.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
- if (isKHR) {
- required_device_extensions.push_back(VK_KHR_RAY_TRACING_EXTENSION_NAME);
- required_device_extensions.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
- required_device_extensions.push_back(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME);
- required_device_extensions.push_back(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME);
- required_device_extensions.push_back(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME);
- required_device_extensions.push_back(VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME);
- } else {
- required_device_extensions.push_back(VK_NV_RAY_TRACING_EXTENSION_NAME);
- }
- if (need_push_descriptors) {
- required_device_extensions.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
- }
-
- for (const char *required_device_extension : required_device_extensions) {
- if (renderFramework->DeviceExtensionSupported(renderFramework->gpu(), nullptr, required_device_extension)) {
- device_extension_names.push_back(required_device_extension);
- } else {
- printf("%s %s device extension not supported, skipping test\n", kSkipPrefix, required_device_extension);
- return false;
- }
- }
- renderFramework->InitState();
- return true;
-}
-
TEST_F(VkLayerTest, ValidateGeometryNV) {
TEST_DESCRIPTION("Validate acceleration structure geometries.");
if (!InitFrameworkForRayTracingTest(this, false, m_instance_extension_names, m_device_extension_names, m_errorMonitor)) {
@@ -5132,43 +6346,18 @@
vkCreateAccelerationStructureNV(m_device->handle(), &as_create_info, nullptr, &as);
m_errorMonitor->VerifyFound();
}
-}
-void GetSimpleGeometryForAccelerationStructureTests(const VkDeviceObj &device, VkBufferObj *vbo, VkBufferObj *ibo,
- VkGeometryNV *geometry) {
- vbo->init(device, 1024, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
- VK_BUFFER_USAGE_RAY_TRACING_BIT_NV);
- ibo->init(device, 1024, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
- VK_BUFFER_USAGE_RAY_TRACING_BIT_NV);
+ // geometryType must be VK_GEOMETRY_TYPE_TRIANGLES_NV or VK_GEOMETRY_TYPE_AABBS_NV
+ {
+ VkGeometryNV geometry = valid_geometry_aabbs;
+ geometry.geometry.aabbs.stride = 1;
+ geometry.geometryType = VK_GEOMETRY_TYPE_INSTANCES_KHR;
- const std::vector<float> vertices = {1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 0.0f};
- const std::vector<uint32_t> indicies = {0, 1, 2};
-
- uint8_t *mapped_vbo_buffer_data = (uint8_t *)vbo->memory().map();
- std::memcpy(mapped_vbo_buffer_data, (uint8_t *)vertices.data(), sizeof(float) * vertices.size());
- vbo->memory().unmap();
-
- uint8_t *mapped_ibo_buffer_data = (uint8_t *)ibo->memory().map();
- std::memcpy(mapped_ibo_buffer_data, (uint8_t *)indicies.data(), sizeof(uint32_t) * indicies.size());
- ibo->memory().unmap();
-
- *geometry = {};
- geometry->sType = VK_STRUCTURE_TYPE_GEOMETRY_NV;
- geometry->geometryType = VK_GEOMETRY_TYPE_TRIANGLES_NV;
- geometry->geometry.triangles.sType = VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV;
- geometry->geometry.triangles.vertexData = vbo->handle();
- geometry->geometry.triangles.vertexOffset = 0;
- geometry->geometry.triangles.vertexCount = 3;
- geometry->geometry.triangles.vertexStride = 12;
- geometry->geometry.triangles.vertexFormat = VK_FORMAT_R32G32B32_SFLOAT;
- geometry->geometry.triangles.indexData = ibo->handle();
- geometry->geometry.triangles.indexOffset = 0;
- geometry->geometry.triangles.indexCount = 3;
- geometry->geometry.triangles.indexType = VK_INDEX_TYPE_UINT32;
- geometry->geometry.triangles.transformData = VK_NULL_HANDLE;
- geometry->geometry.triangles.transformOffset = 0;
- geometry->geometry.aabbs = {};
- geometry->geometry.aabbs.sType = VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV;
+ VkAccelerationStructureCreateInfoNV as_create_info = GetCreateInfo(geometry);
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkGeometryNV-geometryType-03503");
+ vkCreateAccelerationStructureNV(m_device->handle(), &as_create_info, nullptr, &as);
+ m_errorMonitor->VerifyFound();
+ }
}
TEST_F(VkLayerTest, ValidateCreateAccelerationStructureNV) {
@@ -5275,10 +6464,21 @@
TEST_F(VkLayerTest, ValidateCreateAccelerationStructureKHR) {
TEST_DESCRIPTION("Validate acceleration structure creation.");
- if (!InitFrameworkForRayTracingTest(this, true, m_instance_extension_names, m_device_extension_names, m_errorMonitor)) {
+ if (!InitFrameworkForRayTracingTest(this, true, m_instance_extension_names, m_device_extension_names, m_errorMonitor, false,
+ false, true)) {
return;
}
+ auto ray_tracing_features = lvl_init_struct<VkPhysicalDeviceRayTracingFeaturesKHR>();
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&ray_tracing_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+ if (ray_tracing_features.rayQuery == VK_FALSE && ray_tracing_features.rayTracing == VK_FALSE) {
+ printf("%s Both of the required features rayQuery and rayTracing are not supported, skipping test\n", kSkipPrefix);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &ray_tracing_features));
PFN_vkCreateAccelerationStructureKHR vkCreateAccelerationStructureKHR = reinterpret_cast<PFN_vkCreateAccelerationStructureKHR>(
vk::GetDeviceProcAddr(m_device->handle(), "vkCreateAccelerationStructureKHR"));
assert(vkCreateAccelerationStructureKHR != nullptr);
@@ -5314,6 +6514,21 @@
m_errorMonitor->VerifyFound();
}
+ // If type is VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR
+ // and compactedSize is 0, maxGeometryCount must be 1
+ // also tests If compactedSize is 0 then maxGeometryCount must not be 0
+ {
+ VkAccelerationStructureCreateInfoKHR bad_top_level_create_info = as_create_info;
+ bad_top_level_create_info.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR;
+ bad_top_level_create_info.maxGeometryCount = 0;
+ bad_top_level_create_info.compactedSize = 0;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ "VUID-VkAccelerationStructureCreateInfoKHR-compactedSize-02993");
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkAccelerationStructureCreateInfoKHR-type-03495");
+ vkCreateAccelerationStructureKHR(m_device->handle(), &bad_top_level_create_info, nullptr, &as);
+ m_errorMonitor->VerifyFound();
+ }
+
// Bot level can not have instances
{
VkAccelerationStructureCreateInfoKHR bad_bot_level_create_info = as_create_info;
@@ -5373,6 +6588,36 @@
vkCreateAccelerationStructureKHR(m_device->handle(), &mix_geometry_types_as_create_info, nullptr, &as);
m_errorMonitor->VerifyFound();
}
+ // If geometryType is VK_GEOMETRY_TYPE_TRIANGLES_KHR, indexType must be
+ // VK_INDEX_TYPE_UINT16, VK_INDEX_TYPE_UINT32, or VK_INDEX_TYPE_NONE_KHR
+ {
+ VkAccelerationStructureCreateGeometryTypeInfoKHR invalid_index = geometryInfo;
+ invalid_index.geometryType = VK_GEOMETRY_TYPE_TRIANGLES_KHR;
+ invalid_index.indexType = VK_INDEX_TYPE_UINT8_EXT;
+ VkAccelerationStructureCreateInfoKHR invalid_index_geometry_types_as_create_info = as_create_info;
+ invalid_index_geometry_types_as_create_info.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR;
+ invalid_index_geometry_types_as_create_info.pGeometryInfos = &invalid_index;
+ invalid_index_geometry_types_as_create_info.maxGeometryCount = 1;
+ invalid_index_geometry_types_as_create_info.flags = 0;
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ "VUID-VkAccelerationStructureCreateGeometryTypeInfoKHR-geometryType-03502");
+ vkCreateAccelerationStructureKHR(m_device->handle(), &invalid_index_geometry_types_as_create_info, nullptr, &as);
+ m_errorMonitor->VerifyFound();
+ }
+
+ // flags must be a valid combination of VkBuildAccelerationStructureFlagBitsNV
+ {
+ VkAccelerationStructureCreateInfoKHR invalid_flag = as_create_info;
+ invalid_flag.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR;
+ invalid_flag.flags = VK_BUILD_ACCELERATION_STRUCTURE_FLAG_BITS_MAX_ENUM_KHR;
+ invalid_flag.pGeometryInfos = &geometryInfo;
+ invalid_flag.maxGeometryCount = 1;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ "VUID-VkAccelerationStructureCreateInfoKHR-flags-parameter");
+ vkCreateAccelerationStructureKHR(m_device->handle(), &invalid_flag, nullptr, &as);
+ m_errorMonitor->VerifyFound();
+ }
}
TEST_F(VkLayerTest, ValidateBindAccelerationStructureNV) {
@@ -5535,6 +6780,51 @@
}
}
+TEST_F(VkLayerTest, ValidateWriteDescriptorSetAccelerationStructureNV) {
+ TEST_DESCRIPTION("Validate acceleration structure descriptor writing.");
+ if (!InitFrameworkForRayTracingTest(this, false, m_instance_extension_names, m_device_extension_names, m_errorMonitor)) {
+ return;
+ }
+
+ OneOffDescriptorSet ds(m_device,
+ {
+ {0, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV, 1, VK_SHADER_STAGE_RAYGEN_BIT_NV, nullptr},
+ });
+
+ VkWriteDescriptorSet descriptor_write = {};
+ descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+ descriptor_write.dstSet = ds.set_;
+ descriptor_write.dstBinding = 0;
+ descriptor_write.descriptorCount = 1;
+ descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV;
+
+ VkAccelerationStructureNV badHandle = (VkAccelerationStructureNV)12345678;
+ VkWriteDescriptorSetAccelerationStructureKHR acc = {};
+ acc.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV;
+ acc.accelerationStructureCount = 1;
+ acc.pAccelerationStructures = &badHandle;
+ descriptor_write.pNext = &acc;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
+ "VUID-VkWriteDescriptorSetAccelerationStructureKHR-pAccelerationStructures-parameter");
+ vk::UpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
+ m_errorMonitor->VerifyFound();
+
+ VkAccelerationStructureCreateInfoNV top_level_as_create_info = {};
+ top_level_as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
+ top_level_as_create_info.info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
+ top_level_as_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV;
+ top_level_as_create_info.info.instanceCount = 1;
+ top_level_as_create_info.info.geometryCount = 0;
+
+ VkAccelerationStructureObj top_level_as(*m_device, top_level_as_create_info);
+
+ acc.pAccelerationStructures = &top_level_as.handle();
+ m_errorMonitor->ExpectSuccess();
+ vk::UpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
+ m_errorMonitor->VerifyNotFound();
+}
+
TEST_F(VkLayerTest, ValidateCmdBuildAccelerationStructureNV) {
TEST_DESCRIPTION("Validate acceleration structure building.");
if (!InitFrameworkForRayTracingTest(this, false, m_instance_extension_names, m_device_extension_names, m_errorMonitor)) {
@@ -5639,6 +6929,34 @@
vkCmdBuildAccelerationStructureNV(m_commandBuffer->handle(), &bot_level_as_create_info.info, VK_NULL_HANDLE, 0, VK_TRUE,
bot_level_as_updated.handle(), bot_level_as.handle(), bot_level_as_scratch.handle(), 0);
m_errorMonitor->VerifyFound();
+
+ // invalid scratch buff
+ VkBufferObj bot_level_as_invalid_scratch;
+ VkBufferCreateInfo create_info = {};
+ create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ // invalid usage
+ create_info.usage = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR;
+ bot_level_as.create_scratch_buffer(*m_device, &bot_level_as_invalid_scratch, &create_info);
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkAccelerationStructureInfoNV-scratch-02781");
+ vkCmdBuildAccelerationStructureNV(m_commandBuffer->handle(), &bot_level_as_create_info.info, VK_NULL_HANDLE, 0, VK_FALSE,
+ bot_level_as.handle(), VK_NULL_HANDLE, bot_level_as_invalid_scratch.handle(), 0);
+ m_errorMonitor->VerifyFound();
+
+ // invalid instance data.
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkAccelerationStructureInfoNV-instanceData-02782");
+ vkCmdBuildAccelerationStructureNV(m_commandBuffer->handle(), &bot_level_as_create_info.info,
+ bot_level_as_invalid_scratch.handle(), 0, VK_FALSE, bot_level_as.handle(), VK_NULL_HANDLE,
+ bot_level_as_scratch.handle(), 0);
+ m_errorMonitor->VerifyFound();
+
+ // must be called outside renderpass
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBuildAccelerationStructureNV-renderpass");
+ vkCmdBuildAccelerationStructureNV(m_commandBuffer->handle(), &bot_level_as_create_info.info, VK_NULL_HANDLE, 0, VK_FALSE,
+ bot_level_as.handle(), VK_NULL_HANDLE, bot_level_as_scratch.handle(), 0);
+ m_commandBuffer->EndRenderPass();
+ m_errorMonitor->VerifyFound();
}
TEST_F(VkLayerTest, ValidateGetAccelerationStructureHandleNV) {
@@ -5735,539 +7053,29 @@
"UNASSIGNED-CoreValidation-DrawState-InvalidCommandBuffer-VkAccelerationStructureNV");
vkCmdCopyAccelerationStructureNV(m_commandBuffer->handle(), dst_as_without_mem.handle(), src_as.handle(),
VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_NV);
- m_errorMonitor->VerifyFound();
-}
-
-TEST_F(VkLayerTest, GpuBuildAccelerationStructureValidationInvalidHandle) {
- TEST_DESCRIPTION(
- "Acceleration structure gpu validation should report an invalid handle when trying to build a top level "
- "acceleration structure with an invalid handle for a bottom level acceleration structure.");
-
- if (!InitFrameworkForRayTracingTest(this, false, m_instance_extension_names, m_device_extension_names, m_errorMonitor,
- /*need_gpu_validation=*/true)) {
- return;
- }
-
- PFN_vkCmdBuildAccelerationStructureNV vkCmdBuildAccelerationStructureNV =
- reinterpret_cast<PFN_vkCmdBuildAccelerationStructureNV>(
- vk::GetDeviceProcAddr(m_device->handle(), "vkCmdBuildAccelerationStructureNV"));
- assert(vkCmdBuildAccelerationStructureNV != nullptr);
-
- VkBufferObj vbo;
- VkBufferObj ibo;
- VkGeometryNV geometry;
- GetSimpleGeometryForAccelerationStructureTests(*m_device, &vbo, &ibo, &geometry);
-
- VkAccelerationStructureCreateInfoNV top_level_as_create_info = {};
- top_level_as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
- top_level_as_create_info.info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
- top_level_as_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV;
- top_level_as_create_info.info.instanceCount = 1;
- top_level_as_create_info.info.geometryCount = 0;
-
- VkCommandPoolObj command_pool(m_device, 0, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
-
- struct VkGeometryInstanceNV {
- float transform[12];
- uint32_t instanceCustomIndex : 24;
- uint32_t mask : 8;
- uint32_t instanceOffset : 24;
- uint32_t flags : 8;
- uint64_t accelerationStructureHandle;
- };
-
- VkGeometryInstanceNV instance = {
- {
- // clang-format off
- 1.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 1.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 1.0f, 0.0f,
- // clang-format on
- },
- 0,
- 0xFF,
- 0,
- VK_GEOMETRY_INSTANCE_TRIANGLE_CULL_DISABLE_BIT_NV,
- 1234567890, // invalid
- };
-
- VkDeviceSize instance_buffer_size = sizeof(VkGeometryInstanceNV);
- VkBufferObj instance_buffer;
- instance_buffer.init(*m_device, instance_buffer_size,
- VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
- VK_BUFFER_USAGE_RAY_TRACING_BIT_NV);
-
- uint8_t *mapped_instance_buffer_data = (uint8_t *)instance_buffer.memory().map();
- std::memcpy(mapped_instance_buffer_data, (uint8_t *)&instance, static_cast<std::size_t>(instance_buffer_size));
- instance_buffer.memory().unmap();
-
- VkAccelerationStructureObj top_level_as(*m_device, top_level_as_create_info);
- m_errorMonitor->VerifyNotFound();
-
- VkBufferObj top_level_as_scratch;
- top_level_as.create_scratch_buffer(*m_device, &top_level_as_scratch);
-
- VkCommandBufferObj command_buffer(m_device, &command_pool);
- command_buffer.begin();
- vkCmdBuildAccelerationStructureNV(command_buffer.handle(), &top_level_as_create_info.info, instance_buffer.handle(), 0,
- VK_FALSE, top_level_as.handle(), VK_NULL_HANDLE, top_level_as_scratch.handle(), 0);
- command_buffer.end();
-
- m_errorMonitor->SetDesiredFailureMsg(
- kErrorBit, "Attempted to build top level acceleration structure using invalid bottom level acceleration structure handle");
-
- VkSubmitInfo submit_info = {};
- submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
- submit_info.commandBufferCount = 1;
- submit_info.pCommandBuffers = &command_buffer.handle();
- vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
- vk::QueueWaitIdle(m_device->m_queue);
- m_errorMonitor->VerifyFound();
-}
-
-TEST_F(VkLayerTest, GpuBuildAccelerationStructureValidationBottomLevelNotYetBuilt) {
- TEST_DESCRIPTION(
- "Acceleration structure gpu validation should report an invalid handle when trying to build a top level "
- "acceleration structure with a handle for a bottom level acceleration structure that has not yet been built.");
-
- if (!InitFrameworkForRayTracingTest(this, false, m_instance_extension_names, m_device_extension_names, m_errorMonitor,
- /*need_gpu_validation=*/true)) {
- return;
- }
-
- PFN_vkCmdBuildAccelerationStructureNV vkCmdBuildAccelerationStructureNV =
- reinterpret_cast<PFN_vkCmdBuildAccelerationStructureNV>(
- vk::GetDeviceProcAddr(m_device->handle(), "vkCmdBuildAccelerationStructureNV"));
- assert(vkCmdBuildAccelerationStructureNV != nullptr);
-
- VkBufferObj vbo;
- VkBufferObj ibo;
- VkGeometryNV geometry;
- GetSimpleGeometryForAccelerationStructureTests(*m_device, &vbo, &ibo, &geometry);
-
- VkAccelerationStructureCreateInfoNV bot_level_as_create_info = {};
- bot_level_as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
- bot_level_as_create_info.info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
- bot_level_as_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV;
- bot_level_as_create_info.info.instanceCount = 0;
- bot_level_as_create_info.info.geometryCount = 1;
- bot_level_as_create_info.info.pGeometries = &geometry;
-
- VkAccelerationStructureCreateInfoNV top_level_as_create_info = {};
- top_level_as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
- top_level_as_create_info.info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
- top_level_as_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV;
- top_level_as_create_info.info.instanceCount = 1;
- top_level_as_create_info.info.geometryCount = 0;
-
- VkCommandPoolObj command_pool(m_device, 0, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
-
- struct VkGeometryInstanceNV {
- float transform[12];
- uint32_t instanceCustomIndex : 24;
- uint32_t mask : 8;
- uint32_t instanceOffset : 24;
- uint32_t flags : 8;
- uint64_t accelerationStructureHandle;
- };
-
- VkAccelerationStructureObj bot_level_as_never_built(*m_device, bot_level_as_create_info);
- m_errorMonitor->VerifyNotFound();
-
- VkGeometryInstanceNV instance = {
- {
- // clang-format off
- 1.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 1.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 1.0f, 0.0f,
- // clang-format on
- },
- 0,
- 0xFF,
- 0,
- VK_GEOMETRY_INSTANCE_TRIANGLE_CULL_DISABLE_BIT_NV,
- bot_level_as_never_built.opaque_handle(),
- };
-
- VkDeviceSize instance_buffer_size = sizeof(VkGeometryInstanceNV);
- VkBufferObj instance_buffer;
- instance_buffer.init(*m_device, instance_buffer_size,
- VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
- VK_BUFFER_USAGE_RAY_TRACING_BIT_NV);
-
- uint8_t *mapped_instance_buffer_data = (uint8_t *)instance_buffer.memory().map();
- std::memcpy(mapped_instance_buffer_data, (uint8_t *)&instance, static_cast<std::size_t>(instance_buffer_size));
- instance_buffer.memory().unmap();
-
- VkAccelerationStructureObj top_level_as(*m_device, top_level_as_create_info);
- m_errorMonitor->VerifyNotFound();
-
- VkBufferObj top_level_as_scratch;
- top_level_as.create_scratch_buffer(*m_device, &top_level_as_scratch);
-
- VkCommandBufferObj command_buffer(m_device, &command_pool);
- command_buffer.begin();
- vkCmdBuildAccelerationStructureNV(command_buffer.handle(), &top_level_as_create_info.info, instance_buffer.handle(), 0,
- VK_FALSE, top_level_as.handle(), VK_NULL_HANDLE, top_level_as_scratch.handle(), 0);
- command_buffer.end();
-
- m_errorMonitor->SetDesiredFailureMsg(
- kErrorBit, "Attempted to build top level acceleration structure using invalid bottom level acceleration structure handle");
-
- VkSubmitInfo submit_info = {};
- submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
- submit_info.commandBufferCount = 1;
- submit_info.pCommandBuffers = &command_buffer.handle();
- vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
- vk::QueueWaitIdle(m_device->m_queue);
- m_errorMonitor->VerifyFound();
-}
-
-TEST_F(VkLayerTest, GpuBuildAccelerationStructureValidationBottomLevelDestroyed) {
- TEST_DESCRIPTION(
- "Acceleration structure gpu validation should report an invalid handle when trying to build a top level "
- "acceleration structure with a handle for a destroyed bottom level acceleration structure.");
-
- if (!InitFrameworkForRayTracingTest(this, false, m_instance_extension_names, m_device_extension_names, m_errorMonitor,
- /*need_gpu_validation=*/true)) {
- return;
- }
-
- PFN_vkCmdBuildAccelerationStructureNV vkCmdBuildAccelerationStructureNV =
- reinterpret_cast<PFN_vkCmdBuildAccelerationStructureNV>(
- vk::GetDeviceProcAddr(m_device->handle(), "vkCmdBuildAccelerationStructureNV"));
- assert(vkCmdBuildAccelerationStructureNV != nullptr);
-
- VkBufferObj vbo;
- VkBufferObj ibo;
- VkGeometryNV geometry;
- GetSimpleGeometryForAccelerationStructureTests(*m_device, &vbo, &ibo, &geometry);
-
- VkAccelerationStructureCreateInfoNV bot_level_as_create_info = {};
- bot_level_as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
- bot_level_as_create_info.info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
- bot_level_as_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_NV;
- bot_level_as_create_info.info.instanceCount = 0;
- bot_level_as_create_info.info.geometryCount = 1;
- bot_level_as_create_info.info.pGeometries = &geometry;
-
- VkAccelerationStructureCreateInfoNV top_level_as_create_info = {};
- top_level_as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
- top_level_as_create_info.info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
- top_level_as_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV;
- top_level_as_create_info.info.instanceCount = 1;
- top_level_as_create_info.info.geometryCount = 0;
-
- VkCommandPoolObj command_pool(m_device, 0, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
-
- struct VkGeometryInstanceNV {
- float transform[12];
- uint32_t instanceCustomIndex : 24;
- uint32_t mask : 8;
- uint32_t instanceOffset : 24;
- uint32_t flags : 8;
- uint64_t accelerationStructureHandle;
- };
-
- uint64_t destroyed_bot_level_as_handle = 0;
- {
- VkAccelerationStructureObj destroyed_bot_level_as(*m_device, bot_level_as_create_info);
- m_errorMonitor->VerifyNotFound();
-
- destroyed_bot_level_as_handle = destroyed_bot_level_as.opaque_handle();
-
- VkBufferObj bot_level_as_scratch;
- destroyed_bot_level_as.create_scratch_buffer(*m_device, &bot_level_as_scratch);
-
- VkCommandBufferObj command_buffer(m_device, &command_pool);
- command_buffer.begin();
- vkCmdBuildAccelerationStructureNV(command_buffer.handle(), &bot_level_as_create_info.info, VK_NULL_HANDLE, 0, VK_FALSE,
- destroyed_bot_level_as.handle(), VK_NULL_HANDLE, bot_level_as_scratch.handle(), 0);
- command_buffer.end();
-
- VkSubmitInfo submit_info = {};
- submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
- submit_info.commandBufferCount = 1;
- submit_info.pCommandBuffers = &command_buffer.handle();
- vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
- vk::QueueWaitIdle(m_device->m_queue);
- m_errorMonitor->VerifyNotFound();
-
- // vk::DestroyAccelerationStructureNV called on destroyed_bot_level_as during destruction.
- }
-
- VkGeometryInstanceNV instance = {
- {
- // clang-format off
- 1.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 1.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 1.0f, 0.0f,
- // clang-format on
- },
- 0,
- 0xFF,
- 0,
- VK_GEOMETRY_INSTANCE_TRIANGLE_CULL_DISABLE_BIT_NV,
- destroyed_bot_level_as_handle,
- };
-
- VkDeviceSize instance_buffer_size = sizeof(VkGeometryInstanceNV);
- VkBufferObj instance_buffer;
- instance_buffer.init(*m_device, instance_buffer_size,
- VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
- VK_BUFFER_USAGE_RAY_TRACING_BIT_NV);
-
- uint8_t *mapped_instance_buffer_data = (uint8_t *)instance_buffer.memory().map();
- std::memcpy(mapped_instance_buffer_data, (uint8_t *)&instance, static_cast<std::size_t>(instance_buffer_size));
- instance_buffer.memory().unmap();
-
- VkAccelerationStructureObj top_level_as(*m_device, top_level_as_create_info);
- m_errorMonitor->VerifyNotFound();
-
- VkBufferObj top_level_as_scratch;
- top_level_as.create_scratch_buffer(*m_device, &top_level_as_scratch);
-
- VkCommandBufferObj command_buffer(m_device, &command_pool);
- command_buffer.begin();
- vkCmdBuildAccelerationStructureNV(command_buffer.handle(), &top_level_as_create_info.info, instance_buffer.handle(), 0,
- VK_FALSE, top_level_as.handle(), VK_NULL_HANDLE, top_level_as_scratch.handle(), 0);
- command_buffer.end();
-
- m_errorMonitor->SetDesiredFailureMsg(
- kErrorBit, "Attempted to build top level acceleration structure using invalid bottom level acceleration structure handle");
-
- VkSubmitInfo submit_info = {};
- submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
- submit_info.commandBufferCount = 1;
- submit_info.pCommandBuffers = &command_buffer.handle();
- vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
- vk::QueueWaitIdle(m_device->m_queue);
- m_errorMonitor->VerifyFound();
-}
-
-TEST_F(VkLayerTest, GpuBuildAccelerationStructureValidationRestoresState) {
- TEST_DESCRIPTION("Validate that acceleration structure gpu validation correctly restores compute state.");
-
- if (!InitFrameworkForRayTracingTest(this, false, m_instance_extension_names, m_device_extension_names, m_errorMonitor,
- /*need_gpu_validation=*/true, /*need_push_descriptors=*/true)) {
- return;
- }
-
- PFN_vkCmdBuildAccelerationStructureNV vkCmdBuildAccelerationStructureNV =
- reinterpret_cast<PFN_vkCmdBuildAccelerationStructureNV>(
- vk::GetDeviceProcAddr(m_device->handle(), "vkCmdBuildAccelerationStructureNV"));
- assert(vkCmdBuildAccelerationStructureNV != nullptr);
-
- PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
- (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdPushDescriptorSetKHR");
- assert(vkCmdPushDescriptorSetKHR != nullptr);
-
- VkBufferObj vbo;
- VkBufferObj ibo;
- VkGeometryNV geometry;
- GetSimpleGeometryForAccelerationStructureTests(*m_device, &vbo, &ibo, &geometry);
-
- VkAccelerationStructureCreateInfoNV top_level_as_create_info = {};
- top_level_as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV;
- top_level_as_create_info.info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV;
- top_level_as_create_info.info.type = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_NV;
- top_level_as_create_info.info.instanceCount = 1;
- top_level_as_create_info.info.geometryCount = 0;
-
- VkCommandPoolObj command_pool(m_device, 0, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
-
- struct VkGeometryInstanceNV {
- float transform[12];
- uint32_t instanceCustomIndex : 24;
- uint32_t mask : 8;
- uint32_t instanceOffset : 24;
- uint32_t flags : 8;
- uint64_t accelerationStructureHandle;
- };
-
- VkGeometryInstanceNV instance = {
- {
- // clang-format off
- 1.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 1.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 1.0f, 0.0f,
- // clang-format on
- },
- 0,
- 0xFF,
- 0,
- VK_GEOMETRY_INSTANCE_TRIANGLE_CULL_DISABLE_BIT_NV,
- 1234567,
- };
-
- VkDeviceSize instance_buffer_size = sizeof(VkGeometryInstanceNV);
- VkBufferObj instance_buffer;
- instance_buffer.init(*m_device, instance_buffer_size,
- VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
- VK_BUFFER_USAGE_RAY_TRACING_BIT_NV);
-
- uint8_t *mapped_instance_buffer_data = (uint8_t *)instance_buffer.memory().map();
- std::memcpy(mapped_instance_buffer_data, (uint8_t *)&instance, static_cast<std::size_t>(instance_buffer_size));
- instance_buffer.memory().unmap();
-
- VkAccelerationStructureObj top_level_as(*m_device, top_level_as_create_info);
- m_errorMonitor->VerifyNotFound();
-
- VkBufferObj top_level_as_scratch;
- top_level_as.create_scratch_buffer(*m_device, &top_level_as_scratch);
-
- struct ComputeOutput {
- uint32_t push_constant_value;
- uint32_t push_descriptor_value;
- uint32_t normal_descriptor_value;
- };
-
- VkBufferObj push_descriptor_buffer;
- push_descriptor_buffer.init(*m_device, 4, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
- VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
-
- VkBufferObj normal_descriptor_buffer;
- normal_descriptor_buffer.init(*m_device, 4, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
- VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
-
- VkDeviceSize output_descriptor_buffer_size = static_cast<VkDeviceSize>(sizeof(ComputeOutput));
- VkBufferObj output_descriptor_buffer;
- output_descriptor_buffer.init(*m_device, output_descriptor_buffer_size,
- VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
- VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
-
- const std::string cs_source = R"glsl(#version 450
- layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
-
- layout(push_constant) uniform PushConstants { uint value; } push_constant;
- layout(set = 0, binding = 0, std430) buffer PushDescriptorBuffer { uint value; } push_descriptor;
- layout(set = 1, binding = 0, std430) buffer NormalDescriptorBuffer { uint value; } normal_descriptor;
-
- layout(set = 2, binding = 0, std430) buffer ComputeOutputBuffer {
- uint push_constant_value;
- uint push_descriptor_value;
- uint normal_descriptor_value;
- } compute_output;
-
- void main() {
- compute_output.push_constant_value = push_constant.value;
- compute_output.push_descriptor_value = push_descriptor.value;
- compute_output.normal_descriptor_value = normal_descriptor.value;
- }
- )glsl";
- VkShaderObj cs(m_device, cs_source.c_str(), VK_SHADER_STAGE_COMPUTE_BIT, this);
-
- OneOffDescriptorSet push_descriptor_set(m_device,
- {
- {0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
- },
- VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
- OneOffDescriptorSet normal_descriptor_set(m_device,
- {
- {0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
- });
- OneOffDescriptorSet output_descriptor_set(m_device,
- {
- {0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
- });
-
- VkPushConstantRange push_constant_range = {};
- push_constant_range.stageFlags = VK_SHADER_STAGE_COMPUTE_BIT;
- push_constant_range.size = 4;
- push_constant_range.offset = 0;
-
- const VkPipelineLayoutObj compute_pipeline_layout(m_device,
- {
- &push_descriptor_set.layout_,
- &normal_descriptor_set.layout_,
- &output_descriptor_set.layout_,
- },
- {push_constant_range});
-
- VkComputePipelineCreateInfo compute_pipeline_ci = {};
- compute_pipeline_ci.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO;
- compute_pipeline_ci.layout = compute_pipeline_layout.handle();
- compute_pipeline_ci.stage = cs.GetStageCreateInfo();
-
- VkPipeline compute_pipeline;
- ASSERT_VK_SUCCESS(
- vk::CreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &compute_pipeline_ci, nullptr, &compute_pipeline));
-
- normal_descriptor_set.WriteDescriptorBufferInfo(0, normal_descriptor_buffer.handle(), 4, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
- normal_descriptor_set.UpdateDescriptorSets();
-
- output_descriptor_set.WriteDescriptorBufferInfo(0, output_descriptor_buffer.handle(), output_descriptor_buffer_size,
- VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
- output_descriptor_set.UpdateDescriptorSets();
-
- // Set input data
- const uint32_t push_constant_value = 1234567890;
- const uint32_t push_descriptor_value = 98765432;
- const uint32_t normal_descriptor_value = 1111111;
-
- uint32_t *mapped_push_descriptor_buffer_data = (uint32_t *)push_descriptor_buffer.memory().map();
- *mapped_push_descriptor_buffer_data = push_descriptor_value;
- push_descriptor_buffer.memory().unmap();
-
- uint32_t *mapped_normal_descriptor_buffer_data = (uint32_t *)normal_descriptor_buffer.memory().map();
- *mapped_normal_descriptor_buffer_data = normal_descriptor_value;
- normal_descriptor_buffer.memory().unmap();
-
- ComputeOutput *mapped_output_buffer_data = (ComputeOutput *)output_descriptor_buffer.memory().map();
- mapped_output_buffer_data->push_constant_value = 0;
- mapped_output_buffer_data->push_descriptor_value = 0;
- mapped_output_buffer_data->normal_descriptor_value = 0;
- output_descriptor_buffer.memory().unmap();
-
- VkDescriptorBufferInfo push_descriptor_buffer_info = {};
- push_descriptor_buffer_info.buffer = push_descriptor_buffer.handle();
- push_descriptor_buffer_info.offset = 0;
- push_descriptor_buffer_info.range = 4;
- VkWriteDescriptorSet push_descriptor_set_write = {};
- push_descriptor_set_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
- push_descriptor_set_write.descriptorCount = 1;
- push_descriptor_set_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
- push_descriptor_set_write.dstBinding = 0;
- push_descriptor_set_write.pBufferInfo = &push_descriptor_buffer_info;
-
- VkCommandBufferObj command_buffer(m_device, &command_pool);
- command_buffer.begin();
- vk::CmdBindPipeline(command_buffer.handle(), VK_PIPELINE_BIND_POINT_COMPUTE, compute_pipeline);
- vk::CmdPushConstants(command_buffer.handle(), compute_pipeline_layout.handle(), VK_SHADER_STAGE_COMPUTE_BIT, 0, 4,
- &push_constant_value);
- vkCmdPushDescriptorSetKHR(command_buffer.handle(), VK_PIPELINE_BIND_POINT_COMPUTE, compute_pipeline_layout.handle(), 0, 1,
- &push_descriptor_set_write);
- vk::CmdBindDescriptorSets(command_buffer.handle(), VK_PIPELINE_BIND_POINT_COMPUTE, compute_pipeline_layout.handle(), 1, 1,
- &normal_descriptor_set.set_, 0, nullptr);
- vk::CmdBindDescriptorSets(command_buffer.handle(), VK_PIPELINE_BIND_POINT_COMPUTE, compute_pipeline_layout.handle(), 2, 1,
- &output_descriptor_set.set_, 0, nullptr);
-
- vkCmdBuildAccelerationStructureNV(command_buffer.handle(), &top_level_as_create_info.info, instance_buffer.handle(), 0,
- VK_FALSE, top_level_as.handle(), VK_NULL_HANDLE, top_level_as_scratch.handle(), 0);
-
- vk::CmdDispatch(command_buffer.handle(), 1, 1, 1);
- command_buffer.end();
-
- m_errorMonitor->SetDesiredFailureMsg(
- kErrorBit, "Attempted to build top level acceleration structure using invalid bottom level acceleration structure handle");
-
- VkSubmitInfo submit_info = {};
- submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
- submit_info.commandBufferCount = 1;
- submit_info.pCommandBuffers = &command_buffer.handle();
- vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
- vk::QueueWaitIdle(m_device->m_queue);
m_errorMonitor->VerifyFound();
- mapped_output_buffer_data = (ComputeOutput *)output_descriptor_buffer.memory().map();
- EXPECT_EQ(mapped_output_buffer_data->push_constant_value, push_constant_value);
- EXPECT_EQ(mapped_output_buffer_data->push_descriptor_value, push_descriptor_value);
- EXPECT_EQ(mapped_output_buffer_data->normal_descriptor_value, normal_descriptor_value);
- output_descriptor_buffer.memory().unmap();
+ // mode must be VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR or VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyAccelerationStructureNV-mode-03410");
+ vkCmdCopyAccelerationStructureNV(m_commandBuffer->handle(), dst_as.handle(), src_as.handle(),
+ VK_COPY_ACCELERATION_STRUCTURE_MODE_DESERIALIZE_KHR);
+ m_errorMonitor->VerifyFound();
- // Clean up
- vk::DestroyPipeline(m_device->device(), compute_pipeline, nullptr);
+ // mode must be a valid VkCopyAccelerationStructureModeKHR value
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyAccelerationStructureNV-mode-parameter");
+ vkCmdCopyAccelerationStructureNV(m_commandBuffer->handle(), dst_as.handle(), src_as.handle(),
+ VK_COPY_ACCELERATION_STRUCTURE_MODE_MAX_ENUM_KHR);
+ m_errorMonitor->VerifyFound();
+
+ // This command must only be called outside of a render pass instance
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+ m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyAccelerationStructureNV-renderpass");
+ vkCmdCopyAccelerationStructureNV(m_commandBuffer->handle(), dst_as.handle(), src_as.handle(),
+ VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_NV);
+ m_commandBuffer->EndRenderPass();
+ m_errorMonitor->VerifyFound();
}
TEST_F(VkLayerTest, QueryPerformanceCreation) {
@@ -6842,6 +7650,27 @@
}
{
+ m_commandBuffer->reset();
+ m_commandBuffer->begin();
+ vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
+ m_commandBuffer->end();
+
+ VkSubmitInfo submit_info;
+ submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ submit_info.pNext = NULL;
+ submit_info.waitSemaphoreCount = 0;
+ submit_info.pWaitSemaphores = NULL;
+ submit_info.pWaitDstStageMask = NULL;
+ submit_info.commandBufferCount = 1;
+ submit_info.pCommandBuffers = &m_commandBuffer->handle();
+ submit_info.signalSemaphoreCount = 0;
+ submit_info.pSignalSemaphores = NULL;
+
+ vk::QueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
+ vk::QueueWaitIdle(queue);
+ }
+
+ {
VkBufferCreateInfo buf_info = {};
buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
@@ -6862,6 +7691,7 @@
ASSERT_VK_SUCCESS(err);
vk::BindBufferMemory(device(), buffer, mem, 0);
+ m_commandBuffer->reset();
m_commandBuffer->begin();
vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
@@ -7062,7 +7892,7 @@
command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
- fpvkResetQueryPoolEXT(m_device->device(), query_pool, 0, 0);
+ fpvkResetQueryPoolEXT(m_device->device(), query_pool, 0, 1);
m_commandBuffer->begin(&command_buffer_begin_info);
vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
@@ -7174,6 +8004,200 @@
vk::DestroyQueryPool(m_device->device(), query_pool, NULL);
}
+TEST_F(VkLayerTest, QueryPerformanceResetAndBegin) {
+ TEST_DESCRIPTION("Verify that we get an error if we reset & begin a performance query within the same primary command buffer.");
+
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME);
+ } else {
+ printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_KHR_PERFORMANCE_QUERY_EXTENSION_NAME);
+ return;
+ }
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME);
+ } else {
+ printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME);
+ return;
+ }
+
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+ VkPhysicalDeviceFeatures2KHR features2 = {};
+ auto hostQueryResetFeatures = lvl_init_struct<VkPhysicalDeviceHostQueryResetFeaturesEXT>();
+ auto performanceFeatures = lvl_init_struct<VkPhysicalDevicePerformanceQueryFeaturesKHR>(&hostQueryResetFeatures);
+ features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&performanceFeatures);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+ if (!performanceFeatures.performanceCounterQueryPools) {
+ printf("%s Performance query pools are not supported.\n", kSkipPrefix);
+ return;
+ }
+ if (!hostQueryResetFeatures.hostQueryReset) {
+ printf("%s Missing host query reset.\n", kSkipPrefix);
+ return;
+ }
+
+ VkCommandPoolCreateFlags pool_flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &performanceFeatures, pool_flags));
+ PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR
+ vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR =
+ (PFN_vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR)vk::GetInstanceProcAddr(
+ instance(), "vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR");
+ ASSERT_TRUE(vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR != nullptr);
+
+ PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR =
+ (PFN_vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR)vk::GetInstanceProcAddr(
+ instance(), "vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR != nullptr);
+
+ auto queueFamilyProperties = m_device->phy().queue_properties();
+ uint32_t queueFamilyIndex = queueFamilyProperties.size();
+ std::vector<VkPerformanceCounterKHR> counters;
+ std::vector<uint32_t> counterIndices;
+ uint32_t nPasses = 0;
+
+ // Find a single counter with VK_QUERY_SCOPE_RENDER_PASS_KHR scope.
+ for (uint32_t idx = 0; idx < queueFamilyProperties.size(); idx++) {
+ uint32_t nCounters;
+
+ vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(gpu(), idx, &nCounters, nullptr, nullptr);
+ if (nCounters == 0) continue;
+
+ counters.resize(nCounters);
+ for (auto &c : counters) {
+ c.sType = VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_KHR;
+ c.pNext = nullptr;
+ }
+ vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR(gpu(), idx, &nCounters, &counters[0], nullptr);
+ queueFamilyIndex = idx;
+
+ for (uint32_t counterIdx = 0; counterIdx < counters.size(); counterIdx++) counterIndices.push_back(counterIdx);
+
+ VkQueryPoolPerformanceCreateInfoKHR create_info{};
+ create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR;
+ create_info.queueFamilyIndex = idx;
+ create_info.counterIndexCount = counterIndices.size();
+ create_info.pCounterIndices = &counterIndices[0];
+
+ vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(gpu(), &create_info, &nPasses);
+
+ if (nPasses < 2) {
+ counters.clear();
+ continue;
+ }
+ break;
+ }
+
+ if (counterIndices.empty()) {
+ printf("%s No queue reported a set of counters that needs more than one pass.\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ VkQueryPoolPerformanceCreateInfoKHR perf_query_pool_ci{};
+ perf_query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR;
+ perf_query_pool_ci.queueFamilyIndex = queueFamilyIndex;
+ perf_query_pool_ci.counterIndexCount = counterIndices.size();
+ perf_query_pool_ci.pCounterIndices = &counterIndices[0];
+ VkQueryPoolCreateInfo query_pool_ci{};
+ query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
+ query_pool_ci.pNext = &perf_query_pool_ci;
+ query_pool_ci.queryType = VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR;
+ query_pool_ci.queryCount = 1;
+
+ VkQueryPool query_pool;
+ vk::CreateQueryPool(device(), &query_pool_ci, nullptr, &query_pool);
+
+ VkQueue queue = VK_NULL_HANDLE;
+ vk::GetDeviceQueue(device(), queueFamilyIndex, 0, &queue);
+
+ PFN_vkAcquireProfilingLockKHR vkAcquireProfilingLockKHR =
+ (PFN_vkAcquireProfilingLockKHR)vk::GetInstanceProcAddr(instance(), "vkAcquireProfilingLockKHR");
+ ASSERT_TRUE(vkAcquireProfilingLockKHR != nullptr);
+ PFN_vkReleaseProfilingLockKHR vkReleaseProfilingLockKHR =
+ (PFN_vkReleaseProfilingLockKHR)vk::GetInstanceProcAddr(instance(), "vkReleaseProfilingLockKHR");
+ ASSERT_TRUE(vkReleaseProfilingLockKHR != nullptr);
+
+ {
+ VkAcquireProfilingLockInfoKHR lock_info{};
+ lock_info.sType = VK_STRUCTURE_TYPE_ACQUIRE_PROFILING_LOCK_INFO_KHR;
+ VkResult result = vkAcquireProfilingLockKHR(device(), &lock_info);
+ ASSERT_TRUE(result == VK_SUCCESS);
+ }
+
+ {
+ VkBufferCreateInfo buf_info = {};
+ buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+ buf_info.size = 4096;
+ buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ VkBuffer buffer;
+ VkResult err = vk::CreateBuffer(device(), &buf_info, NULL, &buffer);
+ ASSERT_VK_SUCCESS(err);
+
+ VkMemoryRequirements mem_reqs;
+ vk::GetBufferMemoryRequirements(device(), buffer, &mem_reqs);
+
+ VkMemoryAllocateInfo alloc_info = {};
+ alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ alloc_info.allocationSize = 4096;
+ VkDeviceMemory mem;
+ err = vk::AllocateMemory(device(), &alloc_info, NULL, &mem);
+ ASSERT_VK_SUCCESS(err);
+ vk::BindBufferMemory(device(), buffer, mem, 0);
+
+ VkCommandBufferBeginInfo command_buffer_begin_info{};
+ command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
+ command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
+
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdBeginQuery-None-02863");
+
+ m_commandBuffer->reset();
+ m_commandBuffer->begin(&command_buffer_begin_info);
+ vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
+ vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
+ vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
+ m_commandBuffer->end();
+
+ {
+ VkPerformanceQuerySubmitInfoKHR perf_submit_info{};
+ perf_submit_info.sType = VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR;
+ perf_submit_info.counterPassIndex = nPasses - 1;
+ VkSubmitInfo submit_info{};
+ submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ submit_info.pNext = &perf_submit_info;
+ submit_info.waitSemaphoreCount = 0;
+ submit_info.pWaitSemaphores = NULL;
+ submit_info.pWaitDstStageMask = NULL;
+ submit_info.commandBufferCount = 1;
+ submit_info.pCommandBuffers = &m_commandBuffer->handle();
+ submit_info.signalSemaphoreCount = 0;
+ submit_info.pSignalSemaphores = NULL;
+
+ vk::QueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
+ }
+
+ vk::QueueWaitIdle(queue);
+ m_errorMonitor->VerifyFound();
+
+ vk::DestroyBuffer(device(), buffer, nullptr);
+ vk::FreeMemory(device(), mem, NULL);
+ }
+
+ vkReleaseProfilingLockKHR(device());
+
+ vk::DestroyQueryPool(m_device->device(), query_pool, NULL);
+}
+
TEST_F(VkLayerTest, QueueSubmitNoTimelineSemaphoreInfo) {
TEST_DESCRIPTION("Submit a queue with a timeline semaphore but not a VkTimelineSemaphoreSubmitInfoKHR.");
@@ -7193,19 +8217,11 @@
return;
}
- PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
- (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
- ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
- auto timelinefeatures = lvl_init_struct<VkPhysicalDeviceTimelineSemaphoreFeaturesKHR>();
- auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&timelinefeatures);
- vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
- if (!timelinefeatures.timelineSemaphore) {
- printf("%s Timeline semaphores are not supported.\n", kSkipPrefix);
+ if (!CheckTimelineSemaphoreSupportAndInitState(this)) {
+ printf("%s Timeline semaphore not supported, skipping test\n", kSkipPrefix);
return;
}
- ASSERT_NO_FATAL_FAILURE(InitState());
-
VkSemaphoreTypeCreateInfoKHR semaphore_type_create_info{};
semaphore_type_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR;
semaphore_type_create_info.semaphoreType = VK_SEMAPHORE_TYPE_TIMELINE_KHR;
@@ -7268,14 +8284,8 @@
return;
}
- PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
- (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
- ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
- auto timelinefeatures = lvl_init_struct<VkPhysicalDeviceTimelineSemaphoreFeaturesKHR>();
- auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&timelinefeatures);
- vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
- if (!timelinefeatures.timelineSemaphore) {
- printf("%s Timeline semaphores are not supported.\n", kSkipPrefix);
+ if (!CheckTimelineSemaphoreSupportAndInitState(this)) {
+ printf("%s Timeline semaphore not supported, skipping test\n", kSkipPrefix);
return;
}
@@ -7286,8 +8296,6 @@
auto prop2 = lvl_init_struct<VkPhysicalDeviceProperties2KHR>(&timelineproperties);
vkGetPhysicalDeviceProperties2KHR(gpu(), &prop2);
- ASSERT_NO_FATAL_FAILURE(InitState());
-
VkSemaphoreTypeCreateInfoKHR semaphore_type_create_info{};
semaphore_type_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR;
semaphore_type_create_info.semaphoreType = VK_SEMAPHORE_TYPE_TIMELINE_KHR;
@@ -7465,19 +8473,11 @@
return;
}
- PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
- (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
- ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
- auto timelinefeatures = lvl_init_struct<VkPhysicalDeviceTimelineSemaphoreFeaturesKHR>();
- auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&timelinefeatures);
- vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
- if (!timelinefeatures.timelineSemaphore) {
- printf("%s Timeline semaphores are not supported.\n", kSkipPrefix);
+ if (!CheckTimelineSemaphoreSupportAndInitState(this)) {
+ printf("%s Timeline semaphore not supported, skipping test\n", kSkipPrefix);
return;
}
- ASSERT_NO_FATAL_FAILURE(InitState());
-
// We need two queues for this
uint32_t queue_count;
vk::GetPhysicalDeviceQueueFamilyProperties(gpu(), &queue_count, NULL);
@@ -7519,6 +8519,11 @@
dev_info.enabledExtensionCount = m_device_extension_names.size();
dev_info.ppEnabledExtensionNames = m_device_extension_names.data();
+ auto timeline_semaphore_features = lvl_init_struct<VkPhysicalDeviceTimelineSemaphoreFeatures>();
+ timeline_semaphore_features.timelineSemaphore = true;
+ auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&timeline_semaphore_features);
+ dev_info.pNext = &features2;
+
VkDevice dev;
ASSERT_VK_SUCCESS(vk::CreateDevice(gpu(), &dev_info, nullptr, &dev));
@@ -7565,6 +8570,7 @@
vk::DeviceWaitIdle(dev);
vk::DestroySemaphore(dev, semaphore, nullptr);
+ vk::DestroyDevice(dev, nullptr);
}
TEST_F(VkLayerTest, InvalidExternalSemaphore) {
@@ -7640,19 +8646,11 @@
return;
}
- PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
- (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
- ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
- auto timelinefeatures = lvl_init_struct<VkPhysicalDeviceTimelineSemaphoreFeaturesKHR>();
- auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&timelinefeatures);
- vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
- if (!timelinefeatures.timelineSemaphore) {
- printf("%s Timeline semaphores are not supported.\n", kSkipPrefix);
+ if (!CheckTimelineSemaphoreSupportAndInitState(this)) {
+ printf("%s Timeline semaphore not supported, skipping test\n", kSkipPrefix);
return;
}
- ASSERT_NO_FATAL_FAILURE(InitState());
-
VkSemaphoreTypeCreateInfoKHR semaphore_type_create_info{};
semaphore_type_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR;
semaphore_type_create_info.semaphoreType = VK_SEMAPHORE_TYPE_TIMELINE_KHR;
@@ -7753,14 +8751,8 @@
return;
}
- PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
- (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
- ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
- auto timelinefeatures = lvl_init_struct<VkPhysicalDeviceTimelineSemaphoreFeaturesKHR>();
- auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&timelinefeatures);
- vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
- if (!timelinefeatures.timelineSemaphore) {
- printf("%s Timeline semaphores are not supported.\n", kSkipPrefix);
+ if (!CheckTimelineSemaphoreSupportAndInitState(this)) {
+ printf("%s Timeline semaphore not supported, skipping test\n", kSkipPrefix);
return;
}
@@ -7771,8 +8763,6 @@
auto prop2 = lvl_init_struct<VkPhysicalDeviceProperties2KHR>(&timelineproperties);
vkGetPhysicalDeviceProperties2KHR(gpu(), &prop2);
- ASSERT_NO_FATAL_FAILURE(InitState());
-
VkSemaphoreTypeCreateInfoKHR semaphore_type_create_info{};
semaphore_type_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR;
semaphore_type_create_info.semaphoreType = VK_SEMAPHORE_TYPE_TIMELINE_KHR;
@@ -7830,7 +8820,7 @@
semaphore_signal_info.semaphore = semaphore[1];
ASSERT_VK_SUCCESS(vkSignalSemaphoreKHR(m_device->device(), &semaphore_signal_info));
- // Check if we can test violations of maxTimmelineSemaphoreValueDifference
+ // Check if we can test violations of maxTimelineSemaphoreValueDifference
if (timelineproperties.maxTimelineSemaphoreValueDifference < UINT64_MAX) {
VkSemaphore sem;
@@ -7848,6 +8838,48 @@
ASSERT_VK_SUCCESS(vkSignalSemaphoreKHR(m_device->device(), &semaphore_signal_info));
vk::DestroySemaphore(m_device->device(), sem, nullptr);
+
+ // Regression test for value difference validations ran against binary semaphores
+ {
+ VkSemaphore timeline_sem;
+ VkSemaphore binary_sem;
+
+ semaphore_type_create_info.initialValue = 0;
+ ASSERT_VK_SUCCESS(vk::CreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &timeline_sem));
+
+ VkSemaphoreCreateInfo binary_semaphore_create_info{};
+ binary_semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
+
+ ASSERT_VK_SUCCESS(vk::CreateSemaphore(m_device->device(), &binary_semaphore_create_info, nullptr, &binary_sem));
+
+ signalValue = 1;
+ uint64_t offendingValue = timelineproperties.maxTimelineSemaphoreValueDifference + 1;
+
+ submit_info.waitSemaphoreCount = 1;
+ submit_info.pWaitSemaphores = &timeline_sem;
+ submit_info.signalSemaphoreCount = 1;
+ submit_info.pSignalSemaphores = &binary_sem;
+
+ timeline_semaphore_submit_info.waitSemaphoreValueCount = 1;
+ timeline_semaphore_submit_info.pWaitSemaphoreValues = &signalValue;
+
+ // These two assignments are not required by the spec, but would segfault on older versions of validation layers
+ timeline_semaphore_submit_info.signalSemaphoreValueCount = 1;
+ timeline_semaphore_submit_info.pSignalSemaphoreValues = &offendingValue;
+
+ m_errorMonitor->ExpectSuccess();
+
+ vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
+
+ semaphore_signal_info.semaphore = timeline_sem;
+ semaphore_signal_info.value = 1;
+ vkSignalSemaphoreKHR(m_device->device(), &semaphore_signal_info);
+
+ m_errorMonitor->VerifyNotFound();
+
+ vk::DestroySemaphore(m_device->device(), binary_sem, nullptr);
+ vk::DestroySemaphore(m_device->device(), timeline_sem, nullptr);
+ }
}
ASSERT_VK_SUCCESS(vk::QueueWaitIdle(m_device->m_queue));
@@ -7903,3 +8935,1555 @@
vk::DestroySemaphore(m_device->device(), semaphore, nullptr);
}
+
+TEST_F(VkLayerTest, ImageDrmFormatModifer) {
+ TEST_DESCRIPTION("General testing of VK_EXT_image_drm_format_modifier");
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ if (IsPlatform(kMockICD)) {
+ printf("%s Test not supported by MockICD, skipping tests\n", kSkipPrefix);
+ return;
+ }
+
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME);
+ } else {
+ printf("%s Extension %s not supported by device; skipped.\n", kSkipPrefix, VK_EXT_IMAGE_DRM_FORMAT_MODIFIER_EXTENSION_NAME);
+ return;
+ }
+
+ PFN_vkGetImageDrmFormatModifierPropertiesEXT vkGetImageDrmFormatModifierPropertiesEXT =
+ (PFN_vkGetImageDrmFormatModifierPropertiesEXT)vk::GetInstanceProcAddr(instance(),
+ "vkGetImageDrmFormatModifierPropertiesEXT");
+ ASSERT_TRUE(vkGetImageDrmFormatModifierPropertiesEXT != nullptr);
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ const uint64_t dummy_modifiers[2] = {0, 1};
+
+ VkImageCreateInfo image_info = {};
+ image_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_info.pNext = nullptr;
+ image_info.imageType = VK_IMAGE_TYPE_2D;
+ image_info.arrayLayers = 1;
+ image_info.extent = {64, 64, 1};
+ image_info.format = VK_FORMAT_R8G8B8A8_UNORM;
+ image_info.mipLevels = 1;
+ image_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ image_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_info.tiling = VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT;
+ image_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
+
+ VkImageFormatProperties2 image_format_prop = {};
+ image_format_prop.sType = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2;
+ VkPhysicalDeviceImageFormatInfo2 image_format_info = {};
+ image_format_info.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2;
+ image_format_info.format = image_info.format;
+ image_format_info.tiling = image_info.tiling;
+ image_format_info.type = image_info.imageType;
+ image_format_info.usage = image_info.usage;
+ VkPhysicalDeviceImageDrmFormatModifierInfoEXT drm_format_mod_info = {};
+ drm_format_mod_info.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT;
+ drm_format_mod_info.pNext = nullptr;
+ drm_format_mod_info.drmFormatModifier = dummy_modifiers[0];
+ drm_format_mod_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ drm_format_mod_info.queueFamilyIndexCount = 0;
+ image_format_info.pNext = (void *)&drm_format_mod_info;
+ vk::GetPhysicalDeviceImageFormatProperties2(m_device->phy().handle(), &image_format_info, &image_format_prop);
+
+ VkSubresourceLayout dummyPlaneLayout = {0, 0, 0, 0, 0};
+
+ VkImageDrmFormatModifierListCreateInfoEXT drm_format_mod_list = {};
+ drm_format_mod_list.sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT;
+ drm_format_mod_list.pNext = nullptr;
+ drm_format_mod_list.drmFormatModifierCount = 2;
+ drm_format_mod_list.pDrmFormatModifiers = dummy_modifiers;
+
+ VkImageDrmFormatModifierExplicitCreateInfoEXT drm_format_mod_explicit = {};
+ drm_format_mod_explicit.sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT;
+ drm_format_mod_explicit.pNext = nullptr;
+ drm_format_mod_explicit.drmFormatModifierPlaneCount = 1;
+ drm_format_mod_explicit.pPlaneLayouts = &dummyPlaneLayout;
+
+ VkImage image = VK_NULL_HANDLE;
+
+ // No pNext
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCreateInfo-tiling-02261");
+ vk::CreateImage(device(), &image_info, nullptr, &image);
+ m_errorMonitor->VerifyFound();
+
+ // Postive check if only 1
+ image_info.pNext = (void *)&drm_format_mod_list;
+ m_errorMonitor->ExpectSuccess();
+ vk::CreateImage(device(), &image_info, nullptr, &image);
+ vk::DestroyImage(device(), image, nullptr);
+ m_errorMonitor->VerifyNotFound();
+
+ image_info.pNext = (void *)&drm_format_mod_explicit;
+ m_errorMonitor->ExpectSuccess();
+ vk::CreateImage(device(), &image_info, nullptr, &image);
+ vk::DestroyImage(device(), image, nullptr);
+ m_errorMonitor->VerifyNotFound();
+
+ // Having both in pNext
+ drm_format_mod_explicit.pNext = (void *)&drm_format_mod_list;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCreateInfo-tiling-02261");
+ vk::CreateImage(device(), &image_info, nullptr, &image);
+ m_errorMonitor->VerifyFound();
+
+ // Only 1 pNext but wrong tiling
+ image_info.pNext = (void *)&drm_format_mod_list;
+ image_info.tiling = VK_IMAGE_TILING_LINEAR;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCreateInfo-pNext-02262");
+ vk::CreateImage(device(), &image_info, nullptr, &image);
+ m_errorMonitor->VerifyFound();
+}
+
+TEST_F(VkLayerTest, ValidateNVDeviceDiagnosticCheckpoints) {
+ TEST_DESCRIPTION("General testing of VK_NV_device_diagnostic_checkpoints");
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_EXTENSION_NAME);
+ } else {
+ printf("%s Extension %s not supported by device; skipped.\n", kSkipPrefix,
+ VK_NV_DEVICE_DIAGNOSTIC_CHECKPOINTS_EXTENSION_NAME);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ auto vkGetQueueCheckpointDataNV =
+ (PFN_vkGetQueueCheckpointDataNV)vk::GetDeviceProcAddr(m_device->device(), "vkGetQueueCheckpointDataNV");
+
+ auto vkCmdSetCheckpointNV = (PFN_vkCmdSetCheckpointNV)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetCheckpointNV");
+
+ ASSERT_TRUE(vkGetQueueCheckpointDataNV != nullptr);
+ ASSERT_TRUE(vkCmdSetCheckpointNV != nullptr);
+
+ uint32_t data = 100;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetCheckpointNV-commandBuffer-recording");
+ vkCmdSetCheckpointNV(m_commandBuffer->handle(), &data);
+ m_errorMonitor->VerifyFound();
+}
+
+TEST_F(VkLayerTest, InvalidGetDeviceQueue) {
+ TEST_DESCRIPTION("General testing of vkGetDeviceQueue and general Device creation cases");
+
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s Did not find VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME; skipped.\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+
+ VkDevice test_device;
+ VkQueue test_queue;
+ VkResult result;
+
+ // Use the first Physical device and queue family
+ // Makes test more portable as every driver has at least 1 queue with a queueCount of 1
+ uint32_t queue_family_count = 1;
+ uint32_t queue_family_index = 0;
+ VkQueueFamilyProperties queue_properties;
+ vk::GetPhysicalDeviceQueueFamilyProperties(gpu(), &queue_family_count, &queue_properties);
+
+ float queue_priority = 1.0;
+ VkDeviceQueueCreateInfo queue_create_info = {};
+ queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
+ queue_create_info.flags = VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT;
+ queue_create_info.pNext = nullptr;
+ queue_create_info.queueFamilyIndex = queue_family_index;
+ queue_create_info.queueCount = 1;
+ queue_create_info.pQueuePriorities = &queue_priority;
+
+ VkPhysicalDeviceProtectedMemoryFeatures protect_features = {};
+ protect_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES;
+ protect_features.pNext = nullptr;
+ protect_features.protectedMemory = VK_FALSE; // Starting with it off
+
+ VkDeviceCreateInfo device_create_info = {};
+ device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
+ device_create_info.pNext = &protect_features;
+ device_create_info.flags = 0;
+ device_create_info.pQueueCreateInfos = &queue_create_info;
+ device_create_info.queueCreateInfoCount = 1;
+ device_create_info.pEnabledFeatures = nullptr;
+ device_create_info.enabledLayerCount = 0;
+ device_create_info.enabledExtensionCount = 0;
+
+ // Protect feature not set
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkDeviceQueueCreateInfo-flags-02861");
+ vk::CreateDevice(gpu(), &device_create_info, nullptr, &test_device);
+ m_errorMonitor->VerifyFound();
+
+ VkPhysicalDeviceFeatures2 features2;
+ features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
+ features2.pNext = &protect_features;
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+
+ if (protect_features.protectedMemory == VK_TRUE) {
+ result = vk::CreateDevice(gpu(), &device_create_info, nullptr, &test_device);
+ if (result != VK_SUCCESS) {
+ printf("%s CreateDevice returned back %s, skipping rest of tests\n", kSkipPrefix, string_VkResult(result));
+ return;
+ }
+
+ // TODO: Re-enable test when Vulkan-Loader issue #384 is resolved and upstream
+ // Try using GetDeviceQueue with a queue that has as flag
+ // m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkGetDeviceQueue-flags-01841");
+ // vk::GetDeviceQueue(test_device, queue_family_index, 0, &test_queue);
+ // m_errorMonitor->VerifyFound();
+
+ vk::DestroyDevice(test_device, nullptr);
+ }
+
+ // Create device without protected queue
+ protect_features.protectedMemory = VK_FALSE;
+ queue_create_info.flags = 0;
+ result = vk::CreateDevice(gpu(), &device_create_info, nullptr, &test_device);
+ if (result != VK_SUCCESS) {
+ printf("%s CreateDevice returned back %s, skipping rest of tests\n", kSkipPrefix, string_VkResult(result));
+ return;
+ }
+
+ // TODO: Re-enable test when Vulkan-Loader issue #384 is resolved and upstream
+ // Set queueIndex 1 over size of queueCount
+ // m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkGetDeviceQueue-queueIndex-00385");
+ // vk::GetDeviceQueue(test_device, queue_family_index, queue_properties.queueCount, &test_queue);
+ // m_errorMonitor->VerifyFound();
+
+ // Use an unknown queue family index
+ // m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkGetDeviceQueue-queueFamilyIndex-00384");
+ // vk::GetDeviceQueue(test_device, queue_family_index + 1, 0, &test_queue);
+ // m_errorMonitor->VerifyFound();
+
+ // Sanity check can still get the queue
+ m_errorMonitor->ExpectSuccess();
+ vk::GetDeviceQueue(test_device, queue_family_index, 0, &test_queue);
+ m_errorMonitor->VerifyNotFound();
+
+ vk::DestroyDevice(test_device, nullptr);
+}
+
+TEST_F(VkLayerTest, DisabledProtectedMemory) {
+ TEST_DESCRIPTION("Validate cases where protectedMemory feature is not enabled");
+
+ SetTargetApiVersion(VK_API_VERSION_1_1);
+
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
+ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+
+ auto protected_memory_features = lvl_init_struct<VkPhysicalDeviceProtectedMemoryFeatures>();
+ auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+
+ // Set false to trigger VUs
+ protected_memory_features.protectedMemory = VK_FALSE;
+
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
+
+ VkCommandPool command_pool;
+ VkCommandPoolCreateInfo pool_create_info = {};
+ pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
+ pool_create_info.pNext = nullptr;
+ pool_create_info.flags = VK_COMMAND_POOL_CREATE_PROTECTED_BIT;
+ pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCommandPoolCreateInfo-flags-02860");
+ vk::CreateCommandPool(device(), &pool_create_info, nullptr, &command_pool);
+ m_errorMonitor->VerifyFound();
+
+ VkBuffer buffer;
+ VkBufferCreateInfo buffer_create_info = {};
+ buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ buffer_create_info.pNext = nullptr;
+ buffer_create_info.flags = VK_BUFFER_CREATE_PROTECTED_BIT;
+ buffer_create_info.size = 4096;
+ buffer_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+ buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferCreateInfo-flags-01887");
+ vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer);
+ m_errorMonitor->VerifyFound();
+
+ VkImage image;
+ VkImageCreateInfo image_create_info{};
+ image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_create_info.pNext = nullptr;
+ image_create_info.flags = VK_IMAGE_CREATE_PROTECTED_BIT;
+ image_create_info.extent = {64, 64, 1};
+ image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
+ image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+ image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_create_info.arrayLayers = 1;
+ image_create_info.mipLevels = 1;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCreateInfo-flags-01890");
+ vk::CreateImage(device(), &image_create_info, nullptr, &image);
+ m_errorMonitor->VerifyFound();
+
+ // Try to find memory with protected bit in it at all
+ VkDeviceMemory memory_protected = VK_NULL_HANDLE;
+ VkMemoryAllocateInfo alloc_info = {};
+ alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ alloc_info.pNext = nullptr;
+ alloc_info.allocationSize = 4096;
+
+ VkPhysicalDeviceMemoryProperties phys_mem_props;
+ vk::GetPhysicalDeviceMemoryProperties(gpu(), &phys_mem_props);
+ alloc_info.memoryTypeIndex = phys_mem_props.memoryTypeCount + 1;
+ for (uint32_t i = 0; i < phys_mem_props.memoryTypeCount; i++) {
+ // Check just protected bit is in type at all
+ if ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_PROTECTED_BIT) != 0) {
+ alloc_info.memoryTypeIndex = i;
+ break;
+ }
+ }
+ if (alloc_info.memoryTypeIndex < phys_mem_props.memoryTypeCount) {
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkMemoryAllocateInfo-memoryTypeIndex-01872");
+ vk::AllocateMemory(device(), &alloc_info, NULL, &memory_protected);
+ m_errorMonitor->VerifyFound();
+ }
+}
+
+TEST_F(VkLayerTest, InvalidProtectedMemory) {
+ TEST_DESCRIPTION("Validate cases where protectedMemory feature is enabled and usages are invalid");
+
+ SetTargetApiVersion(VK_API_VERSION_1_1);
+
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
+ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+
+ auto protected_memory_features = lvl_init_struct<VkPhysicalDeviceProtectedMemoryFeatures>();
+ auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+
+ if (protected_memory_features.protectedMemory == VK_FALSE) {
+ printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
+ return;
+ };
+
+ // Turns m_commandBuffer into a protected command buffer
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_PROTECTED_BIT));
+
+ bool sparse_support = (m_device->phy().features().sparseBinding == VK_TRUE);
+
+ if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
+ printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
+ return;
+ }
+
+ VkBuffer buffer_protected = VK_NULL_HANDLE;
+ VkBuffer buffer_unprotected = VK_NULL_HANDLE;
+ VkBufferCreateInfo buffer_create_info = {};
+ buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ buffer_create_info.pNext = nullptr;
+ buffer_create_info.flags = VK_BUFFER_CREATE_PROTECTED_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
+ buffer_create_info.size = 1 << 20; // 1 MB
+ buffer_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+ buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+
+ if (sparse_support == true) {
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferCreateInfo-None-01888");
+ vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_protected);
+ m_errorMonitor->VerifyFound();
+ }
+
+ // Create actual protected and unprotected buffers
+ m_errorMonitor->ExpectSuccess();
+ buffer_create_info.flags = VK_BUFFER_CREATE_PROTECTED_BIT;
+ vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_protected);
+ buffer_create_info.flags = 0;
+ vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_unprotected);
+ m_errorMonitor->VerifyNotFound();
+
+ VkImage image_protected = VK_NULL_HANDLE;
+ VkImage image_unprotected = VK_NULL_HANDLE;
+ VkImageCreateInfo image_create_info{};
+ image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_create_info.pNext = nullptr;
+ image_create_info.flags = VK_IMAGE_CREATE_PROTECTED_BIT | VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
+ image_create_info.extent = {8, 8, 1};
+ image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
+ image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+ image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_create_info.arrayLayers = 1;
+ image_create_info.mipLevels = 1;
+
+ if (sparse_support == true) {
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCreateInfo-None-01891");
+ vk::CreateImage(device(), &image_create_info, nullptr, &image_protected);
+ m_errorMonitor->VerifyFound();
+ }
+
+ // Create actual protected and unprotected images
+ m_errorMonitor->ExpectSuccess();
+ image_create_info.flags = VK_IMAGE_CREATE_PROTECTED_BIT;
+ vk::CreateImage(device(), &image_create_info, nullptr, &image_protected);
+ image_create_info.flags = 0;
+ vk::CreateImage(device(), &image_create_info, nullptr, &image_unprotected);
+ m_errorMonitor->VerifyNotFound();
+
+ // Create protected and unproteced memory
+ VkDeviceMemory memory_protected = VK_NULL_HANDLE;
+ VkDeviceMemory memory_unprotected = VK_NULL_HANDLE;
+
+ VkMemoryAllocateInfo alloc_info = {};
+ alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ alloc_info.pNext = nullptr;
+ alloc_info.allocationSize = 0;
+
+ // set allocationSize to buffer as it will be larger than the image, but query image to avoid BP warning
+ VkMemoryRequirements mem_reqs_protected;
+ vk::GetImageMemoryRequirements(device(), image_protected, &mem_reqs_protected);
+ vk::GetBufferMemoryRequirements(device(), buffer_protected, &mem_reqs_protected);
+ VkMemoryRequirements mem_reqs_unprotected;
+ vk::GetImageMemoryRequirements(device(), image_unprotected, &mem_reqs_unprotected);
+ vk::GetBufferMemoryRequirements(device(), buffer_unprotected, &mem_reqs_unprotected);
+
+ // Get memory index for a protected and unprotected memory
+ VkPhysicalDeviceMemoryProperties phys_mem_props;
+ vk::GetPhysicalDeviceMemoryProperties(gpu(), &phys_mem_props);
+ uint32_t memory_type_protected = phys_mem_props.memoryTypeCount + 1;
+ uint32_t memory_type_unprotected = phys_mem_props.memoryTypeCount + 1;
+ for (uint32_t i = 0; i < phys_mem_props.memoryTypeCount; i++) {
+ if ((mem_reqs_unprotected.memoryTypeBits & (1 << i)) &&
+ ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) ==
+ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) {
+ memory_type_unprotected = i;
+ }
+ // Check just protected bit is in type at all
+ if ((mem_reqs_protected.memoryTypeBits & (1 << i)) &&
+ ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_PROTECTED_BIT) != 0)) {
+ memory_type_protected = i;
+ }
+ }
+ if ((memory_type_protected >= phys_mem_props.memoryTypeCount) || (memory_type_unprotected >= phys_mem_props.memoryTypeCount)) {
+ printf("%s No valid memory type index could be found; skipped.\n", kSkipPrefix);
+ vk::DestroyImage(device(), image_protected, nullptr);
+ vk::DestroyImage(device(), image_unprotected, nullptr);
+ vk::DestroyBuffer(device(), buffer_protected, nullptr);
+ vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
+ return;
+ }
+
+ alloc_info.memoryTypeIndex = memory_type_protected;
+ alloc_info.allocationSize = mem_reqs_protected.size;
+ vk::AllocateMemory(device(), &alloc_info, NULL, &memory_protected);
+
+ alloc_info.allocationSize = mem_reqs_unprotected.size;
+ alloc_info.memoryTypeIndex = memory_type_unprotected;
+ vk::AllocateMemory(device(), &alloc_info, NULL, &memory_unprotected);
+
+ // Bind protected buffer with unprotected memory
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindBufferMemory-None-01898");
+ m_errorMonitor->SetUnexpectedError("VUID-vkBindBufferMemory-memory-01035");
+ vk::BindBufferMemory(device(), buffer_protected, memory_unprotected, 0);
+ m_errorMonitor->VerifyFound();
+
+ // Bind unprotected buffer with protected memory
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindBufferMemory-None-01899");
+ m_errorMonitor->SetUnexpectedError("VUID-vkBindBufferMemory-memory-01035");
+ vk::BindBufferMemory(device(), buffer_unprotected, memory_protected, 0);
+ m_errorMonitor->VerifyFound();
+
+ // Bind protected image with unprotected memory
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindImageMemory-None-01901");
+ m_errorMonitor->SetUnexpectedError("VUID-vkBindImageMemory-memory-01047");
+ vk::BindImageMemory(device(), image_protected, memory_unprotected, 0);
+ m_errorMonitor->VerifyFound();
+
+ // Bind unprotected image with protected memory
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindImageMemory-None-01902");
+ m_errorMonitor->SetUnexpectedError("VUID-vkBindImageMemory-memory-01047");
+ vk::BindImageMemory(device(), image_unprotected, memory_protected, 0);
+ m_errorMonitor->VerifyFound();
+
+ vk::DestroyImage(device(), image_protected, nullptr);
+ vk::DestroyImage(device(), image_unprotected, nullptr);
+ vk::DestroyBuffer(device(), buffer_protected, nullptr);
+ vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
+ vk::FreeMemory(device(), memory_protected, nullptr);
+ vk::FreeMemory(device(), memory_unprotected, nullptr);
+}
+
+TEST_F(VkLayerTest, ValidateCmdTraceRaysKHR) {
+ TEST_DESCRIPTION("Validate vkCmdTraceRaysKHR.");
+ if (!InitFrameworkForRayTracingTest(this, true, m_instance_extension_names, m_device_extension_names, m_errorMonitor)) {
+ return;
+ }
+ VkBuffer buffer;
+ VkBufferCreateInfo buf_info = {};
+ buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+ buf_info.size = 4096;
+ buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ VkResult err = vk::CreateBuffer(device(), &buf_info, NULL, &buffer);
+ ASSERT_VK_SUCCESS(err);
+
+ VkMemoryRequirements mem_reqs;
+ vk::GetBufferMemoryRequirements(device(), buffer, &mem_reqs);
+
+ VkMemoryAllocateInfo alloc_info = {};
+ alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ alloc_info.allocationSize = 4096;
+ VkDeviceMemory mem;
+ err = vk::AllocateMemory(device(), &alloc_info, NULL, &mem);
+ ASSERT_VK_SUCCESS(err);
+ vk::BindBufferMemory(device(), buffer, mem, 0);
+
+ PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
+ (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
+
+ auto ray_tracing_properties = lvl_init_struct<VkPhysicalDeviceRayTracingPropertiesKHR>();
+ auto properties2 = lvl_init_struct<VkPhysicalDeviceProperties2KHR>(&ray_tracing_properties);
+ vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
+
+ PFN_vkCmdTraceRaysKHR vkCmdTraceRaysKHR = (PFN_vkCmdTraceRaysKHR)vk::GetInstanceProcAddr(instance(), "vkCmdTraceRaysKHR");
+ ASSERT_TRUE(vkCmdTraceRaysKHR != nullptr);
+
+ VkStridedBufferRegionKHR stridebufregion = {};
+ stridebufregion.buffer = buffer;
+ stridebufregion.offset = 0;
+ stridebufregion.stride = ray_tracing_properties.shaderGroupHandleSize;
+ stridebufregion.size = buf_info.size;
+ // invalid offset
+ {
+ VkStridedBufferRegionKHR invalid_offset = stridebufregion;
+ invalid_offset.offset = ray_tracing_properties.shaderGroupBaseAlignment + 1;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysKHR-offset-04038");
+ vkCmdTraceRaysKHR(m_commandBuffer->handle(), &stridebufregion, &stridebufregion, &stridebufregion, &invalid_offset, 100,
+ 100, 1);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysKHR-offset-04032");
+ vkCmdTraceRaysKHR(m_commandBuffer->handle(), &stridebufregion, &stridebufregion, &invalid_offset, &stridebufregion, 100,
+ 100, 1);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysKHR-offset-04026");
+ vkCmdTraceRaysKHR(m_commandBuffer->handle(), &stridebufregion, &invalid_offset, &stridebufregion, &stridebufregion, 100,
+ 100, 1);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysKHR-pRayGenShaderBindingTable-04021");
+ vkCmdTraceRaysKHR(m_commandBuffer->handle(), &invalid_offset, &stridebufregion, &stridebufregion, &stridebufregion, 100,
+ 100, 1);
+ m_errorMonitor->VerifyFound();
+ }
+
+ // Invalid stride multiplier
+ {
+ VkStridedBufferRegionKHR invalid_stride = stridebufregion;
+ invalid_stride.stride = 1;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysKHR-stride-04040");
+ vkCmdTraceRaysKHR(m_commandBuffer->handle(), &stridebufregion, &stridebufregion, &stridebufregion, &invalid_stride, 100,
+ 100, 1);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysKHR-stride-04034");
+ vkCmdTraceRaysKHR(m_commandBuffer->handle(), &stridebufregion, &stridebufregion, &invalid_stride, &stridebufregion, 100,
+ 100, 1);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysKHR-stride-04028");
+ vkCmdTraceRaysKHR(m_commandBuffer->handle(), &stridebufregion, &invalid_stride, &stridebufregion, &stridebufregion, 100,
+ 100, 1);
+ m_errorMonitor->VerifyFound();
+ }
+ // Invalid stride, greater than maxShaderGroupStride
+ {
+ VkStridedBufferRegionKHR invalid_stride = stridebufregion;
+ uint32_t align = ray_tracing_properties.shaderGroupHandleSize;
+ invalid_stride.stride =
+ ray_tracing_properties.maxShaderGroupStride + (align - (ray_tracing_properties.maxShaderGroupStride % align));
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysKHR-stride-04041");
+ vkCmdTraceRaysKHR(m_commandBuffer->handle(), &stridebufregion, &stridebufregion, &stridebufregion, &invalid_stride, 100,
+ 100, 1);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysKHR-stride-04035");
+ vkCmdTraceRaysKHR(m_commandBuffer->handle(), &stridebufregion, &stridebufregion, &invalid_stride, &stridebufregion, 100,
+ 100, 1);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysKHR-stride-04029");
+ vkCmdTraceRaysKHR(m_commandBuffer->handle(), &stridebufregion, &invalid_stride, &stridebufregion, &stridebufregion, 100,
+ 100, 1);
+ m_errorMonitor->VerifyFound();
+ }
+}
+
+TEST_F(VkLayerTest, ValidateCmdTraceRaysIndirectKHR) {
+ TEST_DESCRIPTION("Validate vkCmdTraceRaysIndirectKHR.");
+ if (!InitFrameworkForRayTracingTest(this, true, m_instance_extension_names, m_device_extension_names, m_errorMonitor, false,
+ false, true)) {
+ return;
+ }
+ auto ray_tracing_features = lvl_init_struct<VkPhysicalDeviceRayTracingFeaturesKHR>();
+ auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&ray_tracing_features);
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+ if (ray_tracing_features.rayTracingIndirectTraceRays == VK_FALSE) {
+ printf("%s rayTracingIndirectTraceRays not supported, skipping tests\n", kSkipPrefix);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &ray_tracing_features));
+ VkBuffer buffer;
+ VkBufferCreateInfo buf_info = {};
+ buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+ buf_info.size = 4096;
+ buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ VkResult err = vk::CreateBuffer(device(), &buf_info, NULL, &buffer);
+ ASSERT_VK_SUCCESS(err);
+
+ VkMemoryRequirements mem_reqs;
+ vk::GetBufferMemoryRequirements(device(), buffer, &mem_reqs);
+
+ VkMemoryAllocateInfo alloc_info = {};
+ alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ alloc_info.allocationSize = 4096;
+ VkDeviceMemory mem;
+ err = vk::AllocateMemory(device(), &alloc_info, NULL, &mem);
+ ASSERT_VK_SUCCESS(err);
+ vk::BindBufferMemory(device(), buffer, mem, 0);
+
+ PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
+ (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
+
+ auto ray_tracing_properties = lvl_init_struct<VkPhysicalDeviceRayTracingPropertiesKHR>();
+ auto properties2 = lvl_init_struct<VkPhysicalDeviceProperties2KHR>(&ray_tracing_properties);
+ vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
+
+ PFN_vkCmdTraceRaysIndirectKHR vkCmdTraceRaysIndirectKHR =
+ (PFN_vkCmdTraceRaysIndirectKHR)vk::GetInstanceProcAddr(instance(), "vkCmdTraceRaysIndirectKHR");
+ ASSERT_TRUE(vkCmdTraceRaysIndirectKHR != nullptr);
+
+ VkStridedBufferRegionKHR stridebufregion = {};
+ stridebufregion.buffer = buffer;
+ stridebufregion.offset = 0;
+ stridebufregion.stride = ray_tracing_properties.shaderGroupHandleSize;
+ stridebufregion.size = buf_info.size;
+ // invalid offset
+ {
+ VkStridedBufferRegionKHR invalid_offset = stridebufregion;
+ invalid_offset.offset = ray_tracing_properties.shaderGroupBaseAlignment + 1;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysIndirectKHR-offset-04038");
+ vkCmdTraceRaysIndirectKHR(m_commandBuffer->handle(), &stridebufregion, &stridebufregion, &stridebufregion, &invalid_offset,
+ buffer, 0);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysIndirectKHR-offset-04032");
+ vkCmdTraceRaysIndirectKHR(m_commandBuffer->handle(), &stridebufregion, &stridebufregion, &invalid_offset, &stridebufregion,
+ buffer, 0);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysIndirectKHR-offset-04026");
+ vkCmdTraceRaysIndirectKHR(m_commandBuffer->handle(), &stridebufregion, &invalid_offset, &stridebufregion, &stridebufregion,
+ buffer, 0);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysIndirectKHR-pRayGenShaderBindingTable-04021");
+ vkCmdTraceRaysIndirectKHR(m_commandBuffer->handle(), &invalid_offset, &stridebufregion, &stridebufregion, &stridebufregion,
+ buffer, 0);
+ m_errorMonitor->VerifyFound();
+ }
+
+ // Invalid stride multiplier
+ {
+ VkStridedBufferRegionKHR invalid_stride = stridebufregion;
+ invalid_stride.stride = 1;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysIndirectKHR-stride-04040");
+ vkCmdTraceRaysIndirectKHR(m_commandBuffer->handle(), &stridebufregion, &stridebufregion, &stridebufregion, &invalid_stride,
+ buffer, 0);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysIndirectKHR-stride-04034");
+ vkCmdTraceRaysIndirectKHR(m_commandBuffer->handle(), &stridebufregion, &stridebufregion, &invalid_stride, &stridebufregion,
+ buffer, 0);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysIndirectKHR-stride-04028");
+ vkCmdTraceRaysIndirectKHR(m_commandBuffer->handle(), &stridebufregion, &invalid_stride, &stridebufregion, &stridebufregion,
+ buffer, 0);
+ m_errorMonitor->VerifyFound();
+ }
+ // Invalid stride, greater than maxShaderGroupStride
+ {
+ VkStridedBufferRegionKHR invalid_stride = stridebufregion;
+ uint32_t align = ray_tracing_properties.shaderGroupHandleSize;
+ invalid_stride.stride =
+ ray_tracing_properties.maxShaderGroupStride + (align - (ray_tracing_properties.maxShaderGroupStride % align));
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysIndirectKHR-stride-04041");
+ vkCmdTraceRaysIndirectKHR(m_commandBuffer->handle(), &stridebufregion, &stridebufregion, &stridebufregion, &invalid_stride,
+ buffer, 0);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysIndirectKHR-stride-04035");
+ vkCmdTraceRaysIndirectKHR(m_commandBuffer->handle(), &stridebufregion, &stridebufregion, &invalid_stride, &stridebufregion,
+ buffer, 0);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdTraceRaysIndirectKHR-stride-04029");
+ vkCmdTraceRaysIndirectKHR(m_commandBuffer->handle(), &stridebufregion, &invalid_stride, &stridebufregion, &stridebufregion,
+ buffer, 0);
+ m_errorMonitor->VerifyFound();
+ }
+}
+
+TEST_F(VkLayerTest, ValidateVkAccelerationStructureVersionKHR) {
+ TEST_DESCRIPTION("Validate VkAccelerationStructureVersionKHR.");
+ if (!InitFrameworkForRayTracingTest(this, true, m_instance_extension_names, m_device_extension_names, m_errorMonitor, false,
+ false, true)) {
+ return;
+ }
+
+ auto ray_tracing_features = lvl_init_struct<VkPhysicalDeviceRayTracingFeaturesKHR>();
+ auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&ray_tracing_features);
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+ if (ray_tracing_features.rayTracing == VK_FALSE) {
+ printf("%s rayTracing not supported, skipping tests\n", kSkipPrefix);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &ray_tracing_features));
+ PFN_vkGetDeviceAccelerationStructureCompatibilityKHR vkGetDeviceAccelerationStructureCompatibilityKHR =
+ (PFN_vkGetDeviceAccelerationStructureCompatibilityKHR)vk::GetInstanceProcAddr(
+ instance(), "vkGetDeviceAccelerationStructureCompatibilityKHR");
+ ASSERT_TRUE(vkGetDeviceAccelerationStructureCompatibilityKHR != nullptr);
+ VkAccelerationStructureVersionKHR valid_version = {};
+ uint8_t mode[] = {VK_COPY_ACCELERATION_STRUCTURE_MODE_COMPACT_KHR, VK_COPY_ACCELERATION_STRUCTURE_MODE_CLONE_KHR};
+ valid_version.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_VERSION_KHR;
+ valid_version.versionData = mode;
+ {
+ VkAccelerationStructureVersionKHR invalid_version = valid_version;
+ invalid_version.sType = VK_STRUCTURE_TYPE_MAX_ENUM;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkAccelerationStructureVersionKHR-sType-sType");
+ vkGetDeviceAccelerationStructureCompatibilityKHR(m_device->handle(), &invalid_version);
+ m_errorMonitor->VerifyFound();
+ }
+
+ {
+ VkAccelerationStructureVersionKHR invalid_version = valid_version;
+ invalid_version.versionData = NULL;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkAccelerationStructureVersionKHR-versionData-parameter");
+ vkGetDeviceAccelerationStructureCompatibilityKHR(m_device->handle(), &invalid_version);
+ m_errorMonitor->VerifyFound();
+ }
+}
+
+TEST_F(VkLayerTest, ValidateCmdBuildAccelerationStructureKHR) {
+ TEST_DESCRIPTION("Validate acceleration structure building.");
+ if (!InitFrameworkForRayTracingTest(this, true, m_instance_extension_names, m_device_extension_names, m_errorMonitor)) {
+ return;
+ }
+
+ PFN_vkCmdBuildAccelerationStructureKHR vkCmdBuildAccelerationStructureKHR =
+ (PFN_vkCmdBuildAccelerationStructureKHR)vk::GetDeviceProcAddr(device(), "vkCmdBuildAccelerationStructureKHR");
+
+ PFN_vkGetBufferDeviceAddressKHR vkGetBufferDeviceAddressKHR =
+ (PFN_vkGetBufferDeviceAddressKHR)vk::GetDeviceProcAddr(device(), "vkGetBufferDeviceAddressKHR");
+
+ assert(vkCmdBuildAccelerationStructureKHR != nullptr);
+ VkBufferObj vbo;
+ VkBufferObj ibo;
+ VkGeometryNV geometryNV;
+ GetSimpleGeometryForAccelerationStructureTests(*m_device, &vbo, &ibo, &geometryNV);
+
+ VkAccelerationStructureCreateGeometryTypeInfoKHR geometryInfo = {};
+ geometryInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_GEOMETRY_TYPE_INFO_KHR;
+ geometryInfo.geometryType = geometryNV.geometryType;
+ geometryInfo.maxPrimitiveCount = 1024;
+ geometryInfo.indexType = geometryNV.geometry.triangles.indexType;
+ geometryInfo.maxVertexCount = 1024;
+ geometryInfo.vertexFormat = geometryNV.geometry.triangles.vertexFormat;
+ geometryInfo.allowsTransforms = VK_TRUE;
+
+ VkAccelerationStructureCreateInfoKHR bot_level_as_create_info = {};
+ bot_level_as_create_info.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR;
+ bot_level_as_create_info.pNext = NULL;
+ bot_level_as_create_info.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR;
+ bot_level_as_create_info.maxGeometryCount = 1;
+ bot_level_as_create_info.pGeometryInfos = &geometryInfo;
+ VkAccelerationStructureObj bot_level_as(*m_device, bot_level_as_create_info);
+
+ VkBufferDeviceAddressInfo vertexAddressInfo = {VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO, NULL,
+ geometryNV.geometry.triangles.vertexData};
+ VkDeviceAddress vertexAddress = vkGetBufferDeviceAddressKHR(m_device->handle(), &vertexAddressInfo);
+
+ VkBufferDeviceAddressInfo indexAddressInfo = {VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO, NULL,
+ geometryNV.geometry.triangles.indexData};
+ VkDeviceAddress indexAddress = vkGetBufferDeviceAddressKHR(m_device->handle(), &indexAddressInfo);
+
+ VkAccelerationStructureGeometryKHR valid_geometry_triangles = {VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR};
+ valid_geometry_triangles.geometryType = geometryNV.geometryType;
+ valid_geometry_triangles.geometry.triangles.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR;
+ valid_geometry_triangles.geometry.triangles.pNext = NULL;
+ valid_geometry_triangles.geometry.triangles.vertexFormat = geometryNV.geometry.triangles.vertexFormat;
+ valid_geometry_triangles.geometry.triangles.vertexData.deviceAddress = vertexAddress;
+ valid_geometry_triangles.geometry.triangles.vertexStride = 8;
+ valid_geometry_triangles.geometry.triangles.indexType = VK_INDEX_TYPE_UINT32;
+ valid_geometry_triangles.geometry.triangles.indexData.deviceAddress = indexAddress;
+ valid_geometry_triangles.geometry.triangles.transformData.deviceAddress = 0;
+ valid_geometry_triangles.flags = 0;
+
+ VkAccelerationStructureGeometryKHR *pGeometry_triangles = &valid_geometry_triangles;
+ VkAccelerationStructureBuildGeometryInfoKHR valid_asInfo_triangles = {
+ VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR};
+ valid_asInfo_triangles.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR;
+ valid_asInfo_triangles.flags = 0;
+ valid_asInfo_triangles.update = VK_FALSE;
+ valid_asInfo_triangles.srcAccelerationStructure = VK_NULL_HANDLE;
+ valid_asInfo_triangles.dstAccelerationStructure = bot_level_as.handle();
+ valid_asInfo_triangles.geometryArrayOfPointers = VK_FALSE;
+ valid_asInfo_triangles.geometryCount = 1;
+ valid_asInfo_triangles.ppGeometries = &pGeometry_triangles;
+ valid_asInfo_triangles.scratchData.deviceAddress = 0;
+
+ VkAccelerationStructureBuildOffsetInfoKHR buildOffsetInfo = {
+ 1,
+ 0,
+ 0,
+ 0,
+ };
+ const VkAccelerationStructureBuildOffsetInfoKHR *pBuildOffsetInfo = &buildOffsetInfo;
+ m_commandBuffer->begin();
+
+ // build valid src acc for update VK_TRUE case with VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR set
+ VkAccelerationStructureBuildGeometryInfoKHR valid_src_asInfo_triangles = valid_asInfo_triangles;
+ valid_src_asInfo_triangles.flags = VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR;
+ valid_src_asInfo_triangles.srcAccelerationStructure = bot_level_as.handle();
+ valid_src_asInfo_triangles.dstAccelerationStructure = bot_level_as.handle();
+ vkCmdBuildAccelerationStructureKHR(m_commandBuffer->handle(), 1, &valid_src_asInfo_triangles, &pBuildOffsetInfo);
+
+ // positive test
+ {
+ VkAccelerationStructureBuildGeometryInfoKHR asInfo_validupdate = valid_asInfo_triangles;
+ asInfo_validupdate.update = VK_TRUE;
+ asInfo_validupdate.srcAccelerationStructure = bot_level_as.handle();
+ m_errorMonitor->ExpectSuccess();
+ vkCmdBuildAccelerationStructureKHR(m_commandBuffer->handle(), 1, &asInfo_validupdate, &pBuildOffsetInfo);
+ m_errorMonitor->VerifyNotFound();
+ }
+ // If update is VK_TRUE, srcAccelerationStructure must not be VK_NULL_HANDLE
+ {
+ VkAccelerationStructureBuildGeometryInfoKHR asInfo_invalidupdate = valid_asInfo_triangles;
+ asInfo_invalidupdate.update = VK_TRUE;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkAccelerationStructureBuildGeometryInfoKHR-update-03537");
+ vkCmdBuildAccelerationStructureKHR(m_commandBuffer->handle(), 1, &asInfo_invalidupdate, &pBuildOffsetInfo);
+ m_errorMonitor->VerifyFound();
+ }
+
+ {
+ VkAccelerationStructureBuildGeometryInfoKHR invalid_src_asInfo_triangles = valid_src_asInfo_triangles;
+ invalid_src_asInfo_triangles.flags = 0;
+ invalid_src_asInfo_triangles.srcAccelerationStructure = bot_level_as.handle();
+ invalid_src_asInfo_triangles.dstAccelerationStructure = bot_level_as.handle();
+
+ // build src As without flag VK_BUILD_ACCELERATION_STRUCTURE_ALLOW_UPDATE_BIT_KHR set
+ vkCmdBuildAccelerationStructureKHR(m_commandBuffer->handle(), 1, &invalid_src_asInfo_triangles, &pBuildOffsetInfo);
+ VkAccelerationStructureBuildGeometryInfoKHR asInfo_invalidupdate = valid_asInfo_triangles;
+
+ asInfo_invalidupdate.update = VK_TRUE;
+ asInfo_invalidupdate.srcAccelerationStructure = bot_level_as.handle();
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkAccelerationStructureBuildGeometryInfoKHR-update-03538");
+ vkCmdBuildAccelerationStructureKHR(m_commandBuffer->handle(), 1, &asInfo_invalidupdate, &pBuildOffsetInfo);
+ m_errorMonitor->VerifyFound();
+ }
+}
+
+TEST_F(VkLayerTest, ValidateImportMemoryHandleType) {
+ TEST_DESCRIPTION("Validate import memory handleType for buffers and images");
+
+#ifdef _WIN32
+ const auto ext_mem_extension_name = VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME;
+ const auto handle_type = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT_KHR;
+#else
+ const auto ext_mem_extension_name = VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME;
+ const auto handle_type = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHR;
+#endif
+ const auto wrong_handle_type = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT;
+
+ // Check for external memory instance extensions
+ std::vector<const char *> reqd_instance_extensions = {
+ {VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME}};
+ for (auto extension_name : reqd_instance_extensions) {
+ if (InstanceExtensionSupported(extension_name)) {
+ m_instance_extension_names.push_back(extension_name);
+ } else {
+ printf("%s Required instance extension %s not supported, skipping test\n", kSkipPrefix, extension_name);
+ return;
+ }
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ auto vkGetPhysicalDeviceExternalBufferPropertiesKHR =
+ (PFN_vkGetPhysicalDeviceExternalBufferPropertiesKHR)vk::GetInstanceProcAddr(
+ instance(), "vkGetPhysicalDeviceExternalBufferPropertiesKHR");
+
+ // Check for import/export capability
+ // export used to feed memory to test import
+ VkPhysicalDeviceExternalBufferInfoKHR ebi = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO_KHR, nullptr, 0,
+ VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, handle_type};
+ VkExternalBufferPropertiesKHR ebp = {VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES_KHR, nullptr, {0, 0, 0}};
+ ASSERT_TRUE(vkGetPhysicalDeviceExternalBufferPropertiesKHR != nullptr);
+ vkGetPhysicalDeviceExternalBufferPropertiesKHR(gpu(), &ebi, &ebp);
+ if (!(ebp.externalMemoryProperties.compatibleHandleTypes & handle_type) ||
+ !(ebp.externalMemoryProperties.externalMemoryFeatures & VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_KHR) ||
+ !(ebp.externalMemoryProperties.externalMemoryFeatures & VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_KHR)) {
+ printf("%s External buffer does not support importing and exporting, skipping test\n", kSkipPrefix);
+ return;
+ }
+
+ // Always use dedicated allocation
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ } else {
+ printf("%s Dedicated allocation extension not supported, skipping test\n", kSkipPrefix);
+ return;
+ }
+
+ // Check for external memory device extensions
+ if (DeviceExtensionSupported(gpu(), nullptr, ext_mem_extension_name)) {
+ m_device_extension_names.push_back(ext_mem_extension_name);
+ m_device_extension_names.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
+ } else {
+ printf("%s External memory extension not supported, skipping test\n", kSkipPrefix);
+ return;
+ }
+
+ // Check for bind memory 2
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ } else {
+ printf("%s bind memory 2 extension not supported, skipping test\n", kSkipPrefix);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ PFN_vkBindBufferMemory2KHR vkBindBufferMemory2Function =
+ (PFN_vkBindBufferMemory2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkBindBufferMemory2KHR");
+ PFN_vkBindImageMemory2KHR vkBindImageMemory2Function =
+ (PFN_vkBindImageMemory2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkBindImageMemory2KHR");
+
+ m_errorMonitor->ExpectSuccess(kErrorBit | kWarningBit);
+
+ VkMemoryPropertyFlags mem_flags = 0;
+ const VkDeviceSize buffer_size = 1024;
+
+ // Create export and import buffers
+ VkExternalMemoryBufferCreateInfoKHR external_buffer_info = {VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR, nullptr,
+ handle_type};
+ auto buffer_info = VkBufferObj::create_info(buffer_size, VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+ buffer_info.pNext = &external_buffer_info;
+ VkBufferObj buffer_export;
+ buffer_export.init_no_mem(*m_device, buffer_info);
+ external_buffer_info.handleTypes = wrong_handle_type;
+ VkBufferObj buffer_import;
+ buffer_import.init_no_mem(*m_device, buffer_info);
+
+ // Allocation info
+ auto alloc_info = vk_testing::DeviceMemory::get_resource_alloc_info(*m_device, buffer_export.memory_requirements(), mem_flags);
+
+ // Add export allocation info to pNext chain
+ VkMemoryDedicatedAllocateInfoKHR dedicated_info = {VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR, nullptr,
+ VK_NULL_HANDLE, buffer_export.handle()};
+ VkExportMemoryAllocateInfoKHR export_info = {VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR, &dedicated_info, handle_type};
+ alloc_info.pNext = &export_info;
+
+ // Allocate memory to be exported
+ vk_testing::DeviceMemory memory_buffer_export;
+ memory_buffer_export.init(*m_device, alloc_info);
+
+ // Bind exported memory
+ buffer_export.bind_memory(memory_buffer_export, 0);
+
+ VkExternalMemoryImageCreateInfoKHR external_image_info = {VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO, nullptr,
+ handle_type};
+ VkImageCreateInfo image_info{};
+ image_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_info.pNext = &external_image_info;
+ image_info.extent = {64, 64, 1};
+ image_info.format = VK_FORMAT_R8G8B8A8_UNORM;
+ image_info.imageType = VK_IMAGE_TYPE_2D;
+ image_info.tiling = VK_IMAGE_TILING_OPTIMAL;
+ image_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+ image_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_info.arrayLayers = 1;
+ image_info.mipLevels = 1;
+ VkImageObj image_export(m_device);
+ image_export.init_no_mem(*m_device, image_info);
+ external_image_info.handleTypes = wrong_handle_type;
+ VkImageObj image_import(m_device);
+ image_import.init_no_mem(*m_device, image_info);
+
+ // Allocation info
+ dedicated_info = {VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR, nullptr, image_export.handle(), VK_NULL_HANDLE};
+ alloc_info = vk_testing::DeviceMemory::get_resource_alloc_info(*m_device, image_export.memory_requirements(), mem_flags);
+ alloc_info.pNext = &export_info;
+
+ // Allocate memory to be exported
+ vk_testing::DeviceMemory memory_image_export;
+ memory_image_export.init(*m_device, alloc_info);
+
+ // Bind exported memory
+ image_export.bind_memory(memory_image_export, 0);
+
+#ifdef _WIN32
+ // Export memory to handle
+ auto vkGetMemoryWin32HandleKHR =
+ (PFN_vkGetMemoryWin32HandleKHR)vk::GetInstanceProcAddr(instance(), "vkGetMemoryWin32HandleKHR");
+ ASSERT_TRUE(vkGetMemoryWin32HandleKHR != nullptr);
+ VkMemoryGetWin32HandleInfoKHR mghi_buffer = {VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR, nullptr,
+ memory_buffer_export.handle(), handle_type};
+ VkMemoryGetWin32HandleInfoKHR mghi_image = {VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR, nullptr,
+ memory_image_export.handle(), handle_type};
+ HANDLE handle_buffer;
+ HANDLE handle_image;
+ ASSERT_VK_SUCCESS(vkGetMemoryWin32HandleKHR(m_device->device(), &mghi_buffer, &handle_buffer));
+ ASSERT_VK_SUCCESS(vkGetMemoryWin32HandleKHR(m_device->device(), &mghi_image, &handle_image));
+
+ VkImportMemoryWin32HandleInfoKHR import_info_buffer = {VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR, nullptr,
+ handle_type, handle_buffer};
+ VkImportMemoryWin32HandleInfoKHR import_info_image = {VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR, nullptr,
+ handle_type, handle_image};
+#else
+ // Export memory to fd
+ auto vkGetMemoryFdKHR = (PFN_vkGetMemoryFdKHR)vk::GetInstanceProcAddr(instance(), "vkGetMemoryFdKHR");
+ ASSERT_TRUE(vkGetMemoryFdKHR != nullptr);
+ VkMemoryGetFdInfoKHR mgfi_buffer = {VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR, nullptr, memory_buffer_export.handle(),
+ handle_type};
+ VkMemoryGetFdInfoKHR mgfi_image = {VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR, nullptr, memory_image_export.handle(),
+ handle_type};
+ int fd_buffer;
+ int fd_image;
+ ASSERT_VK_SUCCESS(vkGetMemoryFdKHR(m_device->device(), &mgfi_buffer, &fd_buffer));
+ ASSERT_VK_SUCCESS(vkGetMemoryFdKHR(m_device->device(), &mgfi_image, &fd_image));
+
+ VkImportMemoryFdInfoKHR import_info_buffer = {VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR, nullptr, handle_type, fd_buffer};
+ VkImportMemoryFdInfoKHR import_info_image = {VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR, nullptr, handle_type, fd_image};
+#endif
+
+ // Import memory
+ alloc_info = vk_testing::DeviceMemory::get_resource_alloc_info(*m_device, buffer_import.memory_requirements(), mem_flags);
+ alloc_info.pNext = &import_info_buffer;
+ vk_testing::DeviceMemory memory_buffer_import;
+ memory_buffer_import.init(*m_device, alloc_info);
+
+ alloc_info = vk_testing::DeviceMemory::get_resource_alloc_info(*m_device, image_import.memory_requirements(), mem_flags);
+ alloc_info.pNext = &import_info_image;
+ vk_testing::DeviceMemory memory_image_import;
+ memory_image_import.init(*m_device, alloc_info);
+ m_errorMonitor->VerifyNotFound();
+
+ // Bind imported memory with different handleType
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindBufferMemory-memory-02727");
+ vk::BindBufferMemory(device(), buffer_import.handle(), memory_buffer_import.handle(), 0);
+ m_errorMonitor->VerifyFound();
+
+ VkBindBufferMemoryInfo bind_buffer_info = {};
+ bind_buffer_info.sType = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO;
+ bind_buffer_info.pNext = nullptr;
+ bind_buffer_info.buffer = buffer_import.handle();
+ bind_buffer_info.memory = memory_buffer_import.handle();
+ bind_buffer_info.memoryOffset = 0;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBindBufferMemoryInfo-memory-02792");
+ vkBindBufferMemory2Function(device(), 1, &bind_buffer_info);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBindImageMemory-memory-02729");
+ m_errorMonitor->SetUnexpectedError("VUID-VkBindImageMemoryInfo-memory-01614");
+ m_errorMonitor->SetUnexpectedError("VUID-VkBindImageMemoryInfo-memory-01612");
+ vk::BindImageMemory(device(), image_import.handle(), memory_image_import.handle(), 0);
+ m_errorMonitor->VerifyFound();
+
+ VkBindImageMemoryInfo bind_image_info = {};
+ bind_image_info.sType = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO;
+ bind_image_info.pNext = nullptr;
+ bind_image_info.image = image_import.handle();
+ bind_image_info.memory = memory_buffer_import.handle();
+ bind_image_info.memoryOffset = 0;
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBindImageMemoryInfo-memory-02794");
+ m_errorMonitor->SetUnexpectedError("VUID-VkBindImageMemoryInfo-memory-01614");
+ m_errorMonitor->SetUnexpectedError("VUID-VkBindImageMemoryInfo-memory-01612");
+ vkBindImageMemory2Function(device(), 1, &bind_image_info);
+ m_errorMonitor->VerifyFound();
+}
+
+TEST_F(VkLayerTest, ValidateExtendedDynamicStateDisabled) {
+ TEST_DESCRIPTION("Validate VK_EXT_extended_dynamic_state VUs");
+
+ uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
+ if (version < VK_API_VERSION_1_1) {
+ printf("%s At least Vulkan version 1.1 is required, skipping test.\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
+ } else {
+ printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
+ return;
+ }
+
+ auto extended_dynamic_state_features = lvl_init_struct<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>();
+ auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2>(&extended_dynamic_state_features);
+ vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
+ if (!extended_dynamic_state_features.extendedDynamicState) {
+ printf("%s Test requires (unsupported) extendedDynamicState, skipping\n", kSkipPrefix);
+ return;
+ }
+
+ // First test attempted uses of VK_EXT_extended_dynamic_state without it being enabled.
+ extended_dynamic_state_features.extendedDynamicState = VK_FALSE;
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
+
+ auto vkCmdSetCullModeEXT = (PFN_vkCmdSetCullModeEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetCullModeEXT");
+ auto vkCmdSetFrontFaceEXT = (PFN_vkCmdSetFrontFaceEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFrontFaceEXT");
+ auto vkCmdSetPrimitiveTopologyEXT =
+ (PFN_vkCmdSetPrimitiveTopologyEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetPrimitiveTopologyEXT");
+ auto vkCmdSetViewportWithCountEXT =
+ (PFN_vkCmdSetViewportWithCountEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetViewportWithCountEXT");
+ auto vkCmdSetScissorWithCountEXT =
+ (PFN_vkCmdSetScissorWithCountEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetScissorWithCountEXT");
+ auto vkCmdSetDepthTestEnableEXT =
+ (PFN_vkCmdSetDepthTestEnableEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetDepthTestEnableEXT");
+ auto vkCmdSetDepthWriteEnableEXT =
+ (PFN_vkCmdSetDepthWriteEnableEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetDepthWriteEnableEXT");
+ auto vkCmdSetDepthCompareOpEXT =
+ (PFN_vkCmdSetDepthCompareOpEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetDepthCompareOpEXT");
+ auto vkCmdSetDepthBoundsTestEnableEXT =
+ (PFN_vkCmdSetDepthBoundsTestEnableEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetDepthBoundsTestEnableEXT");
+ auto vkCmdSetStencilTestEnableEXT =
+ (PFN_vkCmdSetStencilTestEnableEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetStencilTestEnableEXT");
+ auto vkCmdSetStencilOpEXT = (PFN_vkCmdSetStencilOpEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetStencilOpEXT");
+
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ CreatePipelineHelper pipe(*this);
+ pipe.InitInfo();
+ const VkDynamicState dyn_states[] = {
+ VK_DYNAMIC_STATE_CULL_MODE_EXT, VK_DYNAMIC_STATE_FRONT_FACE_EXT,
+ VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT, VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT,
+ VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT, VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT,
+ VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT, VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT,
+ VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT, VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT,
+ VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT, VK_DYNAMIC_STATE_STENCIL_OP_EXT,
+ };
+ VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
+ dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
+ dyn_state_ci.dynamicStateCount = size(dyn_states);
+ dyn_state_ci.pDynamicStates = dyn_states;
+ pipe.dyn_state_ci_ = dyn_state_ci;
+ pipe.vp_state_ci_.viewportCount = 0;
+ pipe.vp_state_ci_.scissorCount = 0;
+ pipe.InitState();
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03378");
+ pipe.CreateGraphicsPipeline();
+ m_errorMonitor->VerifyFound();
+
+ VkCommandBufferObj commandBuffer(m_device, m_commandPool);
+ commandBuffer.begin();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetCullModeEXT-None-03384");
+ vkCmdSetCullModeEXT(commandBuffer.handle(), VK_CULL_MODE_NONE);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetDepthBoundsTestEnableEXT-None-03349");
+ vkCmdSetDepthBoundsTestEnableEXT(commandBuffer.handle(), VK_FALSE);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetDepthCompareOpEXT-None-03353");
+ vkCmdSetDepthCompareOpEXT(commandBuffer.handle(), VK_COMPARE_OP_NEVER);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetDepthTestEnableEXT-None-03352");
+ vkCmdSetDepthTestEnableEXT(commandBuffer.handle(), VK_FALSE);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetDepthWriteEnableEXT-None-03354");
+ vkCmdSetDepthWriteEnableEXT(commandBuffer.handle(), VK_FALSE);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetFrontFaceEXT-None-03383");
+ vkCmdSetFrontFaceEXT(commandBuffer.handle(), VK_FRONT_FACE_CLOCKWISE);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetPrimitiveTopologyEXT-None-03347");
+ vkCmdSetPrimitiveTopologyEXT(commandBuffer.handle(), VK_PRIMITIVE_TOPOLOGY_POINT_LIST);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissorWithCountEXT-None-03396");
+ VkRect2D scissor = {{0, 0}, {1, 1}};
+ vkCmdSetScissorWithCountEXT(commandBuffer.handle(), 1, &scissor);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetStencilOpEXT-None-03351");
+ vkCmdSetStencilOpEXT(commandBuffer.handle(), VK_STENCIL_FACE_BACK_BIT, VK_STENCIL_OP_ZERO, VK_STENCIL_OP_ZERO,
+ VK_STENCIL_OP_ZERO, VK_COMPARE_OP_NEVER);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetStencilTestEnableEXT-None-03350");
+ vkCmdSetStencilTestEnableEXT(commandBuffer.handle(), VK_FALSE);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewportWithCountEXT-None-03393");
+ VkViewport viewport = {0, 0, 1, 1, 0.0f, 0.0f};
+ vkCmdSetViewportWithCountEXT(commandBuffer.handle(), 1, &viewport);
+ m_errorMonitor->VerifyFound();
+
+ commandBuffer.end();
+}
+
+TEST_F(VkLayerTest, ValidateExtendedDynamicStateEnabled) {
+ TEST_DESCRIPTION("Validate VK_EXT_extended_dynamic_state VUs");
+
+ uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
+ if (version < VK_API_VERSION_1_1) {
+ printf("%s At least Vulkan version 1.1 is required, skipping test.\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
+ } else {
+ printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
+ return;
+ }
+
+ auto extended_dynamic_state_features = lvl_init_struct<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>();
+ auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2>(&extended_dynamic_state_features);
+ vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
+ if (!extended_dynamic_state_features.extendedDynamicState) {
+ printf("%s Test requires (unsupported) extendedDynamicState, skipping\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
+
+ auto vkCmdSetPrimitiveTopologyEXT =
+ (PFN_vkCmdSetPrimitiveTopologyEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetPrimitiveTopologyEXT");
+ auto vkCmdSetViewportWithCountEXT =
+ (PFN_vkCmdSetViewportWithCountEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetViewportWithCountEXT");
+ auto vkCmdSetScissorWithCountEXT =
+ (PFN_vkCmdSetScissorWithCountEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetScissorWithCountEXT");
+ auto vkCmdBindVertexBuffers2EXT =
+ (PFN_vkCmdBindVertexBuffers2EXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBindVertexBuffers2EXT");
+
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ // Verify viewportCount and scissorCount are specified as zero.
+ {
+ CreatePipelineHelper pipe(*this);
+ pipe.InitInfo();
+ const VkDynamicState dyn_states[] = {
+ VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT,
+ VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT,
+ };
+ VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
+ dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
+ dyn_state_ci.dynamicStateCount = size(dyn_states);
+ dyn_state_ci.pDynamicStates = dyn_states;
+ pipe.dyn_state_ci_ = dyn_state_ci;
+ pipe.InitState();
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03379");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-03380");
+ pipe.CreateGraphicsPipeline();
+ m_errorMonitor->VerifyFound();
+ }
+
+ const VkDynamicState dyn_states[] = {
+ VK_DYNAMIC_STATE_CULL_MODE_EXT, VK_DYNAMIC_STATE_FRONT_FACE_EXT,
+ VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT, VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT,
+ VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT, VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE_EXT,
+ VK_DYNAMIC_STATE_DEPTH_TEST_ENABLE_EXT, VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT,
+ VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT, VK_DYNAMIC_STATE_DEPTH_BOUNDS_TEST_ENABLE_EXT,
+ VK_DYNAMIC_STATE_STENCIL_TEST_ENABLE_EXT, VK_DYNAMIC_STATE_STENCIL_OP_EXT,
+ };
+
+ // Verify dupes of every state.
+ for (size_t i = 0; i < size(dyn_states); ++i) {
+ CreatePipelineHelper pipe(*this);
+ pipe.InitInfo();
+ VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
+ dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
+ dyn_state_ci.dynamicStateCount = 2;
+ VkDynamicState dyn_state_dupes[2] = {dyn_states[i], dyn_states[i]};
+ dyn_state_ci.pDynamicStates = dyn_state_dupes;
+ pipe.dyn_state_ci_ = dyn_state_ci;
+ if (dyn_states[i] == VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT) {
+ pipe.vp_state_ci_.viewportCount = 0;
+ }
+ if (dyn_states[i] == VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT) {
+ pipe.vp_state_ci_.scissorCount = 0;
+ }
+ pipe.InitState();
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPipelineDynamicStateCreateInfo-pDynamicStates-01442");
+ pipe.CreateGraphicsPipeline();
+ m_errorMonitor->VerifyFound();
+ }
+
+ // Verify each vkCmdSet command
+ CreatePipelineHelper pipe(*this);
+ pipe.InitInfo();
+ VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
+ dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
+ dyn_state_ci.dynamicStateCount = size(dyn_states);
+ dyn_state_ci.pDynamicStates = dyn_states;
+ pipe.dyn_state_ci_ = dyn_state_ci;
+ pipe.vp_state_ci_.viewportCount = 0;
+ pipe.vp_state_ci_.scissorCount = 0;
+ pipe.vi_ci_.vertexBindingDescriptionCount = 1;
+ VkVertexInputBindingDescription inputBinding = {0, sizeof(float), VK_VERTEX_INPUT_RATE_VERTEX};
+ pipe.vi_ci_.pVertexBindingDescriptions = &inputBinding;
+ pipe.vi_ci_.vertexAttributeDescriptionCount = 1;
+ VkVertexInputAttributeDescription attribute = {0, 0, VK_FORMAT_R32_SFLOAT, 0};
+ pipe.vi_ci_.pVertexAttributeDescriptions = &attribute;
+ pipe.InitState();
+ pipe.CreateGraphicsPipeline();
+
+ VkBufferObj buffer;
+ buffer.init(*m_device, 16, 0, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
+ std::vector<VkBuffer> buffers(m_device->props.limits.maxVertexInputBindings + 1ull, buffer.handle());
+ std::vector<VkDeviceSize> offsets(buffers.size(), 0);
+
+ VkCommandBufferObj commandBuffer(m_device, m_commandPool);
+ commandBuffer.begin();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindVertexBuffers2EXT-firstBinding-03355");
+ vkCmdBindVertexBuffers2EXT(commandBuffer.handle(), m_device->props.limits.maxVertexInputBindings, 1, buffers.data(),
+ offsets.data(), 0, 0);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindVertexBuffers2EXT-firstBinding-03356");
+ vkCmdBindVertexBuffers2EXT(commandBuffer.handle(), 0, m_device->props.limits.maxVertexInputBindings + 1, buffers.data(),
+ offsets.data(), 0, 0);
+ m_errorMonitor->VerifyFound();
+
+ {
+ VkBufferObj bufferWrongUsage;
+ bufferWrongUsage.init(*m_device, 16, 0, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindVertexBuffers2EXT-pBuffers-03359");
+ VkBuffer buffers2[1] = {bufferWrongUsage.handle()};
+ VkDeviceSize offsets2[1] = {};
+ vkCmdBindVertexBuffers2EXT(commandBuffer.handle(), 0, 1, buffers2, offsets2, 0, 0);
+ m_errorMonitor->VerifyFound();
+ }
+
+ {
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindVertexBuffers2EXT-pBuffers-04111");
+ m_errorMonitor->SetUnexpectedError("UNASSIGNED-GeneralParameterError-RequiredParameter");
+ m_errorMonitor->SetUnexpectedError("VUID-vkCmdBindVertexBuffers2EXT-pBuffers-parameter");
+ VkBuffer buffers2[1] = {VK_NULL_HANDLE};
+ VkDeviceSize offsets2[1] = {16};
+ VkDeviceSize strides[1] = {m_device->props.limits.maxVertexInputBindingStride + 1ull};
+ vkCmdBindVertexBuffers2EXT(commandBuffer.handle(), 0, 1, buffers2, offsets2, 0, 0);
+ m_errorMonitor->VerifyFound();
+
+ buffers2[0] = buffers[0];
+ VkDeviceSize sizes[1] = {16};
+ // m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindVertexBuffers2EXT-pBuffers-04112");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindVertexBuffers2EXT-pOffsets-03357");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindVertexBuffers2EXT-pSizes-03358");
+ vkCmdBindVertexBuffers2EXT(commandBuffer.handle(), 0, 1, buffers2, offsets2, sizes, 0);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindVertexBuffers2EXT-pStrides-03362");
+ vkCmdBindVertexBuffers2EXT(commandBuffer.handle(), 0, 1, buffers2, offsets2, 0, strides);
+ m_errorMonitor->VerifyFound();
+ }
+
+ commandBuffer.BeginRenderPass(m_renderPassBeginInfo);
+
+ CreatePipelineHelper pipe2(*this);
+ pipe2.InitInfo();
+ VkPipelineDynamicStateCreateInfo dyn_state_ci2 = {};
+ dyn_state_ci2.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
+ dyn_state_ci2.dynamicStateCount = 1;
+ VkDynamicState dynamic_state2 = VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT;
+ dyn_state_ci2.pDynamicStates = &dynamic_state2;
+ pipe2.dyn_state_ci_ = dyn_state_ci2;
+ pipe2.vp_state_ci_.viewportCount = 0;
+ pipe2.InitState();
+ pipe2.CreateGraphicsPipeline();
+ vk::CmdBindPipeline(commandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe2.pipeline_);
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-viewportCount-03417");
+ vk::CmdDraw(commandBuffer.handle(), 1, 1, 0, 0);
+ m_errorMonitor->VerifyFound();
+
+ CreatePipelineHelper pipe3(*this);
+ pipe3.InitInfo();
+ VkPipelineDynamicStateCreateInfo dyn_state_ci3 = {};
+ dyn_state_ci3.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
+ dyn_state_ci3.dynamicStateCount = 1;
+ VkDynamicState dynamic_state3 = VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT_EXT;
+ dyn_state_ci3.pDynamicStates = &dynamic_state3;
+ pipe3.dyn_state_ci_ = dyn_state_ci3;
+ pipe3.vp_state_ci_.scissorCount = 0;
+ pipe3.InitState();
+ pipe3.CreateGraphicsPipeline();
+ vk::CmdBindPipeline(commandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe3.pipeline_);
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-scissorCount-03418");
+ vk::CmdDraw(commandBuffer.handle(), 1, 1, 0, 0);
+ m_errorMonitor->VerifyFound();
+
+ vk::CmdBindPipeline(commandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
+
+ VkDeviceSize strides[1] = {0};
+ vkCmdSetPrimitiveTopologyEXT(commandBuffer.handle(), VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP);
+ vkCmdBindVertexBuffers2EXT(commandBuffer.handle(), 0, 1, buffers.data(), offsets.data(), 0, strides);
+ VkRect2D scissor = {{0, 0}, {1, 1}};
+ vkCmdSetScissorWithCountEXT(commandBuffer.handle(), 1, &scissor);
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindVertexBuffers2EXT-pStrides-03363");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-viewportCount-03419");
+ vk::CmdDraw(commandBuffer.handle(), 1, 1, 0, 0);
+ m_errorMonitor->VerifyFound();
+ VkViewport viewport = {0, 0, 1, 1, 0.0f, 0.0f};
+ vkCmdSetViewportWithCountEXT(commandBuffer.handle(), 1, &viewport);
+ strides[0] = 4;
+ vkCmdBindVertexBuffers2EXT(commandBuffer.handle(), 0, 1, buffers.data(), offsets.data(), 0, strides);
+
+ vkCmdSetPrimitiveTopologyEXT(commandBuffer.handle(), VK_PRIMITIVE_TOPOLOGY_LINE_LIST);
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDraw-primitiveTopology-03420");
+ vk::CmdDraw(commandBuffer.handle(), 1, 1, 0, 0);
+ m_errorMonitor->VerifyFound();
+
+ vk::CmdEndRenderPass(commandBuffer.handle());
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewportWithCountEXT-viewportCount-03394");
+ m_errorMonitor->SetUnexpectedError("VUID-vkCmdSetViewportWithCountEXT-viewportCount-arraylength");
+ VkViewport viewport2 = {
+ 0, 0, 1, 1, 0.0f, 0.0f,
+ };
+ vkCmdSetViewportWithCountEXT(commandBuffer.handle(), 0, &viewport2);
+ m_errorMonitor->VerifyFound();
+
+ {
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissorWithCountEXT-offset-03400");
+ VkRect2D scissor2 = {{1, 0}, {INT32_MAX, 16}};
+ vkCmdSetScissorWithCountEXT(commandBuffer.handle(), 1, &scissor2);
+ m_errorMonitor->VerifyFound();
+ }
+
+ {
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissorWithCountEXT-offset-03401");
+ VkRect2D scissor2 = {{0, 1}, {16, INT32_MAX}};
+ vkCmdSetScissorWithCountEXT(commandBuffer.handle(), 1, &scissor2);
+ m_errorMonitor->VerifyFound();
+ }
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissorWithCountEXT-scissorCount-03397");
+ m_errorMonitor->SetUnexpectedError("VUID-vkCmdSetScissorWithCountEXT-scissorCount-arraylength");
+ vkCmdSetScissorWithCountEXT(commandBuffer.handle(), 0, 0);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissorWithCountEXT-x-03399");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissorWithCountEXT-x-03399");
+ VkRect2D scissor3 = {{-1, -1}, {0, 0}};
+ vkCmdSetScissorWithCountEXT(commandBuffer.handle(), 1, &scissor3);
+ m_errorMonitor->VerifyFound();
+
+ commandBuffer.end();
+}
+
+TEST_F(VkLayerTest, ValidateExtendedDynamicStateEnabledNoMultiview) {
+ TEST_DESCRIPTION("Validate VK_EXT_extended_dynamic_state VUs");
+
+ uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
+ if (version < VK_API_VERSION_1_1) {
+ printf("%s At least Vulkan version 1.1 is required, skipping test.\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
+ } else {
+ printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
+ return;
+ }
+
+ auto extended_dynamic_state_features = lvl_init_struct<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>();
+ auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2>(&extended_dynamic_state_features);
+ vk::GetPhysicalDeviceFeatures2(gpu(), &features2);
+ if (!extended_dynamic_state_features.extendedDynamicState) {
+ printf("%s Test requires (unsupported) extendedDynamicState, skipping\n", kSkipPrefix);
+ return;
+ }
+
+ features2.features.multiViewport = VK_FALSE;
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
+
+ auto vkCmdSetViewportWithCountEXT =
+ (PFN_vkCmdSetViewportWithCountEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetViewportWithCountEXT");
+ auto vkCmdSetScissorWithCountEXT =
+ (PFN_vkCmdSetScissorWithCountEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetScissorWithCountEXT");
+
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ VkCommandBufferObj commandBuffer(m_device, m_commandPool);
+ commandBuffer.begin();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewportWithCountEXT-viewportCount-03395");
+ VkViewport viewport = {0, 0, 1, 1, 0.0f, 0.0f};
+ VkViewport viewports[] = {viewport, viewport};
+ vkCmdSetViewportWithCountEXT(commandBuffer.handle(), size(viewports), viewports);
+ m_errorMonitor->VerifyFound();
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissorWithCountEXT-scissorCount-03398");
+ VkRect2D scissor = {{0, 0}, {1, 1}};
+ VkRect2D scissors[] = {scissor, scissor};
+ vkCmdSetScissorWithCountEXT(commandBuffer.handle(), size(scissors), scissors);
+ m_errorMonitor->VerifyFound();
+
+ commandBuffer.end();
+}
diff --git a/tests/vklayertests_pipeline_shader.cpp b/tests/vklayertests_pipeline_shader.cpp
index ce4e421..338d9a5 100644
--- a/tests/vklayertests_pipeline_shader.cpp
+++ b/tests/vklayertests_pipeline_shader.cpp
@@ -195,9 +195,7 @@
features.independentBlend = VK_FALSE;
ASSERT_NO_FATAL_FAILURE(Init(&features));
- m_errorMonitor->SetDesiredFailureMsg(
- kErrorBit,
- "Invalid Pipeline CreateInfo: If independent blend feature not enabled, all elements of pAttachments must be identical");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605");
VkDescriptorSetObj descriptorSet(m_device);
descriptorSet.AppendDummy();
@@ -249,6 +247,98 @@
vk::DestroyRenderPass(m_device->device(), renderpass, NULL);
}
+TEST_F(VkLayerTest, BlendingOnFormatWithoutBlendingSupport) {
+ TEST_DESCRIPTION("Test that blending is not enabled with a format not support blending");
+ VkPhysicalDeviceFeatures features = {};
+ features.independentBlend = VK_FALSE;
+ ASSERT_NO_FATAL_FAILURE(Init(&features));
+
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkGraphicsPipelineCreateInfo-blendEnable-02023");
+
+ VkFormat non_blending_format = VK_FORMAT_UNDEFINED;
+ for (uint32_t i = 1; i <= VK_FORMAT_ASTC_12x12_SRGB_BLOCK; i++) {
+ VkFormatProperties format_props = m_device->format_properties(static_cast<VkFormat>(i));
+ if ((format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) &&
+ !(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT)) {
+ non_blending_format = static_cast<VkFormat>(i);
+ break;
+ }
+ }
+
+ if (non_blending_format == VK_FORMAT_UNDEFINED) {
+ printf("%s Unable to find a color attachment format with no blending support. Skipping test.\n", kSkipPrefix);
+ return;
+ }
+
+ VkDescriptorSetObj descriptorSet(m_device);
+ descriptorSet.AppendDummy();
+ descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
+
+ VkPipelineObj pipeline(m_device);
+ // Create a renderPass with two color attachments
+ VkAttachmentReference attachment = {};
+ attachment.layout = VK_IMAGE_LAYOUT_GENERAL;
+
+ VkSubpassDescription subpass = {};
+ subpass.pColorAttachments = &attachment;
+ subpass.colorAttachmentCount = 1;
+
+ VkRenderPassCreateInfo rpci = {};
+ rpci.subpassCount = 1;
+ rpci.pSubpasses = &subpass;
+ rpci.attachmentCount = 1;
+
+ VkAttachmentDescription attach_desc = {};
+ attach_desc.format = non_blending_format;
+ attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
+ attach_desc.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ attach_desc.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
+
+ rpci.pAttachments = &attach_desc;
+ rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
+
+ VkRenderPass rp;
+ vk::CreateRenderPass(m_device->device(), &rpci, NULL, &rp);
+ VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
+ pipeline.AddShader(&vs);
+
+ VkPipelineColorBlendAttachmentState att_state = {};
+ att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
+ att_state.blendEnable = VK_TRUE;
+ pipeline.AddColorAttachment(0, att_state);
+ pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
+
+ VkImageObj image(m_device);
+ image.Init(32, 32, 1, non_blending_format, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT);
+ VkImageView imageView = image.targetView(non_blending_format);
+
+ VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
+ VkFramebuffer fb;
+ vk::CreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
+
+ VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
+ nullptr,
+ rp,
+ fb,
+ {{
+ 0,
+ 0,
+ },
+ {32, 32}},
+ 0,
+ nullptr};
+
+ m_commandBuffer->begin();
+ m_commandBuffer->BeginRenderPass(rpbi);
+ vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.handle());
+ m_commandBuffer->EndRenderPass();
+ m_commandBuffer->end();
+
+ m_errorMonitor->VerifyFound();
+ vk::DestroyRenderPass(m_device->device(), rp, NULL);
+ vk::DestroyFramebuffer(m_device->device(), fb, NULL);
+}
+
// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
TEST_DESCRIPTION(
@@ -394,7 +484,7 @@
ASSERT_NO_FATAL_FAILURE(Init());
- if (!m_device->phy().features().geometryShader) {
+ if (!m_device->phy().features().geometryShader || !m_device->phy().features().shaderTessellationAndGeometryPointSize) {
printf("%s Device does not support geometry shaders; Skipped.\n", kSkipPrefix);
return;
}
@@ -486,7 +576,7 @@
ASSERT_NO_FATAL_FAILURE(Init());
- if (!m_device->phy().features().geometryShader) {
+ if (!m_device->phy().features().geometryShader || !m_device->phy().features().shaderTessellationAndGeometryPointSize) {
printf("%s Device does not support geometry shaders; Skipped.\n", kSkipPrefix);
return;
}
@@ -561,6 +651,107 @@
vk::DestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
}
+TEST_F(VkLayerTest, CreatePipelineExcessSubsampledPerStageDescriptors) {
+ TEST_DESCRIPTION("Attempt to create a pipeline layout where total subsampled descriptors exceed limits");
+
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
+ VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ // Check extension support
+ if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME)) {
+ printf("%s test requires %s extension. Skipping.\n", kSkipPrefix, VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME);
+ return;
+ }
+
+ m_device_extension_names.push_back(VK_EXT_FRAGMENT_DENSITY_MAP_2_EXTENSION_NAME);
+
+ PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
+ (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
+ VkPhysicalDeviceFragmentDensityMap2PropertiesEXT density_map2_properties =
+ lvl_init_struct<VkPhysicalDeviceFragmentDensityMap2PropertiesEXT>();
+ VkPhysicalDeviceProperties2KHR properties2 = lvl_init_struct<VkPhysicalDeviceProperties2KHR>(&density_map2_properties);
+ vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ uint32_t max_subsampled_samplers = density_map2_properties.maxDescriptorSetSubsampledSamplers;
+
+ // Note: Adding this check in case mock ICDs don't initialize min-max values correctly
+ if (max_subsampled_samplers == 0) {
+ printf("%s maxDescriptorSetSubsampledSamplers limit (%d) must be greater than 0. Skipping.\n", kSkipPrefix,
+ max_subsampled_samplers);
+ return;
+ }
+
+ if (max_subsampled_samplers >= properties2.properties.limits.maxDescriptorSetSamplers) {
+ printf("%s test assumes maxDescriptorSetSubsampledSamplers limit (%d) is less than overall sampler limit (%d). Skipping.\n",
+ kSkipPrefix, max_subsampled_samplers, properties2.properties.limits.maxDescriptorSetSamplers);
+ return;
+ }
+
+ VkDescriptorSetLayoutBinding dslb = {};
+ std::vector<VkDescriptorSetLayoutBinding> dslb_vec = {};
+ VkDescriptorSetLayout ds_layout = VK_NULL_HANDLE;
+ VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
+ ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
+ ds_layout_ci.pNext = NULL;
+ VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
+ pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
+ pipeline_layout_ci.pNext = NULL;
+ pipeline_layout_ci.setLayoutCount = 1;
+ pipeline_layout_ci.pSetLayouts = &ds_layout;
+ VkPipelineLayout pipeline_layout = VK_NULL_HANDLE;
+
+ VkSamplerCreateInfo sampler_info = SafeSaneSamplerCreateInfo();
+ sampler_info.flags |= VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT;
+ VkSampler sampler = VK_NULL_HANDLE;
+ VkResult err = vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
+ ASSERT_VK_SUCCESS(err);
+
+ // just make all the immutable samplers point to the same sampler
+ std::vector<VkSampler> immutableSamplers;
+ immutableSamplers.resize(max_subsampled_samplers);
+ for (uint32_t sampler_idx = 0; sampler_idx < max_subsampled_samplers; sampler_idx++) {
+ immutableSamplers[sampler_idx] = sampler;
+ }
+
+ // VU 03566 - too many subsampled sampler type descriptors across stages
+ dslb_vec.clear();
+ dslb.binding = 0;
+ dslb.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
+ dslb.descriptorCount = max_subsampled_samplers;
+ dslb.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
+ dslb.pImmutableSamplers = &immutableSamplers[0];
+ dslb_vec.push_back(dslb);
+ dslb.binding = 1;
+ dslb.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
+ dslb.descriptorCount = max_subsampled_samplers;
+ dslb.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
+ dslb_vec.push_back(dslb);
+
+ ds_layout_ci.bindingCount = dslb_vec.size();
+ ds_layout_ci.pBindings = dslb_vec.data();
+ err = vk::CreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
+ ASSERT_VK_SUCCESS(err);
+
+ const char *max_sampler_vuid = "VUID-VkPipelineLayoutCreateInfo-pImmutableSamplers-03566";
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, max_sampler_vuid);
+
+ err = vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
+ m_errorMonitor->VerifyFound();
+ vk::DestroyPipelineLayout(m_device->device(), pipeline_layout, NULL); // Unnecessary but harmless if test passed
+ pipeline_layout = VK_NULL_HANDLE;
+ vk::DestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
+}
+
TEST_F(VkLayerTest, CreatePipelineLayoutExcessPerStageDescriptors) {
TEST_DESCRIPTION("Attempt to create a pipeline layout where total descriptors exceed per-stage limits");
@@ -1301,6 +1492,10 @@
TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
TEST_DESCRIPTION("Attempt to draw with a command buffer that is invalid due to a pipeline dependency being destroyed.");
ASSERT_NO_FATAL_FAILURE(Init());
+ if (IsPlatform(kNexusPlayer)) {
+ printf("%s This test should not run on Nexus Player\n", kSkipPrefix);
+ return;
+ }
ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
{
@@ -1331,10 +1526,14 @@
// Enable VK_KHR_draw_indirect_count for KHR variants
ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ VkPhysicalDeviceVulkan12Features features12 = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES, nullptr};
if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
+ if (DeviceValidationVersion() >= VK_API_VERSION_1_2) {
+ features12.drawIndirectCount = VK_TRUE;
+ }
}
- ASSERT_NO_FATAL_FAILURE(InitState());
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features12));
bool has_khr_indirect = DeviceExtensionEnabled(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
@@ -1576,7 +1775,7 @@
VkPipelineShaderStageCreateInfo shaderStage = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
auto set_info = [&](CreatePipelineHelper &helper) { helper.shader_stages_ = {shaderStage}; };
- CreatePipelineHelper::OneshotTest(*this, set_info, kErrorBit, "Invalid Pipeline CreateInfo State: Vertex Shader required");
+ CreatePipelineHelper::OneshotTest(*this, set_info, kErrorBit, "VUID-VkGraphicsPipelineCreateInfo-stage-00727");
// Finally, check the string validation for the shader stage pName variable. Correct the shader stage data, and bork the
// string before calling again
@@ -2590,6 +2789,10 @@
TEST_DESCRIPTION("Test non-1.0 lineWidth errors when pipeline is created and in vkCmdSetLineWidth");
VkPhysicalDeviceFeatures features{};
ASSERT_NO_FATAL_FAILURE(Init(&features));
+ if (IsPlatform(kNexusPlayer)) {
+ printf("%s This test should not run on Nexus Player\n", kSkipPrefix);
+ return;
+ }
ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
const std::vector<float> test_cases = {-1.0f, 0.0f, NearestSmaller(1.0f), NearestGreater(1.0f), NAN};
@@ -2611,6 +2814,47 @@
}
}
+TEST_F(VkLayerTest, PipelineCreationCacheControl) {
+ TEST_DESCRIPTION("Test VK_EXT_pipeline_creation_cache_control");
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_EXT_PIPELINE_CREATION_CACHE_CONTROL_EXTENSION_NAME);
+ } else {
+ printf("%s VK_EXT_pipeline_creation_cache_control not supported, skipping tests\n", kSkipPrefix);
+ return;
+ }
+
+ VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT cache_control_features = {};
+ cache_control_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT;
+ cache_control_features.pNext = nullptr;
+ cache_control_features.pipelineCreationCacheControl = VK_FALSE; // Tests all assume feature is off
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &cache_control_features));
+ ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+ const auto set_graphics_flags = [&](CreatePipelineHelper &helper) {
+ helper.gp_ci_.flags = VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT;
+ };
+ CreatePipelineHelper::OneshotTest(*this, set_graphics_flags, kErrorBit,
+ "VUID-VkGraphicsPipelineCreateInfo-pipelineCreationCacheControl-02878");
+
+ const auto set_compute_flags = [&](CreateComputePipelineHelper &helper) {
+ helper.cp_ci_.flags = VK_PIPELINE_CREATE_EARLY_RETURN_ON_FAILURE_BIT_EXT;
+ };
+ CreateComputePipelineHelper::OneshotTest(*this, set_compute_flags, kErrorBit,
+ "VUID-VkComputePipelineCreateInfo-pipelineCreationCacheControl-02875");
+
+ VkPipelineCache pipeline_cache;
+ VkPipelineCacheCreateInfo cache_create_info = {};
+ cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
+ cache_create_info.pNext = nullptr;
+ cache_create_info.initialDataSize = 0;
+ cache_create_info.flags = VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT;
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPipelineCacheCreateInfo-pipelineCreationCacheControl-02892");
+ vk::CreatePipelineCache(m_device->device(), &cache_create_info, nullptr, &pipeline_cache);
+ m_errorMonitor->VerifyFound();
+}
+
TEST_F(VkLayerTest, VUID_VkVertexInputBindingDescription_binding_00618) {
TEST_DESCRIPTION(
"Test VUID-VkVertexInputBindingDescription-binding-00618: binding must be less than "
@@ -3337,7 +3581,7 @@
pipe.pipeline_layout_ = VkPipelineLayoutObj(m_device, {}, {push_constant_range});
m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
- "Push constant range covering variable starting at offset 0 not declared in layout");
+ "Shader push-constant buffer member 0 at offset 0 is not declared in pipeline layout");
pipe.CreateGraphicsPipeline();
m_errorMonitor->VerifyFound();
}
@@ -4501,6 +4745,14 @@
"limit");
ASSERT_NO_FATAL_FAILURE(Init());
+ if (IsPlatform(kPixel3)) {
+ printf("%s This test should not run on Pixel 3\n", kSkipPrefix);
+ return;
+ }
+ if (IsPlatform(kPixel3aXL)) {
+ printf("%s This test should not run on Pixel 3a XL\n", kSkipPrefix);
+ return;
+ }
ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
// overflow == 0: no overflow, 1: too many components, 2: location number too large
@@ -4787,7 +5039,7 @@
pipe.InitState();
pipe.pipeline_layout_ = VkPipelineLayoutObj(m_device, {});
/* should have generated an error -- no push constant ranges provided! */
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "not declared in layout");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "not declared in pipeline layout");
pipe.CreateGraphicsPipeline();
m_errorMonitor->VerifyFound();
}
@@ -5160,6 +5412,12 @@
ASSERT_NO_FATAL_FAILURE(InitState());
ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+ const VkFormat ds_format = FindSupportedDepthStencilFormat(gpu());
+ if (ds_format == VK_FORMAT_UNDEFINED) {
+ printf("%s No Depth + Stencil format found rest of tests skipped.\n", kSkipPrefix);
+ return;
+ }
+
struct TestCase {
VkSampleCountFlagBits color_samples;
VkSampleCountFlagBits depth_samples;
@@ -5181,7 +5439,7 @@
att[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
att[0].finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
- att[1].format = VK_FORMAT_D24_UNORM_S8_UINT;
+ att[1].format = ds_format;
att[1].samples = test_case.depth_samples;
att[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
att[1].finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
@@ -5422,7 +5680,7 @@
}
}
- if (DeviceIsMockICD() || DeviceSimulation()) {
+ if (IsPlatform(kMockICD) || DeviceSimulation()) {
printf("%s Test not supported by MockICD, skipping tests\n", kSkipPrefix);
return;
}
@@ -5506,7 +5764,7 @@
return;
}
- if (DeviceIsMockICD() || DeviceSimulation()) {
+ if (IsPlatform(kMockICD) || DeviceSimulation()) {
printf("%s DevSim doesn't support Vulkan 1.1, skipping tests\n", kSkipPrefix);
return;
}
@@ -5678,7 +5936,7 @@
return;
}
- if (DeviceIsMockICD() || DeviceSimulation()) {
+ if (IsPlatform(kMockICD) || DeviceSimulation()) {
printf("%s DevSim doesn't support Vulkan 1.1, skipping tests\n", kSkipPrefix);
return;
}
@@ -5919,7 +6177,7 @@
"VUID-VkPipelineCreationFeedbackCreateInfoEXT-pipelineStageCreationFeedbackCount-02668",
true);
- if (DeviceIsMockICD() || DeviceSimulation()) {
+ if (IsPlatform(kMockICD) || DeviceSimulation()) {
printf("%s Driver data writeback check not supported by MockICD, skipping.\n", kSkipPrefix);
} else {
m_errorMonitor->ExpectSuccess();
@@ -5998,7 +6256,7 @@
feedback_info.pipelineStageCreationFeedbackCount = 2;
CreateNVRayTracingPipelineHelper::OneshotTest(
- *this, set_feedback, "VUID-VkPipelineCreationFeedbackCreateInfoEXT-pipelineStageCreationFeedbackCount-02670");
+ *this, set_feedback, "VUID-VkPipelineCreationFeedbackCreateInfoEXT-pipelineStageCreationFeedbackCount-02969");
}
TEST_F(VkLayerTest, CreatePipelineCheckShaderImageFootprintEnabled) {
@@ -7049,6 +7307,333 @@
}
}
+TEST_F(VkLayerTest, ValidateRayTracingPipelineNV) {
+ TEST_DESCRIPTION("Validate vkCreateRayTracingPipelinesNV and CreateInfo parameters during ray-tracing pipeline creation");
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_RAY_TRACING_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_NV_RAY_TRACING_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ } else {
+ printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_NV_RAY_TRACING_EXTENSION_NAME);
+ return;
+ }
+
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+
+ auto pipleline_features = lvl_init_struct<VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT>();
+ auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&pipleline_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+ // Set this to true as it is a required feature
+ pipleline_features.pipelineCreationCacheControl = VK_TRUE;
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
+
+ const VkPipelineLayoutObj empty_pipeline_layout(m_device, {});
+ const std::string empty_shader = R"glsl(#version 460
+ #extension GL_NV_ray_tracing : require
+ void main() {}
+ )glsl";
+
+ VkShaderObj rgen_shader(m_device, empty_shader.c_str(), VK_SHADER_STAGE_RAYGEN_BIT_NV, this, "main");
+ VkShaderObj ahit_shader(m_device, empty_shader.c_str(), VK_SHADER_STAGE_ANY_HIT_BIT_NV, this, "main");
+ VkShaderObj chit_shader(m_device, empty_shader.c_str(), VK_SHADER_STAGE_CLOSEST_HIT_BIT_NV, this, "main");
+ VkShaderObj miss_shader(m_device, empty_shader.c_str(), VK_SHADER_STAGE_MISS_BIT_NV, this, "main");
+ VkShaderObj intr_shader(m_device, empty_shader.c_str(), VK_SHADER_STAGE_INTERSECTION_BIT_NV, this, "main");
+ VkShaderObj call_shader(m_device, empty_shader.c_str(), VK_SHADER_STAGE_CALLABLE_BIT_NV, this, "main");
+ m_errorMonitor->VerifyNotFound();
+ PFN_vkCreateRayTracingPipelinesNV vkCreateRayTracingPipelinesNV =
+ reinterpret_cast<PFN_vkCreateRayTracingPipelinesNV>(vk::GetInstanceProcAddr(instance(), "vkCreateRayTracingPipelinesNV"));
+ ASSERT_TRUE(vkCreateRayTracingPipelinesNV != nullptr);
+ VkPipeline pipeline = VK_NULL_HANDLE;
+ VkPipelineShaderStageCreateInfo stage_create_info = {};
+ stage_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+ stage_create_info.stage = VK_SHADER_STAGE_RAYGEN_BIT_NV;
+ ;
+ stage_create_info.module = rgen_shader.handle();
+ stage_create_info.pName = "main";
+ VkRayTracingShaderGroupCreateInfoNV group_create_info = {};
+ group_create_info.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV;
+ group_create_info.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_NV;
+ group_create_info.generalShader = VK_SHADER_UNUSED_NV;
+ group_create_info.closestHitShader = VK_SHADER_UNUSED_NV;
+ group_create_info.anyHitShader = VK_SHADER_UNUSED_NV;
+ group_create_info.intersectionShader = VK_SHADER_UNUSED_NV;
+ {
+ VkRayTracingPipelineCreateInfoNV pipeline_ci = {};
+ pipeline_ci.sType = VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV;
+ pipeline_ci.stageCount = 1;
+ pipeline_ci.pStages = &stage_create_info;
+ pipeline_ci.groupCount = 1;
+ pipeline_ci.pGroups = &group_create_info;
+ pipeline_ci.layout = empty_pipeline_layout.handle();
+ pipeline_ci.flags = VK_PIPELINE_CREATE_DERIVATIVE_BIT;
+ pipeline_ci.basePipelineIndex = -1;
+ uint64_t fake_pipeline_id = 0xCADECADE;
+ VkPipeline fake_pipeline_handle = reinterpret_cast<VkPipeline &>(fake_pipeline_id);
+ pipeline_ci.basePipelineHandle = fake_pipeline_handle;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkRayTracingPipelineCreateInfoNV-flags-03421");
+ vkCreateRayTracingPipelinesNV(m_device->handle(), VK_NULL_HANDLE, 1, &pipeline_ci, nullptr, &pipeline);
+ m_errorMonitor->VerifyFound();
+ pipeline_ci.basePipelineHandle = VK_NULL_HANDLE;
+ pipeline_ci.basePipelineIndex = 10;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCreateRayTracingPipelinesNV-flags-03415");
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkRayTracingPipelineCreateInfoNV-flags-03422");
+ vkCreateRayTracingPipelinesNV(m_device->handle(), VK_NULL_HANDLE, 1, &pipeline_ci, nullptr, &pipeline);
+ m_errorMonitor->VerifyFound();
+ }
+ {
+ VkRayTracingPipelineCreateInfoNV pipeline_ci = {};
+ pipeline_ci.sType = VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV;
+ pipeline_ci.stageCount = 1;
+ pipeline_ci.pStages = &stage_create_info;
+ pipeline_ci.groupCount = 1;
+ pipeline_ci.pGroups = &group_create_info;
+ pipeline_ci.layout = empty_pipeline_layout.handle();
+ pipeline_ci.flags = VK_PIPELINE_CREATE_DEFER_COMPILE_BIT_NV | VK_PIPELINE_CREATE_FAIL_ON_PIPELINE_COMPILE_REQUIRED_BIT_EXT;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkRayTracingPipelineCreateInfoNV-flags-02957");
+ vkCreateRayTracingPipelinesNV(m_device->handle(), VK_NULL_HANDLE, 1, &pipeline_ci, nullptr, &pipeline);
+ m_errorMonitor->VerifyFound();
+ }
+ {
+ VkRayTracingPipelineCreateInfoNV pipeline_ci = {};
+ pipeline_ci.sType = VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV;
+ pipeline_ci.stageCount = 1;
+ pipeline_ci.pStages = &stage_create_info;
+ pipeline_ci.groupCount = 1;
+ pipeline_ci.pGroups = &group_create_info;
+ pipeline_ci.layout = empty_pipeline_layout.handle();
+ pipeline_ci.flags = VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkRayTracingPipelineCreateInfoNV-flags-02904");
+ vkCreateRayTracingPipelinesNV(m_device->handle(), VK_NULL_HANDLE, 1, &pipeline_ci, nullptr, &pipeline);
+ m_errorMonitor->VerifyFound();
+ pipeline_ci.flags = VK_PIPELINE_CREATE_LIBRARY_BIT_KHR;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkRayTracingPipelineCreateInfoNV-flags-03456");
+ vkCreateRayTracingPipelinesNV(m_device->handle(), VK_NULL_HANDLE, 1, &pipeline_ci, nullptr, &pipeline);
+ m_errorMonitor->VerifyFound();
+ pipeline_ci.flags = VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkRayTracingPipelineCreateInfoNV-flags-03458");
+ vkCreateRayTracingPipelinesNV(m_device->handle(), VK_NULL_HANDLE, 1, &pipeline_ci, nullptr, &pipeline);
+ m_errorMonitor->VerifyFound();
+ pipeline_ci.flags = VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkRayTracingPipelineCreateInfoNV-flags-03459");
+ vkCreateRayTracingPipelinesNV(m_device->handle(), VK_NULL_HANDLE, 1, &pipeline_ci, nullptr, &pipeline);
+ m_errorMonitor->VerifyFound();
+ pipeline_ci.flags = VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_MISS_SHADERS_BIT_KHR;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkRayTracingPipelineCreateInfoNV-flags-03460");
+ vkCreateRayTracingPipelinesNV(m_device->handle(), VK_NULL_HANDLE, 1, &pipeline_ci, nullptr, &pipeline);
+ m_errorMonitor->VerifyFound();
+ pipeline_ci.flags = VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_INTERSECTION_SHADERS_BIT_KHR;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkRayTracingPipelineCreateInfoNV-flags-03461");
+ vkCreateRayTracingPipelinesNV(m_device->handle(), VK_NULL_HANDLE, 1, &pipeline_ci, nullptr, &pipeline);
+ m_errorMonitor->VerifyFound();
+ pipeline_ci.flags = VK_PIPELINE_CREATE_RAY_TRACING_SKIP_AABBS_BIT_KHR;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkRayTracingPipelineCreateInfoNV-flags-03462");
+ vkCreateRayTracingPipelinesNV(m_device->handle(), VK_NULL_HANDLE, 1, &pipeline_ci, nullptr, &pipeline);
+ m_errorMonitor->VerifyFound();
+ pipeline_ci.flags = VK_PIPELINE_CREATE_RAY_TRACING_SKIP_TRIANGLES_BIT_KHR;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkRayTracingPipelineCreateInfoNV-flags-03463");
+ vkCreateRayTracingPipelinesNV(m_device->handle(), VK_NULL_HANDLE, 1, &pipeline_ci, nullptr, &pipeline);
+ m_errorMonitor->VerifyFound();
+ }
+ // test for vkCreateRayTracingPipelinesNV
+ {
+ VkRayTracingPipelineCreateInfoNV pipeline_ci = {};
+ pipeline_ci.sType = VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV;
+ pipeline_ci.stageCount = 1;
+ pipeline_ci.pStages = &stage_create_info;
+ pipeline_ci.groupCount = 1;
+ pipeline_ci.pGroups = &group_create_info;
+ pipeline_ci.layout = empty_pipeline_layout.handle();
+ // appending twice as it is generated twice in auto-validation code
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ "VUID-vkCreateRayTracingPipelinesNV-createInfoCount-arraylength");
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ "VUID-vkCreateRayTracingPipelinesNV-createInfoCount-arraylength");
+ vkCreateRayTracingPipelinesNV(m_device->handle(), VK_NULL_HANDLE, 0, &pipeline_ci, nullptr, &pipeline);
+ m_errorMonitor->VerifyFound();
+ }
+}
+TEST_F(VkLayerTest, RayTracingPipelineCreateInfoKHR) {
+ TEST_DESCRIPTION("Validate CreateInfo parameters during ray-tracing pipeline creation");
+ if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
+ m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ } else {
+ printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_RAY_TRACING_EXTENSION_NAME)) {
+ m_device_extension_names.push_back(VK_KHR_RAY_TRACING_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME);
+ } else {
+ printf("%s Extension %s is not supported.\n", kSkipPrefix, VK_KHR_RAY_TRACING_EXTENSION_NAME);
+ return;
+ }
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
+ auto ray_tracing_features = lvl_init_struct<VkPhysicalDeviceRayTracingFeaturesKHR>();
+ auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&ray_tracing_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+ if (!ray_tracing_features.rayTracing) {
+ printf("%s Feature rayTracing is not supported.\n", kSkipPrefix);
+ return;
+ }
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
+ const VkPipelineLayoutObj empty_pipeline_layout(m_device, {});
+ const std::string empty_shader = R"glsl(#version 460
+ #extension GL_NV_ray_tracing : require
+ void main() {}
+ )glsl";
+ VkShaderObj rgen_shader(m_device, empty_shader.c_str(), VK_SHADER_STAGE_RAYGEN_BIT_KHR, this, "main");
+ VkShaderObj ahit_shader(m_device, empty_shader.c_str(), VK_SHADER_STAGE_ANY_HIT_BIT_KHR, this, "main");
+ VkShaderObj chit_shader(m_device, empty_shader.c_str(), VK_SHADER_STAGE_CLOSEST_HIT_BIT_KHR, this, "main");
+ VkShaderObj miss_shader(m_device, empty_shader.c_str(), VK_SHADER_STAGE_MISS_BIT_KHR, this, "main");
+ VkShaderObj intr_shader(m_device, empty_shader.c_str(), VK_SHADER_STAGE_INTERSECTION_BIT_KHR, this, "main");
+ VkShaderObj call_shader(m_device, empty_shader.c_str(), VK_SHADER_STAGE_CALLABLE_BIT_KHR, this, "main");
+ m_errorMonitor->VerifyNotFound();
+ PFN_vkCreateRayTracingPipelinesKHR vkCreateRayTracingPipelinesKHR =
+ reinterpret_cast<PFN_vkCreateRayTracingPipelinesKHR>(vk::GetInstanceProcAddr(instance(), "vkCreateRayTracingPipelinesKHR"));
+ ASSERT_TRUE(vkCreateRayTracingPipelinesKHR != nullptr);
+ VkPipeline pipeline = VK_NULL_HANDLE;
+ VkPipelineShaderStageCreateInfo stage_create_info = {};
+ stage_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+ stage_create_info.stage = VK_SHADER_STAGE_RAYGEN_BIT_KHR;
+ stage_create_info.module = rgen_shader.handle();
+ stage_create_info.pName = "main";
+ VkRayTracingShaderGroupCreateInfoKHR group_create_info = {};
+ group_create_info.sType = VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR;
+ group_create_info.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR;
+ group_create_info.generalShader = 1; // Bad index here
+ group_create_info.closestHitShader = VK_SHADER_UNUSED_KHR;
+ group_create_info.anyHitShader = VK_SHADER_UNUSED_KHR;
+ group_create_info.intersectionShader = VK_SHADER_UNUSED_KHR;
+ {
+ VkRayTracingPipelineCreateInfoKHR pipeline_ci = {};
+ pipeline_ci.sType = VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR;
+ pipeline_ci.libraries.sType = VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR;
+ pipeline_ci.pStages = &stage_create_info;
+ pipeline_ci.groupCount = 1;
+ pipeline_ci.pGroups = &group_create_info;
+ pipeline_ci.layout = empty_pipeline_layout.handle();
+ pipeline_ci.libraries.libraryCount = 0;
+ pipeline_ci.stageCount = 0;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ "VUID-VkRayTracingPipelineCreateInfoKHR-libraries-02958");
+ vkCreateRayTracingPipelinesKHR(m_device->handle(), VK_NULL_HANDLE, 1, &pipeline_ci, nullptr, &pipeline);
+ m_errorMonitor->VerifyFound();
+ pipeline_ci.stageCount = 1;
+ pipeline_ci.groupCount = 0;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ "VUID-VkRayTracingPipelineCreateInfoKHR-libraries-02959");
+ vkCreateRayTracingPipelinesKHR(m_device->handle(), VK_NULL_HANDLE, 1, &pipeline_ci, nullptr, &pipeline);
+ m_errorMonitor->VerifyFound();
+ pipeline_ci.groupCount = 1;
+ }
+ {
+ VkRayTracingPipelineCreateInfoKHR pipeline_ci = {};
+ pipeline_ci.sType = VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR;
+ pipeline_ci.libraries.sType = VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR;
+ pipeline_ci.stageCount = 1;
+ pipeline_ci.pStages = &stage_create_info;
+ pipeline_ci.groupCount = 1;
+ pipeline_ci.pGroups = &group_create_info;
+ pipeline_ci.layout = empty_pipeline_layout.handle();
+ pipeline_ci.libraries.libraryCount = 1;
+ pipeline_ci.pLibraryInterface = NULL;
+ m_errorMonitor->SetUnexpectedError("VUID-VkPipelineLibraryCreateInfoKHR-pLibraries-parameter");
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
+ "VUID-VkRayTracingPipelineCreateInfoKHR-libraryCount-03466");
+ vkCreateRayTracingPipelinesKHR(m_device->handle(), VK_NULL_HANDLE, 1, &pipeline_ci, nullptr, &pipeline);
+ m_errorMonitor->VerifyFound();
+ }
+ {
+ VkRayTracingPipelineCreateInfoKHR pipeline_ci = {};
+ pipeline_ci.sType = VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR;
+ pipeline_ci.libraries.sType = VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR;
+ pipeline_ci.stageCount = 1;
+ pipeline_ci.pStages = &stage_create_info;
+ pipeline_ci.groupCount = 1;
+ pipeline_ci.pGroups = &group_create_info;
+ pipeline_ci.layout = empty_pipeline_layout.handle();
+ pipeline_ci.flags = VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkRayTracingPipelineCreateInfoKHR-flags-02904");
+ vkCreateRayTracingPipelinesKHR(m_device->handle(), VK_NULL_HANDLE, 1, &pipeline_ci, nullptr, &pipeline);
+ m_errorMonitor->VerifyFound();
+ }
+ {
+ VkRayTracingPipelineCreateInfoKHR pipeline_ci = {};
+ pipeline_ci.sType = VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR;
+ pipeline_ci.libraries.sType = VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR;
+ pipeline_ci.stageCount = 1;
+ pipeline_ci.pStages = &stage_create_info;
+ pipeline_ci.groupCount = 1;
+ pipeline_ci.pGroups = &group_create_info;
+ pipeline_ci.layout = empty_pipeline_layout.handle();
+ pipeline_ci.flags = VK_PIPELINE_CREATE_DERIVATIVE_BIT;
+ pipeline_ci.basePipelineIndex = -1;
+ uint64_t fake_pipeline_id = 0xCADECADE;
+ VkPipeline fake_pipeline_handle = reinterpret_cast<VkPipeline &>(fake_pipeline_id);
+ pipeline_ci.basePipelineHandle = fake_pipeline_handle;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkRayTracingPipelineCreateInfoKHR-flags-03421");
+ vkCreateRayTracingPipelinesKHR(m_device->handle(), VK_NULL_HANDLE, 1, &pipeline_ci, nullptr, &pipeline);
+ m_errorMonitor->VerifyFound();
+ pipeline_ci.basePipelineHandle = VK_NULL_HANDLE;
+ pipeline_ci.basePipelineIndex = 10;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCreateRayTracingPipelinesKHR-flags-03415");
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkRayTracingPipelineCreateInfoKHR-flags-03422");
+ vkCreateRayTracingPipelinesKHR(m_device->handle(), VK_NULL_HANDLE, 1, &pipeline_ci, nullptr, &pipeline);
+ m_errorMonitor->VerifyFound();
+ }
+ {
+ VkRayTracingPipelineCreateInfoKHR pipeline_ci = {};
+ pipeline_ci.sType = VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR;
+ pipeline_ci.libraries.sType = VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR;
+ pipeline_ci.stageCount = 1;
+ pipeline_ci.pStages = &stage_create_info;
+ pipeline_ci.groupCount = 1;
+ pipeline_ci.pGroups = &group_create_info;
+ pipeline_ci.layout = empty_pipeline_layout.handle();
+ pipeline_ci.flags = VK_PIPELINE_CREATE_LIBRARY_BIT_KHR;
+ pipeline_ci.pLibraryInterface = NULL;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkRayTracingPipelineCreateInfoKHR-flags-03465");
+ vkCreateRayTracingPipelinesKHR(m_device->handle(), VK_NULL_HANDLE, 1, &pipeline_ci, nullptr, &pipeline);
+ m_errorMonitor->VerifyFound();
+ }
+ {
+ group_create_info.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_PROCEDURAL_HIT_GROUP_KHR;
+ VkRayTracingPipelineCreateInfoKHR pipeline_ci = {};
+ pipeline_ci.sType = VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR;
+ pipeline_ci.libraries.sType = VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR;
+ pipeline_ci.stageCount = 1;
+ pipeline_ci.pStages = &stage_create_info;
+ pipeline_ci.groupCount = 1;
+ pipeline_ci.pGroups = &group_create_info;
+ pipeline_ci.layout = empty_pipeline_layout.handle();
+ pipeline_ci.flags = VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_ANY_HIT_SHADERS_BIT_KHR;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkRayTracingPipelineCreateInfoKHR-flags-03470");
+ vkCreateRayTracingPipelinesKHR(m_device->handle(), VK_NULL_HANDLE, 1, &pipeline_ci, nullptr, &pipeline);
+ m_errorMonitor->VerifyFound();
+ group_create_info.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_TRIANGLES_HIT_GROUP_KHR;
+ pipeline_ci.flags = VK_PIPELINE_CREATE_RAY_TRACING_NO_NULL_CLOSEST_HIT_SHADERS_BIT_KHR;
+ m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkRayTracingPipelineCreateInfoKHR-flags-03471");
+ vkCreateRayTracingPipelinesKHR(m_device->handle(), VK_NULL_HANDLE, 1, &pipeline_ci, nullptr, &pipeline);
+ m_errorMonitor->VerifyFound();
+ group_create_info.type = VK_RAY_TRACING_SHADER_GROUP_TYPE_GENERAL_KHR;
+ }
+}
+
TEST_F(VkLayerTest, RayTracingPipelineShaderGroupsKHR) {
TEST_DESCRIPTION("Validate shader groups during ray-tracing pipeline creation");
@@ -7679,8 +8264,8 @@
imb.subresourceRange.baseArrayLayer = 0;
imb.subresourceRange.layerCount = 1;
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-01183");
- m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-01183");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-4098");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-4098");
vk::CmdPipelineBarrier(commandBuffer.handle(), VK_PIPELINE_STAGE_VERTEX_SHADER_BIT,
VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT, 0, 0, nullptr, 0, nullptr, 1, &imb);
m_errorMonitor->VerifyFound();
@@ -7899,3 +8484,76 @@
graphics_pipe.CreateGraphicsPipeline();
m_errorMonitor->VerifyFound();
}
+
+TEST_F(VkLayerTest, ValidateGetRayTracingCaptureReplayShaderGroupHandlesKHR) {
+ TEST_DESCRIPTION("Validate vkGetRayTracingCaptureReplayShaderGroupHandlesKHR.");
+ if (!InitFrameworkForRayTracingTest(this, true, m_instance_extension_names, m_device_extension_names, m_errorMonitor, false,
+ false)) {
+ return;
+ }
+ auto ray_tracing_features = lvl_init_struct<VkPhysicalDeviceRayTracingFeaturesKHR>();
+ PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
+ (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
+ auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&ray_tracing_features);
+ vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
+ if (ray_tracing_features.rayTracingShaderGroupHandleCaptureReplay == VK_FALSE) {
+ printf("%s rayTracingShaderGroupHandleCaptureReplay not enabled.\n", kSkipPrefix);
+ return;
+ }
+ CreateNVRayTracingPipelineHelper rt_pipe(*this);
+ rt_pipe.InitInfo(true /*isKHR*/);
+ rt_pipe.InitState();
+ rt_pipe.CreateKHRRayTracingPipeline();
+ VkBuffer buffer;
+ VkBufferCreateInfo buf_info = {};
+ buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
+ buf_info.size = 4096;
+ buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ VkResult err = vk::CreateBuffer(device(), &buf_info, NULL, &buffer);
+ ASSERT_VK_SUCCESS(err);
+
+ VkMemoryRequirements mem_reqs;
+ vk::GetBufferMemoryRequirements(device(), buffer, &mem_reqs);
+
+ VkMemoryAllocateInfo alloc_info = {};
+ alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ alloc_info.allocationSize = 4096;
+ VkDeviceMemory mem;
+ err = vk::AllocateMemory(device(), &alloc_info, NULL, &mem);
+ ASSERT_VK_SUCCESS(err);
+ vk::BindBufferMemory(device(), buffer, mem, 0);
+ PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR vkGetRayTracingCaptureReplayShaderGroupHandlesKHR =
+ (PFN_vkGetRayTracingCaptureReplayShaderGroupHandlesKHR)vk::GetInstanceProcAddr(
+ instance(), "vkGetRayTracingCaptureReplayShaderGroupHandlesKHR");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-dataSize-arraylength");
+ vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(m_device->handle(), rt_pipe.pipeline_, 1, 1, 0, &buffer);
+ m_errorMonitor->VerifyFound();
+
+ // dataSize must be at least VkPhysicalDeviceRayTracingPropertiesKHR::shaderGroupHandleCaptureReplaySize
+ PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
+ (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
+ ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
+ auto ray_tracing_properties = lvl_init_struct<VkPhysicalDeviceRayTracingPropertiesKHR>();
+ auto properties2 = lvl_init_struct<VkPhysicalDeviceProperties2KHR>(&ray_tracing_properties);
+ vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
+ // Check only when the reported size is
+ if (ray_tracing_properties.shaderGroupHandleCaptureReplaySize > 0) {
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-dataSize-03484");
+ vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(m_device->handle(), rt_pipe.pipeline_, 1, 1,
+ (ray_tracing_properties.shaderGroupHandleCaptureReplaySize - 1), &buffer);
+ m_errorMonitor->VerifyFound();
+ }
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-firstGroup-03483");
+ // In CreateNVRayTracingPipelineHelper::InitKHRRayTracingPipelineInfo rp_ci_KHR_.groupCount = groups_KHR_.size();
+ vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(m_device->handle(), rt_pipe.pipeline_, 2, rt_pipe.groups_KHR_.size(),
+ (ray_tracing_properties.shaderGroupHandleCaptureReplaySize - 1), &buffer);
+ m_errorMonitor->VerifyFound();
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-firstGroup-03483");
+ m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkGetRayTracingCaptureReplayShaderGroupHandlesKHR-firstGroup-04051");
+ // In CreateNVRayTracingPipelineHelper::InitKHRRayTracingPipelineInfo rp_ci_KHR_.groupCount = groups_KHR_.size();
+ uint32_t invalid_firstgroup = rt_pipe.groups_KHR_.size() + 1;
+ vkGetRayTracingCaptureReplayShaderGroupHandlesKHR(m_device->handle(), rt_pipe.pipeline_, invalid_firstgroup, 0,
+ (ray_tracing_properties.shaderGroupHandleCaptureReplaySize - 1), &buffer);
+ m_errorMonitor->VerifyFound();
+}
diff --git a/tests/vkpositivelayertests.cpp b/tests/vkpositivelayertests.cpp
index 351fa3b..2f1f8d0 100644
--- a/tests/vkpositivelayertests.cpp
+++ b/tests/vkpositivelayertests.cpp
@@ -24,13 +24,44 @@
* Author: John Zulauf <jzulauf@lunarg.com>
*/
-#include "cast_utils.h"
#include "layer_validation_tests.h"
+
+#include <array>
+#include <chrono>
+#include <memory>
+#include <mutex>
+#include <thread>
+
+#include "cast_utils.h"
+
//
// POSITIVE VALIDATION TESTS
//
// These tests do not expect to encounter ANY validation errors pass only if this is true
+TEST_F(VkPositiveLayerTest, TwoInstances) {
+ TEST_DESCRIPTION("Create two instances before destroy");
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ VkInstance i1, i2, i3;
+
+ VkInstanceCreateInfo ici = {};
+ ici.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
+ ici.enabledLayerCount = instance_layers_.size();
+ ici.ppEnabledLayerNames = instance_layers_.data();
+
+ ASSERT_VK_SUCCESS(vk::CreateInstance(&ici, nullptr, &i1));
+
+ ASSERT_VK_SUCCESS(vk::CreateInstance(&ici, nullptr, &i2));
+ ASSERT_NO_FATAL_FAILURE(vk::DestroyInstance(i2, nullptr));
+
+ ASSERT_VK_SUCCESS(vk::CreateInstance(&ici, nullptr, &i3));
+ ASSERT_NO_FATAL_FAILURE(vk::DestroyInstance(i3, nullptr));
+
+ ASSERT_NO_FATAL_FAILURE(vk::DestroyInstance(i1, nullptr));
+}
+
TEST_F(VkPositiveLayerTest, ToolingExtension) {
TEST_DESCRIPTION("Call Tooling Extension and verify layer results");
@@ -412,7 +443,10 @@
"Ensure that layout transitions work correctly without errors, when an attachment reference is VK_ATTACHMENT_UNUSED");
ASSERT_NO_FATAL_FAILURE(Init());
-
+ if (IsPlatform(kNexusPlayer)) {
+ printf("%s This test should not run on Nexus Player\n", kSkipPrefix);
+ return;
+ }
m_errorMonitor->ExpectSuccess();
// A renderpass with no attachments
@@ -544,7 +578,7 @@
VkImageObj destImage(m_device);
destImage.Init(100, 100, 1, depth_stencil_fmt, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
VK_IMAGE_TILING_OPTIMAL, 0);
- fence.wait(VK_TRUE, UINT64_MAX);
+ fence.wait(UINT64_MAX);
VkCommandBufferObj cmdbuf(m_device, m_commandPool);
cmdbuf.begin();
@@ -703,6 +737,10 @@
TEST_DESCRIPTION("Draw using a pipeline whose create renderPass has been destroyed.");
m_errorMonitor->ExpectSuccess();
ASSERT_NO_FATAL_FAILURE(Init());
+ if (IsPlatform(kNexusPlayer)) {
+ printf("%s This test should not run on Nexus Player\n", kSkipPrefix);
+ return;
+ }
ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
VkResult err;
@@ -850,7 +888,9 @@
TEST_F(VkPositiveLayerTest, BasicQuery) {
TEST_DESCRIPTION("Use a couple occlusion queries");
m_errorMonitor->ExpectSuccess();
- ASSERT_NO_FATAL_FAILURE(Init());
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+ VkCommandPoolCreateFlags pool_flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
+ ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, pool_flags));
ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
uint32_t qfi = 0;
@@ -906,7 +946,22 @@
res = vk::GetQueryPoolResults(m_device->handle(), query_pool, 0, 2, sizeof(samples_passed), samples_passed, sizeof(uint64_t),
VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT);
ASSERT_VK_SUCCESS(res);
+
+ // Now reset query pool in a different command buffer than the BeginQuery
+ vk::ResetCommandBuffer(m_commandBuffer->handle(), 0);
+ m_commandBuffer->begin();
+ vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
+ m_commandBuffer->end();
+ m_commandBuffer->QueueCommandBuffer();
+ vk::QueueWaitIdle(m_device->m_queue);
+ vk::ResetCommandBuffer(m_commandBuffer->handle(), 0);
+ m_commandBuffer->begin();
+ vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
+ vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
+ m_commandBuffer->end();
+ m_commandBuffer->QueueCommandBuffer();
m_errorMonitor->VerifyNotFound();
+ vk::QueueWaitIdle(m_device->m_queue);
vk::DestroyQueryPool(m_device->handle(), query_pool, NULL);
}
@@ -1938,6 +1993,17 @@
copy_region.extent = {10, 10, 1}; // Dimensions in (uncompressed) texels
vk::CmdCopyImage(m_commandBuffer->handle(), uncomp_10x10t_image.handle(), VK_IMAGE_LAYOUT_GENERAL,
comp_10x10b_40x40t_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, ©_region);
+ // The next copy swaps source and dest s.t. we need an execution barrier on for the prior source and an access barrier for
+ // prior dest
+ auto image_barrier = lvl_init_struct<VkImageMemoryBarrier>();
+ image_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ image_barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
+ image_barrier.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
+ image_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
+ image_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
+ image_barrier.image = comp_10x10b_40x40t_image.handle();
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr,
+ 0, nullptr, 1, &image_barrier);
// And from compressed to uncompressed
copy_region.extent = {40, 40, 1}; // Dimensions in (compressed) texels
@@ -2382,6 +2448,10 @@
VkResult err;
ASSERT_NO_FATAL_FAILURE(Init());
+ if (IsPlatform(kNexusPlayer)) {
+ printf("%s This test should not run on Nexus Player\n", kSkipPrefix);
+ return;
+ }
m_errorMonitor->ExpectSuccess();
// Create layout with two uniform buffer descriptors w/ empty binding between them
@@ -2764,9 +2834,6 @@
// This is a positive test. No failures are expected.
TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
- VkResult err;
- bool pass;
-
TEST_DESCRIPTION(
"Create a buffer, allocate memory, bind memory, destroy the buffer, create an image, and bind the same memory to it");
@@ -2774,120 +2841,58 @@
ASSERT_NO_FATAL_FAILURE(Init());
- VkBuffer buffer;
- VkImage image;
- VkDeviceMemory mem;
- VkMemoryRequirements mem_reqs;
+ auto buffer = std::unique_ptr<VkBufferObj>(new VkBufferObj());
+ VkDeviceSize buff_size = 256;
+ buffer->init_no_mem(*DeviceObj(), VkBufferObj::create_info(buff_size, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT));
- VkBufferCreateInfo buf_info = {};
- buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
- buf_info.pNext = NULL;
- buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
- buf_info.size = 256;
- buf_info.queueFamilyIndexCount = 0;
- buf_info.pQueueFamilyIndices = NULL;
- buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
- buf_info.flags = 0;
- err = vk::CreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
- ASSERT_VK_SUCCESS(err);
-
- vk::GetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
-
- VkMemoryAllocateInfo alloc_info = {};
- alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
- alloc_info.pNext = NULL;
- alloc_info.memoryTypeIndex = 0;
-
- // Ensure memory is big enough for both bindings
- alloc_info.allocationSize = 0x10000;
-
- pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
- if (!pass) {
- printf("%s Failed to allocate memory.\n", kSkipPrefix);
- vk::DestroyBuffer(m_device->device(), buffer, NULL);
- return;
- }
-
- err = vk::AllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
- ASSERT_VK_SUCCESS(err);
-
- uint8_t *pData;
- err = vk::MapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
- ASSERT_VK_SUCCESS(err);
-
- memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
-
- vk::UnmapMemory(m_device->device(), mem);
-
- err = vk::BindBufferMemory(m_device->device(), buffer, mem, 0);
- ASSERT_VK_SUCCESS(err);
-
- // NOW, destroy the buffer. Obviously, the resource no longer occupies this
- // memory. In fact, it was never used by the GPU.
- // Just be sure, wait for idle.
- vk::DestroyBuffer(m_device->device(), buffer, NULL);
- vk::DeviceWaitIdle(m_device->device());
-
- // Use optimal as some platforms report linear support but then fail image creation
- VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
- VkImageFormatProperties image_format_properties;
- vk::GetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
- VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
- if (image_format_properties.maxExtent.width == 0) {
- printf("%s Image format not supported; skipped.\n", kSkipPrefix);
- vk::FreeMemory(m_device->device(), mem, NULL);
- return;
- }
VkImageCreateInfo image_create_info = {};
image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
- image_create_info.pNext = NULL;
image_create_info.imageType = VK_IMAGE_TYPE_2D;
- image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
- image_create_info.extent.width = 64;
+ image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM; // mandatory format
+ image_create_info.extent.width = 64; // at least 4096x4096 is supported
image_create_info.extent.height = 64;
image_create_info.extent.depth = 1;
image_create_info.mipLevels = 1;
image_create_info.arrayLayers = 1;
image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
- image_create_info.tiling = image_tiling;
+ image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
- image_create_info.queueFamilyIndexCount = 0;
- image_create_info.pQueueFamilyIndices = NULL;
- image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
- image_create_info.flags = 0;
+ VkImageObj image(DeviceObj());
+ image.init_no_mem(*DeviceObj(), image_create_info);
- /* Create a mappable image. It will be the texture if linear images are OK
- * to be textures or it will be the staging image if they are not.
- */
- err = vk::CreateImage(m_device->device(), &image_create_info, NULL, &image);
- ASSERT_VK_SUCCESS(err);
+ const auto buffer_memory_requirements = buffer->memory_requirements();
+ const auto image_memory_requirements = image.memory_requirements();
- vk::GetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
-
- VkMemoryAllocateInfo mem_alloc = {};
- mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
- mem_alloc.pNext = NULL;
- mem_alloc.allocationSize = 0;
- mem_alloc.memoryTypeIndex = 0;
- mem_alloc.allocationSize = mem_reqs.size;
-
- pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
- if (!pass) {
- printf("%s Failed to allocate memory.\n", kSkipPrefix);
- vk::FreeMemory(m_device->device(), mem, NULL);
- vk::DestroyImage(m_device->device(), image, NULL);
+ vk_testing::DeviceMemory mem;
+ VkMemoryAllocateInfo alloc_info = {};
+ alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ alloc_info.allocationSize = (std::max)(buffer_memory_requirements.size, image_memory_requirements.size);
+ bool has_memtype =
+ m_device->phy().set_memory_type(buffer_memory_requirements.memoryTypeBits & image_memory_requirements.memoryTypeBits,
+ &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
+ if (!has_memtype) {
+ printf("%s Failed to find a host visible memory type for both a buffer and an image. Test skipped.\n", kSkipPrefix);
return;
}
+ mem.init(*DeviceObj(), alloc_info);
+
+ auto pData = mem.map();
+ std::memset(pData, 0xCADECADE, static_cast<size_t>(buff_size));
+ mem.unmap();
+
+ buffer->bind_memory(mem, 0);
+
+ // NOW, destroy the buffer. Obviously, the resource no longer occupies this
+ // memory. In fact, it was never used by the GPU.
+ // Just be sure, wait for idle.
+ buffer.reset(nullptr);
+ vk::DeviceWaitIdle(m_device->device());
// VALIDATION FAILURE:
- err = vk::BindImageMemory(m_device->device(), image, mem, 0);
- ASSERT_VK_SUCCESS(err);
+ image.bind_memory(mem, 0);
m_errorMonitor->VerifyNotFound();
-
- vk::FreeMemory(m_device->device(), mem, NULL);
- vk::DestroyImage(m_device->device(), image, NULL);
}
// This is a positive test. No failures are expected.
@@ -3089,6 +3094,14 @@
m_errorMonitor->ExpectSuccess();
ASSERT_NO_FATAL_FAILURE(Init());
+ if (IsPlatform(kPixel3)) {
+ printf("%s This test should not run on Pixel 3\n", kSkipPrefix);
+ return;
+ }
+ if (IsPlatform(kPixel3aXL)) {
+ printf("%s This test should not run on Pixel 3a XL\n", kSkipPrefix);
+ return;
+ }
ASSERT_NO_FATAL_FAILURE(InitViewport());
ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
@@ -4074,10 +4087,22 @@
TEST_DESCRIPTION("Issue a query on a secondary command buffer and copy it on a primary.");
ASSERT_NO_FATAL_FAILURE(Init());
+ if (IsPlatform(kNexusPlayer)) {
+ printf("%s This test should not run on Nexus Player\n", kSkipPrefix);
+ return;
+ }
if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
printf("%s Queue family needs to have multiple queues to run this test.\n", kSkipPrefix);
return;
}
+ uint32_t queue_count;
+ vk::GetPhysicalDeviceQueueFamilyProperties(gpu(), &queue_count, NULL);
+ VkQueueFamilyProperties *queue_props = new VkQueueFamilyProperties[queue_count];
+ vk::GetPhysicalDeviceQueueFamilyProperties(gpu(), &queue_count, queue_props);
+ if (queue_props[m_device->graphics_queue_node_index_].timestampValidBits == 0) {
+ printf("%s Device graphic queue has timestampValidBits of 0, skipping.\n", kSkipPrefix);
+ return;
+ }
m_errorMonitor->ExpectSuccess();
@@ -4142,10 +4167,22 @@
TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
ASSERT_NO_FATAL_FAILURE(Init());
+ if (IsPlatform(kNexusPlayer)) {
+ printf("%s This test should not run on Nexus Player\n", kSkipPrefix);
+ return;
+ }
if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
printf("%s Queue family needs to have multiple queues to run this test.\n", kSkipPrefix);
return;
}
+ uint32_t queue_count;
+ vk::GetPhysicalDeviceQueueFamilyProperties(gpu(), &queue_count, NULL);
+ VkQueueFamilyProperties *queue_props = new VkQueueFamilyProperties[queue_count];
+ vk::GetPhysicalDeviceQueueFamilyProperties(gpu(), &queue_count, queue_props);
+ if (queue_props[m_device->graphics_queue_node_index_].timestampValidBits == 0) {
+ printf("%s Device graphic queue has timestampValidBits of 0, skipping.\n", kSkipPrefix);
+ return;
+ }
m_errorMonitor->ExpectSuccess();
@@ -5836,470 +5873,6 @@
m_errorMonitor->VerifyNotFound();
}
}
-TEST_F(VkPositiveLayerTest, GpuValidationInlineUniformBlockAndMiscGpu) {
- TEST_DESCRIPTION(
- "GPU validation: Make sure inline uniform blocks don't generate false validation errors, verify reserved descriptor slot "
- "and verify pipeline recovery");
- m_errorMonitor->ExpectSuccess();
- VkValidationFeatureEnableEXT enables[] = {VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT,
- VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT};
- VkValidationFeaturesEXT features = {};
- features.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
- features.enabledValidationFeatureCount = 2;
- features.pEnabledValidationFeatures = enables;
- bool descriptor_indexing = CheckDescriptorIndexingSupportAndInitFramework(this, m_instance_extension_names,
- m_device_extension_names, &features, m_errorMonitor);
- if (DeviceIsMockICD() || DeviceSimulation()) {
- printf("%s Test not supported by MockICD, skipping tests\n", kSkipPrefix);
- return;
- }
- VkPhysicalDeviceFeatures2KHR features2 = {};
- auto indexing_features = lvl_init_struct<VkPhysicalDeviceDescriptorIndexingFeaturesEXT>();
- auto inline_uniform_block_features = lvl_init_struct<VkPhysicalDeviceInlineUniformBlockFeaturesEXT>(&indexing_features);
- bool inline_uniform_block = DeviceExtensionSupported(gpu(), nullptr, VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME);
- if (!(descriptor_indexing && inline_uniform_block)) {
- printf("Descriptor indexing and/or inline uniform block not supported Skipping test\n");
- return;
- }
- m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
- m_device_extension_names.push_back(VK_EXT_INLINE_UNIFORM_BLOCK_EXTENSION_NAME);
- PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
- (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
- ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
-
- features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&inline_uniform_block_features);
- vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
- if (!indexing_features.descriptorBindingPartiallyBound || !inline_uniform_block_features.inlineUniformBlock) {
- printf("Not all features supported, skipping test\n");
- return;
- }
- auto inline_uniform_props = lvl_init_struct<VkPhysicalDeviceInlineUniformBlockPropertiesEXT>();
- auto prop2 = lvl_init_struct<VkPhysicalDeviceProperties2KHR>(&inline_uniform_props);
- vk::GetPhysicalDeviceProperties2(gpu(), &prop2);
-
- VkCommandPoolCreateFlags pool_flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
- ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, pool_flags));
- if (m_device->props.apiVersion < VK_API_VERSION_1_1) {
- printf("%s GPU-Assisted validation test requires Vulkan 1.1+.\n", kSkipPrefix);
- return;
- }
- auto c_queue = m_device->GetDefaultComputeQueue();
- if (nullptr == c_queue) {
- printf("Compute not supported, skipping test\n");
- return;
- }
-
- uint32_t qfi = 0;
- VkBufferCreateInfo bci = {};
- bci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
- bci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
- bci.size = 4;
- bci.queueFamilyIndexCount = 1;
- bci.pQueueFamilyIndices = &qfi;
- VkBufferObj buffer0;
- VkMemoryPropertyFlags mem_props = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
- buffer0.init(*m_device, bci, mem_props);
-
- VkDescriptorBindingFlagsEXT ds_binding_flags[2] = {};
- ds_binding_flags[1] = VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT;
- VkDescriptorSetLayoutBindingFlagsCreateInfoEXT layout_createinfo_binding_flags[1] = {};
- layout_createinfo_binding_flags[0].sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT;
- layout_createinfo_binding_flags[0].pNext = NULL;
- layout_createinfo_binding_flags[0].bindingCount = 2;
- layout_createinfo_binding_flags[0].pBindingFlags = ds_binding_flags;
-
- OneOffDescriptorSet descriptor_set(m_device,
- {
- {0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr},
- {1, VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT, 20, VK_SHADER_STAGE_ALL,
- nullptr}, // 16 bytes for ivec4, 4 more for int
- },
- 0, layout_createinfo_binding_flags, 0);
- const VkPipelineLayoutObj pipeline_layout(m_device, {&descriptor_set.layout_});
-
- VkDescriptorBufferInfo buffer_info[1] = {};
- buffer_info[0].buffer = buffer0.handle();
- buffer_info[0].offset = 0;
- buffer_info[0].range = sizeof(uint32_t);
-
- const uint32_t test_data = 0xdeadca7;
- VkWriteDescriptorSetInlineUniformBlockEXT write_inline_uniform = {};
- write_inline_uniform.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT;
- write_inline_uniform.dataSize = 4;
- write_inline_uniform.pData = &test_data;
-
- VkWriteDescriptorSet descriptor_writes[2] = {};
- descriptor_writes[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
- descriptor_writes[0].dstSet = descriptor_set.set_;
- descriptor_writes[0].dstBinding = 0;
- descriptor_writes[0].descriptorCount = 1;
- descriptor_writes[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
- descriptor_writes[0].pBufferInfo = buffer_info;
-
- descriptor_writes[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
- descriptor_writes[1].dstSet = descriptor_set.set_;
- descriptor_writes[1].dstBinding = 1;
- descriptor_writes[1].dstArrayElement = 16; // Skip first 16 bytes (dummy)
- descriptor_writes[1].descriptorCount = 4; // Write 4 bytes to val
- descriptor_writes[1].descriptorType = VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT;
- descriptor_writes[1].pNext = &write_inline_uniform;
- vk::UpdateDescriptorSets(m_device->device(), 2, descriptor_writes, 0, NULL);
-
- char const *csSource =
- "#version 450\n"
- "#extension GL_EXT_nonuniform_qualifier : enable\n "
- "layout(set = 0, binding = 0) buffer StorageBuffer { uint index; } u_index;"
- "layout(set = 0, binding = 1) uniform inlineubodef { ivec4 dummy; int val; } inlineubo;\n"
-
- "void main() {\n"
- " u_index.index = inlineubo.val;\n"
- "}\n";
-
- auto shader_module = new VkShaderObj(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
-
- VkPipelineShaderStageCreateInfo stage;
- stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
- stage.pNext = nullptr;
- stage.flags = 0;
- stage.stage = VK_SHADER_STAGE_COMPUTE_BIT;
- stage.module = shader_module->handle();
- stage.pName = "main";
- stage.pSpecializationInfo = nullptr;
-
- // CreateComputePipelines
- VkComputePipelineCreateInfo pipeline_info = {};
- pipeline_info.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO;
- pipeline_info.pNext = nullptr;
- pipeline_info.flags = 0;
- pipeline_info.layout = pipeline_layout.handle();
- pipeline_info.basePipelineHandle = VK_NULL_HANDLE;
- pipeline_info.basePipelineIndex = -1;
- pipeline_info.stage = stage;
-
- VkPipeline c_pipeline;
- vk::CreateComputePipelines(device(), VK_NULL_HANDLE, 1, &pipeline_info, nullptr, &c_pipeline);
-
- m_commandBuffer->begin();
- vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_COMPUTE, c_pipeline);
- vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_COMPUTE, pipeline_layout.handle(), 0, 1,
- &descriptor_set.set_, 0, nullptr);
- vk::CmdDispatch(m_commandBuffer->handle(), 1, 1, 1);
- m_commandBuffer->end();
-
- VkSubmitInfo submit_info = {};
- submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
- submit_info.commandBufferCount = 1;
- submit_info.pCommandBuffers = &m_commandBuffer->handle();
- vk::QueueSubmit(c_queue->handle(), 1, &submit_info, VK_NULL_HANDLE);
- vk::QueueWaitIdle(m_device->m_queue);
- m_errorMonitor->VerifyNotFound();
- vk::DestroyPipeline(m_device->handle(), c_pipeline, NULL);
-
- uint32_t *data = (uint32_t *)buffer0.memory().map();
- ASSERT_TRUE(*data = test_data);
- *data = 0;
- buffer0.memory().unmap();
-
- // Also verify that binding slot reservation is working
- VkInstanceCreateInfo inst_info = {};
- VkInstance test_inst;
- inst_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
- vk::CreateInstance(&inst_info, NULL, &test_inst);
- uint32_t gpu_count;
- VkPhysicalDevice objs[4];
- vk::EnumeratePhysicalDevices(test_inst, &gpu_count, NULL);
- if (gpu_count > 4) gpu_count = 4;
- vk::EnumeratePhysicalDevices(test_inst, &gpu_count, objs);
- VkPhysicalDeviceProperties properties;
- vk::GetPhysicalDeviceProperties(objs[0], &properties);
- if (m_device->props.limits.maxBoundDescriptorSets != properties.limits.maxBoundDescriptorSets - 1)
- m_errorMonitor->SetError("VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_RESERVE_BINDING_SLOT_EXT not functioning as expected");
- vk::DestroyInstance(test_inst, NULL);
-
- auto set_count = properties.limits.maxBoundDescriptorSets;
- // Now be sure that recovery from an unavailable descriptor set works and that uninstrumented shaders are used
- VkDescriptorSetLayoutBinding dsl_binding[2] = {};
- dsl_binding[0].binding = 0;
- dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
- dsl_binding[0].descriptorCount = 1;
- dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
- dsl_binding[1].binding = 1;
- dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT;
- dsl_binding[1].descriptorCount = 20;
- dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
- VkDescriptorSetLayout *layouts{new VkDescriptorSetLayout[set_count]{}};
- VkDescriptorSetLayoutCreateInfo dsl_create_info = {};
- dsl_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
- dsl_create_info.pNext = layout_createinfo_binding_flags;
- dsl_create_info.pBindings = dsl_binding;
- dsl_create_info.bindingCount = 2;
- for (uint32_t i = 0; i < set_count; i++) {
- vk::CreateDescriptorSetLayout(m_device->handle(), &dsl_create_info, NULL, &layouts[i]);
- }
- VkPipelineLayoutCreateInfo pl_create_info = {};
- VkPipelineLayout pl_layout;
- pl_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
- pl_create_info.setLayoutCount = set_count;
- pl_create_info.pSetLayouts = layouts;
- vk::CreatePipelineLayout(m_device->handle(), &pl_create_info, NULL, &pl_layout);
- pipeline_info.layout = pl_layout;
- vk::CreateComputePipelines(device(), VK_NULL_HANDLE, 1, &pipeline_info, nullptr, &c_pipeline);
- m_commandBuffer->begin();
- vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_COMPUTE, c_pipeline);
- vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_COMPUTE, pl_layout, 0, 1, &descriptor_set.set_, 0,
- nullptr);
- vk::CmdDispatch(m_commandBuffer->handle(), 1, 1, 1);
- m_commandBuffer->end();
- vk::QueueSubmit(c_queue->handle(), 1, &submit_info, VK_NULL_HANDLE);
- vk::QueueWaitIdle(m_device->m_queue);
- vk::DestroyShaderModule(m_device->handle(), shader_module->handle(), NULL);
- vk::DestroyPipelineLayout(m_device->handle(), pl_layout, NULL);
- vk::DestroyPipeline(m_device->handle(), c_pipeline, NULL);
- for (uint32_t i = 0; i < set_count; i++) {
- vk::DestroyDescriptorSetLayout(m_device->handle(), layouts[i], NULL);
- }
- m_errorMonitor->VerifyNotFound();
- data = (uint32_t *)buffer0.memory().map();
- if (*data != test_data) m_errorMonitor->SetError("Pipeline recovery when resources unavailable not functioning as expected");
- buffer0.memory().unmap();
- delete[] layouts;
-}
-
-TEST_F(VkPositiveLayerTest, GpuDebugPrintf) {
- TEST_DESCRIPTION("Verify that calls to debugPrintfEXT are received in debug stream");
- VkValidationFeatureEnableEXT enables[] = {VK_VALIDATION_FEATURE_ENABLE_DEBUG_PRINTF_EXT};
- VkValidationFeaturesEXT validation_features = {};
- validation_features.sType = VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT;
- validation_features.enabledValidationFeatureCount = 1;
- validation_features.pEnabledValidationFeatures = enables;
- m_device_extension_names.push_back(VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME);
- InitFramework(m_errorMonitor, &validation_features);
- if (!DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME)) {
- printf("%s Extension %s not supported, skipping this pass. \n", kSkipPrefix,
- VK_KHR_SHADER_NON_SEMANTIC_INFO_EXTENSION_NAME);
- return;
- }
- ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
- if (m_device->props.apiVersion < VK_API_VERSION_1_1) {
- printf("%s GPU-Assisted printf test requires Vulkan 1.1+.\n", kSkipPrefix);
- return;
- }
- auto features = m_device->phy().features();
- if (!features.vertexPipelineStoresAndAtomics || !features.fragmentStoresAndAtomics) {
- printf("%s GPU-Assisted printf test requires vertexPipelineStoresAndAtomics and fragmentStoresAndAtomics.\n", kSkipPrefix);
- return;
- }
- ASSERT_NO_FATAL_FAILURE(InitViewport());
- ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-
- if (DeviceIsMockICD() || DeviceSimulation()) {
- printf("%s GPU-Assisted printf test requires a driver that can draw.\n", kSkipPrefix);
- return;
- }
- // Make a uniform buffer to be passed to the shader that contains the test number
- uint32_t qfi = 0;
- VkBufferCreateInfo bci = {};
- bci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
- bci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
- bci.size = 8;
- bci.queueFamilyIndexCount = 1;
- bci.pQueueFamilyIndices = &qfi;
- VkBufferObj buffer0;
- VkMemoryPropertyFlags mem_props = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
- buffer0.init(*m_device, bci, mem_props);
- OneOffDescriptorSet descriptor_set(m_device, {{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}});
-
- const VkPipelineLayoutObj pipeline_layout(m_device, {&descriptor_set.layout_});
- VkDescriptorBufferInfo buffer_info[2] = {};
- buffer_info[0].buffer = buffer0.handle();
- buffer_info[0].offset = 0;
- buffer_info[0].range = sizeof(uint32_t);
-
- VkWriteDescriptorSet descriptor_writes[1] = {};
- descriptor_writes[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
- descriptor_writes[0].dstSet = descriptor_set.set_;
- descriptor_writes[0].dstBinding = 0;
- descriptor_writes[0].descriptorCount = 1;
- descriptor_writes[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
- descriptor_writes[0].pBufferInfo = buffer_info;
- vk::UpdateDescriptorSets(m_device->device(), 1, descriptor_writes, 0, NULL);
-
- char const *shader_source =
- "#version 450\n"
- "#extension GL_EXT_debug_printf : enable\n"
- "layout(set = 0, binding = 0) uniform ufoo {\n"
- " int whichtest;\n"
- "} u_info;\n"
- "void main() {\n"
- " float myfloat = 3.1415f;\n"
- " int foo = -135;\n"
- " if (gl_VertexIndex == 0) {\n"
- " switch(u_info.whichtest) {\n"
- " case 0:\n"
- " debugPrintfEXT(\"Here are two float values %f, %f\", 1.0, myfloat);\n"
- " break;\n"
- " case 1:\n"
- " debugPrintfEXT(\"Here's a smaller float value %1.2f\", myfloat);\n"
- " break;\n"
- " case 2:\n"
- " debugPrintfEXT(\"Here's an integer %i with text before and after it\", foo);\n"
- " break;\n"
- " case 3:\n"
- " foo = 256;\n"
- " debugPrintfEXT(\"Here's an integer in octal %o and hex 0x%x\", foo, foo);\n"
- " break;\n"
- " case 4:\n"
- " debugPrintfEXT(\"%d is a negative integer\", foo);\n"
- " break;\n"
- " case 5:\n"
- " vec4 floatvec = vec4(1.2f, 2.2f, 3.2f, 4.2f);\n"
- " debugPrintfEXT(\"Here's a vector of floats %1.2v4f\", floatvec);\n"
- " break;\n"
- " case 6:\n"
- " debugPrintfEXT(\"Here's a float in sn %e\", myfloat);\n"
- " break;\n"
- " case 7:\n"
- " debugPrintfEXT(\"Here's a float in sn %1.2e\", myfloat);\n"
- " break;\n"
- " case 8:\n"
- " debugPrintfEXT(\"Here's a float in shortest %g\", myfloat);\n"
- " break;\n"
- " case 9:\n"
- " debugPrintfEXT(\"Here's a float in hex %1.9a\", myfloat);\n"
- " break;\n"
- " case 10:\n"
- " debugPrintfEXT(\"First printf with a %% and no value\");\n"
- " debugPrintfEXT(\"Second printf with a value %i\", foo);\n"
- " break;\n"
- " }\n"
- " }\n"
- " gl_Position = vec4(0.0, 0.0, 0.0, 0.0);\n"
- "}\n";
- std::vector<char const *> messages;
- messages.push_back("Here are two float values 1.000000, 3.141500");
- messages.push_back("Here's a smaller float value 3.14");
- messages.push_back("Here's an integer -135 with text before and after it");
- messages.push_back("Here's an integer in octal 400 and hex 0x100");
- messages.push_back("-135 is a negative integer");
- messages.push_back("Here's a vector of floats 1.20, 2.20, 3.20, 4.20");
- messages.push_back("Here's a float in sn 3.141500e+00");
- messages.push_back("Here's a float in sn 3.14e+00");
- messages.push_back("Here's a float in shortest 3.1415");
- messages.push_back("Here's a float in hex 0x1.921cac000p+1");
- // Two error messages have to be last in the vector
- messages.push_back("First printf with a % and no value");
- messages.push_back("Second printf with a value -135");
- VkShaderObj vs(m_device, shader_source, VK_SHADER_STAGE_VERTEX_BIT, this, "main", true);
-
- VkViewport viewport = m_viewports[0];
- VkRect2D scissors = m_scissors[0];
-
- VkSubmitInfo submit_info = {};
- submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
- submit_info.commandBufferCount = 1;
- submit_info.pCommandBuffers = &m_commandBuffer->handle();
-
- VkPipelineObj pipe(m_device);
- pipe.AddShader(&vs);
- pipe.AddDefaultColorAttachment();
- VkResult err = pipe.CreateVKPipeline(pipeline_layout.handle(), renderPass());
- ASSERT_VK_SUCCESS(err);
-
- VkCommandBufferBeginInfo begin_info = {};
- VkCommandBufferInheritanceInfo hinfo = {};
- hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
- begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
- begin_info.pInheritanceInfo = &hinfo;
-
- m_commandBuffer->begin(&begin_info);
- m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
- vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
- vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
- &descriptor_set.set_, 0, nullptr);
- vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
- vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissors);
- vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
- vk::CmdEndRenderPass(m_commandBuffer->handle());
- m_commandBuffer->end();
-
- for (uint32_t i = 0; i < messages.size(); i++) {
- VkDeviceAddress *data = (VkDeviceAddress *)buffer0.memory().map();
- data[0] = i;
- buffer0.memory().unmap();
- m_errorMonitor->SetDesiredFailureMsg(kInformationBit, messages[i]);
- if (10 == i) {
- m_errorMonitor->SetDesiredFailureMsg(kInformationBit, messages[i + 1]);
- i++;
- }
- err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
- ASSERT_VK_SUCCESS(err);
- err = vk::QueueWaitIdle(m_device->m_queue);
- ASSERT_VK_SUCCESS(err);
- m_errorMonitor->VerifyFound();
- }
-
- if (features.shaderInt64) {
- char const *shader_source_int64 =
- "#version 450\n"
- "#extension GL_EXT_debug_printf : enable\n"
- "#extension GL_ARB_gpu_shader_int64 : enable\n"
- "layout(set = 0, binding = 0) uniform ufoo {\n"
- " int whichtest;\n"
- "} u_info;\n"
- "void main() {\n"
- " uint64_t bigvar = 0x2000000000000001ul;\n"
- " if (gl_VertexIndex == 0) {\n"
- " switch(u_info.whichtest) {\n"
- " case 0:\n"
- " debugPrintfEXT(\"Here's an unsigned long 0x%ul\", bigvar);\n"
- " break;\n"
- " case 1:\n"
- " u64vec4 vecul = u64vec4(bigvar, bigvar, bigvar, bigvar);"
- " debugPrintfEXT(\"Here's a vector of ul %v4ul\", vecul);\n"
- " break;\n"
- " }\n"
- " }\n"
- " gl_Position = vec4(0.0, 0.0, 0.0, 0.0);\n"
- "}\n";
- VkShaderObj vs_int64(m_device, shader_source_int64, VK_SHADER_STAGE_VERTEX_BIT, this, "main", true);
- VkPipelineObj pipe2(m_device);
- pipe2.AddShader(&vs_int64);
- pipe2.AddDefaultColorAttachment();
- err = pipe2.CreateVKPipeline(pipeline_layout.handle(), renderPass());
- ASSERT_VK_SUCCESS(err);
-
- m_commandBuffer->begin(&begin_info);
- m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
- vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe2.handle());
- vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
- &descriptor_set.set_, 0, nullptr);
- vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
- vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissors);
- vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
- vk::CmdEndRenderPass(m_commandBuffer->handle());
- m_commandBuffer->end();
-
- VkDeviceAddress *data = (VkDeviceAddress *)buffer0.memory().map();
- data[0] = 0;
- buffer0.memory().unmap();
- m_errorMonitor->SetDesiredFailureMsg(kInformationBit, "Here's an unsigned long 0x2000000000000001");
- err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
- ASSERT_VK_SUCCESS(err);
- err = vk::QueueWaitIdle(m_device->m_queue);
- ASSERT_VK_SUCCESS(err);
- m_errorMonitor->VerifyFound();
- data = (VkDeviceAddress *)buffer0.memory().map();
- data[0] = 1;
- buffer0.memory().unmap();
- m_errorMonitor->SetDesiredFailureMsg(
- kInformationBit, "Here's a vector of ul 2000000000000001, 2000000000000001, 2000000000000001, 2000000000000001");
- err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
- ASSERT_VK_SUCCESS(err);
- err = vk::QueueWaitIdle(m_device->m_queue);
- ASSERT_VK_SUCCESS(err);
- m_errorMonitor->VerifyFound();
- }
-}
TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
@@ -6393,6 +5966,10 @@
TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
ASSERT_NO_FATAL_FAILURE(Init());
+ if (IsPlatform(kNexusPlayer)) {
+ printf("%s This test should not run on Nexus Player\n", kSkipPrefix);
+ return;
+ }
ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
std::vector<const char *> device_extension_names;
@@ -6780,6 +6357,9 @@
m_errorMonitor->VerifyNotFound();
}
+ image.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
+
// Try good case with VK_REMAINING
{
m_errorMonitor->ExpectSuccess();
@@ -6821,6 +6401,9 @@
m_errorMonitor->VerifyNotFound();
}
+ image.ImageMemoryBarrier(m_commandBuffer, ds_aspect, VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
+
// Try good case with VK_REMAINING
{
m_errorMonitor->ExpectSuccess();
@@ -6834,6 +6417,10 @@
TEST_DESCRIPTION("Create Graphics Pipeline with pointers that must be ignored by layers");
ASSERT_NO_FATAL_FAILURE(Init());
+ if (IsPlatform(kNexusPlayer)) {
+ printf("%s This test should not run on Nexus Player\n", kSkipPrefix);
+ return;
+ }
m_depth_stencil_fmt = FindSupportedDepthStencilFormat(gpu());
ASSERT_TRUE(m_depth_stencil_fmt != 0);
@@ -7626,8 +7213,8 @@
image.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_ACCESS_TRANSFER_WRITE_BIT,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
- std::array<VkImageAspectFlagBits, 3> aspects = {VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT,
- VK_IMAGE_ASPECT_PLANE_2_BIT};
+ std::array<VkImageAspectFlagBits, 3> aspects = {
+ {VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT, VK_IMAGE_ASPECT_PLANE_2_BIT}};
std::array<VkBufferObj, 3> buffers;
VkMemoryPropertyFlags reqs = 0;
@@ -7906,8 +7493,8 @@
m_commandBuffer->begin();
VkImageMemoryBarrier img_barrier = {};
img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
- img_barrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
- img_barrier.dstAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
+ img_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ img_barrier.dstAccessMask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT;
img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
img_barrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
img_barrier.image = mpimage.handle();
@@ -7918,7 +7505,7 @@
img_barrier.subresourceRange.baseMipLevel = 0;
img_barrier.subresourceRange.layerCount = 1;
img_barrier.subresourceRange.levelCount = 1;
- vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
+ vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1, &img_barrier);
m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
@@ -7948,7 +7535,7 @@
TEST_F(VkPositiveLayerTest, ApiVersionZero) {
TEST_DESCRIPTION("Check that apiVersion = 0 is valid.");
m_errorMonitor->ExpectSuccess();
- app_info.apiVersion = 0U;
+ app_info_.apiVersion = 0U;
ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
m_errorMonitor->VerifyNotFound();
}
@@ -8192,6 +7779,10 @@
TEST_DESCRIPTION("Make sure unused attachments are correctly ignored.");
ASSERT_NO_FATAL_FAILURE(Init());
+ if (IsPlatform(kNexusPlayer)) {
+ printf("%s This test should not run on Nexus Player\n", kSkipPrefix);
+ return;
+ }
ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
char const *fsSource =
@@ -8566,7 +8157,7 @@
auto bind_devicegroup_info = lvl_init_struct<VkBindImageMemoryDeviceGroupInfo>();
bind_devicegroup_info.deviceIndexCount = 2;
- std::array<uint32_t, 2> deviceIndices = {0, 0};
+ std::array<uint32_t, 2> deviceIndices = {{0, 0}};
bind_devicegroup_info.pDeviceIndices = deviceIndices.data();
bind_devicegroup_info.splitInstanceBindRegionCount = 0;
bind_devicegroup_info.pSplitInstanceBindRegions = nullptr;
@@ -8782,6 +8373,10 @@
TEST_F(VkPositiveLayerTest, TestRasterizationDiscardEnableTrue) {
TEST_DESCRIPTION("Ensure it doesn't crash and trigger error msg when rasterizerDiscardEnable = true");
ASSERT_NO_FATAL_FAILURE(Init());
+ if (IsPlatform(kNexusPlayer)) {
+ printf("%s This test should not run on Nexus Player\n", kSkipPrefix);
+ return;
+ }
ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
VkAttachmentDescription att[1] = {{}};
@@ -8947,7 +8542,7 @@
VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL};
const int size = 2;
- std::array<VkAttachmentDescription, size> attachments = {attachment, attachment};
+ std::array<VkAttachmentDescription, size> attachments = {{attachment, attachment}};
VkAttachmentReference att_ref_depth_stencil = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL};
@@ -8980,7 +8575,7 @@
VkImageView view;
err = vk::CreateImageView(m_device->device(), &ivci, nullptr, &view);
ASSERT_VK_SUCCESS(err);
- std::array<VkImageView, size> views = {view, view};
+ std::array<VkImageView, size> views = {{view, view}};
VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, size, views.data(), 32, 32, 1};
VkFramebuffer fb;
@@ -9109,7 +8704,7 @@
printf("%s Cannot create surface or swapchain, skipping CmdCopySwapchainImage test\n", kSkipPrefix);
return;
}
- uint32_t image_index = 0, image_count;
+ uint32_t image_index, image_count;
PFN_vkGetSwapchainImagesKHR fpGetSwapchainImagesKHR =
(PFN_vkGetSwapchainImagesKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkGetSwapchainImagesKHR");
fpGetSwapchainImagesKHR(m_device->handle(), m_swapchain, &image_count, NULL);
@@ -9119,9 +8714,7 @@
VkFence fence;
VkResult ret = vk::CreateFence(m_device->device(), &fenceci, nullptr, &fence);
ASSERT_VK_SUCCESS(ret);
- PFN_vkAcquireNextImageKHR fpAcquireNextImageKHR =
- (PFN_vkAcquireNextImageKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkAcquireNextImageKHR");
- ret = fpAcquireNextImageKHR(m_device->handle(), m_swapchain, UINT64_MAX, VK_NULL_HANDLE, fence, &image_index);
+ ret = vk::AcquireNextImageKHR(m_device->handle(), m_swapchain, UINT64_MAX, VK_NULL_HANDLE, fence, &image_index);
ASSERT_VK_SUCCESS(ret);
VkAttachmentDescription attach[] = {
{0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
@@ -9195,9 +8788,11 @@
submit_info.signalSemaphoreCount = 0;
submit_info.pSignalSemaphores = NULL;
vk::WaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
+ vk::ResetFences(m_device->device(), 1, &fence);
m_errorMonitor->ExpectSuccess();
- vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
+ vk::QueueSubmit(m_device->m_queue, 1, &submit_info, fence);
m_errorMonitor->VerifyNotFound();
+ vk::WaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
free(swapchainImages);
vk::DestroyFramebuffer(m_device->device(), fb1, NULL);
@@ -9206,6 +8801,7 @@
vk::DestroyRenderPass(m_device->device(), rp2, NULL);
vk::DestroyFence(m_device->device(), fence, NULL);
vk::DestroyImageView(m_device->device(), view, NULL);
+ DestroySwapchain();
}
TEST_F(VkPositiveLayerTest, PipelineStageConditionalRendering) {
@@ -9306,7 +8902,9 @@
"#version 450\n"
"\n"
"layout(push_constant, std430) uniform foo { float x[4]; } constants;\n"
+ "layout(location=0) out vec4 o;\n"
"void main(){\n"
+ " o = vec4(constants.x[0]);\n"
"}\n";
VkShaderObj const vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
@@ -9756,7 +9354,7 @@
auto bind_devicegroup_info = lvl_init_struct<VkBindImageMemoryDeviceGroupInfo>();
bind_devicegroup_info.deviceIndexCount = 2;
- std::array<uint32_t, 2> deviceIndices = {0, 0};
+ std::array<uint32_t, 2> deviceIndices = {{0, 0}};
bind_devicegroup_info.pDeviceIndices = deviceIndices.data();
bind_devicegroup_info.splitInstanceBindRegionCount = 0;
bind_devicegroup_info.pSplitInstanceBindRegions = nullptr;
@@ -9843,3 +9441,770 @@
vk::DestroySemaphore(m_device->device(), image_acquired, nullptr);
vk::DestroyFramebuffer(m_device->device(), framebuffer, nullptr);
}
+
+TEST_F(VkPositiveLayerTest, QueueThreading) {
+ TEST_DESCRIPTION("Test concurrent Queue access from vkGet and vkSubmit");
+
+ using namespace std::chrono;
+ using std::thread;
+ ASSERT_NO_FATAL_FAILURE(InitFramework());
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ const auto queue_family = DeviceObj()->GetDefaultQueue()->get_family_index();
+ constexpr uint32_t queue_index = 0;
+ VkCommandPoolObj command_pool(DeviceObj(), queue_family);
+
+ const VkDevice device_h = device();
+ VkQueue queue_h;
+ vk::GetDeviceQueue(device(), queue_family, queue_index, &queue_h);
+ VkQueueObj queue_o(queue_h, queue_family);
+
+ const VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, command_pool.handle(),
+ VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
+ vk_testing::CommandBuffer mock_cmdbuff(*DeviceObj(), cbai);
+ const VkCommandBufferBeginInfo cbbi{VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
+ VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
+ mock_cmdbuff.begin(&cbbi);
+ mock_cmdbuff.end();
+
+ std::mutex queue_mutex;
+
+ constexpr auto test_duration = seconds{2};
+ const auto timer_begin = steady_clock::now();
+
+ const auto &testing_thread1 = [&]() {
+ for (auto timer_now = steady_clock::now(); timer_now - timer_begin < test_duration; timer_now = steady_clock::now()) {
+ VkQueue dummy_q;
+ vk::GetDeviceQueue(device_h, queue_family, queue_index, &dummy_q);
+ }
+ };
+
+ const auto &testing_thread2 = [&]() {
+ for (auto timer_now = steady_clock::now(); timer_now - timer_begin < test_duration; timer_now = steady_clock::now()) {
+ VkSubmitInfo si = {};
+ si.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
+ si.commandBufferCount = 1;
+ si.pCommandBuffers = &mock_cmdbuff.handle();
+ queue_mutex.lock();
+ ASSERT_VK_SUCCESS(vk::QueueSubmit(queue_h, 1, &si, VK_NULL_HANDLE));
+ queue_mutex.unlock();
+ }
+ };
+
+ const auto &testing_thread3 = [&]() {
+ for (auto timer_now = steady_clock::now(); timer_now - timer_begin < test_duration; timer_now = steady_clock::now()) {
+ queue_mutex.lock();
+ ASSERT_VK_SUCCESS(vk::QueueWaitIdle(queue_h));
+ queue_mutex.unlock();
+ }
+ };
+
+ Monitor().ExpectSuccess();
+ std::array<thread, 3> threads = {thread(testing_thread1), thread(testing_thread2), thread(testing_thread3)};
+ for (auto &t : threads) t.join();
+ Monitor().VerifyNotFound();
+
+ vk::QueueWaitIdle(queue_h);
+}
+
+TEST_F(VkPositiveLayerTest, SwapchainImageFormatProps) {
+ TEST_DESCRIPTION("Try using special format props on a swapchain image");
+
+ if (!AddSurfaceInstanceExtension()) {
+ printf("%s surface extensions not supported, skipping CmdCopySwapchainImage test\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework());
+
+ if (!AddSwapchainDeviceExtension()) {
+ printf("%s swapchain extensions not supported, skipping CmdCopySwapchainImage test\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ if (!InitSwapchain()) {
+ printf("%s Cannot create surface or swapchain, skipping CmdCopySwapchainImage test\n", kSkipPrefix);
+ return;
+ }
+
+ // HACK: I know InitSwapchain() will pick first supported format
+ VkSurfaceFormatKHR format_tmp;
+ {
+ uint32_t format_count = 1;
+ const VkResult err = vk::GetPhysicalDeviceSurfaceFormatsKHR(gpu(), m_surface, &format_count, &format_tmp);
+ ASSERT_TRUE(err == VK_SUCCESS || err == VK_INCOMPLETE) << vk_result_string(err);
+ }
+ const VkFormat format = format_tmp.format;
+
+ VkFormatProperties format_props;
+ vk::GetPhysicalDeviceFormatProperties(gpu(), format, &format_props);
+ if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT)) {
+ printf("%s We need VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BLEND_BIT feature. Skipping test.\n", kSkipPrefix);
+ return;
+ }
+
+ VkShaderObj vs(DeviceObj(), bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
+ VkShaderObj fs(DeviceObj(), bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
+
+ VkPipelineLayoutObj pipeline_layout(DeviceObj());
+ VkRenderpassObj render_pass(DeviceObj(), format);
+
+ VkPipelineObj pipeline(DeviceObj());
+ pipeline.AddShader(&vs);
+ pipeline.AddShader(&fs);
+ VkPipelineColorBlendAttachmentState pcbas = {};
+ pcbas.blendEnable = VK_TRUE; // !!!
+ pcbas.colorWriteMask =
+ VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
+ pipeline.AddColorAttachment(0, pcbas);
+ pipeline.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
+ pipeline.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
+
+ ASSERT_VK_SUCCESS(pipeline.CreateVKPipeline(pipeline_layout.handle(), render_pass.handle()));
+
+ uint32_t image_count;
+ ASSERT_VK_SUCCESS(vk::GetSwapchainImagesKHR(device(), m_swapchain, &image_count, nullptr));
+ std::vector<VkImage> swapchain_images(image_count);
+ ASSERT_VK_SUCCESS(vk::GetSwapchainImagesKHR(device(), m_swapchain, &image_count, swapchain_images.data()));
+
+ VkFenceObj fence;
+ fence.init(*DeviceObj(), VkFenceObj::create_info());
+
+ uint32_t image_index;
+ ASSERT_VK_SUCCESS(vk::AcquireNextImageKHR(device(), m_swapchain, UINT64_MAX, VK_NULL_HANDLE, fence.handle(), &image_index));
+ fence.wait(UINT32_MAX);
+
+ VkImageViewCreateInfo ivci = {};
+ ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
+ ivci.image = swapchain_images[image_index];
+ ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
+ ivci.format = format;
+ ivci.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
+ VkImageView image_view;
+ ASSERT_VK_SUCCESS(vk::CreateImageView(device(), &ivci, nullptr, &image_view));
+
+ VkFramebufferCreateInfo fbci = {};
+ fbci.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
+ fbci.renderPass = render_pass.handle();
+ fbci.attachmentCount = 1;
+ fbci.pAttachments = &image_view;
+ fbci.width = 1;
+ fbci.height = 1;
+ fbci.layers = 1;
+ VkFramebuffer framebuffer;
+ ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &fbci, nullptr, &framebuffer));
+
+ VkCommandBufferObj cmdbuff(DeviceObj(), m_commandPool);
+ cmdbuff.begin();
+ VkRenderPassBeginInfo rpbi = {};
+ rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
+ rpbi.renderPass = render_pass.handle();
+ rpbi.framebuffer = framebuffer;
+ rpbi.renderArea = {{0, 0}, {1, 1}};
+ cmdbuff.BeginRenderPass(rpbi);
+
+ Monitor().ExpectSuccess();
+ vk::CmdBindPipeline(cmdbuff.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.handle());
+ Monitor().VerifyNotFound();
+
+ // teardown
+ vk::DestroyImageView(device(), image_view, nullptr);
+ vk::DestroyFramebuffer(device(), framebuffer, nullptr);
+ DestroySwapchain();
+}
+
+TEST_F(VkPositiveLayerTest, SwapchainExclusiveModeQueueFamilyPropertiesReferences) {
+ TEST_DESCRIPTION("Try using special format props on a swapchain image");
+
+ if (!AddSurfaceInstanceExtension()) {
+ printf("%s surface extensions not supported, skipping CmdCopySwapchainImage test\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework());
+
+ if (!AddSwapchainDeviceExtension()) {
+ printf("%s swapchain extensions not supported, skipping CmdCopySwapchainImage test\n", kSkipPrefix);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ if (InitSurface()) {
+ auto surface = m_surface;
+ VkImageUsageFlags imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
+ VkSurfaceTransformFlagBitsKHR preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
+
+ VkSurfaceCapabilitiesKHR capabilities;
+ vk::GetPhysicalDeviceSurfaceCapabilitiesKHR(m_device->phy().handle(), surface, &capabilities);
+
+ uint32_t format_count;
+ vk::GetPhysicalDeviceSurfaceFormatsKHR(m_device->phy().handle(), surface, &format_count, nullptr);
+ vector<VkSurfaceFormatKHR> formats;
+ if (format_count != 0) {
+ formats.resize(format_count);
+ vk::GetPhysicalDeviceSurfaceFormatsKHR(m_device->phy().handle(), surface, &format_count, formats.data());
+ }
+
+ uint32_t present_mode_count;
+ vk::GetPhysicalDeviceSurfacePresentModesKHR(m_device->phy().handle(), surface, &present_mode_count, nullptr);
+ vector<VkPresentModeKHR> present_modes;
+ if (present_mode_count != 0) {
+ present_modes.resize(present_mode_count);
+ vk::GetPhysicalDeviceSurfacePresentModesKHR(m_device->phy().handle(), surface, &present_mode_count,
+ present_modes.data());
+ }
+
+ VkSwapchainCreateInfoKHR swapchain_create_info = {};
+ swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
+ swapchain_create_info.pNext = 0;
+ swapchain_create_info.surface = surface;
+ swapchain_create_info.minImageCount = capabilities.minImageCount;
+ swapchain_create_info.imageFormat = formats[0].format;
+ swapchain_create_info.imageColorSpace = formats[0].colorSpace;
+ swapchain_create_info.imageExtent = {capabilities.minImageExtent.width, capabilities.minImageExtent.height};
+ swapchain_create_info.imageArrayLayers = 1;
+ swapchain_create_info.imageUsage = imageUsage;
+ swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ swapchain_create_info.preTransform = preTransform;
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
+ swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR;
+#else
+ swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
+#endif
+ swapchain_create_info.presentMode = present_modes[0];
+ swapchain_create_info.clipped = VK_FALSE;
+ swapchain_create_info.oldSwapchain = 0;
+
+ swapchain_create_info.queueFamilyIndexCount = 4094967295; // This SHOULD get ignored
+ uint32_t bogus_int = 99;
+ swapchain_create_info.pQueueFamilyIndices = &bogus_int;
+
+ vk::CreateSwapchainKHR(device(), &swapchain_create_info, nullptr, &m_swapchain);
+
+ if (m_surface != VK_NULL_HANDLE) {
+ vk::DestroySurfaceKHR(instance(), m_surface, nullptr);
+ m_surface = VK_NULL_HANDLE;
+ }
+ }
+}
+
+// Android Hardware Buffer Positive Tests
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
+#include "android_ndk_types.h"
+TEST_F(VkPositiveLayerTest, AndroidHardwareBufferMemoryRequirements) {
+ TEST_DESCRIPTION("Verify AndroidHardwareBuffer doesn't conflict with memory requirements.");
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ if (IsPlatform(kGalaxyS10)) {
+ printf("%s This test should not run on Galaxy S10\n", kSkipPrefix);
+ return;
+ }
+
+ if ((DeviceExtensionSupported(gpu(), nullptr, VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)) &&
+ // Also skip on devices that advertise AHB, but not the pre-requisite foreign_queue extension
+ (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME))) {
+ m_device_extension_names.push_back(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME);
+ } else {
+ printf("%s %s extension not supported, skipping tests\n", kSkipPrefix,
+ VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ PFN_vkGetAndroidHardwareBufferPropertiesANDROID pfn_GetAHBProps =
+ (PFN_vkGetAndroidHardwareBufferPropertiesANDROID)vk::GetDeviceProcAddr(m_device->device(),
+ "vkGetAndroidHardwareBufferPropertiesANDROID");
+ ASSERT_TRUE(pfn_GetAHBProps != nullptr);
+
+ // Allocate an AHardwareBuffer
+ AHardwareBuffer *ahb;
+ AHardwareBuffer_Desc ahb_desc = {};
+ ahb_desc.format = AHARDWAREBUFFER_FORMAT_BLOB;
+ ahb_desc.usage = AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER;
+ ahb_desc.width = 64;
+ ahb_desc.height = 1;
+ ahb_desc.layers = 1;
+ ahb_desc.stride = 1;
+ AHardwareBuffer_allocate(&ahb_desc, &ahb);
+
+ VkExternalMemoryBufferCreateInfo ext_buf_info = {};
+ ext_buf_info.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR;
+ ext_buf_info.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
+
+ VkBufferCreateInfo buffer_create_info = {};
+ buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ buffer_create_info.pNext = &ext_buf_info;
+ buffer_create_info.size = 512;
+ buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
+
+ VkBuffer buffer = VK_NULL_HANDLE;
+ vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &buffer);
+
+ VkImportAndroidHardwareBufferInfoANDROID import_ahb_Info = {};
+ import_ahb_Info.sType = VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID;
+ import_ahb_Info.pNext = nullptr;
+ import_ahb_Info.buffer = ahb;
+
+ VkAndroidHardwareBufferPropertiesANDROID ahb_props = {};
+ ahb_props.sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID;
+ ahb_props.pNext = nullptr;
+ pfn_GetAHBProps(m_device->device(), ahb, &ahb_props);
+
+ VkMemoryAllocateInfo memory_allocate_info = {};
+ memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ memory_allocate_info.pNext = &import_ahb_Info;
+ memory_allocate_info.allocationSize = ahb_props.allocationSize;
+
+ // Set index to match one of the bits in ahb_props that is also only Device Local
+ // Android implemenetations "should have" a DEVICE_LOCAL only index designed for AHB
+ VkMemoryPropertyFlagBits property = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
+ VkPhysicalDeviceMemoryProperties gpu_memory_props;
+ vk::GetPhysicalDeviceMemoryProperties(gpu(), &gpu_memory_props);
+ memory_allocate_info.memoryTypeIndex = gpu_memory_props.memoryTypeCount + 1;
+ for (uint32_t i = 0; i < gpu_memory_props.memoryTypeCount; i++) {
+ if ((ahb_props.memoryTypeBits & (1 << i)) && ((gpu_memory_props.memoryTypes[i].propertyFlags & property) == property)) {
+ memory_allocate_info.memoryTypeIndex = i;
+ break;
+ }
+ }
+
+ if (memory_allocate_info.memoryTypeIndex >= gpu_memory_props.memoryTypeCount) {
+ printf("%s No invalid memory type index could be found; skipped.\n", kSkipPrefix);
+ AHardwareBuffer_release(ahb);
+ vk::DestroyBuffer(m_device->device(), buffer, nullptr);
+ return;
+ }
+
+ // Should be able to bind memory with no error
+ VkDeviceMemory memory;
+ m_errorMonitor->ExpectSuccess();
+ vk::AllocateMemory(m_device->device(), &memory_allocate_info, nullptr, &memory);
+ vk::BindBufferMemory(m_device->device(), buffer, memory, 0);
+ m_errorMonitor->VerifyNotFound();
+
+ vk::DestroyBuffer(m_device->device(), buffer, nullptr);
+ vk::FreeMemory(m_device->device(), memory, nullptr);
+}
+
+TEST_F(VkPositiveLayerTest, AndroidHardwareBufferDepthStencil) {
+ TEST_DESCRIPTION("Verify AndroidHardwareBuffer can import Depth/Stencil");
+
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ if (IsPlatform(kGalaxyS10) || IsPlatform(kShieldTV) || IsPlatform(kShieldTVb)) {
+ printf("%s This test should not run on Galaxy S10 or the ShieldTV\n", kSkipPrefix);
+ return;
+ }
+
+ if ((DeviceExtensionSupported(gpu(), nullptr, VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)) &&
+ // Also skip on devices that advertise AHB, but not the pre-requisite foreign_queue extension
+ (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME))) {
+ m_device_extension_names.push_back(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME);
+ } else {
+ printf("%s %s extension not supported, skipping tests\n", kSkipPrefix,
+ VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ PFN_vkGetAndroidHardwareBufferPropertiesANDROID pfn_GetAHBProps =
+ (PFN_vkGetAndroidHardwareBufferPropertiesANDROID)vk::GetDeviceProcAddr(m_device->device(),
+ "vkGetAndroidHardwareBufferPropertiesANDROID");
+ ASSERT_TRUE(pfn_GetAHBProps != nullptr);
+
+ // Allocate an AHardwareBuffer
+ AHardwareBuffer *ahb;
+ AHardwareBuffer_Desc ahb_desc = {};
+ ahb_desc.format = AHARDWAREBUFFER_FORMAT_D16_UNORM;
+ ahb_desc.usage = AHARDWAREBUFFER_USAGE_GPU_FRAMEBUFFER;
+ ahb_desc.width = 64;
+ ahb_desc.height = 1;
+ ahb_desc.layers = 1;
+ ahb_desc.stride = 1;
+ AHardwareBuffer_allocate(&ahb_desc, &ahb);
+
+ VkAndroidHardwareBufferFormatPropertiesANDROID ahb_fmt_props = {};
+ ahb_fmt_props.sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID;
+
+ VkAndroidHardwareBufferPropertiesANDROID ahb_props = {};
+ ahb_props.sType = VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID;
+ ahb_props.pNext = &ahb_fmt_props;
+ pfn_GetAHBProps(m_device->device(), ahb, &ahb_props);
+
+ VkExternalMemoryImageCreateInfo ext_image_info = {};
+ ext_image_info.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO;
+ ext_image_info.pNext = nullptr;
+ ext_image_info.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
+
+ // Create a Depth/Stencil image
+ VkImage dsImage;
+ VkImageCreateInfo image_create_info = {};
+ image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_create_info.pNext = &ext_image_info;
+ image_create_info.flags = 0;
+ image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ image_create_info.format = ahb_fmt_props.format;
+ image_create_info.extent = {64, 1, 1};
+ image_create_info.mipLevels = 1;
+ image_create_info.arrayLayers = 1;
+ image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
+ image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
+ vk::CreateImage(m_device->device(), &image_create_info, nullptr, &dsImage);
+
+ VkMemoryDedicatedAllocateInfo memory_dedicated_info = {};
+ memory_dedicated_info.sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO;
+ memory_dedicated_info.pNext = nullptr;
+ memory_dedicated_info.image = dsImage;
+ memory_dedicated_info.buffer = VK_NULL_HANDLE;
+
+ VkImportAndroidHardwareBufferInfoANDROID import_ahb_Info = {};
+ import_ahb_Info.sType = VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID;
+ import_ahb_Info.pNext = &memory_dedicated_info;
+ import_ahb_Info.buffer = ahb;
+
+ VkMemoryAllocateInfo memory_allocate_info = {};
+ memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ memory_allocate_info.pNext = &import_ahb_Info;
+ memory_allocate_info.allocationSize = ahb_props.allocationSize;
+
+ // Set index to match one of the bits in ahb_props that is also only Device Local
+ // Android implemenetations "should have" a DEVICE_LOCAL only index designed for AHB
+ VkMemoryPropertyFlagBits property = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
+ VkPhysicalDeviceMemoryProperties gpu_memory_props;
+ vk::GetPhysicalDeviceMemoryProperties(gpu(), &gpu_memory_props);
+ memory_allocate_info.memoryTypeIndex = gpu_memory_props.memoryTypeCount + 1;
+ for (uint32_t i = 0; i < gpu_memory_props.memoryTypeCount; i++) {
+ if ((ahb_props.memoryTypeBits & (1 << i)) && ((gpu_memory_props.memoryTypes[i].propertyFlags & property) == property)) {
+ memory_allocate_info.memoryTypeIndex = i;
+ break;
+ }
+ }
+
+ if (memory_allocate_info.memoryTypeIndex >= gpu_memory_props.memoryTypeCount) {
+ printf("%s No invalid memory type index could be found; skipped.\n", kSkipPrefix);
+ AHardwareBuffer_release(ahb);
+ vk::DestroyImage(m_device->device(), dsImage, nullptr);
+ return;
+ }
+
+ VkDeviceMemory memory;
+ m_errorMonitor->ExpectSuccess();
+ vk::AllocateMemory(m_device->device(), &memory_allocate_info, nullptr, &memory);
+ vk::BindImageMemory(m_device->device(), dsImage, memory, 0);
+ m_errorMonitor->VerifyNotFound();
+
+ vk::DestroyImage(m_device->device(), dsImage, nullptr);
+ vk::FreeMemory(m_device->device(), memory, nullptr);
+}
+
+TEST_F(VkPositiveLayerTest, AndroidHardwareBufferBindBufferMemory) {
+ TEST_DESCRIPTION("Verify AndroidHardwareBuffer Buffers can be queried for mem requirements while unbound.");
+
+ SetTargetApiVersion(VK_API_VERSION_1_1);
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ if (IsPlatform(kGalaxyS10)) {
+ printf("%s This test should not run on Galaxy S10\n", kSkipPrefix);
+ return;
+ }
+
+ if ((DeviceExtensionSupported(gpu(), nullptr, VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)) &&
+ // Also skip on devices that advertise AHB, but not the pre-requisite foreign_queue extension
+ (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME))) {
+ m_device_extension_names.push_back(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME);
+ } else {
+ printf("%s %s extension not supported, skipping tests\n", kSkipPrefix,
+ VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ PFN_vkGetAndroidHardwareBufferPropertiesANDROID pfn_GetAHBProps =
+ (PFN_vkGetAndroidHardwareBufferPropertiesANDROID)vk::GetDeviceProcAddr(m_device->device(),
+ "vkGetAndroidHardwareBufferPropertiesANDROID");
+ ASSERT_TRUE(pfn_GetAHBProps != nullptr);
+
+ // Allocate an AHardwareBuffer
+ AHardwareBuffer *ahb;
+ AHardwareBuffer_Desc ahb_desc = {};
+ ahb_desc.format = AHARDWAREBUFFER_FORMAT_BLOB;
+ ahb_desc.usage = AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER;
+ ahb_desc.width = 64;
+ ahb_desc.height = 1;
+ ahb_desc.layers = 1;
+ ahb_desc.stride = 1;
+ AHardwareBuffer_allocate(&ahb_desc, &ahb);
+
+ VkExternalMemoryBufferCreateInfo ext_buf_info = {};
+ ext_buf_info.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR;
+ ext_buf_info.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
+
+ VkBufferCreateInfo buffer_create_info = {};
+ buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ buffer_create_info.pNext = &ext_buf_info;
+ buffer_create_info.size = 8192; // greater than the 4k AHB usually are
+ buffer_create_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
+
+ VkBuffer buffer = VK_NULL_HANDLE;
+ vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &buffer);
+
+ m_errorMonitor->ExpectSuccess();
+ // Try to get memory requirements prior to binding memory
+ VkMemoryRequirements mem_reqs;
+ vk::GetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
+
+ // Test bind memory 2 extension
+ VkBufferMemoryRequirementsInfo2 buffer_mem_reqs2 = {};
+ buffer_mem_reqs2.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2;
+ buffer_mem_reqs2.pNext = nullptr;
+ buffer_mem_reqs2.buffer = buffer;
+ VkMemoryRequirements2 mem_reqs2;
+ mem_reqs2.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2;
+ mem_reqs2.pNext = nullptr;
+ vk::GetBufferMemoryRequirements2(m_device->device(), &buffer_mem_reqs2, &mem_reqs2);
+
+ VkImportAndroidHardwareBufferInfoANDROID import_ahb_Info = {};
+ import_ahb_Info.sType = VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID;
+ import_ahb_Info.pNext = nullptr;
+ import_ahb_Info.buffer = ahb;
+
+ VkMemoryAllocateInfo memory_info = {};
+ memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ memory_info.pNext = &import_ahb_Info;
+ memory_info.allocationSize = mem_reqs.size + mem_reqs.alignment; // save room for offset
+ bool has_memtype = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &memory_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
+ if (!has_memtype) {
+ printf("%s No invalid memory type index could be found; skipped.\n", kSkipPrefix);
+ AHardwareBuffer_release(ahb);
+ vk::DestroyBuffer(m_device->device(), buffer, nullptr);
+ return;
+ }
+
+ // Some drivers don't return exact size in getBufferMemory as getAHB
+ m_errorMonitor->SetUnexpectedError("VUID-VkMemoryAllocateInfo-allocationSize-02383");
+ VkDeviceMemory memory;
+ vk::AllocateMemory(m_device->device(), &memory_info, NULL, &memory);
+ vk::BindBufferMemory(m_device->device(), buffer, memory, mem_reqs.alignment);
+
+ m_errorMonitor->VerifyNotFound();
+
+ vk::DestroyBuffer(m_device->device(), buffer, nullptr);
+ vk::FreeMemory(m_device->device(), memory, nullptr);
+}
+
+TEST_F(VkPositiveLayerTest, AndroidHardwareBufferExportBuffer) {
+ TEST_DESCRIPTION("Verify VkBuffers can export to an AHB.");
+
+ SetTargetApiVersion(VK_API_VERSION_1_1);
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ if ((DeviceExtensionSupported(gpu(), nullptr, VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)) &&
+ // Also skip on devices that advertise AHB, but not the pre-requisite foreign_queue extension
+ (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME))) {
+ m_device_extension_names.push_back(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME);
+ } else {
+ printf("%s %s extension not supported, skipping tests\n", kSkipPrefix,
+ VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ PFN_vkGetMemoryAndroidHardwareBufferANDROID vkGetMemoryAndroidHardwareBufferANDROID =
+ (PFN_vkGetMemoryAndroidHardwareBufferANDROID)vk::GetDeviceProcAddr(device(), "vkGetMemoryAndroidHardwareBufferANDROID");
+ ASSERT_TRUE(vkGetMemoryAndroidHardwareBufferANDROID != nullptr);
+
+ m_errorMonitor->ExpectSuccess();
+
+ // Create VkBuffer to be exported to an AHB
+ VkBuffer buffer = VK_NULL_HANDLE;
+ VkExternalMemoryBufferCreateInfo ext_buf_info = {};
+ ext_buf_info.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR;
+ ext_buf_info.pNext = nullptr;
+ ext_buf_info.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
+
+ VkBufferCreateInfo buffer_create_info = {};
+ buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ buffer_create_info.pNext = &ext_buf_info;
+ buffer_create_info.size = 4096;
+ buffer_create_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
+ vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer);
+
+ VkMemoryRequirements mem_reqs;
+ vk::GetBufferMemoryRequirements(device(), buffer, &mem_reqs);
+
+ VkExportMemoryAllocateInfo export_memory_info = {};
+ export_memory_info.sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO;
+ export_memory_info.pNext = nullptr;
+ export_memory_info.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
+
+ VkMemoryAllocateInfo memory_info = {};
+ memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ memory_info.pNext = &export_memory_info;
+ memory_info.allocationSize = mem_reqs.size;
+
+ bool has_memtype = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &memory_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
+ if (!has_memtype) {
+ printf("%s No invalid memory type index could be found; skipped.\n", kSkipPrefix);
+ vk::DestroyBuffer(device(), buffer, nullptr);
+ return;
+ }
+
+ VkDeviceMemory memory = VK_NULL_HANDLE;
+ ;
+ vk::AllocateMemory(device(), &memory_info, NULL, &memory);
+ vk::BindBufferMemory(device(), buffer, memory, 0);
+
+ // Export memory to AHB
+ AHardwareBuffer *ahb = nullptr;
+
+ VkMemoryGetAndroidHardwareBufferInfoANDROID get_ahb_info = {};
+ get_ahb_info.sType = VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID;
+ get_ahb_info.pNext = nullptr;
+ get_ahb_info.memory = memory;
+ vkGetMemoryAndroidHardwareBufferANDROID(device(), &get_ahb_info, &ahb);
+
+ m_errorMonitor->VerifyNotFound();
+
+ // App in charge of releasing after exporting
+ AHardwareBuffer_release(ahb);
+ vk::FreeMemory(device(), memory, NULL);
+ vk::DestroyBuffer(device(), buffer, nullptr);
+}
+
+TEST_F(VkPositiveLayerTest, AndroidHardwareBufferExportImage) {
+ TEST_DESCRIPTION("Verify VkImages can export to an AHB.");
+
+ SetTargetApiVersion(VK_API_VERSION_1_1);
+ ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
+
+ if ((DeviceExtensionSupported(gpu(), nullptr, VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME)) &&
+ // Also skip on devices that advertise AHB, but not the pre-requisite foreign_queue extension
+ (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME))) {
+ m_device_extension_names.push_back(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME);
+ m_device_extension_names.push_back(VK_EXT_QUEUE_FAMILY_FOREIGN_EXTENSION_NAME);
+ } else {
+ printf("%s %s extension not supported, skipping tests\n", kSkipPrefix,
+ VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
+ return;
+ }
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ PFN_vkGetMemoryAndroidHardwareBufferANDROID vkGetMemoryAndroidHardwareBufferANDROID =
+ (PFN_vkGetMemoryAndroidHardwareBufferANDROID)vk::GetDeviceProcAddr(device(), "vkGetMemoryAndroidHardwareBufferANDROID");
+ ASSERT_TRUE(vkGetMemoryAndroidHardwareBufferANDROID != nullptr);
+
+ m_errorMonitor->ExpectSuccess();
+
+ // Create VkImage to be exported to an AHB
+ VkExternalMemoryImageCreateInfo ext_image_info = {};
+ ext_image_info.sType = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO;
+ ext_image_info.pNext = nullptr;
+ ext_image_info.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
+
+ VkImage image = VK_NULL_HANDLE;
+ VkImageCreateInfo image_create_info = {};
+ image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
+ image_create_info.pNext = &ext_image_info;
+ image_create_info.flags = 0;
+ image_create_info.imageType = VK_IMAGE_TYPE_2D;
+ image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
+ image_create_info.extent = {64, 1, 1};
+ image_create_info.mipLevels = 1;
+ image_create_info.arrayLayers = 1;
+ image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
+ image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
+ image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
+ vk::CreateImage(device(), &image_create_info, nullptr, &image);
+
+ VkMemoryDedicatedAllocateInfo memory_dedicated_info = {};
+ memory_dedicated_info.sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO;
+ memory_dedicated_info.pNext = nullptr;
+ memory_dedicated_info.image = image;
+ memory_dedicated_info.buffer = VK_NULL_HANDLE;
+
+ VkExportMemoryAllocateInfo export_memory_info = {};
+ export_memory_info.sType = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO;
+ export_memory_info.pNext = &memory_dedicated_info;
+ export_memory_info.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
+
+ VkMemoryAllocateInfo memory_info = {};
+ memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ memory_info.pNext = &export_memory_info;
+
+ // "When allocating new memory for an image that can be exported to an Android hardware buffer, the memory’s allocationSize must
+ // be zero":
+ memory_info.allocationSize = 0;
+
+ // Use any DEVICE_LOCAL memory found
+ bool has_memtype = m_device->phy().set_memory_type(0xFFFFFFFF, &memory_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
+ if (!has_memtype) {
+ printf("%s No invalid memory type index could be found; skipped.\n", kSkipPrefix);
+ vk::DestroyImage(device(), image, nullptr);
+ return;
+ }
+
+ VkDeviceMemory memory = VK_NULL_HANDLE;
+ vk::AllocateMemory(device(), &memory_info, NULL, &memory);
+ vk::BindImageMemory(device(), image, memory, 0);
+
+ // Export memory to AHB
+ AHardwareBuffer *ahb = nullptr;
+
+ VkMemoryGetAndroidHardwareBufferInfoANDROID get_ahb_info = {};
+ get_ahb_info.sType = VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID;
+ get_ahb_info.pNext = nullptr;
+ get_ahb_info.memory = memory;
+ vkGetMemoryAndroidHardwareBufferANDROID(device(), &get_ahb_info, &ahb);
+
+ m_errorMonitor->VerifyNotFound();
+
+ // App in charge of releasing after exporting
+ AHardwareBuffer_release(ahb);
+ vk::FreeMemory(device(), memory, NULL);
+ vk::DestroyImage(device(), image, nullptr);
+}
+
+#endif // VK_USE_PLATFORM_ANDROID_KHR
diff --git a/tests/vkrenderframework.cpp b/tests/vkrenderframework.cpp
index 85c4461..6bab873 100644
--- a/tests/vkrenderframework.cpp
+++ b/tests/vkrenderframework.cpp
@@ -22,20 +22,32 @@
*/
#include "vkrenderframework.h"
+
+#include <algorithm>
+#include <cassert>
+#include <cstring>
+#include <utility>
+#include <vector>
+
#include "vk_format_utils.h"
-#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
+using std::string;
+using std::strncmp;
+using std::vector;
+
+template <typename C, typename F>
+typename C::iterator RemoveIf(C &container, F &&fn) {
+ return container.erase(std::remove_if(container.begin(), container.end(), std::forward<F>(fn)), container.end());
+}
ErrorMonitor::ErrorMonitor() {
test_platform_thread_create_mutex(&mutex_);
- test_platform_thread_lock_mutex(&mutex_);
- Reset();
- test_platform_thread_unlock_mutex(&mutex_);
+ MonitorReset();
}
ErrorMonitor::~ErrorMonitor() NOEXCEPT { test_platform_thread_delete_mutex(&mutex_); }
-void ErrorMonitor::Reset() {
+void ErrorMonitor::MonitorReset() {
message_flags_ = 0;
bailout_ = NULL;
message_found_ = VK_FALSE;
@@ -46,10 +58,14 @@
other_messages_.clear();
}
-void ErrorMonitor::SetDesiredFailureMsg(const VkFlags msgFlags, const std::string msg) {
- SetDesiredFailureMsg(msgFlags, msg.c_str());
+void ErrorMonitor::Reset() {
+ test_platform_thread_lock_mutex(&mutex_);
+ MonitorReset();
+ test_platform_thread_unlock_mutex(&mutex_);
}
+void ErrorMonitor::SetDesiredFailureMsg(const VkFlags msgFlags, const string msg) { SetDesiredFailureMsg(msgFlags, msg.c_str()); }
+
void ErrorMonitor::SetDesiredFailureMsg(const VkFlags msgFlags, const char *const msgString) {
test_platform_thread_lock_mutex(&mutex_);
desired_message_strings_.insert(msgString);
@@ -65,9 +81,7 @@
void ErrorMonitor::SetUnexpectedError(const char *const msg) {
test_platform_thread_lock_mutex(&mutex_);
-
ignore_message_strings_.emplace_back(msg);
-
test_platform_thread_unlock_mutex(&mutex_);
}
@@ -125,36 +139,45 @@
vector<string> ErrorMonitor::GetOtherFailureMsgs() const { return other_messages_; }
-VkDebugReportFlagsEXT ErrorMonitor::GetMessageFlags() const { return message_flags_; }
+VkDebugReportFlagsEXT ErrorMonitor::GetMessageFlags() { return message_flags_; }
bool ErrorMonitor::AnyDesiredMsgFound() const { return message_found_; }
bool ErrorMonitor::AllDesiredMsgsFound() const { return desired_message_strings_.empty(); }
void ErrorMonitor::SetError(const char *const errorString) {
+ test_platform_thread_lock_mutex(&mutex_);
message_found_ = true;
failure_message_strings_.insert(errorString);
+ test_platform_thread_unlock_mutex(&mutex_);
}
-void ErrorMonitor::SetBailout(bool *bailout) { bailout_ = bailout; }
+void ErrorMonitor::SetBailout(bool *bailout) {
+ test_platform_thread_lock_mutex(&mutex_);
+ bailout_ = bailout;
+ test_platform_thread_unlock_mutex(&mutex_);
+}
void ErrorMonitor::DumpFailureMsgs() const {
vector<string> otherMsgs = GetOtherFailureMsgs();
if (otherMsgs.size()) {
- cout << "Other error messages logged for this test were:" << endl;
+ std::cout << "Other error messages logged for this test were:" << std::endl;
for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
- cout << " " << *iter << endl;
+ std::cout << " " << *iter << std::endl;
}
}
}
void ErrorMonitor::ExpectSuccess(VkDebugReportFlagsEXT const message_flag_mask) {
// Match ANY message matching specified type
- SetDesiredFailureMsg(message_flag_mask, "");
- message_flags_ = message_flag_mask; // override mask handling in SetDesired...
+ test_platform_thread_lock_mutex(&mutex_);
+ desired_message_strings_.insert("");
+ message_flags_ = message_flag_mask;
+ test_platform_thread_unlock_mutex(&mutex_);
}
void ErrorMonitor::VerifyFound() {
+ test_platform_thread_lock_mutex(&mutex_);
// Not receiving expected message(s) is a failure. /Before/ throwing, dump any other messages
if (!AllDesiredMsgsFound()) {
DumpFailureMsgs();
@@ -172,10 +195,12 @@
ADD_FAILURE() << "Received unexpected error(s).";
#endif
}
- Reset();
+ MonitorReset();
+ test_platform_thread_unlock_mutex(&mutex_);
}
void ErrorMonitor::VerifyNotFound() {
+ test_platform_thread_lock_mutex(&mutex_);
// ExpectSuccess() configured us to match anything. Any error is a failure.
if (AnyDesiredMsgFound()) {
DumpFailureMsgs();
@@ -193,21 +218,63 @@
ADD_FAILURE() << "Received unexpected error(s).";
#endif
}
- Reset();
+ MonitorReset();
+ test_platform_thread_unlock_mutex(&mutex_);
}
-bool ErrorMonitor::IgnoreMessage(std::string const &msg) const {
+bool ErrorMonitor::IgnoreMessage(string const &msg) const {
if (ignore_message_strings_.empty()) {
return false;
}
- return std::find_if(ignore_message_strings_.begin(), ignore_message_strings_.end(), [&msg](std::string const &str) {
- return msg.find(str) != std::string::npos;
- }) != ignore_message_strings_.end();
+ return std::find_if(ignore_message_strings_.begin(), ignore_message_strings_.end(),
+ [&msg](string const &str) { return msg.find(str) != string::npos; }) != ignore_message_strings_.end();
+}
+
+void DebugReporter::Create(VkInstance instance) NOEXCEPT {
+ assert(instance);
+ assert(!debug_obj_);
+
+ auto DebugCreate = reinterpret_cast<DebugCreateFnType>(vk::GetInstanceProcAddr(instance, debug_create_fn_name_));
+ if (!DebugCreate) return;
+
+ const VkResult err = DebugCreate(instance, &debug_create_info_, nullptr, &debug_obj_);
+ if (err) debug_obj_ = VK_NULL_HANDLE;
+}
+
+void DebugReporter::Destroy(VkInstance instance) NOEXCEPT {
+ assert(instance);
+ assert(debug_obj_); // valid to call with null object, but probably bug
+
+ auto DebugDestroy = reinterpret_cast<DebugDestroyFnType>(vk::GetInstanceProcAddr(instance, debug_destroy_fn_name_));
+ assert(DebugDestroy);
+
+ DebugDestroy(instance, debug_obj_, nullptr);
+ debug_obj_ = VK_NULL_HANDLE;
+}
+
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
+VKAPI_ATTR VkBool32 VKAPI_CALL DebugReporter::DebugCallback(VkDebugReportFlagsEXT message_flags, VkDebugReportObjectTypeEXT,
+ uint64_t, size_t, int32_t, const char *, const char *message,
+ void *user_data) {
+#else
+VKAPI_ATTR VkBool32 VKAPI_CALL DebugReporter::DebugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity,
+ VkDebugUtilsMessageTypeFlagsEXT message_types,
+ const VkDebugUtilsMessengerCallbackDataEXT *callback_data,
+ void *user_data) {
+ const auto message_flags = DebugAnnotFlagsToReportFlags(message_severity, message_types);
+ const char *message = callback_data->pMessage;
+#endif
+ ErrorMonitor *errMonitor = (ErrorMonitor *)user_data;
+
+ if (message_flags & errMonitor->GetMessageFlags()) {
+ return errMonitor->CheckForDesiredMsg(message);
+ }
+ return VK_FALSE;
}
VkRenderFramework::VkRenderFramework()
- : inst(VK_NULL_HANDLE),
+ : instance_(NULL),
m_device(NULL),
m_commandPool(VK_NULL_HANDLE),
m_commandBuffer(NULL),
@@ -223,17 +290,10 @@
m_clear_via_load_op(true),
m_depth_clear_color(1.0),
m_stencil_clear_color(0),
- m_depthStencil(NULL),
- m_CreateDebugReportCallback(VK_NULL_HANDLE),
- m_DestroyDebugReportCallback(VK_NULL_HANDLE),
- m_globalMsgCallback(VK_NULL_HANDLE),
- m_CreateDebugUtilsCallback(VK_NULL_HANDLE),
- m_DestroyDebugUtilsCallback(VK_NULL_HANDLE),
- m_global_message_callback(VK_NULL_HANDLE) {
- memset(&m_renderPassBeginInfo, 0, sizeof(m_renderPassBeginInfo));
- m_renderPassBeginInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
-
- m_errorMonitor = new ErrorMonitor;
+ m_depthStencil(NULL) {
+ m_framebuffer_info = lvl_init_struct<VkFramebufferCreateInfo>();
+ m_renderPass_info = lvl_init_struct<VkRenderPassCreateInfo>();
+ m_renderPassBeginInfo = lvl_init_struct<VkRenderPassBeginInfo>();
// clear the back buffer to dark grey
m_clear_color.float32[0] = 0.25f;
@@ -245,40 +305,53 @@
VkRenderFramework::~VkRenderFramework() { ShutdownFramework(); }
VkPhysicalDevice VkRenderFramework::gpu() {
- EXPECT_NE((VkInstance)0, inst); // Invalid to request gpu before instance exists
- return objs[0];
+ EXPECT_NE((VkInstance)0, instance_); // Invalid to request gpu before instance exists
+ return gpu_;
+}
+
+VkPhysicalDeviceProperties VkRenderFramework::physDevProps() {
+ EXPECT_NE((VkPhysicalDevice)0, gpu_); // Invalid to request physical device properties before gpu
+ return physDevProps_;
}
// Return true if layer name is found and spec+implementation values are >= requested values
-bool VkRenderFramework::InstanceLayerSupported(const char *name, uint32_t spec, uint32_t implementation) {
- uint32_t layer_count = 0;
- std::vector<VkLayerProperties> layer_props;
+bool VkRenderFramework::InstanceLayerSupported(const char *const layer_name, const uint32_t spec_version,
+ const uint32_t impl_version) {
+ const auto layers = vk_testing::GetGlobalLayers();
- VkResult res = vk::EnumerateInstanceLayerProperties(&layer_count, NULL);
- if (VK_SUCCESS != res) return false;
- if (0 == layer_count) return false;
-
- layer_props.resize(layer_count);
- res = vk::EnumerateInstanceLayerProperties(&layer_count, layer_props.data());
- if (VK_SUCCESS != res) return false;
-
- for (auto &it : layer_props) {
- if (0 == strncmp(name, it.layerName, VK_MAX_EXTENSION_NAME_SIZE)) {
- return ((it.specVersion >= spec) && (it.implementationVersion >= implementation));
+ for (const auto &layer : layers) {
+ if (0 == strncmp(layer_name, layer.layerName, VK_MAX_EXTENSION_NAME_SIZE)) {
+ return layer.specVersion >= spec_version && layer.implementationVersion >= impl_version;
}
}
return false;
}
+// Return true if extension name is found and spec value is >= requested spec value
+// WARNING: for simplicity, does not cover layers' extensions
+bool VkRenderFramework::InstanceExtensionSupported(const char *const extension_name, const uint32_t spec_version) {
+ // WARNING: assume debug extensions are always supported, which are usually provided by layers
+ if (0 == strncmp(extension_name, VK_EXT_DEBUG_UTILS_EXTENSION_NAME, VK_MAX_EXTENSION_NAME_SIZE)) return true;
+ if (0 == strncmp(extension_name, VK_EXT_DEBUG_REPORT_EXTENSION_NAME, VK_MAX_EXTENSION_NAME_SIZE)) return true;
+
+ const auto extensions = vk_testing::GetGlobalExtensions();
+
+ const auto IsTheQueriedExtension = [extension_name, spec_version](const VkExtensionProperties &extension) {
+ return strncmp(extension_name, extension.extensionName, VK_MAX_EXTENSION_NAME_SIZE) == 0 &&
+ extension.specVersion >= spec_version;
+ };
+
+ return std::any_of(extensions.begin(), extensions.end(), IsTheQueriedExtension);
+}
+
// Enable device profile as last layer on stack overriding devsim if there, or return if not available
bool VkRenderFramework::EnableDeviceProfileLayer() {
if (InstanceLayerSupported("VK_LAYER_LUNARG_device_profile_api")) {
if (VkTestFramework::m_devsim_layer) {
- assert(0 == strcmp(m_instance_layer_names.back(), "VK_LAYER_LUNARG_device_simulation"));
- m_instance_layer_names.pop_back();
- m_instance_layer_names.push_back("VK_LAYER_LUNARG_device_profile_api");
+ assert(0 == strncmp(instance_layers_.back(), "VK_LAYER_LUNARG_device_simulation", VK_MAX_EXTENSION_NAME_SIZE));
+ instance_layers_.back() = "VK_LAYER_LUNARG_device_profile_api";
} else {
- m_instance_layer_names.push_back("VK_LAYER_LUNARG_device_profile_api");
+ instance_layers_.push_back("VK_LAYER_LUNARG_device_profile_api");
}
} else {
printf(" Did not find VK_LAYER_LUNARG_device_profile_api layer; skipped.\n");
@@ -287,66 +360,37 @@
return true;
}
-// Return true if extension name is found and spec value is >= requested spec value
-bool VkRenderFramework::InstanceExtensionSupported(const char *ext_name, uint32_t spec) {
- // Debug utils is explicitly supported by the validation layer, no need to check for it
- if (0 == strncmp(ext_name, VK_EXT_DEBUG_UTILS_EXTENSION_NAME, VK_MAX_EXTENSION_NAME_SIZE)) {
- return true;
- }
- uint32_t ext_count = 0;
- std::vector<VkExtensionProperties> ext_props;
- VkResult res = vk::EnumerateInstanceExtensionProperties(nullptr, &ext_count, nullptr);
- if (VK_SUCCESS != res) return false;
- if (0 == ext_count) return false;
-
- ext_props.resize(ext_count);
- res = vk::EnumerateInstanceExtensionProperties(nullptr, &ext_count, ext_props.data());
- if (VK_SUCCESS != res) return false;
-
- for (auto &it : ext_props) {
- if (0 == strncmp(ext_name, it.extensionName, VK_MAX_EXTENSION_NAME_SIZE)) {
- return (it.specVersion >= spec);
- }
- }
- return false;
-}
-
// Return true if instance exists and extension name is in the list
bool VkRenderFramework::InstanceExtensionEnabled(const char *ext_name) {
- if (!inst) return false;
+ if (!instance_) return false;
- bool ext_found = false;
- for (auto ext : m_instance_extension_names) {
- if (!strcmp(ext, ext_name)) {
- ext_found = true;
- break;
- }
- }
- return ext_found;
+ return std::any_of(instance_extensions_.begin(), instance_extensions_.end(),
+ [ext_name](const char *e) { return 0 == strncmp(ext_name, e, VK_MAX_EXTENSION_NAME_SIZE); });
}
-
// Return true if extension name is found and spec value is >= requested spec value
-bool VkRenderFramework::DeviceExtensionSupported(VkPhysicalDevice dev, const char *layer, const char *ext_name, uint32_t spec) {
- if (!inst) {
- EXPECT_NE((VkInstance)0, inst); // Complain, not cool without an instance
+bool VkRenderFramework::DeviceExtensionSupported(const char *extension_name, const uint32_t spec_version) const {
+ if (!instance_ || !gpu_) {
+ EXPECT_NE((VkInstance)0, instance_); // Complain, not cool without an instance
+ EXPECT_NE((VkPhysicalDevice)0, gpu_);
return false;
}
- uint32_t ext_count = 0;
- std::vector<VkExtensionProperties> ext_props;
- VkResult res = vk::EnumerateDeviceExtensionProperties(dev, layer, &ext_count, nullptr);
- if (VK_SUCCESS != res) return false;
- if (0 == ext_count) return false;
- ext_props.resize(ext_count);
- res = vk::EnumerateDeviceExtensionProperties(dev, layer, &ext_count, ext_props.data());
- if (VK_SUCCESS != res) return false;
+ const vk_testing::PhysicalDevice device_obj(gpu_);
- for (auto &it : ext_props) {
- if (0 == strncmp(ext_name, it.extensionName, VK_MAX_EXTENSION_NAME_SIZE)) {
- return (it.specVersion >= spec);
- }
+ const auto enabled_layers = instance_layers_; // assumes instance_layers_ contains enabled layers
+
+ auto extensions = device_obj.extensions();
+ for (const auto &layer : enabled_layers) {
+ const auto layer_extensions = device_obj.extensions(layer);
+ extensions.insert(extensions.end(), layer_extensions.begin(), layer_extensions.end());
}
- return false;
+
+ const auto IsTheQueriedExtension = [extension_name, spec_version](const VkExtensionProperties &extension) {
+ return strncmp(extension_name, extension.extensionName, VK_MAX_EXTENSION_NAME_SIZE) == 0 &&
+ extension.specVersion >= spec_version;
+ };
+
+ return std::any_of(extensions.begin(), extensions.end(), IsTheQueriedExtension);
}
// Return true if device is created and extension name is found in the list
@@ -355,7 +399,7 @@
bool ext_found = false;
for (auto ext : m_device_extension_names) {
- if (!strcmp(ext, ext_name)) {
+ if (!strncmp(ext, ext_name, VK_MAX_EXTENSION_NAME_SIZE)) {
ext_found = true;
break;
}
@@ -363,198 +407,76 @@
return ext_found;
}
-// WARNING: The DevSim layer can override the properties that are tested here, making the result of
-// this function dubious when DevSim is active.
-bool VkRenderFramework::DeviceIsMockICD() {
- VkPhysicalDeviceProperties props = vk_testing::PhysicalDevice(gpu()).properties();
- if ((props.vendorID == 0xba5eba11) && (props.deviceID == 0xf005ba11) && (0 == strcmp("Vulkan Mock Device", props.deviceName))) {
- return true;
- }
- return false;
-}
-
// Some tests may need to be skipped if the devsim layer is in use.
bool VkRenderFramework::DeviceSimulation() { return m_devsim_layer; }
-// Debug Report-based framework initialization
-void VkRenderFramework::InitFrameworkDebugReport(PFN_vkDebugReportCallbackEXT dbgFunction, void *userData, void *instance_pnext) {
- // Only enable device profile layer by default if devsim is not enabled
- if (!VkTestFramework::m_devsim_layer && InstanceLayerSupported("VK_LAYER_LUNARG_device_profile_api")) {
- m_instance_layer_names.push_back("VK_LAYER_LUNARG_device_profile_api");
- }
-
- // Assert not already initialized
- ASSERT_EQ((VkInstance)0, inst);
-
- // Remove any unsupported layer names from list
- for (auto layer = m_instance_layer_names.begin(); layer != m_instance_layer_names.end();) {
- if (!InstanceLayerSupported(*layer)) {
- ADD_FAILURE() << "InitFramework(): Requested layer " << *layer << " was not found. Disabled.";
- layer = m_instance_layer_names.erase(layer);
- } else {
- ++layer;
- }
- }
-
- // Remove any unsupported instance extension names from list
- for (auto ext = m_instance_extension_names.begin(); ext != m_instance_extension_names.end();) {
- if (!InstanceExtensionSupported(*ext)) {
- ADD_FAILURE() << "InitFramework(): Requested extension " << *ext << " was not found. Disabled.";
- ext = m_instance_extension_names.erase(ext);
- } else {
- ++ext;
- }
- }
-
- VkInstanceCreateInfo instInfo = {};
- instInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
- instInfo.pNext = instance_pnext;
- instInfo.pApplicationInfo = &app_info;
- instInfo.enabledLayerCount = m_instance_layer_names.size();
- instInfo.ppEnabledLayerNames = m_instance_layer_names.data();
- instInfo.enabledExtensionCount = m_instance_extension_names.size();
- instInfo.ppEnabledExtensionNames = m_instance_extension_names.data();
-
- VkDebugReportCallbackCreateInfoEXT dbgCreateInfo;
- if (dbgFunction) {
- // Enable create time debug messages
- memset(&dbgCreateInfo, 0, sizeof(dbgCreateInfo));
- dbgCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
- dbgCreateInfo.flags = kErrorBit | kWarningBit | kPerformanceWarningBit;
- dbgCreateInfo.pfnCallback = dbgFunction;
- dbgCreateInfo.pUserData = userData;
-
- dbgCreateInfo.pNext = instInfo.pNext;
- instInfo.pNext = &dbgCreateInfo;
- }
-
- VkResult err;
-
- err = vk::CreateInstance(&instInfo, NULL, &this->inst);
- ASSERT_VK_SUCCESS(err);
-
- err = vk::EnumeratePhysicalDevices(inst, &this->gpu_count, NULL);
- ASSERT_LE(this->gpu_count, ARRAY_SIZE(objs)) << "Too many gpus";
- ASSERT_VK_SUCCESS(err);
- err = vk::EnumeratePhysicalDevices(inst, &this->gpu_count, objs);
- ASSERT_VK_SUCCESS(err);
- ASSERT_GE(this->gpu_count, (uint32_t)1) << "No GPU available";
-
- if (dbgFunction) {
- m_CreateDebugReportCallback =
- (PFN_vkCreateDebugReportCallbackEXT)vk::GetInstanceProcAddr(this->inst, "vkCreateDebugReportCallbackEXT");
- ASSERT_NE(m_CreateDebugReportCallback, (PFN_vkCreateDebugReportCallbackEXT)NULL)
- << "Did not get function pointer for CreateDebugReportCallback";
- if (m_CreateDebugReportCallback) {
- dbgCreateInfo.pNext = nullptr; // clean up from usage in CreateInstance above
- err = m_CreateDebugReportCallback(this->inst, &dbgCreateInfo, NULL, &m_globalMsgCallback);
- ASSERT_VK_SUCCESS(err);
-
- m_DestroyDebugReportCallback =
- (PFN_vkDestroyDebugReportCallbackEXT)vk::GetInstanceProcAddr(this->inst, "vkDestroyDebugReportCallbackEXT");
- ASSERT_NE(m_DestroyDebugReportCallback, (PFN_vkDestroyDebugReportCallbackEXT)NULL)
- << "Did not get function pointer for DestroyDebugReportCallback";
- }
- }
+VkInstanceCreateInfo VkRenderFramework::GetInstanceCreateInfo() const {
+ return {
+ VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
+ &debug_reporter_.debug_create_info_,
+ 0,
+ &app_info_,
+ static_cast<uint32_t>(instance_layers_.size()),
+ instance_layers_.data(),
+ static_cast<uint32_t>(instance_extensions_.size()),
+ instance_extensions_.data(),
+ };
}
-// Debug Utils-based framework initialization
-void VkRenderFramework::InitFrameworkDebugUtils(PFN_vkDebugUtilsMessengerCallbackEXT debug_function, void *userData,
- void *instance_pnext) {
- // Only enable device profile layer by default if devsim is not enabled
- if (!VkTestFramework::m_devsim_layer && InstanceLayerSupported("VK_LAYER_LUNARG_device_profile_api")) {
- m_instance_layer_names.push_back("VK_LAYER_LUNARG_device_profile_api");
- }
+void VkRenderFramework::InitFramework(void * /*unused compatibility parameter*/, void *instance_pnext) {
+ ASSERT_EQ((VkInstance)0, instance_);
- // Assert not already initialized
- ASSERT_EQ((VkInstance)0, inst);
-
- // Remove any unsupported layer names from list
- for (auto layer = m_instance_layer_names.begin(); layer != m_instance_layer_names.end();) {
- if (!InstanceLayerSupported(*layer)) {
- ADD_FAILURE() << "InitFramework(): Requested layer " << *layer << " was not found. Disabled.";
- layer = m_instance_layer_names.erase(layer);
- } else {
- ++layer;
+ const auto LayerNotSupportedWithReporting = [](const char *layer) {
+ if (InstanceLayerSupported(layer))
+ return false;
+ else {
+ ADD_FAILURE() << "InitFramework(): Requested layer \"" << layer << "\" is not supported. It will be disabled.";
+ return true;
}
- }
-
- // Remove any unsupported instance extension names from list
- for (auto ext = m_instance_extension_names.begin(); ext != m_instance_extension_names.end();) {
- if (!InstanceExtensionSupported(*ext)) {
- ADD_FAILURE() << "InitFramework(): Requested extension " << *ext << " was not found. Disabled.";
- ext = m_instance_extension_names.erase(ext);
- } else {
- ++ext;
+ };
+ const auto ExtensionNotSupportedWithReporting = [](const char *extension) {
+ if (InstanceExtensionSupported(extension))
+ return false;
+ else {
+ ADD_FAILURE() << "InitFramework(): Requested extension \"" << extension << "\" is not supported. It will be disabled.";
+ return true;
}
+ };
+
+ RemoveIf(instance_layers_, LayerNotSupportedWithReporting);
+ RemoveIf(instance_extensions_, ExtensionNotSupportedWithReporting);
+
+ auto ici = GetInstanceCreateInfo();
+
+ // concatenate pNexts
+ void *last_pnext = nullptr;
+ if (instance_pnext) {
+ last_pnext = instance_pnext;
+ while (reinterpret_cast<const VkBaseOutStructure *>(last_pnext)->pNext)
+ last_pnext = reinterpret_cast<VkBaseOutStructure *>(last_pnext)->pNext;
+
+ void *&link = reinterpret_cast<void *&>(reinterpret_cast<VkBaseOutStructure *>(last_pnext)->pNext);
+ link = const_cast<void *>(ici.pNext);
+ ici.pNext = instance_pnext;
}
- VkInstanceCreateInfo instInfo = {};
- instInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
- instInfo.pNext = instance_pnext;
- instInfo.pApplicationInfo = &app_info;
- instInfo.enabledLayerCount = m_instance_layer_names.size();
- instInfo.ppEnabledLayerNames = m_instance_layer_names.data();
- instInfo.enabledExtensionCount = m_instance_extension_names.size();
- instInfo.ppEnabledExtensionNames = m_instance_extension_names.data();
+ ASSERT_VK_SUCCESS(vk::CreateInstance(&ici, nullptr, &instance_));
+ if (instance_pnext) reinterpret_cast<VkBaseOutStructure *>(last_pnext)->pNext = nullptr; // reset back borrowed pNext chain
- VkDebugUtilsMessengerCreateInfoEXT debug_create_info{};
- if (debug_function) {
- // Enable create time debug messages
- debug_create_info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
- debug_create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT |
- VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
- VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT;
- debug_create_info.messageType =
- VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
- debug_create_info.pfnUserCallback = debug_function;
- debug_create_info.pUserData = userData;
+ uint32_t gpu_count = 1;
+ const VkResult err = vk::EnumeratePhysicalDevices(instance_, &gpu_count, &gpu_);
+ ASSERT_TRUE(err == VK_SUCCESS || err == VK_INCOMPLETE) << vk_result_string(err);
+ ASSERT_GT(gpu_count, (uint32_t)0) << "No GPU (i.e. VkPhysicalDevice) available";
- debug_create_info.pNext = instInfo.pNext;
- instInfo.pNext = &debug_create_info;
- }
-
- VkResult err;
-
- err = vk::CreateInstance(&instInfo, NULL, &this->inst);
- ASSERT_VK_SUCCESS(err);
-
- err = vk::EnumeratePhysicalDevices(inst, &this->gpu_count, NULL);
- ASSERT_LE(this->gpu_count, ARRAY_SIZE(objs)) << "Too many gpus";
- ASSERT_VK_SUCCESS(err);
- err = vk::EnumeratePhysicalDevices(inst, &this->gpu_count, objs);
- ASSERT_VK_SUCCESS(err);
- ASSERT_GE(this->gpu_count, (uint32_t)1) << "No GPU available";
-
- if (debug_function) {
- m_CreateDebugUtilsCallback =
- (PFN_vkCreateDebugUtilsMessengerEXT)vk::GetInstanceProcAddr(this->inst, "vkCreateDebugUtilsMessengerEXT");
- ASSERT_NE(m_CreateDebugUtilsCallback, (PFN_vkCreateDebugUtilsMessengerEXT)NULL)
- << "Did not get function pointer for CreateDebugUtilsMessengerEXT";
- if (m_CreateDebugUtilsCallback) {
- debug_create_info.pNext = nullptr; // clean up from usage in CreateInstance above
- err = m_CreateDebugUtilsCallback(this->inst, &debug_create_info, NULL, &m_global_message_callback);
- ASSERT_VK_SUCCESS(err);
-
- m_DestroyDebugUtilsCallback =
- (PFN_vkDestroyDebugUtilsMessengerEXT)vk::GetInstanceProcAddr(this->inst, "vkDestroyDebugUtilsMessengerEXT");
- ASSERT_NE(m_DestroyDebugUtilsCallback, (PFN_vkDestroyDebugUtilsMessengerEXT)NULL)
- << "Did not get function pointer for DestroyDebugUtilsMessengerEXT";
- }
- }
-}
-
-void VkRenderFramework::InitFramework(void *userData, void *instance_pnext) {
-#ifdef VK_USE_PLATFORM_ANDROID_KHR
- InitFrameworkDebugReport(LvtDebugReportFunc, userData, instance_pnext);
-#else
- InitFrameworkDebugUtils(LvtDebugUtilsFunc, userData, instance_pnext);
-#endif
+ vk::GetPhysicalDeviceProperties(gpu_, &physDevProps_);
+ debug_reporter_.Create(instance_);
}
void VkRenderFramework::ShutdownFramework() {
+ debug_reporter_.error_monitor_.Reset();
+
// Nothing to shut down without a VkInstance
- if (!this->inst) return;
+ if (!instance_) return;
delete m_commandBuffer;
m_commandBuffer = nullptr;
@@ -565,12 +487,6 @@
if (m_renderPass) vk::DestroyRenderPass(device(), m_renderPass, NULL);
m_renderPass = VK_NULL_HANDLE;
- if (m_globalMsgCallback) m_DestroyDebugReportCallback(this->inst, m_globalMsgCallback, NULL);
- m_globalMsgCallback = VK_NULL_HANDLE;
-
- if (m_global_message_callback) m_DestroyDebugUtilsCallback(this->inst, m_global_message_callback, NULL);
- m_global_message_callback = VK_NULL_HANDLE;
-
m_renderTargets.clear();
delete m_depthStencil;
@@ -580,16 +496,17 @@
delete m_device;
m_device = nullptr;
- if (this->inst) vk::DestroyInstance(this->inst, NULL);
- delete m_errorMonitor;
- this->inst = (VkInstance)0; // In case we want to re-initialize
+ debug_reporter_.Destroy(instance_);
+
+ vk::DestroyInstance(instance_, nullptr);
+ instance_ = NULL; // In case we want to re-initialize
}
-ErrorMonitor *VkRenderFramework::Monitor() { return m_errorMonitor; }
+ErrorMonitor &VkRenderFramework::Monitor() { return debug_reporter_.error_monitor_; }
void VkRenderFramework::GetPhysicalDeviceFeatures(VkPhysicalDeviceFeatures *features) {
if (NULL == m_device) {
- VkDeviceObj *temp_device = new VkDeviceObj(0, objs[0], m_device_extension_names);
+ VkDeviceObj *temp_device = new VkDeviceObj(0, gpu_, m_device_extension_names);
*features = temp_device->phy().features();
delete (temp_device);
} else {
@@ -597,39 +514,32 @@
}
}
-void VkRenderFramework::GetPhysicalDeviceProperties(VkPhysicalDeviceProperties *props) {
- *props = vk_testing::PhysicalDevice(gpu()).properties();
+bool VkRenderFramework::IsPlatform(PlatformType platform) {
+ return (!vk_gpu_table.find(platform)->second.compare(physDevProps().deviceName));
}
+void VkRenderFramework::GetPhysicalDeviceProperties(VkPhysicalDeviceProperties *props) { *props = physDevProps_; }
+
void VkRenderFramework::InitState(VkPhysicalDeviceFeatures *features, void *create_device_pnext,
const VkCommandPoolCreateFlags flags) {
- // Remove any unsupported device extension names from list
- for (auto ext = m_device_extension_names.begin(); ext != m_device_extension_names.end();) {
- if (!DeviceExtensionSupported(objs[0], nullptr, *ext)) {
- bool found = false;
- for (auto layer = m_instance_layer_names.begin(); layer != m_instance_layer_names.end(); ++layer) {
- if (DeviceExtensionSupported(objs[0], *layer, *ext)) {
- found = true;
- break;
- }
- }
- if (!found) {
- ADD_FAILURE() << "InitState(): The requested device extension " << *ext << " was not found. Disabled.";
- ext = m_device_extension_names.erase(ext);
- } else {
- ++ext;
- }
- } else {
- ++ext;
+ const auto ExtensionNotSupportedWithReporting = [this](const char *extension) {
+ if (DeviceExtensionSupported(extension))
+ return false;
+ else {
+ ADD_FAILURE() << "InitState(): Requested device extension \"" << extension
+ << "\" is not supported. It will be disabled.";
+ return true;
}
- }
+ };
- m_device = new VkDeviceObj(0, objs[0], m_device_extension_names, features, create_device_pnext);
+ RemoveIf(m_device_extension_names, ExtensionNotSupportedWithReporting);
+
+ m_device = new VkDeviceObj(0, gpu_, m_device_extension_names, features, create_device_pnext);
m_device->SetDeviceQueue();
m_depthStencil = new VkDepthStencilObj(m_device);
- m_render_target_fmt = VkTestFramework::GetFormat(inst, m_device);
+ m_render_target_fmt = VkTestFramework::GetFormat(instance_, m_device);
m_lineWidth = 1.0f;
@@ -755,17 +665,12 @@
bool VkRenderFramework::InitSwapchain(VkSurfaceKHR &surface, VkImageUsageFlags imageUsage,
VkSurfaceTransformFlagBitsKHR preTransform) {
- for (size_t i = 0; i < m_device->queue_props.size(); ++i) {
- VkBool32 presentSupport = false;
- vk::GetPhysicalDeviceSurfaceSupportKHR(m_device->phy().handle(), i, surface, &presentSupport);
- }
-
VkSurfaceCapabilitiesKHR capabilities;
vk::GetPhysicalDeviceSurfaceCapabilitiesKHR(m_device->phy().handle(), surface, &capabilities);
uint32_t format_count;
vk::GetPhysicalDeviceSurfaceFormatsKHR(m_device->phy().handle(), surface, &format_count, nullptr);
- std::vector<VkSurfaceFormatKHR> formats;
+ vector<VkSurfaceFormatKHR> formats;
if (format_count != 0) {
formats.resize(format_count);
vk::GetPhysicalDeviceSurfaceFormatsKHR(m_device->phy().handle(), surface, &format_count, formats.data());
@@ -773,7 +678,7 @@
uint32_t present_mode_count;
vk::GetPhysicalDeviceSurfacePresentModesKHR(m_device->phy().handle(), surface, &present_mode_count, nullptr);
- std::vector<VkPresentModeKHR> present_modes;
+ vector<VkPresentModeKHR> present_modes;
if (present_mode_count != 0) {
present_modes.resize(present_mode_count);
vk::GetPhysicalDeviceSurfacePresentModesKHR(m_device->phy().handle(), surface, &present_mode_count, present_modes.data());
@@ -806,7 +711,7 @@
}
uint32_t imageCount = 0;
vk::GetSwapchainImagesKHR(device(), m_swapchain, &imageCount, nullptr);
- std::vector<VkImage> swapchainImages;
+ vector<VkImage> swapchainImages;
swapchainImages.resize(imageCount);
vk::GetSwapchainImagesKHR(device(), m_swapchain, &imageCount, swapchainImages.data());
return true;
@@ -830,9 +735,9 @@
void VkRenderFramework::InitRenderTarget(VkImageView *dsBinding) { InitRenderTarget(1, dsBinding); }
void VkRenderFramework::InitRenderTarget(uint32_t targets, VkImageView *dsBinding) {
- std::vector<VkAttachmentDescription> attachments;
- std::vector<VkAttachmentReference> color_references;
- std::vector<VkImageView> bindings;
+ vector<VkAttachmentDescription> &attachments = m_renderPass_attachments;
+ vector<VkAttachmentReference> color_references;
+ vector<VkImageView> &bindings = m_framebuffer_attachments;
attachments.reserve(targets + 1); // +1 for dsBinding
color_references.reserve(targets);
bindings.reserve(targets + 1); // +1 for dsBinding
@@ -844,7 +749,7 @@
att.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
- att.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ att.initialLayout = (m_clear_via_load_op) ? VK_IMAGE_LAYOUT_UNDEFINED : VK_IMAGE_LAYOUT_GENERAL;
att.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
VkAttachmentReference ref = {};
@@ -884,7 +789,9 @@
m_renderTargets.push_back(std::move(img));
}
- VkSubpassDescription subpass = {};
+ m_renderPass_subpasses.clear();
+ m_renderPass_subpasses.resize(1);
+ VkSubpassDescription &subpass = m_renderPass_subpasses[0];
subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
subpass.flags = 0;
subpass.inputAttachmentCount = 0;
@@ -921,14 +828,17 @@
subpass.preserveAttachmentCount = 0;
subpass.pPreserveAttachments = NULL;
- VkRenderPassCreateInfo rp_info = {};
+ VkRenderPassCreateInfo &rp_info = m_renderPass_info;
rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
rp_info.attachmentCount = attachments.size();
rp_info.pAttachments = attachments.data();
- rp_info.subpassCount = 1;
- rp_info.pSubpasses = &subpass;
- VkSubpassDependency subpass_dep = {};
+ rp_info.subpassCount = m_renderPass_subpasses.size();
+ rp_info.pSubpasses = m_renderPass_subpasses.data();
+
+ m_renderPass_dependencies.clear();
if (m_addRenderPassSelfDependency) {
+ m_renderPass_dependencies.resize(1);
+ VkSubpassDependency &subpass_dep = m_renderPass_dependencies[0];
// Add a subpass self-dependency to subpass 0 of default renderPass
subpass_dep.srcSubpass = 0;
subpass_dep.dstSubpass = 0;
@@ -951,13 +861,15 @@
subpass_dep.dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
rp_info.dependencyCount = 1;
rp_info.pDependencies = &subpass_dep;
+ } else {
+ rp_info.dependencyCount = 0;
+ rp_info.pDependencies = nullptr;
}
vk::CreateRenderPass(device(), &rp_info, NULL, &m_renderPass);
- renderPass_info_ = rp_info; // Save away a copy for tests that need access to the render pass state
// Create Framebuffer and RenderPass with color attachments and any
// depth/stencil attachment
- VkFramebufferCreateInfo fb_info = {};
+ VkFramebufferCreateInfo &fb_info = m_framebuffer_info;
fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
fb_info.pNext = NULL;
fb_info.renderPass = m_renderPass;
@@ -991,7 +903,7 @@
queue_props = phy().queue_properties();
}
-VkDeviceObj::VkDeviceObj(uint32_t id, VkPhysicalDevice obj, std::vector<const char *> &extension_names,
+VkDeviceObj::VkDeviceObj(uint32_t id, VkPhysicalDevice obj, vector<const char *> &extension_names,
VkPhysicalDeviceFeatures *features, void *create_device_pnext)
: vk_testing::Device(obj), id(id) {
init(extension_names, features, create_device_pnext);
@@ -1028,7 +940,7 @@
}
VkDescriptorSetLayoutObj::VkDescriptorSetLayoutObj(const VkDeviceObj *device,
- const std::vector<VkDescriptorSetLayoutBinding> &descriptor_set_bindings,
+ const vector<VkDescriptorSetLayoutBinding> &descriptor_set_bindings,
VkDescriptorSetLayoutCreateFlags flags, void *pNext) {
VkDescriptorSetLayoutCreateInfo dsl_ci = {};
dsl_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
@@ -1153,7 +1065,7 @@
// build the update array
size_t imageSamplerCount = 0;
- for (std::vector<VkWriteDescriptorSet>::iterator it = m_writes.begin(); it != m_writes.end(); it++) {
+ for (vector<VkWriteDescriptorSet>::iterator it = m_writes.begin(); it != m_writes.end(); it++) {
it->dstSet = m_set->handle();
if (it->descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
it->pImageInfo = &m_imageSamplerDescriptors[imageSamplerCount++];
@@ -1164,7 +1076,7 @@
}
}
-VkRenderpassObj::VkRenderpassObj(VkDeviceObj *dev) {
+VkRenderpassObj::VkRenderpassObj(VkDeviceObj *dev, const VkFormat format) {
// Create a renderPass with a single color attachment
VkAttachmentReference attach = {};
attach.layout = VK_IMAGE_LAYOUT_GENERAL;
@@ -1179,7 +1091,7 @@
rpci.attachmentCount = 1;
VkAttachmentDescription attach_desc = {};
- attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
+ attach_desc.format = format;
attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
attach_desc.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
attach_desc.finalLayout = VK_IMAGE_LAYOUT_GENERAL;
@@ -1191,12 +1103,44 @@
vk::CreateRenderPass(device, &rpci, NULL, &m_renderpass);
}
+VkRenderpassObj::VkRenderpassObj(VkDeviceObj *dev, VkFormat format, bool depthStencil) {
+ if (!depthStencil) {
+ VkRenderpassObj(dev, format);
+ } else {
+ // Create a renderPass with a depth/stencil attachment
+ VkAttachmentReference attach = {};
+ attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+
+ VkSubpassDescription subpass = {};
+ subpass.pDepthStencilAttachment = &attach;
+
+ VkRenderPassCreateInfo rpci = {};
+ rpci.subpassCount = 1;
+ rpci.pSubpasses = &subpass;
+ rpci.attachmentCount = 1;
+
+ VkAttachmentDescription attach_desc = {};
+ attach_desc.format = format;
+ attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
+ attach_desc.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+
+ rpci.pAttachments = &attach_desc;
+ rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
+
+ device = dev->device();
+ vk::CreateRenderPass(device, &rpci, NULL, &m_renderpass);
+ }
+}
+
VkRenderpassObj::~VkRenderpassObj() NOEXCEPT { vk::DestroyRenderPass(device, m_renderpass, NULL); }
VkImageObj::VkImageObj(VkDeviceObj *dev) {
m_device = dev;
m_descriptorImageInfo.imageView = VK_NULL_HANDLE;
m_descriptorImageInfo.imageLayout = VK_IMAGE_LAYOUT_GENERAL;
+ m_arrayLayers = 0;
+ m_mipLevels = 0;
}
// clang-format off
@@ -1220,9 +1164,7 @@
VkPipelineStageFlags src_stages, VkPipelineStageFlags dest_stages,
uint32_t srcQueueFamilyIndex, uint32_t dstQueueFamilyIndex) {
// clang-format on
- // TODO: Mali device crashing with VK_REMAINING_MIP_LEVELS
- const VkImageSubresourceRange subresourceRange =
- subresource_range(aspect, 0, /*VK_REMAINING_MIP_LEVELS*/ 1, 0, 1 /*VK_REMAINING_ARRAY_LAYERS*/);
+ const VkImageSubresourceRange subresourceRange = subresource_range(aspect, 0, m_mipLevels, 0, m_arrayLayers);
VkImageMemoryBarrier barrier;
barrier = image_memory_barrier(output_mask, input_mask, Layout(), image_layout, subresourceRange, srcQueueFamilyIndex,
dstQueueFamilyIndex);
@@ -1241,60 +1183,64 @@
const VkFlags all_cache_inputs = VK_ACCESS_HOST_READ_BIT | VK_ACCESS_INDIRECT_COMMAND_READ_BIT | VK_ACCESS_INDEX_READ_BIT |
VK_ACCESS_VERTEX_ATTRIBUTE_READ_BIT | VK_ACCESS_UNIFORM_READ_BIT | VK_ACCESS_SHADER_READ_BIT |
VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT |
- VK_ACCESS_MEMORY_READ_BIT;
+ VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_MEMORY_READ_BIT;
+
+ const VkFlags shader_read_inputs = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_MEMORY_READ_BIT;
if (image_layout == m_descriptorImageInfo.imageLayout) {
return;
}
+ // Attempt to narrow the src_mask, by what the image could have validly been used for in it's current layout
+ switch (m_descriptorImageInfo.imageLayout) {
+ case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
+ src_mask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
+ break;
+ case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
+ src_mask = shader_read_inputs;
+ break;
+ case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
+ src_mask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ break;
+ case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
+ src_mask = VK_ACCESS_TRANSFER_READ_BIT;
+ break;
+ case VK_IMAGE_LAYOUT_UNDEFINED:
+ src_mask = 0;
+ break;
+ default:
+ src_mask = all_cache_outputs; // Only need to worry about writes, as the stage mask will protect reads
+ }
+
+ // Narrow the dst mask by the valid accesss for the new layout
switch (image_layout) {
case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
- if (m_descriptorImageInfo.imageLayout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)
- src_mask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
- else
- src_mask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ // NOTE: not sure why shader read is here...
dst_mask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_TRANSFER_READ_BIT;
break;
case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
- if (m_descriptorImageInfo.imageLayout == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)
- src_mask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
- else if (m_descriptorImageInfo.imageLayout == VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL)
- src_mask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
- else
- src_mask = VK_ACCESS_TRANSFER_WRITE_BIT;
dst_mask = VK_ACCESS_TRANSFER_WRITE_BIT;
break;
case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
- if (m_descriptorImageInfo.imageLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL)
- src_mask = VK_ACCESS_TRANSFER_WRITE_BIT;
- else
- src_mask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
- dst_mask = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_MEMORY_READ_BIT;
+ dst_mask = shader_read_inputs;
break;
case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
- if (m_descriptorImageInfo.imageLayout == VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL)
- src_mask = VK_ACCESS_TRANSFER_READ_BIT;
- else
- src_mask = 0;
dst_mask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
break;
case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
dst_mask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
- src_mask = all_cache_outputs;
break;
default:
- src_mask = all_cache_outputs;
- dst_mask = all_cache_inputs;
+ // Must wait all read and write operations for the completion of the layout tranisition
+ dst_mask = all_cache_inputs | all_cache_outputs;
break;
}
- if (m_descriptorImageInfo.imageLayout == VK_IMAGE_LAYOUT_UNDEFINED) src_mask = 0;
-
ImageMemoryBarrier(cmd_buf, aspect, src_mask, dst_mask, image_layout);
m_descriptorImageInfo.imageLayout = image_layout;
}
@@ -1365,14 +1311,42 @@
return true;
}
+VkImageCreateInfo VkImageObj::ImageCreateInfo2D(uint32_t const width, uint32_t const height, uint32_t const mipLevels,
+ uint32_t const layers, VkFormat const format, VkFlags const usage,
+ VkImageTiling const requested_tiling, const std::vector<uint32_t> *queue_families) {
+ VkImageCreateInfo imageCreateInfo = vk_testing::Image::create_info();
+ imageCreateInfo.imageType = VK_IMAGE_TYPE_2D;
+ imageCreateInfo.format = format;
+ imageCreateInfo.extent.width = width;
+ imageCreateInfo.extent.height = height;
+ imageCreateInfo.mipLevels = mipLevels;
+ imageCreateInfo.arrayLayers = layers;
+ imageCreateInfo.tiling = requested_tiling; // This will be touched up below...
+ imageCreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ // Automatically set sharing mode etc. based on queue family information
+ if (queue_families && (queue_families->size() > 1)) {
+ imageCreateInfo.sharingMode = VK_SHARING_MODE_CONCURRENT;
+ imageCreateInfo.queueFamilyIndexCount = static_cast<uint32_t>(queue_families->size());
+ imageCreateInfo.pQueueFamilyIndices = queue_families->data();
+ }
+ imageCreateInfo.usage = usage;
+ return imageCreateInfo;
+}
void VkImageObj::InitNoLayout(uint32_t const width, uint32_t const height, uint32_t const mipLevels, VkFormat const format,
VkFlags const usage, VkImageTiling const requested_tiling, VkMemoryPropertyFlags const reqs,
- const std::vector<uint32_t> *queue_families, bool memory) {
+ const vector<uint32_t> *queue_families, bool memory) {
+ InitNoLayout(ImageCreateInfo2D(width, height, mipLevels, 1, format, usage, requested_tiling, queue_families), reqs, memory);
+}
+
+void VkImageObj::InitNoLayout(const VkImageCreateInfo &create_info, VkMemoryPropertyFlags const reqs, bool memory) {
VkFormatProperties image_fmt;
+ // Touch up create info for tiling compatiblity...
+ auto usage = create_info.usage;
+ VkImageTiling requested_tiling = create_info.tiling;
VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL;
- vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &image_fmt);
+ vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), create_info.format, &image_fmt);
if (requested_tiling == VK_IMAGE_TILING_LINEAR) {
if (IsCompatible(usage, image_fmt.linearTilingFeatures)) {
@@ -1392,24 +1366,13 @@
<< ", supported optimal features: " << image_fmt.optimalTilingFeatures;
}
- VkImageCreateInfo imageCreateInfo = vk_testing::Image::create_info();
- imageCreateInfo.imageType = VK_IMAGE_TYPE_2D;
- imageCreateInfo.format = format;
- imageCreateInfo.extent.width = width;
- imageCreateInfo.extent.height = height;
- imageCreateInfo.mipLevels = mipLevels;
+ VkImageCreateInfo imageCreateInfo = create_info;
imageCreateInfo.tiling = tiling;
- imageCreateInfo.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
- // Automatically set sharing mode etc. based on queue family information
- if (queue_families && (queue_families->size() > 1)) {
- imageCreateInfo.sharingMode = VK_SHARING_MODE_CONCURRENT;
- imageCreateInfo.queueFamilyIndexCount = static_cast<uint32_t>(queue_families->size());
- imageCreateInfo.pQueueFamilyIndices = queue_families->data();
- }
+ m_mipLevels = imageCreateInfo.mipLevels;
+ m_arrayLayers = imageCreateInfo.arrayLayers;
Layout(imageCreateInfo.initialLayout);
- imageCreateInfo.usage = usage;
if (memory)
vk_testing::Image::init(*m_device, imageCreateInfo, reqs);
else
@@ -1418,12 +1381,17 @@
void VkImageObj::Init(uint32_t const width, uint32_t const height, uint32_t const mipLevels, VkFormat const format,
VkFlags const usage, VkImageTiling const requested_tiling, VkMemoryPropertyFlags const reqs,
- const std::vector<uint32_t> *queue_families, bool memory) {
- InitNoLayout(width, height, mipLevels, format, usage, requested_tiling, reqs, queue_families, memory);
+ const vector<uint32_t> *queue_families, bool memory) {
+ Init(ImageCreateInfo2D(width, height, mipLevels, 1, format, usage, requested_tiling, queue_families), reqs, memory);
+}
+
+void VkImageObj::Init(const VkImageCreateInfo &create_info, VkMemoryPropertyFlags const reqs, bool memory) {
+ InitNoLayout(create_info, reqs, memory);
if (!initialized() || !memory) return; // We don't have a valid handle from early stage init, and thus SetLayout will fail
VkImageLayout newLayout;
+ const auto usage = create_info.usage;
if (usage & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)
newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
else if (usage & VK_IMAGE_USAGE_SAMPLED_BIT)
@@ -1432,6 +1400,7 @@
newLayout = m_descriptorImageInfo.imageLayout;
VkImageAspectFlags image_aspect = 0;
+ const auto format = create_info.format;
if (FormatIsDepthAndStencil(format)) {
image_aspect = VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
} else if (FormatIsDepthOnly(format)) {
@@ -1467,6 +1436,8 @@
Layout(create_info->initialLayout);
vk_testing::Image::init(*m_device, *create_info, 0);
+ m_mipLevels = create_info->mipLevels;
+ m_arrayLayers = create_info->arrayLayers;
VkImageAspectFlags image_aspect = 0;
if (FormatIsDepthAndStencil(create_info->format)) {
@@ -1725,7 +1696,7 @@
m_stage_info.pName = name;
m_stage_info.pSpecializationInfo = specInfo;
- std::vector<unsigned int> spv;
+ vector<unsigned int> spv;
framework->GLSLtoSPV(&device->props.limits, stage, shader_code, spv, debug, spirv_minor_version);
VkShaderModuleCreateInfo moduleCreateInfo = {};
@@ -1737,8 +1708,8 @@
m_stage_info.module = handle();
}
-VkShaderObj::VkShaderObj(VkDeviceObj *device, const std::string spv_source, VkShaderStageFlagBits stage,
- VkRenderFramework *framework, char const *name, VkSpecializationInfo *specInfo) {
+VkShaderObj::VkShaderObj(VkDeviceObj *device, const string spv_source, VkShaderStageFlagBits stage, VkRenderFramework *framework,
+ char const *name, VkSpecializationInfo *specInfo) {
m_device = device;
m_stage_info.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
m_stage_info.pNext = nullptr;
@@ -1748,7 +1719,7 @@
m_stage_info.pName = name;
m_stage_info.pSpecializationInfo = specInfo;
- std::vector<unsigned int> spv;
+ vector<unsigned int> spv;
framework->ASMtoSPV(SPV_ENV_VULKAN_1_0, 0, spv_source.data(), spv);
VkShaderModuleCreateInfo moduleCreateInfo = {};
@@ -1760,9 +1731,8 @@
m_stage_info.module = handle();
}
-VkPipelineLayoutObj::VkPipelineLayoutObj(VkDeviceObj *device,
- const std::vector<const VkDescriptorSetLayoutObj *> &descriptor_layouts,
- const std::vector<VkPushConstantRange> &push_constant_ranges) {
+VkPipelineLayoutObj::VkPipelineLayoutObj(VkDeviceObj *device, const vector<const VkDescriptorSetLayoutObj *> &descriptor_layouts,
+ const vector<VkPushConstantRange> &push_constant_ranges) {
VkPipelineLayoutCreateInfo pl_ci = {};
pl_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
pl_ci.pushConstantRangeCount = static_cast<uint32_t>(push_constant_ranges.size());
diff --git a/tests/vkrenderframework.h b/tests/vkrenderframework.h
index 69b4a2f..a96eb92 100644
--- a/tests/vkrenderframework.h
+++ b/tests/vkrenderframework.h
@@ -45,25 +45,8 @@
#include <vector>
#include <unordered_set>
-// Validation debug report callback prototype
-extern VKAPI_ATTR VkBool32 VKAPI_CALL LvtDebugReportFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
- size_t location, int32_t msgCode, const char *pLayerPrefix,
- const char *pMsg, void *pUserData);
-
-// Validation debug utils callback prototype
-extern VKAPI_ATTR VkBool32 VKAPI_CALL LvtDebugUtilsFunc(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
- VkDebugUtilsMessageTypeFlagsEXT messageTypes,
- const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData, void *pUserData);
-
-using namespace std;
-
using vk_testing::MakeVkHandles;
-typedef struct {
- PFN_vkDebugReportCallbackEXT LvtDebugReportFunction;
- PFN_vkDebugUtilsMessengerCallbackEXT LvtDebugUtilsFunction;
-} DebugCallbackFunctions;
-
template <class Dst, class Src>
std::vector<Dst *> MakeTestbindingHandles(const std::vector<Src *> &v) {
std::vector<Dst *> handles;
@@ -138,13 +121,9 @@
void SetAllowedFailureMsg(const char *const msg);
VkBool32 CheckForDesiredMsg(const char *const msgString);
- vector<string> GetOtherFailureMsgs() const;
- VkDebugReportFlagsEXT GetMessageFlags() const;
- bool AnyDesiredMsgFound() const;
- bool AllDesiredMsgsFound() const;
+ VkDebugReportFlagsEXT GetMessageFlags();
void SetError(const char *const errorString);
void SetBailout(bool *bailout);
- void DumpFailureMsgs() const;
// Helpers
@@ -158,32 +137,112 @@
// TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
// function and its definition.
bool IgnoreMessage(std::string const &msg) const;
+ std::vector<std::string> GetOtherFailureMsgs() const;
+ bool AnyDesiredMsgFound() const;
+ bool AllDesiredMsgsFound() const;
+ void DumpFailureMsgs() const;
+ void MonitorReset();
VkFlags message_flags_;
std::unordered_multiset<std::string> desired_message_strings_;
std::unordered_multiset<std::string> failure_message_strings_;
std::vector<std::string> ignore_message_strings_;
std::vector<std::string> allowed_message_strings_;
- vector<string> other_messages_;
+ std::vector<std::string> other_messages_;
test_platform_thread_mutex mutex_;
bool *bailout_;
bool message_found_;
};
+struct DebugReporter {
+ void Create(VkInstance instance) NOEXCEPT;
+ void Destroy(VkInstance instance) NOEXCEPT;
+
+ ErrorMonitor error_monitor_;
+
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
+ static VKAPI_ATTR VkBool32 VKAPI_CALL DebugCallback(VkDebugReportFlagsEXT message_flags, VkDebugReportObjectTypeEXT, uint64_t,
+ size_t, int32_t, const char *, const char *msg, void *user_data);
+
+ const char *debug_extension_name = VK_EXT_DEBUG_REPORT_EXTENSION_NAME;
+ VkDebugReportCallbackCreateInfoEXT debug_create_info_ = {
+ VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT, nullptr,
+ VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
+ &DebugCallback, &error_monitor_};
+ using DebugCreateFnType = PFN_vkCreateDebugReportCallbackEXT;
+ const char *debug_create_fn_name_ = "vkCreateDebugReportCallbackEXT";
+ using DebugDestroyFnType = PFN_vkDestroyDebugReportCallbackEXT;
+ const char *debug_destroy_fn_name_ = "vkDestroyDebugReportCallbackEXT";
+ VkDebugReportCallbackEXT debug_obj_ = VK_NULL_HANDLE;
+#else
+ static VKAPI_ATTR VkBool32 VKAPI_CALL DebugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity,
+ VkDebugUtilsMessageTypeFlagsEXT message_types,
+ const VkDebugUtilsMessengerCallbackDataEXT *callback_data, void *user_data);
+
+ const char *debug_extension_name = VK_EXT_DEBUG_UTILS_EXTENSION_NAME;
+ VkDebugUtilsMessengerCreateInfoEXT debug_create_info_ = {
+ VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT,
+ nullptr,
+ 0,
+ VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
+ VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT,
+ VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT,
+ &DebugCallback,
+ &error_monitor_};
+ using DebugCreateFnType = PFN_vkCreateDebugUtilsMessengerEXT;
+ const char *debug_create_fn_name_ = "vkCreateDebugUtilsMessengerEXT";
+ using DebugDestroyFnType = PFN_vkDestroyDebugUtilsMessengerEXT;
+ const char *debug_destroy_fn_name_ = "vkDestroyDebugUtilsMessengerEXT";
+ VkDebugUtilsMessengerEXT debug_obj_ = VK_NULL_HANDLE;
+#endif
+};
+
class VkCommandPoolObj;
class VkCommandBufferObj;
class VkDepthStencilObj;
+typedef enum {
+ kGalaxyS10,
+ kPixel3,
+ kPixelC,
+ kNexusPlayer,
+ kShieldTV,
+ kShieldTVb,
+ kPixel3aXL,
+ kPixel2XL,
+ kMockICD,
+} PlatformType;
+
+const std::unordered_map<PlatformType, std::string, std::hash<int>> vk_gpu_table = {
+ {kGalaxyS10, "Mali-G76"},
+ {kPixel3, "Adreno (TM) 630"},
+ {kPixelC, "NVIDIA Tegra X1"},
+ {kNexusPlayer, "PowerVR Rogue G6430"},
+ {kShieldTV, "NVIDIA Tegra X1 (nvgpu)"},
+ {kShieldTVb, "NVIDIA Tegra X1 (rev B) (nvgpu)"},
+ {kPixel3aXL, "Adreno (TM) 615"},
+ {kPixel2XL, "Adreno (TM) 540"},
+ {kMockICD, "Vulkan Mock Device"},
+};
+
class VkRenderFramework : public VkTestFramework {
public:
- VkInstance instance() { return inst; }
+ VkInstance instance() { return instance_; }
VkDevice device() { return m_device->device(); }
VkDeviceObj *DeviceObj() const { return m_device; }
VkPhysicalDevice gpu();
VkRenderPass renderPass() { return m_renderPass; }
- const VkRenderPassCreateInfo &RenderPassInfo() const { return renderPass_info_; };
+ const VkRenderPassCreateInfo &RenderPassInfo() const { return m_renderPass_info; };
VkFramebuffer framebuffer() { return m_framebuffer; }
- ErrorMonitor *Monitor();
+ ErrorMonitor &Monitor();
+ VkPhysicalDeviceProperties physDevProps();
+
+ static bool InstanceLayerSupported(const char *layer_name, uint32_t spec_version = 0, uint32_t impl_version = 0);
+ static bool InstanceExtensionSupported(const char *extension_name, uint32_t spec_version = 0);
+
+ VkInstanceCreateInfo GetInstanceCreateInfo() const;
+ void InitFramework(void * /*unused compatibility parameter*/ = NULL, void *instance_pnext = NULL);
+ void ShutdownFramework();
void InitViewport(float width, float height);
void InitViewport();
@@ -200,13 +259,7 @@
void InitRenderTarget(uint32_t targets, VkImageView *dsBinding);
void DestroyRenderTarget();
- void InitFrameworkDebugReport(PFN_vkDebugReportCallbackEXT = NULL, void *userData = NULL, void *instance_pnext = NULL);
-
- void InitFrameworkDebugUtils(PFN_vkDebugUtilsMessengerCallbackEXT = NULL, void *userData = NULL, void *instance_pnext = NULL);
-
- void InitFramework(void *userData = NULL, void *instance_pnext = NULL);
-
- void ShutdownFramework();
+ bool IsPlatform(PlatformType platform);
void GetPhysicalDeviceFeatures(VkPhysicalDeviceFeatures *features);
void GetPhysicalDeviceProperties(VkPhysicalDeviceProperties *props);
void InitState(VkPhysicalDeviceFeatures *features = nullptr, void *create_device_pnext = nullptr,
@@ -214,32 +267,46 @@
const VkRenderPassBeginInfo &renderPassBeginInfo() const { return m_renderPassBeginInfo; }
- bool InstanceLayerSupported(const char *name, uint32_t specVersion = 0, uint32_t implementationVersion = 0);
bool EnableDeviceProfileLayer();
- bool InstanceExtensionSupported(const char *name, uint32_t specVersion = 0);
bool InstanceExtensionEnabled(const char *name);
- bool DeviceExtensionSupported(VkPhysicalDevice dev, const char *layer, const char *name, uint32_t specVersion = 0);
+ bool DeviceExtensionSupported(const char *extension_name, uint32_t spec_version = 0) const;
+ bool DeviceExtensionSupported(VkPhysicalDevice, const char *, const char *name,
+ uint32_t spec_version = 0) const { // deprecated
+ return DeviceExtensionSupported(name, spec_version);
+ }
bool DeviceExtensionEnabled(const char *name);
- bool DeviceIsMockICD();
bool DeviceSimulation();
protected:
VkRenderFramework();
virtual ~VkRenderFramework() = 0;
- VkApplicationInfo app_info;
- VkInstance inst;
- VkPhysicalDevice objs[16];
- uint32_t gpu_count;
+ DebugReporter debug_reporter_;
+ ErrorMonitor *m_errorMonitor = &debug_reporter_.error_monitor_; // compatibility alias name
+
+ VkApplicationInfo app_info_;
+ std::vector<const char *> instance_layers_;
+ std::vector<const char *> instance_extensions_;
+ std::vector<const char *> &m_instance_extension_names = instance_extensions_; // compatibility alias name
+ VkInstance instance_;
+ VkPhysicalDevice gpu_;
+ VkPhysicalDeviceProperties physDevProps_;
+
VkDeviceObj *m_device;
VkCommandPoolObj *m_commandPool;
VkCommandBufferObj *m_commandBuffer;
VkRenderPass m_renderPass;
- VkRenderPassCreateInfo renderPass_info_ = {};
+ VkRenderPassCreateInfo m_renderPass_info = {};
+ std::vector<VkAttachmentDescription> m_renderPass_attachments;
+ std::vector<VkSubpassDescription> m_renderPass_subpasses;
+ std::vector<VkSubpassDependency> m_renderPass_dependencies;
+
VkFramebuffer m_framebuffer;
+ VkFramebufferCreateInfo m_framebuffer_info;
+ std::vector<VkImageView> m_framebuffer_attachments;
+
VkSurfaceKHR m_surface;
VkSwapchainKHR m_swapchain;
- ErrorMonitor *m_errorMonitor = {};
std::vector<VkViewport> m_viewports;
std::vector<VkRect2D> m_scissors;
float m_lineWidth;
@@ -255,7 +322,7 @@
bool m_addRenderPassSelfDependency;
std::vector<VkClearValue> m_renderPassClearValues;
VkRenderPassBeginInfo m_renderPassBeginInfo;
- vector<std::unique_ptr<VkImageObj>> m_renderTargets;
+ std::vector<std::unique_ptr<VkImageObj>> m_renderTargets;
float m_width, m_height;
VkFormat m_render_target_fmt;
VkFormat m_depth_stencil_fmt;
@@ -265,18 +332,6 @@
uint32_t m_stencil_clear_color;
VkDepthStencilObj *m_depthStencil;
- // Debug Report Data
- PFN_vkCreateDebugReportCallbackEXT m_CreateDebugReportCallback;
- PFN_vkDestroyDebugReportCallbackEXT m_DestroyDebugReportCallback;
- VkDebugReportCallbackEXT m_globalMsgCallback;
-
- // Debug Utils Data
- PFN_vkCreateDebugUtilsMessengerEXT m_CreateDebugUtilsCallback;
- PFN_vkDestroyDebugUtilsMessengerEXT m_DestroyDebugUtilsCallback;
- VkDebugUtilsMessengerEXT m_global_message_callback;
-
- std::vector<const char *> m_instance_layer_names;
- std::vector<const char *> m_instance_extension_names;
std::vector<const char *> m_device_extension_names;
};
@@ -300,9 +355,9 @@
uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
const VkImageMemoryBarrier *pImageMemoryBarriers);
- void ClearAllBuffers(const vector<std::unique_ptr<VkImageObj>> &color_objs, VkClearColorValue clear_color,
+ void ClearAllBuffers(const std::vector<std::unique_ptr<VkImageObj>> &color_objs, VkClearColorValue clear_color,
VkDepthStencilObj *depth_stencil_obj, float depth_clear_value, uint32_t stencil_clear_value);
- void PrepareAttachments(const vector<std::unique_ptr<VkImageObj>> &color_atts, VkDepthStencilObj *depth_stencil_att);
+ void PrepareAttachments(const std::vector<std::unique_ptr<VkImageObj>> &color_atts, VkDepthStencilObj *depth_stencil_att);
void BindDescriptorSet(VkDescriptorSetObj &descriptorSet);
void BindIndexBuffer(VkBufferObj *indexBuffer, VkDeviceSize offset, VkIndexType indexType);
void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding);
@@ -348,7 +403,8 @@
class VkRenderpassObj {
public:
- VkRenderpassObj(VkDeviceObj *device);
+ VkRenderpassObj(VkDeviceObj *device, VkFormat format = VK_FORMAT_B8G8R8A8_UNORM);
+ VkRenderpassObj(VkDeviceObj *device, VkFormat format, bool depthStencil);
~VkRenderpassObj() NOEXCEPT;
VkRenderPass handle() { return m_renderpass; }
@@ -363,15 +419,23 @@
bool IsCompatible(VkImageUsageFlags usages, VkFormatFeatureFlags features);
public:
+ static VkImageCreateInfo ImageCreateInfo2D(uint32_t const width, uint32_t const height, uint32_t const mipLevels,
+ uint32_t const layers, VkFormat const format, VkFlags const usage,
+ VkImageTiling const requested_tiling = VK_IMAGE_TILING_LINEAR,
+ const std::vector<uint32_t> *queue_families = nullptr);
void Init(uint32_t const width, uint32_t const height, uint32_t const mipLevels, VkFormat const format, VkFlags const usage,
VkImageTiling const tiling = VK_IMAGE_TILING_LINEAR, VkMemoryPropertyFlags const reqs = 0,
const std::vector<uint32_t> *queue_families = nullptr, bool memory = true);
+ void Init(const VkImageCreateInfo &create_info, VkMemoryPropertyFlags const reqs = 0, bool memory = true);
+
void init(const VkImageCreateInfo *create_info);
void InitNoLayout(uint32_t const width, uint32_t const height, uint32_t const mipLevels, VkFormat const format,
VkFlags const usage, VkImageTiling tiling = VK_IMAGE_TILING_LINEAR, VkMemoryPropertyFlags reqs = 0,
const std::vector<uint32_t> *queue_families = nullptr, bool memory = true);
+ void InitNoLayout(const VkImageCreateInfo &create_info, VkMemoryPropertyFlags reqs = 0, bool memory = true);
+
// void clear( CommandBuffer*, uint32_t[4] );
void Layout(VkImageLayout const layout) { m_descriptorImageInfo.imageLayout = layout; }
@@ -427,6 +491,8 @@
vk_testing::ImageView m_targetView;
VkDescriptorImageInfo m_descriptorImageInfo;
+ uint32_t m_mipLevels;
+ uint32_t m_arrayLayers;
};
class VkTextureObj : public VkImageObj {
@@ -500,8 +566,8 @@
std::map<VkDescriptorType, int> m_type_counts;
int m_nextSlot;
- vector<VkDescriptorImageInfo> m_imageSamplerDescriptors;
- vector<VkWriteDescriptorSet> m_writes;
+ std::vector<VkDescriptorImageInfo> m_imageSamplerDescriptors;
+ std::vector<VkWriteDescriptorSet> m_writes;
vk_testing::DescriptorSetLayout m_layout;
vk_testing::PipelineLayout m_pipeline_layout;
@@ -560,8 +626,8 @@
void SetInputAssembly(const VkPipelineInputAssemblyStateCreateInfo *ia_state);
void SetRasterization(const VkPipelineRasterizationStateCreateInfo *rs_state);
void SetTessellation(const VkPipelineTessellationStateCreateInfo *te_state);
- void SetViewport(const vector<VkViewport> viewports);
- void SetScissor(const vector<VkRect2D> scissors);
+ void SetViewport(const std::vector<VkViewport> viewports);
+ void SetScissor(const std::vector<VkRect2D> scissors);
void SetLineState(const VkPipelineRasterizationLineStateCreateInfoEXT *line_state);
void InitGraphicsPipelineCreateInfo(VkGraphicsPipelineCreateInfo *gp_ci);
@@ -579,12 +645,12 @@
VkPipelineTessellationStateCreateInfo const *m_te_state;
VkPipelineDynamicStateCreateInfo m_pd_state;
VkPipelineRasterizationLineStateCreateInfoEXT m_line_state;
- vector<VkDynamicState> m_dynamic_state_enables;
- vector<VkViewport> m_viewports;
- vector<VkRect2D> m_scissors;
+ std::vector<VkDynamicState> m_dynamic_state_enables;
+ std::vector<VkViewport> m_viewports;
+ std::vector<VkRect2D> m_scissors;
VkDeviceObj *m_device;
- vector<VkPipelineShaderStageCreateInfo> m_shaderStages;
- vector<VkPipelineColorBlendAttachmentState> m_colorAttachments;
+ std::vector<VkPipelineShaderStageCreateInfo> m_shaderStages;
+ std::vector<VkPipelineColorBlendAttachmentState> m_colorAttachments;
};
#endif // VKRENDERFRAMEWORK_H
diff --git a/tests/vktestbinding.cpp b/tests/vktestbinding.cpp
index 413a5f2..485c34d 100644
--- a/tests/vktestbinding.cpp
+++ b/tests/vktestbinding.cpp
@@ -104,20 +104,21 @@
*/
std::vector<VkLayerProperties> GetGlobalLayers() {
VkResult err;
- std::vector<VkLayerProperties> layers;
uint32_t layer_count;
+ std::vector<VkLayerProperties> layers;
do {
- layer_count = 0;
- err = vk::EnumerateInstanceLayerProperties(&layer_count, NULL);
+ err = vk::EnumerateInstanceLayerProperties(&layer_count, nullptr);
+ assert(!err);
+ if (err || 0 == layer_count) return {};
- if (err == VK_SUCCESS) {
- layers.reserve(layer_count);
- err = vk::EnumerateInstanceLayerProperties(&layer_count, layers.data());
- }
- } while (err == VK_INCOMPLETE);
+ layers.resize(layer_count);
+ err = vk::EnumerateInstanceLayerProperties(&layer_count, layers.data());
+ } while (VK_INCOMPLETE == err);
- assert(err == VK_SUCCESS);
+ assert(!err);
+ if (err) return {};
+ layers.resize(layer_count);
return layers;
}
@@ -125,7 +126,7 @@
/*
* Return list of Global extensions provided by the ICD / Loader
*/
-std::vector<VkExtensionProperties> GetGlobalExtensions() { return GetGlobalExtensions(NULL); }
+std::vector<VkExtensionProperties> GetGlobalExtensions() { return GetGlobalExtensions(nullptr); }
/*
* Return list of Global extensions provided by the specified layer
@@ -133,51 +134,46 @@
* ICDs
*/
std::vector<VkExtensionProperties> GetGlobalExtensions(const char *pLayerName) {
- std::vector<VkExtensionProperties> exts;
- uint32_t ext_count;
VkResult err;
+ uint32_t extension_count;
+ std::vector<VkExtensionProperties> extensions;
do {
- ext_count = 0;
- err = vk::EnumerateInstanceExtensionProperties(pLayerName, &ext_count, NULL);
+ err = vk::EnumerateInstanceExtensionProperties(nullptr, &extension_count, nullptr);
+ assert(!err);
+ if (err || 0 == extension_count) return {};
- if (err == VK_SUCCESS) {
- exts.resize(ext_count);
- err = vk::EnumerateInstanceExtensionProperties(pLayerName, &ext_count, exts.data());
- }
- } while (err == VK_INCOMPLETE);
+ extensions.resize(extension_count);
+ err = vk::EnumerateInstanceExtensionProperties(nullptr, &extension_count, extensions.data());
+ } while (VK_INCOMPLETE == err);
- assert(err == VK_SUCCESS);
+ assert(!err);
+ if (err) return {};
+ extensions.resize(extension_count);
- return exts;
+ return extensions;
}
/*
- * Return list of PhysicalDevice extensions provided by the ICD / Loader
- */
-std::vector<VkExtensionProperties> PhysicalDevice::extensions() const { return extensions(NULL); }
-
-/*
* Return list of PhysicalDevice extensions provided by the specified layer
* If pLayerName is NULL, will return extensions for ICD / loader.
*/
std::vector<VkExtensionProperties> PhysicalDevice::extensions(const char *pLayerName) const {
- std::vector<VkExtensionProperties> exts;
VkResult err;
-
+ uint32_t extension_count;
+ std::vector<VkExtensionProperties> extensions;
do {
- uint32_t extCount = 0;
- err = vk::EnumerateDeviceExtensionProperties(handle(), pLayerName, &extCount, NULL);
+ err = vk::EnumerateDeviceExtensionProperties(handle(), pLayerName, &extension_count, nullptr);
+ if (err || 0 == extension_count) return {};
- if (err == VK_SUCCESS) {
- exts.resize(extCount);
- err = vk::EnumerateDeviceExtensionProperties(handle(), pLayerName, &extCount, exts.data());
- }
- } while (err == VK_INCOMPLETE);
+ extensions.resize(extension_count);
+ err = vk::EnumerateDeviceExtensionProperties(handle(), pLayerName, &extension_count, extensions.data());
+ } while (VK_INCOMPLETE == err);
- assert(err == VK_SUCCESS);
+ if (err) return {};
+ extensions.resize(extension_count);
- return exts;
+ return extensions;
}
bool PhysicalDevice::set_memory_type(const uint32_t type_bits, VkMemoryAllocateInfo *info, const VkFlags properties,
@@ -203,22 +199,21 @@
* Return list of PhysicalDevice layers
*/
std::vector<VkLayerProperties> PhysicalDevice::layers() const {
- std::vector<VkLayerProperties> layer_props;
VkResult err;
-
+ uint32_t layer_count;
+ std::vector<VkLayerProperties> layers;
do {
- uint32_t layer_count = 0;
- err = vk::EnumerateDeviceLayerProperties(handle(), &layer_count, NULL);
+ err = vk::EnumerateDeviceLayerProperties(handle(), &layer_count, nullptr);
+ if (err || 0 == layer_count) return {};
- if (err == VK_SUCCESS) {
- layer_props.reserve(layer_count);
- err = vk::EnumerateDeviceLayerProperties(handle(), &layer_count, layer_props.data());
- }
- } while (err == VK_INCOMPLETE);
+ layers.resize(layer_count);
+ err = vk::EnumerateDeviceLayerProperties(handle(), &layer_count, layers.data());
+ } while (VK_INCOMPLETE == err);
- assert(err == VK_SUCCESS);
+ if (err) return {};
+ layers.resize(layer_count);
- return layer_props;
+ return layers;
}
QueueCreateInfoArray::QueueCreateInfoArray(const std::vector<VkQueueFamilyProperties> &queue_props)
@@ -470,9 +465,9 @@
void Fence::init(const Device &dev, const VkFenceCreateInfo &info) { NON_DISPATCHABLE_HANDLE_INIT(vk::CreateFence, dev, &info); }
-VkResult Fence::wait(VkBool32 wait_all, uint64_t timeout) const {
+VkResult Fence::wait(uint64_t timeout) const {
VkFence fence = handle();
- return vk::WaitForFences(device(), 1, &fence, wait_all, timeout);
+ return vk::WaitForFences(device(), 1, &fence, VK_TRUE, timeout);
}
NON_DISPATCHABLE_HANDLE_DTOR(Semaphore, vk::DestroySemaphore)
@@ -607,27 +602,46 @@
AccelerationStructure::~AccelerationStructure() {
if (initialized()) {
- PFN_vkDestroyAccelerationStructureNV vkDestroyAccelerationStructureNV =
- (PFN_vkDestroyAccelerationStructureNV)vk::GetDeviceProcAddr(device(), "vkDestroyAccelerationStructureNV");
- assert(vkDestroyAccelerationStructureNV != nullptr);
+ if (isKHR) {
+ PFN_vkDestroyAccelerationStructureKHR vkDestroyAccelerationStructureKHR =
+ (PFN_vkDestroyAccelerationStructureKHR)vk::GetDeviceProcAddr(device(), "vkDestroyAccelerationStructureKHR");
+ assert(vkDestroyAccelerationStructureKHR != nullptr);
+ vkDestroyAccelerationStructureKHR(device(), handle(), nullptr);
+ } else {
+ PFN_vkDestroyAccelerationStructureNV vkDestroyAccelerationStructureNV =
+ (PFN_vkDestroyAccelerationStructureNV)vk::GetDeviceProcAddr(device(), "vkDestroyAccelerationStructureNV");
+ assert(vkDestroyAccelerationStructureNV != nullptr);
- vkDestroyAccelerationStructureNV(device(), handle(), nullptr);
+ vkDestroyAccelerationStructureNV(device(), handle(), nullptr);
+ }
}
}
-VkMemoryRequirements2 AccelerationStructure::memory_requirements() const {
+VkMemoryRequirements2 AccelerationStructure::memory_requirements(bool isKHR) const {
PFN_vkGetAccelerationStructureMemoryRequirementsNV vkGetAccelerationStructureMemoryRequirementsNV =
(PFN_vkGetAccelerationStructureMemoryRequirementsNV)vk::GetDeviceProcAddr(device(),
"vkGetAccelerationStructureMemoryRequirementsNV");
- assert(vkGetAccelerationStructureMemoryRequirementsNV != nullptr);
+ assert(!(!isKHR && vkGetAccelerationStructureMemoryRequirementsNV == nullptr));
- VkAccelerationStructureMemoryRequirementsInfoNV memoryRequirementsInfo = {};
- memoryRequirementsInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV;
- memoryRequirementsInfo.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV;
- memoryRequirementsInfo.accelerationStructure = handle();
-
+ PFN_vkGetAccelerationStructureMemoryRequirementsKHR vkGetAccelerationStructureMemoryRequirementsKHR =
+ (PFN_vkGetAccelerationStructureMemoryRequirementsKHR)vk::GetDeviceProcAddr(
+ device(), "vkGetAccelerationStructureMemoryRequirementsKHR");
+ assert(!(isKHR && vkGetAccelerationStructureMemoryRequirementsKHR == nullptr));
VkMemoryRequirements2 memoryRequirements = {};
- vkGetAccelerationStructureMemoryRequirementsNV(device(), &memoryRequirementsInfo, &memoryRequirements);
+ if (isKHR) {
+ VkAccelerationStructureMemoryRequirementsInfoKHR memoryRequirementsInfo = {};
+ memoryRequirementsInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_KHR;
+ memoryRequirementsInfo.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_KHR;
+ memoryRequirementsInfo.accelerationStructure = handle();
+ memoryRequirementsInfo.buildType = VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR;
+ vkGetAccelerationStructureMemoryRequirementsKHR(device(), &memoryRequirementsInfo, &memoryRequirements);
+ } else {
+ VkAccelerationStructureMemoryRequirementsInfoNV memoryRequirementsInfo = {};
+ memoryRequirementsInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV;
+ memoryRequirementsInfo.type = VK_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_TYPE_OBJECT_NV;
+ memoryRequirementsInfo.accelerationStructure = handle();
+ vkGetAccelerationStructureMemoryRequirementsNV(device(), &memoryRequirementsInfo, &memoryRequirements);
+ }
return memoryRequirements;
}
@@ -677,14 +691,37 @@
}
}
-void AccelerationStructure::create_scratch_buffer(const Device &dev, Buffer *buffer) {
+void AccelerationStructure::initKHR(const Device &dev, const VkAccelerationStructureCreateInfoKHR &info, bool init_memory) {
+ PFN_vkCreateAccelerationStructureKHR vkCreateAccelerationStructureKHR =
+ (PFN_vkCreateAccelerationStructureKHR)vk::GetDeviceProcAddr(dev.handle(), "vkCreateAccelerationStructureKHR");
+ assert(vkCreateAccelerationStructureKHR != nullptr);
+ NON_DISPATCHABLE_HANDLE_INIT(vkCreateAccelerationStructureKHR, dev, &info);
+ if (init_memory) {
+ memory_.init(dev, DeviceMemory::get_resource_alloc_info(dev, memory_requirements(true).memoryRequirements,
+ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
+ PFN_vkBindAccelerationStructureMemoryKHR vkBindAccelerationStructureMemoryKHR =
+ (PFN_vkBindAccelerationStructureMemoryKHR)vk::GetDeviceProcAddr(dev.handle(), "vkBindAccelerationStructureMemoryKHR");
+ assert(vkBindAccelerationStructureMemoryKHR != nullptr);
+ VkBindAccelerationStructureMemoryInfoKHR bind_info = {};
+ bind_info.sType = VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_KHR;
+ bind_info.accelerationStructure = handle();
+ bind_info.memory = memory_.handle();
+ EXPECT(vkBindAccelerationStructureMemoryKHR(dev.handle(), 1, &bind_info) == VK_SUCCESS);
+ }
+}
+void AccelerationStructure::create_scratch_buffer(const Device &dev, Buffer *buffer, VkBufferCreateInfo *pCreateInfo) {
VkMemoryRequirements scratch_buffer_memory_requirements = build_scratch_memory_requirements().memoryRequirements;
VkBufferCreateInfo create_info = {};
- create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
create_info.size = scratch_buffer_memory_requirements.size;
- create_info.usage = VK_BUFFER_USAGE_RAY_TRACING_BIT_NV;
- return buffer->init(dev, create_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
+ if (pCreateInfo) {
+ create_info.sType = pCreateInfo->sType;
+ create_info.usage = pCreateInfo->usage;
+ } else {
+ create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ create_info.usage = VK_BUFFER_USAGE_RAY_TRACING_BIT_NV;
+ }
+ buffer->init(dev, create_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
}
NON_DISPATCHABLE_HANDLE_DTOR(ShaderModule, vk::DestroyShaderModule)
diff --git a/tests/vktestbinding.h b/tests/vktestbinding.h
index c932777..12be3c3 100644
--- a/tests/vktestbinding.h
+++ b/tests/vktestbinding.h
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 2015-2016, 2019 The Khronos Group Inc.
- * Copyright (c) 2015-2016, 2019 Valve Corporation
- * Copyright (c) 2015-2016, 2019 LunarG, Inc.
+ * Copyright (c) 2015-2016, 2020 The Khronos Group Inc.
+ * Copyright (c) 2015-2016, 2020 Valve Corporation
+ * Copyright (c) 2015-2016, 2020 LunarG, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -163,8 +163,7 @@
const VkMemoryPropertyFlags forbid = 0) const;
// vkEnumerateDeviceExtensionProperties()
- std::vector<VkExtensionProperties> extensions() const;
- std::vector<VkExtensionProperties> extensions(const char *pLayerName) const;
+ std::vector<VkExtensionProperties> extensions(const char *pLayerName = nullptr) const;
// vkEnumerateLayers()
std::vector<VkLayerProperties> layers() const;
@@ -331,7 +330,7 @@
// vkGetFenceStatus()
VkResult status() const { return vk::GetFenceStatus(device(), handle()); }
- VkResult wait(VkBool32 wait_all, uint64_t timeout) const;
+ VkResult wait(uint64_t timeout) const;
static VkFenceCreateInfo create_info(VkFenceCreateFlags flags);
static VkFenceCreateInfo create_info();
@@ -560,14 +559,19 @@
public:
explicit AccelerationStructure(const Device &dev, const VkAccelerationStructureCreateInfoNV &info, bool init_memory = true) {
init(dev, info, init_memory);
+ isKHR = false;
+ }
+ explicit AccelerationStructure(const Device &dev, const VkAccelerationStructureCreateInfoKHR &info, bool init_memory = true) {
+ initKHR(dev, info, init_memory);
+ isKHR = true;
}
~AccelerationStructure();
// vkCreateAccelerationStructureNV
void init(const Device &dev, const VkAccelerationStructureCreateInfoNV &info, bool init_memory = true);
-
+ void initKHR(const Device &dev, const VkAccelerationStructureCreateInfoKHR &info, bool init_memory = true);
// vkGetAccelerationStructureMemoryRequirementsNV()
- VkMemoryRequirements2 memory_requirements() const;
+ VkMemoryRequirements2 memory_requirements(bool isKHR = false) const;
VkMemoryRequirements2 build_scratch_memory_requirements() const;
uint64_t opaque_handle() const { return opaque_handle_; }
@@ -576,12 +580,13 @@
const VkDevice &dev() const { return device(); }
- void create_scratch_buffer(const Device &dev, Buffer *buffer);
+ void create_scratch_buffer(const Device &dev, Buffer *buffer, VkBufferCreateInfo *pCreateInfo = NULL);
private:
VkAccelerationStructureInfoNV info_;
DeviceMemory memory_;
uint64_t opaque_handle_;
+ bool isKHR;
};
class ShaderModule : public internal::NonDispHandle<VkShaderModule> {